/

로컬 AI 박스와 API 구독 중 무엇을 쓸지는 제품 스펙이 아니라 언제 부담이 갈리는지로 판단하는 것이 먼저입니다. 많은 팀·개인이 "로컬 AI 박스 API 구독 언제" 바꿔야 하는지 궁금해하지만, 이 글은 특정 하드웨어 스펙 비교나 요금제 표가 아니라 비용·한도 신호만으로 전환 시점을 정리합니다. API 구독만으로 충분한 패턴, 로컬 박스가 필요해지는 신호, 그리고 박스를 사기 전에 먼저 줄일 수 있는 클라우드 사용 습관을 순서대로 짚습니다. 가격·전기요금·TCO 수치는 이 글에서 다루지 않습니다.

API 구독만으로 충분한 반복·팀 패턴은?

한 줄 답: 작업이 반복적이고 데이터 민감도가 낮으며, 팀원들이 같은 클라우드 할당량을 공유해도 문제없다면 API 구독만으로 충분합니다.

API 구독이 맞는 상황은 대체로 세 가지 조건이 겹칠 때입니다. 첫째, 반복 패턴입니다. 코드 리뷰, 문서 요약, 간단한 질의응답처럼 매번 비슷한 요청이 오가는 작업은 왕복 지연이 몇 초 추가돼도 체감 불편이 크지 않습니다. 둘째, 공유 할당량입니다. 팀 단위로 같은 구독 한도를 나눠 쓰더라도 피크 시간대가 겹치지 않거나, 한도 초과 시 대기만으로 충분히 버틸 수 있는 규모라면 굳이 전용 장비를 둘 이유가 없습니다. 셋째, 데이터 민감도입니다. 사내 기밀이나 개인정보가 섞이지 않은 일반적인 업무 텍스트·코드라면, 클라우드로 왕복하는 것 자체가 리스크로 작용하지 않습니다.

반대로 말하면, 이 세 조건이 모두 충족되는 동안은 로컬 장비 투자를 미루는 쪽이 합리적입니다. 왕복 지연이 업무 흐름을 크게 방해하지 않고, 할당량 초과가 가끔 발생해도 조정 가능한 수준이며, 데이터를 외부로 보내도 괜찮은 경우라면 API 구독 한 가지만으로 운영하는 편이 관리 부담도 적습니다.

로컬 박스(예: Spark급)가 맞는 데이터·지연·한도 신호는?

한 줄 답: 데이터를 외부로 보낼 수 없거나, 지연에 민감한 작업이 반복되거나, 클라우드 한도·요금 부담이 구조적으로 커지는 신호가 보이면 로컬 박스 쪽으로 무게가 옮겨갑니다.

로컬 박스, 예를 들어 Spark급 소형 AI 장비를 고려할 시점은 스펙표를 들여다보는 순간이 아니라 아래와 같은 신호가 반복적으로 나타날 때입니다.

  • 데이터 레지던시·프라이버시 — 규제 산업, 고객 개인정보, 내부 민감 문서처럼 외부 전송 자체가 정책상 제약되는 데이터를 다루는 경우입니다.
  • 지연(latency) — 실시간에 가까운 응답이 필요한 워크플로우에서 네트워크 왕복이 체감 병목으로 작용하는 경우입니다. 매 호출마다 몇 초씩 쌓이는 구조라면 온프레미스 처리가 유리해집니다.
  • 할당량·요율 제한(rate-limit) 통증 — 팀 규모가 커지면서 공유 API 한도에 자주 부딪히고, 매번 대기열에 걸리거나 요청을 쪼개 우회하는 운영 비용이 눈에 띄게 늘어나는 경우입니다.
  • 오프라인·온프레미스 요구 — 네트워크가 끊긴 환경, 폐쇄망, 또는 특정 고객사 현장에서 인터넷 연결 없이 동작해야 하는 조건입니다.

이 신호들은 특정 제품의 메모리 용량이나 연산 성능 스펙을 비교하는 것과는 다른 질문입니다. 여기서 중요한 것은 "어떤 모델을 몇 토큰까지 돌릴 수 있는가"가 아니라 "이 작업이 애초에 외부로 나가면 안 되는가, 왕복이 느려서 못 쓰는가, 한도 때문에 막히는가"라는 운영상의 사실관계입니다. 이 질문에 "예"가 반복해서 나온다면 로컬 박스를 검토할 시점이 된 것입니다.

올리기 전 줄일 클라우드 사용은?

한 줄 답: 로컬 박스를 사거나 업그레이드하기 전에, 프롬프트 캐싱·경량 모델 전환·배치 처리·중복 에이전트 실행 정리로 클라우드 낭비를 먼저 줄이는 것이 순서입니다.

클라우드 한도나 비용 부담이 느껴진다고 곧바로 로컬 장비 구매로 넘어가기 전에, 다음과 같은 사용 습관을 점검할 가치가 있습니다.

  • 프롬프트 캐싱 활용 — 반복되는 시스템 프롬프트나 긴 컨텍스트를 매번 새로 보내는 대신 캐싱 가능한 구조로 정리하면 같은 작업에서도 호출 비용과 지연이 줄어듭니다.
  • 루틴 작업엔 경량 모델 — 단순 분류, 포맷 변환, 짧은 요약처럼 난이도가 낮은 반복 작업까지 가장 무거운 모델을 쓰고 있지 않은지 확인합니다. 작업 난이도에 맞는 모델로 나누는 것만으로 한도 소모 속도가 달라집니다.
  • 배치·오프피크 처리 — 실시간성이 필요 없는 작업은 배치로 묶거나 오프피크 시간대로 몰아서 처리하면, 피크 시간 할당량 경쟁을 줄일 수 있습니다.
  • 중복 에이전트 실행 정리 — 같은 작업을 여러 에이전트·스크립트가 중복으로 호출하고 있지는 않은지 점검합니다. 특히 자동화 파이프라인에서는 재시도 로직이나 병렬 실행이 의도치 않게 호출 수를 불리는 경우가 흔합니다.

이런 정리를 먼저 거친 뒤에도 앞서 말한 데이터·지연·한도 신호가 여전히 남아 있다면, 그때 로컬 박스 도입을 구체적으로 검토하는 순서가 합리적입니다. 클라우드 낭비를 줄이지 않은 상태에서 로컬 장비를 들이면, 운영 부담만 두 배로 늘어날 수 있습니다.

마무리

로컬 AI 박스와 API 구독은 어느 한쪽이 항상 우월한 선택이 아니라, 작업 패턴과 데이터 성격에 따라 부담이 갈리는 문제입니다. 반복적이고 민감도가 낮은 작업은 API 구독만으로 충분하고, 데이터 레지던시·지연·한도 통증이 구조적으로 쌓인다면 로컬 박스 쪽을 검토할 시점입니다. 다만 그 전에 프롬프트 캐싱, 경량 모델 전환, 배치 처리, 중복 실행 정리 같은 클라우드 사용 최적화를 먼저 점검하는 순서를 권합니다.

도구·구독 할인 경로를 한곳에서 보려면 할인 경로 허브(/42)만 참고하시면 됩니다.

GoingBus 초대·쿠폰이 필요하면 GoingBus(코드 tlsf)를 보시면 됩니다.

Gamsgo 파트너 경로가 필요하면 Gamsgo(코드 NUFUY)를 보시면 됩니다.

MediaTek 10TOPS AIoT 요약:

MediaTek AIoT 10TOPS Linux 보드는 패널 UI와 멀티 카메라 분석을 같은 보드에서 동시에 처리해야 해서 클라우드 왕복이 비효율적인 산업·리테일 워크로드에서 검토 대상이 되지만, 선택 전에는 Ubuntu/Linux BSP의 인터페이스·NPU 툴체인 지원 범위와 스마트 PCBA vs SoM/비전 모듈 조건을 먼저 확인해야 합니다.

~10TOPS 온디바이스 추론이 맞는 패널·멀티캠 워크로드는?

한 줄 답: 패널 UI를 띄우면서 동시에 여러 카메라 피드를 로컬에서 실시간으로 분석해야 하고, 클라우드로 영상을 올려 응답을 기다리는 구조가 지연이나 네트워크 의존성 측면에서 맞지 않는 산업·리테일 워크로드가 ~10TOPS급 보드에 맞는 사례입니다.

Quectel이 공개한 QSM603FCP 스마트 PCBA 출시 공지에 따르면 이 보드는 MediaTek의 AIoT SoC인 MT8371을 기반으로 하며, 회사 측이 표기하는 NPU 스펙 라벨은 최대 10.3 TOPS입니다. 같은 공지는 이 NPU가 상품 인식, 안면 특징 추출, 다중 카메라 피드의 실시간 분석 같은 온디바이스 AI 워크로드를 지원하도록 설계됐다고 설명합니다.

이 보드는 독립적인 듀얼 디스플레이 출력(HDMI + LVDS/MIPI)을 지원한다고 안내되어 있어, 한쪽 화면에는 운영자용 UI를, 다른 화면에는 고객용 결제 금액이나 프로모션 화면을 띄우는 듀얼 스크린 POS 단말기 같은 패널 중심 사용 사례에 맞습니다. 공지에서 언급하는 활용 사례는 산업용 스마트 패널 장치, 에지 컴퓨팅 디바이스, 자동 발권 시스템, 스마트 리테일 POS 시스템 등입니다.

다만 "최대 10.3 TOPS"라는 수치는 MediaTek·Quectel이 밝힌 공식 스펙 라벨일 뿐이며, 실제 체감 처리량으로 그대로 단정할 수는 없습니다. 가속기 자체의 연산 능력과 애플리케이션에서 실제로 체감하는 성능 사이에는 모델 구조, 수치 포맷, 컴파일러 지원, 메모리 트래픽, 전처리 비용, CPU/GPU로 분담되는 연산 비율 같은 변수가 끼어 있다는 점을 전제로 검토해야 합니다.

Ubuntu/Linux BSP에서 먼저 볼 인터페이스·NPU 툴체인은?

한 줄 답: 카메라·디스플레이 인터페이스가 요구 사양을 충족하는지, NPU 런타임·툴체인이 공급사 BSP에 포함돼 공개되는지, 커널/BSP가 Ubuntu 기준으로 배포되는지를 먼저 확인해야 합니다.

Quectel의 QSM603FCP 관련 소개 자료는 이 보드가 Ubuntu 운영체제를 지원한다고 명시합니다. 같은 MT8371 계열인 Genio G520 기반 SH603FC 모듈 제품 페이지는 Android 15, Yocto Linux(커널 6.6), Ubuntu를 함께 지원한다고 안내합니다. 즉 같은 플랫폼이라도 공급사와 제품 라인마다 지원하는 배포판과 커널 버전이 공지되어 있으므로, 이를 먼저 비교하는 작업이 필요합니다.

Ubuntu/Linux BSP 관점에서 선정 단계에 확인할 체크리스트는 다음과 같습니다.

  1. 필요한 카메라(CSI) 해상도와 개수, 디스플레이 출력 조합(HDMI, LVDS, MIPI 등)이 공급사가 공개한 인터페이스 목록에 포함되는지 확인합니다.
  2. NPU 런타임과 컴파일러 툴체인이 공급사 SDK/BSP 패키지에 포함돼 공개되어 있는지, 어떤 모델 포맷을 지원한다고 명시하는지 확인합니다.
  3. 커널 버전과 Ubuntu(또는 Yocto) 배포 방식이 벤더 BSP 공지와 일치하는지, 제품 라인마다 지원 범위가 달라지지 않는지 확인합니다.

이 단계는 특정 레지스터 주소나 디바이스 트리 오버레이를 수정하는 세부 디버깅이 아니라, 공급사가 공개한 BSP 지원 범위를 비교해 보드를 고르는 선택 기준에 해당합니다.

SoM/비전 모듈 대신 스마트 PCBA를 고르는 조건은?

한 줄 답: 필요한 I/O 세트가 고정돼 있고, 캐리어 보드를 직접 설계할 자유도가 필요 없으며, 양산 단계에서 통합 공정과 단가를 줄여야 할 때 스마트 PCBA 쪽이 유리합니다.

스마트 PCBA는 어떤 통합 방식을 정의합니까?

Quectel은 "스마트 PCBA"를 고성능 프로세서, AI 칩, 커넥티비티 기능을 하나의 보드 하드웨어에 직접 통합한 형태로 설명합니다. 이는 모듈을 별도의 캐리어 보드에 얹어 사용하는 SoM이나 카메라·비전 전용 모듈과는 다른 접근입니다. SoM/비전 모듈은 캐리어 보드 설계 자유도를 제품 쪽에 남겨두는 구조이고, 스마트 PCBA는 그 자유도 대신 고정된 완제품형 보드를 그대로 채택하는 구조입니다.

어떤 경우에 고정 I/O와 양산 단가가 기준이 됩니까?

QSM603FCP가 안내하는 인터페이스 구성은 CAN 2.0/FD, RS485, PWM, GPIO, CSI 카메라(최대 16MP), 이더넷, LTE Cat 4, Wi-Fi 6, Bluetooth 5.4 등으로 이미 폭넓게 고정되어 있습니다. 제품에 필요한 인터페이스 조합이 이런 완제품형 보드의 고정 구성과 맞아떨어지고, 카메라·디스플레이 핀아웃을 제품 하우징에 맞춰 커스터마이징할 필요가 크지 않다면, 캐리어 보드를 새로 설계하는 SoM/비전 모듈 경로보다 스마트 PCBA를 그대로 쓰는 쪽이 통합 공정과 검증 기간을 줄이는 데 유리합니다.

반대로 제품 하우징 형태가 특수하거나, 필요한 인터페이스만 남기고 나머지를 제거해 대량 양산 단가를 더 낮춰야 하는 상황이라면, 캐리어 보드를 직접 설계할 수 있는 SoM이나 비전 전용 모듈 쪽이 더 맞을 수 있습니다. 이 선택은 어느 쪽이 우월하다는 문제가 아니라, 제품의 폼팩터 자유도 요구와 양산 규모·일정에 따라 달라지는 조건입니다.

구분스마트 PCBASoM/비전 모듈
I/O 구성공급사가 고정한 완제품형 인터페이스 세트캐리어 보드 설계로 핀아웃·구성을 커스터마이징
통합 공정보드를 그대로 채택해 통합·검증 기간 단축캐리어 보드 설계·검증 과정이 추가로 필요
적합한 상황필요 인터페이스가 고정 구성과 맞아떨어지는 양산 제품폼팩터가 특수하거나 불필요 포트 제거로 단가를 더 낮춰야 하는 경우

FAQ에서는 무엇을 확인합니까?

최대 10.3 TOPS라는 수치를 체감 성능으로 그대로 받아들여도 됩니까?

그렇지 않습니다. 이 수치는 MediaTek MT8371 NPU에 대한 공급사 공식 스펙 라벨이며, 가속기 자체의 연산 능력과 실제 애플리케이션에서 체감하는 처리량은 모델 구조, 수치 포맷, 컴파일러 지원, 메모리 트래픽, 전처리 비용, CPU/GPU 분담 비율에 따라 달라집니다. 라벨 수치를 벤치마크 결과처럼 받아들이기보다, 실제 적용하려는 모델과 워크로드 조건에서 재검증하는 과정이 필요합니다.

Ubuntu 지원 여부는 같은 MT8371 계열에서도 제품마다 다릅니까?

공지 기준으로는 공급사·제품 라인마다 지원 배포판을 각각 안내하고 있습니다. QSM603FCP는 Ubuntu 지원을 명시하고, 같은 Genio G520(MT8371) 기반의 SH603FC 모듈은 Android 15, Yocto Linux(커널 6.6), Ubuntu를 함께 지원한다고 안내합니다. 실제 제품을 선정할 때는 사용하려는 정확한 모델명 기준으로 공급사가 공개한 BSP 지원 범위를 다시 확인해야 합니다. 세부 커널 패치 버전이나 장기 지원 일정은 공급사 공지에 명시되지 않은 부분이 있어 공급사에 직접 확인하는 것이 좋습니다.

결론적으로 어떤 기준으로 선택해야 합니까?

MediaTek AIoT 10TOPS Linux 보드는 패널 UI와 멀티 카메라 분석을 클라우드 의존 없이 같은 보드에서 동시에 처리해야 하는 산업·리테일 워크로드에서 검토 대상이 됩니다. 다만 선택 전에는 카메라·디스플레이 인터페이스, NPU 런타임·툴체인, 커널/BSP 배포 방식이 Ubuntu/Linux 기준으로 공개되어 있는지를 먼저 확인해야 하며, "~10TOPS / 최대 10.3 TOPS" 같은 수치는 공급사가 밝힌 스펙 라벨로만 다뤄야 합니다. 마지막으로 필요한 I/O가 고정 구성과 맞아떨어지고 통합 공정을 줄여야 한다면 스마트 PCBA를, 캐리어 보드 설계 자유도나 추가적인 단가 최적화가 필요하다면 SoM/비전 모듈을 선택하는 것이 합리적인 기준입니다.

바쁜 분들을 위한 핵심 요약

Transformer는 Self-Attention을 핵심 부품으로 사용하는 LLM의 뼈대 구조입니다. 이전 방식(RNN)과 달리 모든 단어를 병렬로 한꺼번에 처리하며, 문장이 길어져도 단어 간의 관계를 정확하게 파악할 수 있습니다.

이 글은 SK하이닉스 AI 해커톤 1차 예선 대비 AI 공부 노트 Day 2입니다. 지난 Day 1 글에서 Q·K·V로 토큰끼리 비중을 매기는 Self-Attention을 정리했는데, 오늘은 그 Self-Attention이 들어가는 전체 뼈대인 Transformer 구조를 살펴보겠습니다.

Transformer 구조 내부 블록은 어떻게 구성되어 있습니까?

한 줄 답: 단어(Embedding)에 위치 정보를 더한 후, Self-Attention과 FFN 단계를 거치며 의미를 깊게 이해합니다.

Transformer는 아래와 같은 블록 하나를 여러 층(Layer) 쌓아서 만듭니다. 텍스트로 흐름을 정리하면 다음과 같습니다.

[Input] 단어 Embedding + 위치 정보 (Positional Encoding)
   ↓
[블록 시작]
 1. Self-Attention (단어들끼리 정보 교환)
    * 각 단계 후 Residual Connection + LayerNorm
   ↓
 2. FFN (Feed-Forward Network, 각 단어별 혼자 가공)
    * 각 단계 후 Residual Connection + LayerNorm
[블록 끝] → 이 블록을 여러 층(Layer) 반복

층(Layer)을 여러 겹 쌓을수록, 낮은 층에서는 단어 간의 단순한 관계를 파악하고 높은 층에서는 문장 전체의 깊은 의미를 이해하게 됩니다.

위치 정보(Positional Encoding)는 왜 따로 더해줍니까?

한 줄 답: Attention은 모든 단어를 한꺼번에 보기 때문에 단어의 순서를 모릅니다. 따라서 순서표를 붙여주는 것입니다.

회의실에 사람들이 동시에 입장하면 누가 먼저 들어왔는지 알 수 없는 것과 같습니다. '개가 사람을 물었다'와 '사람이 개를 물었다'는 들어있는 단어(토큰)가 동일하지만 의미가 완전히 다릅니다. 이 차이를 모델이 구분할 수 있도록 각각의 단어에 위치 정보를 더해줍니다.

Self-Attention과 FFN은 각각 어떤 역할을 합니까?

한 줄 답: Self-Attention은 다 같이 모여 토론하는 '회의'이고, FFN은 자리로 돌아가 혼자 생각을 정리하는 '개인 작업'입니다.

자주 헷갈리는 포인트

  • Self-Attention: 토큰들이 서로 정보를 교환하며 전체 문맥 속에서 자신의 역할을 파악합니다.
  • FFN: 다른 토큰을 보지 않고, 각 토큰이 스스로 얻은 정보를 독자적으로 가공하고 정리합니다.

Transformer 구조를 이전 방식(RNN)과 비교하면 무엇이 다릅니까?

한 줄 답: RNN은 순차적이라 느리지만, Transformer는 병렬 처리가 가능해 빠르고 문맥을 잘 기억합니다. 단, 메모리 소모가 큽니다.

RNN은 한 단어씩 차례대로 읽기 때문에 병렬 처리가 불가능하고 느립니다. 또한 긴 문장에서는 앞부분의 내용을 잊어버리는 문제가 있습니다. 반면 Transformer는 모든 단어를 병렬로 처리하며, 문장이 길어져도 Attention을 통해 먼 단어를 즉시 참고할 수 있습니다.

다만 반도체 관점에서 보면, 모든 토큰이 서로를 동시에 쳐다보기 때문에 문장이 길어질수록 계산량과 메모리 사용량이 폭발적으로 증가합니다. 이 문제는 Day 3에서 다룰 'KV Cache' 개념으로 연결됩니다.

배운 내용을 퀴즈로 확인해 볼까요?

Q1. Transformer가 문장의 단어 순서를 인식하기 위해 단어에 더해주는 것은 무엇입니까?

A1. 위치 정보(Positional Encoding)입니다. 한 번에 모든 단어를 병렬로 처리하므로 순서를 알려줄 장치가 필요합니다.

Q2. Self-Attention과 FFN 중, 토큰들이 서로 정보를 교환하는 단계는 무엇입니까?

A2. Self-Attention입니다. FFN은 각 토큰이 독립적으로 정보를 가공하는 단계입니다.

Q3. 문장이 길어질 때 Transformer 모델에서 연산량과 메모리가 크게 증가하는 이유는 무엇입니까?

A3. Self-Attention 과정에서 모든 토큰이 서로의 관계를 계산해야 하기 때문입니다.

Q4. 층을 여러 겹 쌓았을 때, 문장의 깊은 의미를 파악하는 곳은 주로 어느 층입니까?

A4. 높은 층(Higher Layers)입니다. 낮은 층은 기초적인 단어 관계를 파악하는 데 집중합니다.

[시험용 암기 문장] Transformer는 Self-Attention으로 모든 토큰을 한꺼번에(병렬로) 보며 관계를 파악하는 모델 구조다. 이 블록을 여러 층 쌓아 문장을 깊게 이해하고, LLM은 이걸로 다음 토큰을 예측한다.

바쁜 분들을 위한 핵심 요약

Self-Attention은 현재 단어(토큰)가 문장 안의 다른 단어들을 얼마나 참고할지 비중(Weight)을 매기는 과정입니다. Q(검색), K(라벨), V(내용)로 역할을 나누어 정보를 섞고, 최종적으로 단어의 '더 풍부한 문맥적 표현'을 만들어냅니다.

Self-Attention은 최종 답변을 만드는 과정입니까?

한 줄 답: 아닙니다. 답변을 생성하는 것이 아니라, 문맥이 반영된 '더 풍부한 토큰 표현'을 만드는 과정입니다.

Attention 과정 자체는 최종 문장(답변)을 만들지 않습니다. 한 층(Layer)의 결과물은 현재 단어가 주변 단어들과 어떻게 연관되는지 이해한 새로운 상태값일 뿐입니다. 답변을 실제로 생성하는 것은 이 표현을 활용하는 그 위 단계의 몫입니다. 예를 들어, '은행에서 돈을 찾았다'라는 문장에서 '은행'은 '돈을'이라는 토큰에 더 높은 비중을 두어 금융 기관이라는 것을 파악하게 됩니다.

Q, K, V는 각각 어떤 역할을 합니까? (도서관 비유)

한 줄 답: Q는 검색어, K는 책의 라벨, V는 책의 실제 내용입니다.

Embedding 하나만 쓰면 역할이 섞이기 때문에 Q, K, V 셋으로 명확히 분리합니다. 도서관에 비유하면 다음과 같습니다.

  • Q (Query): 내가 찾고 있는 검색어 (현재 토큰)
  • K (Key): 책 표지에 적힌 라벨이나 키워드 (다른 토큰들의 특징)
  • V (Value): 책의 실제 내용 (다른 토큰들이 가진 실제 정보)

실제 계산 흐름과 비중은 어떻게 적용됩니까?

한 줄 답: Q와 K를 비교해 점수를 내고, 이를 비중(확률)으로 바꿔 V와 곱해 더합니다.

계산 흐름 6단계

흐름 순서는 다음과 같습니다.

  1. Token을 숫자 벡터인 Embedding으로 변환합니다.
  2. Embedding에서 Q, K, V를 분리해 생성합니다.
  3. Q와 K를 비교하여 연관성 점수(Q·K Score)를 구합니다.
  4. Softmax 함수를 통과시켜 합이 1이 되는 비중으로 만듭니다. (예: 토큰 B 비중 0.7, 토큰 C 비중 0.3)
  5. 비중을 바탕으로 V의 가중합을 계산합니다. (0.7·VB + 0.3·VC)
  6. 이 결과가 바로 현재 토큰의 새롭고 풍부한 표현이 됩니다.
[시험용 암기 문장] Attention은 지금 토큰이 다른 토큰을 얼마나 참고할지 비중을 매기고, 그 비중으로 정보를 섞어 새 표현을 만든다.

배운 내용 확인 퀴즈

Q1. Self-Attention에서 점수(Score) 비중이 B 토큰 0.7, C 토큰 0.3으로 나왔습니다. 최종 정보는 어떻게 섞입니까?

A1. 0.7 * (B의 Value) + 0.3 * (C의 Value) 형태로 가중합(Weighted Sum)을 구하여 새로운 표현을 만듭니다.

Q2. Q, K, V를 굳이 나누는 가장 큰 이유는 무엇입니까?

A2. Embedding 하나만으로 쿼리(검색), 키(라벨), 밸류(내용) 역할을 모두 수행하면 정보가 섞여 제대로 된 연관성을 찾기 어렵기 때문입니다.

스핀락 vs 뮤텍스 요약:

스핀락 뮤텍스 면접 질문의 핵심은 "지금 컨텍스트가 잠들 수 있는가, 임계구역이 얼마나 짧은가"입니다. ISR이나 인터럽트 비활성화 구간처럼 잠들 수 없고 임계구역이 아주 짧다면 스핀락을, 코드가 길어지거나 블로킹·스케줄링이 필요한 프로세스 컨텍스트라면 뮤텍스를 고른다는 기준부터 말하면 됩니다.

그 다음에 데드락 방지(락 획득 순서)와 우선순위 역전(스핀락 busy-wait이 CPU를 태우는 문제 vs 뮤텍스의 우선순위 상속) 근거를 더하면 답변이 완성됩니다.

이 글은 면접에서 스핀락과 뮤텍스를 고르는 기준을 정리한 일반 안내이며, 커널 버전·아키텍처·설정(CONFIG_PREEMPT 등)에 따라 세부 동작은 달라질 수 있습니다.

스핀락이 맞는 ISR·짧은 임계구역 신호는?

한 줄 답: 인터럽트 핸들러나 인터럽트 비활성화 구간처럼 잠들 수 없는 컨텍스트에서, 아주 짧은 코드만 보호해야 할 때는 스핀락이 맞는 신호입니다.

스핀락은 락을 못 잡으면 코드가 바쁜 대기(busy-wait)로 반복해서 재시도하는 방식입니다. 스핀락을 쥔 상태로는 잠들 수 있는 함수(메모리 할당, 세마포어 대기 등)를 호출하면 안 되므로, 스핀락 내부에서 메모리를 할당해야 한다면 GFP_ATOMIC처럼 잠들지 않는 플래그를 써야 합니다. 리눅스 커널의 spinlocks 문서는 이런 제약과 함께 spin_lock() / spin_lock_irqsave() 같은 변형이 왜 필요한지를 설명합니다.

면접에서는 다음과 같은 신호를 예로 들 수 있습니다. 인터럽트 핸들러(ISR) 안에서 공유 자료구조를 건드려야 하는 경우, 이미 다른 스핀락을 쥐고 있거나 선점이 꺼진 구간이라 잠들 수 없는 경우, 그리고 임계구역이 변수 몇 개를 읽고 쓰는 수준으로 매우 짧아서 바쁜 대기 비용이 작다고 판단되는 경우입니다.

  • 컨텍스트: 지금 코드가 잠들 수 없는 컨텍스트인지(ISR, 이미 락을 쥔 상태, 선점 비활성화)부터 확인합니다.
  • 임계구역 길이: 보호해야 할 코드가 몇 줄 안에 끝나는지 확인합니다.
  • 대기 전제: 다른 쪽이 락을 아주 짧게만 쥐고 있어서 바쁜 대기가 길어지지 않는다는 전제가 성립하는지 확인합니다.

뮤텍스(슬립 가능)로 남겨둘 구간은?

한 줄 답: 코드가 블로킹 I/O나 메모리 할당처럼 잠들 수 있는 호출을 포함하거나 임계구역이 길어서 다른 작업을 오래 막는다면, 스핀락 대신 뮤텍스로 남겨둬야 합니다.

뮤텍스는 락을 못 잡으면 호출한 태스크를 재우고 스케줄러에 맡기는 방식이라서, 프로세스 컨텍스트처럼 잠들어도 되는 곳에서만 쓸 수 있습니다. 리눅스 커널의 mutex-design 문서는 뮤텍스가 세마포어보다 가볍고 단순한 상호배제 전용 락으로 설계된 이유와, 인터럽트 컨텍스트에서는 쓸 수 없다는 제약을 설명합니다.

면접에서는 이런 구간을 예로 들 수 있습니다. 파일·네트워크 I/O처럼 완료까지 시간이 걸리는 작업을 임계구역 안에서 호출해야 하는 경우, 임계구역 안에서 추가로 메모리를 할당해야 하는 경우, 그리고 락을 쥐는 시간이 길어서 다른 쪽을 바쁜 대기로 묶어두면 CPU 낭비가 큰 경우입니다.

  1. 이 코드가 ISR이 아닌 프로세스 컨텍스트에서만 실행되는지 확인합니다.
  2. 임계구역 안에서 잠들 수 있는 호출(블로킹 I/O, 할당, 다른 락 대기)이 있는지 확인합니다.
  3. 둘 중 하나라도 해당되면 스핀락을 쓰지 않고 뮤텍스로 남겨둡니다.

데드락·우선순위 역전을 면접에서 어떻게 짚나?

한 줄 답: 락 획득 순서를 고정하고 IRQ-세이프 변형을 쓰는지로 데드락을, 스핀락 busy-wait이 CPU를 태우는 상황과 뮤텍스의 우선순위 상속으로 우선순위 역전을 설명하면 됩니다.

데드락은 어떻게 짚습니까?

먼저 락 두 개 이상을 서로 다른 순서로 잡으면 데드락이 발생할 수 있다는 원칙부터 말합니다. 락 A를 먼저 잡고 락 B를 잡는 경로와, 락 B를 먼저 잡고 락 A를 잡는 경로가 동시에 존재하면 서로를 기다리며 멈출 수 있으므로, 모든 코드 경로에서 락 획득 순서를 고정하는 것이 기본 원칙입니다.

그 다음 인터럽트와 스핀락을 함께 쓸 때 생기는 중첩 문제를 짚습니다. 인터럽트 핸들러에서도 접근하는 자료구조를 보호하는 스핀락이라면, 프로세스 컨텍스트에서는 spin_lock_irqsave()처럼 인터럽트를 함께 비활성화하는 변형을 써야 합니다. 그렇지 않으면 락을 쥔 채로 인터럽트가 들어와 같은 락을 다시 요청하면서 자기 자신과 데드락에 빠질 수 있습니다.

우선순위 역전은 어떻게 짚습니까?

우선순위 역전은 낮은 우선순위 태스크가 락을 쥔 상태에서 높은 우선순위 태스크가 그 락을 기다리느라 더 낮은 우선순위처럼 동작하게 되는 상황입니다. 스핀락에서는 이 대기가 바쁜 대기이므로, 기다리는 동안 CPU 사이클을 계속 태운다는 점을 짚습니다. 반면 뮤텍스는 대기 중인 태스크를 재우므로 CPU는 낭비되지 않지만, 우선순위가 뒤바뀌는 문제 자체는 남습니다.

이를 완화하는 커널 메커니즘으로 우선순위 상속(priority inheritance)이 있다는 점을 언급할 수 있습니다. 리눅스 커널의 rt-mutex-design 문서는 낮은 우선순위 태스크가 락을 쥐고 있을 때, 그 락을 기다리는 높은 우선순위 태스크의 우선순위를 락을 쥔 태스크에 일시적으로 상속시켜 역전 구간을 줄이는 rt-mutex 구조를 설명합니다.

비교 항목스핀락뮤텍스
사용 가능 컨텍스트인터럽트 컨텍스트 포함, 잠들 수 없는 곳프로세스 컨텍스트, 잠들 수 있는 곳만
락을 못 잡았을 때바쁜 대기(busy-wait)로 CPU 사용태스크를 재우고 스케줄러에 양보
임계구역 안 호출 제약잠드는 호출(블로킹 I/O, 일반 할당) 금지잠드는 호출 가능
우선순위 역전 대응대기 중에도 CPU를 태우므로 역전 비용이 큼rt-mutex 등에서 우선순위 상속으로 완화 가능
면접관이 "스핀락과 뮤텍스 중 하나만 고르라"고 압박해도, 먼저 "지금 컨텍스트가 잠들 수 있는가"를 기준으로 답한 뒤 임계구역 길이와 우선순위 역전 비용을 보강하는 순서가 더 설득력 있는 답변으로 보입니다.
스핀락을 쥔 채로 잠들 수 있는 함수를 호출하거나, 인터럽트 핸들러에서도 쓰는 스핀락을 프로세스 컨텍스트에서 spin_lock_irqsave() 없이 잡는 실수는 커널 코드 리뷰에서 자주 지적되는 전형적인 버그이므로, 면접에서도 이 두 가지를 직접 언급하면 좋습니다.

FAQ에서는 무엇을 확인합니까?

한 줄 답: 스핀락을 오래 쥐었을 때의 피해 범위와, 커널이 우선순위 역전을 완화하는 구체적인 방법을 확인합니다.

스핀락을 오래 잡고 있으면 어떤 문제가 생깁니까?

다른 CPU에서 같은 락을 기다리는 코드가 계속 바쁜 대기로 사이클을 소모하고, SMP가 아니더라도 그동안 인터럽트나 선점이 비활성화돼 있다면 다른 작업의 응답이 늦어집니다. 그래서 스핀락 임계구역은 가능한 한 짧게 유지해야 한다는 원칙이 함께 언급됩니다.

커널에서 우선순위 역전을 완화하는 방법은 무엇입니까?

대표적으로 우선순위 상속을 구현한 rt-mutex가 있습니다. 낮은 우선순위 태스크가 락을 쥐고 있을 때 대기 중인 더 높은 우선순위 태스크의 우선순위를 임시로 넘겨받게 해서, 역전 구간 동안 그 태스크가 선점당하지 않도록 만드는 방식입니다. 자세한 구조는 rt-mutex-design 문서에서 확인할 수 있습니다.

정리하면 어떻게 답하면 됩니까?

스핀락과 뮤텍스를 고르는 질문은 암기 문제가 아니라, 지금 컨텍스트가 잠들 수 있는지와 임계구역이 얼마나 짧은지로 근거를 설명할 수 있는지를 보는 질문입니다. ISR이나 잠들 수 없는 짧은 구간이면 스핀락을, 길거나 블로킹 호출이 섞인 프로세스 컨텍스트 구간이면 뮤텍스를 우선 검토한다는 기준을 먼저 말하고, 필요하면 락 획득 순서로 데드락을, 우선순위 상속으로 우선순위 역전 대응을 보강하면 됩니다.

인터럽트 vs 폴링 요약:

임베디드 인터럽트 폴링 면접 질문을 받을 때는 "이벤트가 드물고 지연에 민감하면 인터럽트, 주기가 일정하고 단순한 값만 읽으면 폴링"이라는 기준부터 말하고, 그 뒤에 latency와 CPU 점유로 근거를 보강하면 됩니다.

이 글은 면접에서 인터럽트와 폴링을 고르는 기준을 정리한 일반 안내이며, MCU·MPU 아키텍처와 RTOS 구성에 따라 세부 수치는 달라질 수 있습니다.

폴링이 오히려 맞는 주기·단순 센서 조건은?

한 줄 답: 샘플링 주기가 고정돼 있고 한 번 읽는 값이 단순하며 CPU가 다른 일로 바쁘지 않다면 폴링이 더 단순하고 예측 가능합니다.

폴링은 메인 루프나 타이머 주기마다 레지스터나 GPIO 핀 값을 직접 읽는 방식입니다. 인터럽트 컨트롤러 설정, 핸들러 등록, 우선순위 조정 같은 추가 구성이 필요 없어서 구현이 단순합니다.

면접에서는 이런 조건을 예로 들 수 있습니다. 온도 센서처럼 값이 천천히 바뀌어 일정한 주기로 읽는 것만으로 충분한 경우, 버튼 디바운스처럼 짧은 시간 동안 여러 번 확인해야 하는 경우, 혹은 인터럽트 컨트롤러가 아직 설정되지 않은 초기 부팅 구간입니다.

단점도 함께 말하면 설득력이 올라갑니다. 값이 바뀌지 않아도 매 주기마다 CPU가 레지스터를 읽으므로, 이벤트 발생 빈도가 낮을수록 낭비되는 사이클이 늘어납니다. 또한 폴링 주기보다 짧게 발생하고 사라지는 이벤트는 놓칠 수 있습니다.

  1. 이벤트 발생 빈도와 변화 속도를 먼저 확인합니다.
  2. 놓쳐도 되는 수준인지, 다음 주기까지 기다려도 되는지 확인합니다.
  3. 그래도 괜찮다면 폴링으로 구현을 단순화합니다.

인터럽트가 맞는 지연·이벤트 드리븐 조건은?

한 줄 답: 이벤트가 드물게 비동기로 발생하고 반응 지연이 중요하거나 CPU를 다른 작업에 쓰고 싶을 때는 인터럽트가 맞습니다.

인터럽트는 하드웨어 이벤트가 발생한 순간 CPU 실행을 끊고 등록된 핸들러로 넘어가는 방식입니다. 리눅스 커널의 Generic IRQ 문서는 드라이버가 request_irq()로 핸들러를 등록하고 free_irq()로 해제하는 구조를, 그리고 edge-triggered·level-triggered 같은 흐름 핸들러 종류를 설명합니다.

면접에서는 이런 조건을 예로 들 수 있습니다. 외부 버튼이나 통신 라인처럼 발생 시점을 예측할 수 없는 이벤트, UART 수신처럼 들어오는 순간 바로 처리해야 손실이 없는 경우, 혹은 메인 루프가 다른 연산을 하는 동안 CPU를 비워 두고 싶은 저전력 설계입니다.

인터럽트의 비용도 함께 말해야 합니다. 핸들러 등록과 우선순위 설계가 필요하고, 공유 자원을 다루면 임계 구역 보호가 필요하며, ISR이 길어지면 다른 인터럽트 응답이 늦어집니다. 그래서 ISR은 최소 작업만 하고 나머지는 request_threaded_irq() 같은 스레드 처리로 넘기는 설계가 자주 언급됩니다.

  1. 이벤트가 비동기이고 예측할 수 없는지 확인합니다.
  2. 놓치면 데이터 손실이나 응답 지연이 문제가 되는지 확인합니다.
  3. 그렇다면 인터럽트를 고르고, ISR은 짧게 유지합니다.

면접에서 latency·CPU 점유를 어떻게 말하나?

한 줄 답: "폴링은 주기마다 CPU를 쓰고 이벤트를 늦게 볼 수도 있다, 인터럽트는 CPU 점유는 낮지만 핸들러 진입 지연과 공유 자원 보호 비용이 있다"는 두 축으로 비교해서 말합니다.

답변은 어떻게 구성해야 합니까?

먼저 두 방식의 지연 성격이 다르다는 점을 말합니다. 폴링은 최악의 경우 이벤트 발생 직후 바로 다음 폴링 시점까지 기다리므로, 지연이 폴링 주기에 거의 비례합니다. 인터럽트는 이벤트가 발생하면 바로 핸들러로 진입하므로 지연이 짧고 더 일정합니다.

그 다음 CPU 점유를 말합니다. 폴링은 이벤트가 없어도 주기마다 CPU 사이클을 쓰므로 이벤트 발생 빈도가 낮을수록 낭비가 커집니다. 인터럽트는 이벤트가 없을 때 CPU를 다른 작업이나 저전력 모드에 둘 수 있어서 평균 점유율이 낮습니다.

구체적인 수치를 묻는 질문에는 아키텍처 문서를 근거로 들 수 있습니다. ARM 커뮤니티 블로그나 Cortex-M 기술 레퍼런스 매뉴얼(TRM)을 보면, 인터럽트 진입 지연(entry latency)은 코어 아키텍처에 의해 상한선이 보장되며 문서에 명확히 기재되어 있습니다. 따라서 구체적인 사이클 수치를 외우기보다는 해당 칩의 데이터시트나 TRM을 확인해야 한다고 답하는 것이 좋습니다.

이렇게 "인터럽트 지연은 사이클 단위로 보장되는 상한이 있고 아키텍처 문서에 명시되어 있다"는 점과, "폴링의 지연은 주기 설계자가 직접 정한다"는 점을 비교하는 방식으로 답하면 훨씬 설득력이 높습니다.

비교 항목폴링인터럽트
지연 특성최악의 경우 폴링 주기만큼 늦어짐핸들러 진입 지연이 짧고 상한이 일정하게 보장됨
CPU 점유이벤트 유무와 무관하게 매 주기 사용이벤트 없을 때는 CPU를 다른 작업에 양보 가능
구현 복잡도낮음 — 루프에서 값만 읽음높음 — 핸들러 등록·우선순위·임계 구역 설계 필요
적합 조건주기 고정, 단순 값, 저빈도 변화비동기·지연 민감 이벤트, 저전력 설계
면접관이 "둘 중 하나만 고르라"고 압박해도, 선택 기준(이벤트 빈도·지연 요구·CPU 여유)을 먼저 말한 뒤 결론을 내리는 순서가 더 좋은 답변으로 보입니다.
실제 수치는 MCU·SoC·RTOS 설정마다 다르므로, 특정 프로젝트의 정확한 사이클 수를 단정해서 말하는 대신 "데이터시트나 레퍼런스 매뉴얼에서 확인한다"는 태도를 보이는 쪽이 안전합니다.

FAQ는 무엇을 확인합니까?

한 줄 답: 두 방식을 섞어 쓰는 하이브리드 구조와, 인터럽트 비용으로 자주 언급되는 문제들을 확인합니다.

폴링과 인터럽트를 같이 쓰는 경우도 면접에서 언급해야 합니까?

네, 실무에서는 인터럽트로 이벤트를 받되 ISR에서는 플래그만 세우고 메인 루프나 스레드에서 그 플래그를 폴링해 처리하는 하이브리드 구조가 흔합니다. 이 구조를 알고 있다고 짧게 언급하면 둘 중 하나만 안다는 인상을 피할 수 있습니다.

인터럽트의 단점을 물으면 어떤 키워드를 말해야 합니까?

ISR과 메인 코드가 공유하는 변수를 보호해야 하는 동시성 문제, 긴 ISR이 같은·낮은 우선순위 인터럽트의 응답을 늦추는 문제, 그리고 핸들러 등록·해제·우선순위 설정 같은 초기 구성 비용을 키워드로 들 수 있습니다.

정리하면 어떻게 답해야 합니까?

인터럽트와 폴링을 고르는 질문은 정답을 외우는 문제가 아니라, 이벤트 빈도·지연 요구·CPU 여유라는 세 가지 기준으로 근거를 설명할 수 있는지를 보는 질문입니다. 주기가 고정되고 단순한 값이면 폴링을, 비동기 이벤트이고 지연에 민감하거나 CPU를 아끼고 싶으면 인터럽트를 우선 검토한다는 기준을 먼저 말하고, 필요하면 아키텍처 문서의 지연 수치 확인이나 하이브리드 구조로 답변을 보강하면 됩니다.

이 기준을 실제 코드로 연결해 보고 싶다면 GPIO 인터럽트 드라이버나 RTOS 태스크 큐를 직접 다뤄 보는 연습이 도움이 됩니다.

+ Recent posts