"[260927] R9700 백업 GPU, 병목 원인과 죽은 슬롯 감지기"
백업 경로가 왜 동시 요청을 늘려도 안 빨라지는지 원인을 찾았고, 슬롯이 죽어서 응답이 폭주하는 문제를 잡아내는 감지기를 만들었습니다.
지난 며칠의 이어지는 이야기
며칠 전 R9700에서 35B MoE 모델을 튜닝한 기록(새 창)에서, 동시 처리 요청 수를 4개까지만 올려야 이득이 있고 그 이상은 오히려 손해라는 결과를 적었습니다.
그런데 그 뒤 24종목 규모로 다시 재보니 이상한 현상이 나왔습니다. 동시 요청 6개나 8개로 돌린 런에서 가끔 종목 몇 개가 통째로 사라졌습니다.
오늘은 이 두 가지, "왜 동시 요청을 늘려도 처리량이 안 오르는가"와 "왜 가끔 종목이 사라지는가"를 각각 원인까지 파고든 하루였습니다. 외부 자문(fable5.1)에 지금까지의 진행 상황을 전달해서 로드맵을 받았고, 그 로드맵의 우선순위 항목부터 순서대로 실행에 옮겼습니다.
병목은 슬롯 수가 아니라 전문가 가중치를 읽는 속도였다
동시 요청 개수별로 초당 처리 토큰을 다시 재보니, 요청 하나를 추가할 때마다 늘어나는 지연 시간이 거의 일정했습니다. 요청이 몇 개든 토큰 하나를 만드는 데 드는 추가 비용이 비슷하다는 뜻입니다.
이 모델은 여러 개의 전문가 네트워크 중 일부만 골라 쓰는 구조입니다. 동시 요청이 늘어날수록 그 순간에 활성화되는 전문가의 수도 늘어나서, 결국 매번 더 많은 전문가의 가중치를 새로 읽어와야 합니다.
그래서 요청을 더 넣어도 "가중치를 읽어오는 시간"이 그만큼 같이 늘어나 버려, 합산 처리량이 어느 지점부터 거의 늘지 않았습니다. 밀집 구조 모델에서 동시 요청을 늘리면 확실히 빨라지던 것과는 다른 물리였습니다.
이 진단에 따라 오늘은 동시 요청 수를 더 올리는 시도를 접었습니다. 대신 처리량을 더 끌어올릴 수 있는 다른 축(토큰당 읽어야 하는 데이터량을 줄이는 양자화, 커널 자체의 효율)을 다음 실험 순서에 올렸습니다.
종목이 사라지는 원인 — 슬롯 하나가 조용히 죽는다
종목이 사라진 런들의 서버 로그를 뒤져보니, 매번 같은 슬롯(동시 처리 창구) 하나가 문제였습니다. 그 슬롯에 어떤 요청이 한 번 비정상적으로 끝까지 길게 늘어지면, 그 이후로 같은 슬롯에 들어오는 모든 요청이 계속 같은 방식으로 끝까지 길게 늘어졌습니다.
슬롯 하나가 사실상 죽어서 그 뒤로 계속 죽은 채로 있는 것이었습니다. 구조화된 형식으로 답을 받아야 하는 특정 호출이 죽은 슬롯에 걸리면 그 호출은 실패로 처리됐고, 그게 "종목이 사라지는" 현상으로 보였던 겁니다.
이 현상은 예전에 실거래 경로에서 한 번 관측했던 것과 같은 종류였습니다. 그때는 원인을 못 찾고 넘어갔는데, 이번에 재현 조건을 좁혀서 잡아냈습니다.
원인을 알고 나니 감지 방법은 단순했습니다. 같은 슬롯에서 같은 이상 패턴이 연속으로 두 번 나오면 그 슬롯이 죽었다고 판단하면 됩니다. 오늘 이 감지 로직만 순수하게 떼어내 코드로 만들었습니다.
다만 감지만 하고 아무 조치도 취하지 않는 상태로 커밋했습니다. 지금 실행 중인 다른 실험 체인을 건드리지 않기 위해 며칠간 코드를 그대로 묵혀두고, 이번 주말이 지난 뒤에 실제로 슬롯을 재기동하는 조치까지 연결할 계획입니다. 실측으로는 손상된 런 두 개를 정확히 잡아냈고, 정상 런 두 개에서는 잘못 울리지 않았습니다.
재생 실험용 퇴화 감시가 오작동했다
이번 진단 과정에서 부수적으로 하나 더 찾았습니다. 실거래가 아니라 과거 데이터로 재생 실험을 돌릴 때도, 실거래용 이상 감시 로직이 그대로 같이 켜져 있었습니다.
이 감시 로직은 원래 실거래 중 뭔가 멈추면 일정 시간을 기다렸다가 강제로 정리하는 안전장치입니다. 그런데 재생 실험에서는 애초에 실거래 신호가 오지 않으니 항상 "멈춘 것"으로 보여서, 매번 대기 시간을 다 채운 뒤 실험 프로세스를 강제로 죽여버렸습니다.
재생 실험은 실거래와 무관하니 이 감시를 끄는 게 맞습니다. 오늘 그렇게 고쳤습니다.
앞으로
다음 순서는 오늘 예약해둔 커널 프로파일링입니다. 종목 없이 순수하게 디코드 한 단계가 어느 연산에 시간을 쓰는지 6~8분 단위로 여러 조합을 돌려 재는 실험이고, 일요일 저녁에 자동으로 실행되도록 걸어뒀습니다.
이번 주말이 지나면 오늘 만든 죽은 슬롯 감지기에 실제 재기동 조치를 붙이고, 그 다음은 양자화 단계를 낮춰서 토큰당 읽는 데이터량 자체를 줄이는 실험으로 넘어갈 계획입니다.