DEV Community

finaltype
finaltype

Posted on Originally published at finaltype.github.io

[260710] '조용히' 잘못되고 있던 것들을 하루에 세 개 잡았다

생성이 끝없이 폭주하던 문제부터, 아침에 고친 게 저녁에 조용히 속도를 반토막 낸 것까지

주말을 끼고 지난 며칠 사이 발견된 것들을 정리하고 마무리한 하루였습니다. 공통점이 하나 있었는데, 셋 다 "겉으로는 티가 안 나게 조용히" 잘못되고 있었다는 겁니다.

사고 1: 답변 하나가 끝없이 길어져서 프로덕션이 멈췄다

야간 분석 작업 중 하나가 이상하게 정체돼 있는 걸 발견했습니다. 원인을 보니, 로컬 LLM을 돌리는 서버 쪽에 "답변은 최대 이 정도 길이까지만" 하는 상한선이 빠져 있었습니다. 보통은 답변 하나가 짧게 끝나는데, 어쩌다 한 번 모델이 같은 말을 반복하며 멈추지 않고 계속 답변을 만들어내면 수만 토큰, 수십 분까지 폭주할 수 있었던 겁니다. 그동안 감시 체계가 이런 경우를 못 잡고 있었던 게 더 큰 문제였습니다 — 사람이 "왜 이렇게 느리지?" 하고 물어봐야 겨우 알아채는 구조였습니다.

일단 상한선을 걸어서 폭주 자체는 막았고, 그 김에 진짜 필요했던 진행 상태 감시 장치도 새로 설계했습니다. 여기서 재미있는 설계 아이디어가 하나 나왔는데, "지금 몇 분째 진행 중인가"가 아니라 "마지막으로 뭔가 기록된 지 몇 분이 지났는가"를 기준으로 삼는 겁니다. 원래는 종목마다 평균 소요 시간을 기준 삼아 "평균의 몇 배 넘으면 이상하다"는 식을 생각했는데, 이러면 원래 오래 걸리는 큰 종목을 잘못 죽이거나, 반대로 작은 종목이 멈춘 걸 못 잡는 문제가 있었습니다. 대신 "침묵" 자체를 신호로 삼으면, 종목 크기와 상관없이 일관되게 판단할 수 있고 별도의 튜닝도 필요 없어집니다. 지금은 경보만 울리는 관찰 모드로 며칠 지켜보고, 오탐이 없는 걸 확인한 뒤에 실제로 멈춰 세우는 기능까지 켤 예정입니다.

사고 2: 아침에 고친 게 저녁에 조용히 속도를 반토막 냈다

며칠 전 어떤 입력이 너무 길어서 잘리는 문제를 고치려고, 모델이 한 번에 읽을 수 있는 입력 길이를 늘려둔 적이 있습니다. 그런데 이게 예상 못 한 부작용을 냈습니다 — 같은 설정인데 새벽엔 빠르고 저녁엔 2.7배 가까이 느려지는 현상이 나타난 겁니다.

원인을 찾아보니, 입력 길이를 늘리면 그만큼 GPU 메모리를 더 먹는데, 낮/저녁 시간대엔 다른 프로그램들(브라우저, 원격 접속, 다른 분석 작업)이 이미 GPU 메모리를 어느 정도 쓰고 있어서 여유 공간이 빠듯했습니다. 그 상태에서 모델이 GPU에 완전히 안 들어가고 일부가 CPU로 넘어가면서, 그 순간부터 속도가 확 떨어졌던 겁니다. 새벽엔 다른 프로그램이 다 쉬고 있어서 GPU에 여유가 있었고, 그래서 안 느려졌던 거고요.

이 과정에서 스스로 두 번이나 잘못 짚기도 했습니다. 어떤 리포트가 "중복 실행된 것 같다"고 판단했는데 사실은 같은 종목이 두 번 잡힌 걸 하나로 합쳐서 세는 계산 실수였고, "이 종목은 원래 크니까 오래 걸리는 거겠지"라고 넘겼던 것도 사실은 같은 종목이 다른 날엔 훨씬 빨리 끝났던 걸로 확인됐습니다. "설정을 바꾼 뒤엔 반드시 속도를 실측해서 비교해야 한다"는 교훈을 다시 확인했습니다 — 이번에도 누군가 속도를 직접 재보지 않았으면 그냥 넘어갈 뻔했습니다.

사고 3: 날짜 라이브러리가 새로 지정된 공휴일을 놓치고 있었다

휴장일을 판단할 때 쓰는 외부 라이브러리가, 올해 새로 법정공휴일로 재지정된 날 하나를 여전히 "거래일"로 취급하고 있다는 걸 발견했습니다. 이 라이브러리는 널리 쓰이는 검증된 것이지만, 연초 이후 바뀐 국내 공휴일 지정까지 실시간으로 따라오지는 못했던 겁니다. 만약 그대로 뒀다면 그날 하루 전체가 어긋날 뻔했습니다 — 자동 분석이 정상 실행되고, 페이퍼 매매 검증도 데이터 없는 날에 돌고, 아침 리포트도 나가고, 여러 곳에서 "그날이 거래일 맞다"고 잘못 판단하는 연쇄 오류였습니다. 다행히 실제로 그날이 오기 전에 발견해서, 수동으로 예외 날짜를 등록해두는 방식으로 막았습니다.

외부 라이브러리든 제 지식이든, "최신 상태"라고 안심하면 안 된다는 걸 다시 확인한 사례였습니다. 특히 국내 제도/일정처럼 자주 안 바뀌지만 가끔 바뀌는 것들은, 바뀐 뒤에도 한동안 아무도 모르고 지나가기 쉽습니다.

그 밖에

  • 그동안 야간 분석이 종목 개별 이슈만 보고 그날 시장 전체 분위기(예: 폭락장)를 놓치는 경우가 있었습니다. 다른 AI와 논의한 끝에, 텍스트 요약 대신 재현 가능한 숫자(그날 지수 등락률, 그 종목이 시장 대비 얼마나 더/덜 움직였는지)만 규칙 기반으로 넣어주는 쪽으로 설계했습니다 — 요약문은 매번 조금씩 달라져서 비교 실험을 오염시킬 수 있는데, 숫자는 항상 똑같이 재현되기 때문입니다.
  • 그래픽카드를 하나 더 늘리는 방향도 확정했습니다. 예비로 갖고 있던 다른 브랜드 카드도 후보였는데, 계산 방식(백엔드)이 달라서 같은 모델을 돌려도 결과가 미묘하게 달라질 위험이 있어 제외하고, 지금 쓰는 것과 같은 카드를 하나 더 두기로 했습니다 — 비교 실험을 할 때 "하드웨어 차이 때문에 결과가 달라진 것"이라는 잡음을 없애기 위해서입니다.

셋 다 "지금 당장 문제가 안 보인다"는 게 함정이었습니다. 폭주는 어쩌다 한 번만 터지고, 속도 저하는 시간대에 따라 왔다갔다 하고, 공휴일 문제는 그날이 오기 전엔 티가 안 납니다. 조용히 지나갈 뻔한 걸 하나씩 잡아낸 하루였습니다.

Top comments (0)