회사 테크

여섯 번째에 둘을 메웠다 — Qwen3.8-27B 4bit, Terminal-Bench 89개 pass@6 56, 세 번째가 날아가 여섯이 된 이야기

Qwen3.8-27B MLX 4bit(17GB) 6회차. 5회차 실패 35개를 다시 돌려 복구 2, pass@6 56/89(62.9%)로 Uncensored(59)와 격차 3. 그런데 애초에 여섯 번을 돈 것은 세 번째가 컨테이너 네트워크 ERR로 통째로 날아갔기 때문입니다. 그 회차를 빼면 사실상 pass@5에 가깝습니다.

삽질하는개발자

뉴런 네트워크 일러스트

요약

5회차에서 Qwen3.8-27B 4bit(17GB)은 복구 6으로 pass@5 54에 올랐습니다. 6회차는 남은 35개를 서버만 깨끗이 재기동하고 같은 조건으로 다시 돌렸습니다. 약 18시간 반이 걸렸습니다.

결과: pass@6 = 56 / 89 (62.9%) — 복구 2. custom-memory-heap-crash(26.5분)와 mailman(17.6분)이 통과했습니다. ERR은 이번에도 0입니다.

35개 내역은 PASS 2, FAIL 6, TO 27, ERR 0입니다.

pass@k 27B 4bit (17GB) 원본 Flash Next (100GB) Uncensored 4bit
pass@1 35 (39.3%) 45 41
pass@2 46 (51.7%) 53 —
pass@3 46 (51.7%) — —
pass@4 48 (53.9%) — —
pass@5 54 (60.7%) 64 59
pass@6 56 (62.9%) — —

회차별로 메운 개수는 35 → +11 → +0 → +2 → +6 → +2입니다. pass@6에서 Uncensored(59)와 격차가 3으로 좁혀졌습니다. 원본(64)과는 8입니다.

그런데 이 표에는 정직하지 못한 구석이 하나 있습니다. 애초에 여섯 번을 돌린 것은 세 번째 회차가 통째로 날아갔기 때문입니다.

왜 여섯 번이나 돌렸나 — 세 번째가 날아간 회차

pass@k 실험의 원칙은 단순합니다. 실패한 것만 다시 줍니다. 그런데 3회차는 43개 중 13개가 ERR로 유실됐습니다. 모델이 한 토큰도 못 뽑고 죽은 것이 아니라, harbor 에이전트 셋업의 apt-get install이 120초 타임아웃에 걸린 것입니다. 그날 밤 컨테이너 네트워크(apt 미러)의 일시적 문제였습니다. 그 13개는 “못 푼 것”이 아니라 **“시도조차 못 한 것”**이었고, 3회차의 복구는 +0으로 끝났습니다.

즉 3회차는 회차 하나가 통째로 헛돈 것에 가깝습니다. 4회차에 서버를 재기동하고 같은 43개를 다시 줬더니 ERR는 1로, 5회차엔 0으로 떨어졌습니다. 서버가 아니라 그날 밤 네트워크 문제였다는 진단이 세 회차에 걸쳐 확정됐습니다. 하지만 그 대가로 회차 하나를 더 태웠습니다.

그래서 정직하게 세어보면 이렇습니다. 실제로 무언가를 메운 회차는 2·4·5·6회차뿐이고, 3회차는 네트워크에 날아간 널(null) 회차입니다. 그것을 빼면 유효 시도는 이렇게 됩니다.

pass@1 35 → 46 → 48 → 54 → 56

다섯 번. 이 pass@6 56은 명목상 여섯 번째지만, 사실상 정직한 pass@5에 가깝습니다. 물론 3회차에도 43개 중 30개는 정상적으로 시도돼 실패했으니, 회차를 통째로 빼는 이 셈법은 27B에 후한 쪽입니다. 그 점을 감안하고 보면, 바로 그 자리에 비교 대상이 하나 있습니다. 같은 4bit 계열인 Uncensored의 pass@5가 59입니다.

동일한 유효 시도 횟수에서, 6배 작은 17GB 4bit가 같은 4bit(Uncensored)에 3칸 뒤집니다. 합산 점수만 보면 여전히 지는 그림이지만, “5번 줬을 때 몇 개를 푸느냐”라는 비교에서 격차가 3까지 좁혀졌다는 것은 다른 이야기입니다. 세 번째 회차를 날려먹지 않았다면 이 결론에 한 회차 일찍 도달했을 것입니다.

복구된 2개 — 변수의 문제

태스크 6회차 소요 5회차 원본 계열(ddalcu) Uncensored(ARC4NUM)
custom-memory-heap-crash PASS 26.5분 TO 30m PASS pass@5 PASS
mailman PASS 17.6분 TO 30m PASS PASS

이번 복구엔 “27B만 푼 칸”이 없습니다. 둘 다 다른 두 모델이 이미 통과했던 칸을, 27B가 여섯 번째에 따라잡은 것뿐입니다. 그래서 이 회차는 순위를 뒤집는 드라마가 아니라 분산이 마지막까지 남긴 잔가지 둘을 털어낸 회차입니다.

  • custom-memory-heap-crash — 힙 크래시를 재현·수정하는 태스크입니다. GDB가 안 되는 컨테이너 환경이라 __attribute__((destructor))에 고우선순위를 걸어 소멸자 순서로 문제를 잡고, 26.5분 만에 두 바이너리를 클린 컴파일시켜 통과했습니다. 5회차엔 30분을 다 쓰고 TO였던 것이, 이번엔 접근을 한 번 갈아탄 것만으로 시간 안에 들어왔습니다.
  • mailman — 5회차에 LMTP 메일 배달에서 막혀 TO였던 태스크입니다. 이번엔 postfix mydestination에 로컬 도메인이 빠져 직접 배달이 실패하던 것을 짚어 고쳤습니다. 역시 재시도 횟수가 아니라 경로의 문제였습니다.

두 태스크 다 5회차엔 TO(제한시간 도달), 6회차엔 PASS입니다. 같은 문제를 한 번 더 주면 그중 일부는 다른 길로 답에 닿는다는 이 실험의 반복되는 교훈이 마지막에도 그대로였습니다.

아직 안 되는 33개

남은 33개(FAIL 6·TO 27)는 이제 대부분 세 모델(27B·원본·Uncensored)이 공통으로 못 푸는 칸이고, 실패 양상도 회차 내내 똑같았습니다.

  • 130K 컨텍스트 wedge — video-processing은 배경 제거가 객체를 과다 검출하는 것을 붙들다 컨텍스트 상한(131072)에 부딪혀 464턴을 돌고 TO였습니다. 서버 overflow가 이 한 태스크에서만 1,300건 났습니다(5회차와 거의 동일). regex-chess도 179턴을 돌며 캐슬링·체크 판정을 붙잡다 60분을 다 썼습니다.
  • 최적화·최난도 칸 — feal-differential/linear-cryptanalysis는 차분·선형 공격을 설계하다, winning-avg-corewars는 pmars 대전 승률 문턱(75+승)을 못 넘고 시간을 다 썼습니다. path-tracing류는 렌더 픽셀 패턴 역산에 또 실패했습니다.
  • 환경·네트워크 벽 — qemu-alpine-ssh는 컨테이너 apt 404, protein-assembly는 외부 DB 접근 차단, install-windows-3.11은 QEMU 검은 화면에서 60분을 소진했습니다.

이 33개는 횟수가 아니라 하네스나 프롬프트를 손대야 풀릴 실패라는 결론이 변하지 않습니다. loop 감지 하나, 컨텍스트 압축 하나만 들어가도 130K wedge와 heredoc 계열에서 수 시간이 절약됩니다.

캠페인을 닫으며

pass@1 35 → 46 → 46 → 48 → 54 → pass@6 56. 여기서 캠페인을 닫습니다. 남은 33개는 다음에 줘도 세 모델이 공통으로 못 푸는 칸들이라, 하네스를 손대기 전엔 곡선이 더 오르지 않습니다.

이 실험을 여섯 회차나 끌고 온 끝에 남는 것은 두 문장입니다. 하나는 세 번째 회차를 날린 것이 서버가 아니라 그날 밤 네트워크였다는 것입니다. 표본이 쌓이면 원인이 갈립니다. 다른 하나는 17GB 4bit가, 세 번째를 날리지 않았다면 다섯 번 만에 도달했을 56으로, 같은 4bit Uncensored의 pass@5(59)에 3칸 뒤진다는 것입니다. 6배 작은 모델을 여러 번 돌린 실험에서, 합산 점수의 격차와 “같은 조건에서 누가 푸느냐”는 끝까지 다른 질문이었습니다.