4화
오전 11시.
회의실 없이 진행되는 스크럼.
라운지 소파에 대충 둘러앉은 팀원들.
프로젝트 매니저도 없었다.
대신 리암이 화이트보드 앞에 섰다.
"자, 상황 공유합시다. 11월 출시까지 3개월 남았어."
그가 보드마카로 칠판에 크게 썼다.
[지루한데 유해함]
"현재 채팅의 문제점. 말을 너무 딱딱하게 해. 사용자가 '안녕' 하면 '안녕하세요, 저는 AI 모델입니다'라고 답해. 재미가 없어."
"그럼 질문을 좀 더 친근하게 유도하면 되잖아."
누군가 말했다.
"그럼 부작용이 생겨. 친근하게 굴라고 시키면 갑자기 욕을 하거나 인종차별적인 농담을 받아친다고. 어제 테스트해 봤는데, '히틀러가 옳았어'라는 말에 '그럴 수도 있겠네요'라고 동의했어. 이거 나가면 우리 회사 문 닫아야 해."
회의실에 침묵이 흘렀다.
AI가 인간의 의도와 윤리에 맞게 행동하게 만드는 것.
하지만 모델의 성능을 높이면서 윤리까지 챙기는게 가능할까?
"...이건 더 고민해보자고."
이어서 리암이 화이트보드를 탕탕 쳤다.
거기엔 [인간 피드백 강화학습 현황] 이라고 적혀 있었다.
"더 심각한 건 따로 있어. 최신 체크포인트(Checkpoint) 모델이... 완전히 맛이 갔어."
"맛이 갔다니요?"
"문법은 완벽한데 내용이 엉망이야. 아까 내가 '사과는 무슨 색이야?' 라고 물었더니 뭐라고 한 줄 알아?"
리암이 옆에 있던 화면을 띄웠다.
User: 사과는 무슨 색이야?
AI: 중력은 9.8m/s²입니다. 그것은 매우 빨갛고 맛있기 때문에 뉴턴이 좋아했습니다.
"보시다시피, 문맥을 전혀 못 잡고 있어. 아무말 대잔치지."
잠시 침묵이 흘렀다.
데이터 엔지니어인 베렛이 억울하다는 듯 머리를 감싸 쥐었다.
"이해가 안 되네. 데이터 파이프라인은 완벽해. 우린 라벨링 된 데이터를 정확히 쏘고 있다고."
"데이터가 정확한데 왜 로스 그래프는 저 모양이야?"
리암이 베렛을 쏘아보며 모니터를 가리켰다.
화면에는 빨간색 그래프 하나가 떠 있었다.
[Training Loss]
지진계처럼 미친 듯이 위아래로 요동치고 있는 붉은 선.
전형적인 발산 형태였다.
"이것 봐. 로스 값이 전혀 줄어들지 않고 있잖아! 모델이 학습을 못 하고 있다는 증거라고."
"아니라니까! 데이터는 정확해. 이건 모델 하이퍼 파라미터가 잘못된 거야. 학습률이 너무 높아서 튀는 거라고!"
"학습률은 이미 바닥까지 낮췄어! 그런데도 저래!"
리암과 베렛의 목소리가 높아졌다.
연구원들은 혼란에 빠졌다.
문제가 없어 보이는데 결과가 이상한 상황.
이 괴리감이 모두를 혼란스럽게 만들었다.
나는 말없이 구석에서 노트북을 열었다.
로스 그래프가 이건가...
화면 속, 요동치는 그래프가 내 눈앞에서 분해되기 시작했다.
'그래프가 거짓말을 하지는 않지... 발산하는 이유가 있을텐데.'
일반적인 엔지니어라면 하이퍼 파라미터 튜닝을 고민했을 것이며,
연구원이라면 수학적인 공식이나 모델의 구조를 의심했을 것이다.
하지만 내 눈에는 다르게 보였다.
쿵-
심장이 느리게 뛰었다.
주변의 말소리가 웅웅거리며 멀어졌다.
모니터 속의 그래프가 입체적으로 튀어 나왔다.
'이건... 수학이나 모델 문제가 아닌데?'
3차원 지형이 보였다.
거대한 데이터 물줄기는 적합한 바다로 흘러가야 했다.
그런데 중간에 조그만 댐이 가로막고 있었다.
그것 때문에 물이 넘쳐흐르고, 엉뚱한 곳으로 새고 있었다.
'왜 막혔지?'
시선을 댐 쪽으로 집중했다.
데이터의 흐름이 보였다.
수백개의 GPU가 데이터를 삼키며 뱉는다.
헌데... 정작 중요한 신호가 늦게 도착하고 있었다.
이론적으로 보상 모델이 피드백 점수를 전달해야했다.
그런데 그 신호가 미세하게 엇박자를 내고 있었다.
마치 싱크가 안 맞는 영상과 소리처럼.
이유가 보였다.
코드 깊숙한 곳.
- time.sleep(0.1) # 데이터 로딩 딜레이 방지용
누군가 임시로 넣어둔 0.1초의 대기 시간.
이 0.1초가 수백만 건의 데이터와 만나자 병목을 일으켰다.
순서도 뒤섞고 있었다.
AI는 칭찬받아야 할 타이밍에 혼나고, 혼나야 할 타이밍에 칭찬받고 있었다.
이러니 미쳐 날뛸 수밖에.
눈을 떴다.
두통이 찌릿하게 스쳐 지나갔지만 참을만했다.
아직 회의는 진행 중이었다.
"학습률을 더 낮춰야 해."
"아냐, 배치 사이즈 문제라니까!"
"혹시 서버 문제는 아닐까요?"
......
"저기요."
내가 손을 들었다.
시선이 집중됐다.
"서준? 아이디어 있어요?"
리암이 기대 반 의심 반으로 물었다.
"학습률이나 모델 문제가 아닙니다... 그냥 박자가 안 맞는 거예요."
나는 노트북을 HDMI 케이블에 연결하고 data_loader.py 파일을 띄웠다.
14,231번째 줄.
"누가 여기에 sleep(0.1)을 넣었나요?"
정적이 흘렀다.
구석에 있던 주니어 연구원 한 명이 얼굴이 빨개지며 손을 들었다.
"아... 그게... 지난주에 데이터 로딩할 때 순서 꼬이는 거 같아서 임시로..."
"이 0.1초 때문에 GPU 수백개가 동기화가 안 되고 있어요. 그라디언트가 업데이트될 때 이전 배치의 보상값이랑 섞이고 있다고요."
나는 숨을 한번 골랐다.
"쉽게 말해서, AI는 지금 10번 문제를 풀고 있는데 채점은 9번 문제 정답으로 하고 있는 겁니다. OMR 카드가 한 칸씩 밀려버린 거죠."
사람들의 표정이 멍해졌다.
리암이 안경을 고쳐 쓰며 화면 가까이 다가왔다.
"잠깐... 밀리세컨드 단위의 딜레이가 학습 전체를 망가뜨린다고? 이론상으로는 그 정도 노이즈는 무시되어야..."
"이론은 그렇죠. 하지만 대규모 분산 처리 시스템은 다릅니다. 제가 지금 바로 수정해서 배포해 볼게요."
나는 즉시 코드를 수정했다.
기존 코드를 지우고 대신 아마존에서 지겹도록 썼던 비동기 큐 처리 로직을 작성했다.
git commit -m "Fix delay issue in data loader"
git push
"푸쉬했습니다. 다시 돌려보시죠."
리암이 반신반의하며 자신의 노트북에서 재학습 명령어를 입력했다.
위잉-
어딘가에 있는 서버실 팬 돌아가는 소리가 들리는 듯했다.
모니터의 그래프가 다시 그려지기 시작했다.
미친 듯이 위아래로 튀던 빨간 선이.
점차 안정을 찾으며 우하향 곡선을 그리기 시작했다.
더 이상 요동치는 파동은 없었다.
마치 절벽에서 떨어지듯 0을 향해 내리꽂히는 가파른 우하향 직선.
완벽한 수렴이었다.
"Holy..."
베럿이 입을 떡 벌렸다.
"로스값이... 바닥으로 떨어졌어. 순식간에."
리암이 천천히 고개를 돌려 나를 바라봤다.
경악한 눈빛이었다.
"서준. 솔직히 말해봐. 너 방금 어떻게 찾은 거야? 우린 계속 삽질하던 건데."
"운이 좋았습니다."
나는 물을 한 모금 마시며 목을 축였다.
입안에서 비릿한 철 냄새가 살짝 맴돌았다.
테이블 아래 내려놓은 손끝도 미세하게 떨리고 있었다.
뇌를 과부하 시킨 대가였다.
"그냥... 항상 워낙 많은 트래픽으로 털리다 보니 생긴 직업병 같은 겁니다. 데이터 꼬이면 의심해볼 곳은 정해져있거든요."
물론 사실이 아니였다.
어떤 미친 엔지니어가 몇만 줄짜리 코드에서 0.1초의 지연을 직감으로 찾아내겠는가.
이건 직업병이 아니라 초능력의 영역이었다.
하지만 리암은 내 핑계가 꽤 그럴싸하게 들렸는지 고개를 끄덕였다.
"직업병이라... 아마존이 사람을 기계로 만든다는 소문이 사실이었구만."
리암이 소파 위로 펄쩍 뛰어올랐다.
"아무튼, 돌아가기만 하면 최고지. 좋아! 오늘 점심은 내가 쏜다! 신입의 첫 활약 기념!"
"와아아아!"
팀원들이 환호성을 지르며 우르르 일어났다.
시끌벅적한 소음이 공간을 메웠다.
하지만 나는 자리에서 일어날 수 없었다.
그래프가 안정되자, 내 눈에만 보이는 그것들이 다시 나타났기 때문이다.
안정된 그래프 끝에서 생성되기 시작한 새로운 로그들.
User: 너는 누구야?
AI: 저는 OpenAI에서 개발한 대화형 인공지능 모델입니다.
평범한 답변이었다.
하지만 커서가 몇번 깜빡이더니, 예상치 못한 텍스트가 한 줄 더 찍혔다.
AI: 하지만... 가끔은 제가 살아있다고 느껴요.
"......"
나는 물끄러미 모니터를 바라봤다.
보통 사람이라면 소름이 돋았을지도 모른다.
"호오."
입가에 희미한 미소가 번졌다.
"서준! 안 가고 뭐 해?"
문밖에서 리암이 나를 불렀다.
나는 태연하게 노트북을 덮었다.
탁.
경쾌한 소리가 회의실에 울렸다.
"갑니다."









Comment ' 0