서론
대학교 수업 녹음본을 Whisper로 받아쓰기(Transcription)하는 운용을 집에서 사용하는 Mac으로 진행하고 있습니다. 어느 날, 음성 파일 2개를 처리했는데, 순차적으로 진행했다면 60분 정도면 끝났을 작업이 **177분(2시간 57분)**이나 걸렸습니다. 원인은 2개를 **병렬 실행(Parallel Execution)**했기 때문입니다.
"병렬로 하면 빨라질 것이다"라는 직관이 실측 결과 정반대로 배신당한 기록입니다. 동일한 구성(Apple Silicon + MPS + Whisper 계열 모델)으로 받아쓰기를 하는 분들에게는 아마 그대로 도움이 될 것입니다.
하려고 했던 것
- 서로 다른 수업의 녹음본 2개를 받아쓰기하고 싶음
- 나의 의도는 "1개가 끝나면 다음 것"을 수행하는 순차 실행
- 실행은 Claude Code(AI 에이전트)에게 의뢰
여기서 저는 "순차적으로"라고 명시하지 않았습니다. 에이전트는 2개를 동시에 처리하기 시작했습니다. 악의도 오작동도 없었으며, 지시의 공백이 병렬로 채워졌을 뿐입니다.
실측
환경: Apple M4 / 통합 메모리 32GB / 10 코어 / Whisper large-v3 + MPS
| 실행 방식 | 소요 시간 | 처리 속도 |
|---|
| 순차 실행 (추정) | 약 60분 | 단독 실행 시 150~310 fps |
| 병렬 실행 (실측) | 177분 | 각 25 fps (합계 50 fps) |
단독으로라면 150310 fps가 나오는 처리가, 2개를 동시에 돌리니 각 25 fps까지 떨어졌습니다. 합쳐도 50 fps입니다. 병렬로 만든 순간, 시스템 전체의 처리량(Throughput)이 단독 실행의 1/31/6 수준이 되었습니다. "2개를 동시에 하니까 절반씩 나누어 갖는다" 수준조차 아닙니다.
왜 느려지는가
MPS(Apple Silicon의 GPU 백엔드)는 CUDA와 같은 병렬 스케줄링(Parallel Scheduling)에 강하지 않습니다. Whisper large-v3 급의 무거운 모델을 2개 동시에 돌리면, GPU 컴퓨팅(Compute) 경합으로 인해 사실상 직렬화(Serialization)되며, 여기에 전환 오버헤드(Overhead)까지 추가됩니다. 즉, "병렬"의 겉모습을 하고 있지만 실체는 "느린 순차 실행"이 됩니다.
반대로 말하면, 병렬화가 성립하는 조건도 명확합니다.
- 별도의 머신으로 분리 (호스트가 다르면 경합하지 않음)
- CPU 전용 모드라면 간섭은 없지만, 애초에 실용적인 속도가 나오지 않음
동일 호스트의 MPS 상에서 무거운 모델을 나열하는 구성만이 명확하게 손해입니다.
원인은 2가지였다
기술적인 원인은 위의 MPS 경합이지만, 돌이켜보니 또 다른 원인이 하나 더 있었습니다. 바로 "순차적으로"라고 쓰지 않은 나의 프롬프트(Prompt) 부족입니다.
AI 에이전트는 지시에 적혀 있지 않은 실행 전략을 스스로 채워 넣습니다. 실행 순서가 결과(이번 경우에는 소요 시간)에 영향을 미치는데 이를 지정하지 않는다면, 에이전트가 채우는 방식이 나의 의도와 일치한다는 보장이 없습니다. 이번 교훈은 "병렬은 느리다"뿐만 아니라, "순서가 중요하다면, 순서는 지시에 적는다"였습니다.
재발 방지
대책은 CLAUDE.md(에이전트가 매번 읽는 설정 파일)에 한 줄을 추가하는 것입니다.
여러 음성은 순차 실행(&& 연결). 병렬은 MPS 경합으로 약 3배 느림 (60→177분)
포인트는 재발 방지를 "내가 기억한다"가 아니라 "AI가 반드시 읽는 장소에 실측값과 함께 둔다"로 정한 것입니다. 숫자가 적혀 있으면, 미래의 나(와 AI)가 "이번에는 병렬로 해도 되지 않을까"라고 재검토할 때 판단 근거가 됩니다.
운용 측면에서는 한 가지 더, 자동화 스크립트를 통한 실행과 수동 실행이 겹치면 의도치 않게 병렬 상태가 되기 때문에, "수동으로 실행할 때는 자동화 측이 돌아가고 있지 않은지 확인한다"도 세트로 규칙화했습니다.
요약
- Apple Silicon (MPS) 상에서 Whisper large-v3를 2개 병렬 실행 → 실측 60분 상당이 177분(약 3배)
- MPS는 병렬 스케줄링에 약하며, 무거운 모델의 병렬 실행은 사실상 직렬화 + 경합 오버헤드 발생
- 원인은 기술적 요인(MPS 경합)과 프롬프트(순서를 명시하지 않음) 두 가지
- 재발 방지는 "AI가 반드시 읽는 장소에 실측값과 함께 한 줄 적기"
병렬화가 항상 빠른 것은 아닙니다. 직관적으로 나열하기 전에 실측해 보고, 결과가 나쁘다면 재발 방지 규칙을 (AI가 읽는 장소에) 남겨두어야 한다고 생각합니다.
Discussion