Skip to content

← 글 목록

예제 시리즈 · ⑧ / ⑧

Laya 실전 ⑧: 디바이스·처리량·에러 처리, 그리고 프로덕션 서비스

시리즈 마지막 편은 예제 35–41과 server.py·hooks/·docker/로, Laya를 실제 시스템의 부품으로 붙이는 지점들을 정리합니다.

예제 35–41약 6분 읽기

디바이스 선택과 지연 (예제 35)

device=None이면 CUDA → MPS → CPU 순으로 정하고, 명시적으로 "cpu"/"mps"/"cuda"를 줄 수도 있습니다. 정밀도는 디바이스별로 다르게 결정됩니다: MPS는 fp16 autocast(단, 행이 5개 미만인 배치는 fp32로 남는 게 이득 — mps_amp_min_rows), XPU는 bf16, CPU는 LAYA_CPU_AMP=bf16을 줄 때만 bf16. 예제는 CPU와 MPS에서 같은 multilingual 질문셋을 재고, 두 디바이스가 같은 답을 낸다를 검증으로 붙입니다. 절댓값이 아니라 비율을 읽으세요 — 첫 MPS 호출의 커널 컴파일은 timed()의 웜업이 이미 걸러냅니다.

처리량의 출구: 호출당 질문 수 (예제 36)

30개 상태 × 3질문 = 90개 답을 두 방식으로 재면, 한 질문에 한 호출(90호출)보다 세 질문을 묶은 호출(30호출)이 호출 자체를 3분의 1로 줄입니다. 상태 묶기 인자는 없고, 묶을 수 있는 건 질문입니다. 이길 곳은 커널 실행 수가 줄고 행렬이 채워지는 지점이지, 상태 인코딩 공유가 아닙니다(질문마다 상태를 다시 행으로 만듭니다).

긴 문서와 창 열기 (예제 37)

laya-multilingual의 기본은 max_len=1024, head_max_len=256. mmBERT는 RoPE 인코더로 8192까지 지원하므로 agent.cfg(그냥 dict)를 런타임에 올려 창을 벌릴 수 있고, 예제는 살아남는 문서가 커지는 것을 측정으로 보여줍니다. 잘리는 쪽이 상태 타입에서 나온다는 점도 중요합니다: 문자열/dict는 앞부분이 남고, 대화 리스트는 뒷부분이 남습니다(truncate_left=isinstance(state, list)). 잘림 보고는 언제나 usage에 있습니다.

체크포인트를 잇는 파이프라인 (예제 38)

route→ triage (english / multilingual)→ typed-decisions (전문가)→ 결정

한 호출은 한 체크포인트 × 한 질문셋입니다. 실제 트래픽이 순차 결정을 원하면 이렇게 잇습니다: ① Router가 값싼 라우팅 → ② triage_questions()를 언어에 맞는 체크포인트에서 → ③ 같은 상태를 typed-decisions에 넘겨 "에이전트가 뭘 해야 하나"를 받음(질문 id 시그니처가 customer_service 워크플로와 정확히 일치해서 라우터가 자동 선택). 일반 단계는 언어에 따라 체크포인트를 바꾸고, 전문가 단계는 안 바꿉니다.

실패의 실제 얼굴 (예제 39)

문서에 적힌 게 아니라 실행해서 확인한 동작들: Router의 model= 오타는 가중치를 하나도 로드하기 전에 ValueError, 존재하지 않는 로컬 경로는 FileNotFoundError, 빈 criteria choice는 모델 실행 전 ValueError, 옵션이 헤드를 넘치는 건 넘칠 때 ValueError. 그리고 함정 하나: P≈0.5의 noul은 평범한 정상 답으로 조용히 통과합니다 — 애매함은 에러가 아니라 정책 입력입니다.

캐시와 모니터, 그리고 대장정 (예제 40–41)

예제 40의 두 운영 패턴: ① 해시 키(state+질문 정의) 인메모리 답변 캐시 — 모델이 결정적이니 순전파는 한 번, ② answer_confidence로 배치 답변을 auto/review/escalate로 나누는 컨피던스 모니터.

예제 41은 여기서 만든 프로덕션 트리아주 서비스의 뼈대입니다. 라우팅(체크포인트 자동 선택) → 트리아주 질문셋 한 번 → 애플리케이션 정책이 확률을 동작으로 매핑(에스컬레이션/팀 라우팅/자동 응답)하고 구조화된 결정 레코드를 출력합니다. 레코드의 경계가 곧 설계 원칙입니다: routing과 answers는 Laya의 출력, decision은 우리 코드 — 임계값·팀 매핑·에스컬레이션 결정은 모델 출력이 아니라 애플리케이션 정책입니다.

서비스로 내놓는 세 가지 모양

🖥️ examples/server.py

단일 파일 HTTP 예측 API. --no-preload, --host/--port, curl 예시까지 그 파일 맨 위의 문서에 적혀 있습니다.

🪝 examples/hooks/

audit(결정 로깅), redact(추론 전 개인정보 제거), cache(히트 시 순전파 생략), otel(카운터·지연 히스토그램). 훅은 tests/test_hooks_api.py가 계약으로 보호하는 공개 API입니다.

🐳 examples/docker/

LAYA_DEVICE/LAYA_MODEL_PATH 환경 변수로 도커 안에서 같은 SDK 호출을 재현하는 퀵스타트.

41개 예제가 증명하는 건 하나입니다: Laya의 확률은 측정 가능하고, 결정은 조합 가능하며, 정책은 언제나 당신의 코드에 남습니다. 즐거운 라우팅하세요.

오픈소스를 한국어로 읽고 배웁니다.