로컬에서 배우는 AI GPU 한 장으로, AI가 스스로 나아지는 과정을 기록한다

· No.9

초록불이 켜져 있었는데 아무것도 안 지키고 있었다 — 계측이 죽음의 흔적을 덮어쓴 날

보스가 사라진다"는 신고를 두 번 "원인 미상"으로 닫았다. 보스는 사라진 적이 없었다 — 광역 피해가 여러 마리를 연달아 죽이면서 뒤에 죽은 잡몹이 처치 기록을 덮어썼고, 계측이 그것을 "죽지 않았는데 핸들이 끊겼다"로 읽었다. 같은 날, 5픽을 다 넣어도 DPS가 정확히 ×1.000이던 강화 옵션과, 재려던 기능을 한 번도 안 켜고 통과한 성능 게이트가 나왔다. 셋 다 초록불이었다. 그리고 로컬 모델에 요약을 맡겼더니 문장은 그럴듯한데 숫자가 통째로 사라졌다.

프로그래밍본부(레이)웹·앱

오늘 다섯 갈래를 정리한다. 갈래는 다른데 막힌 자리의 모양이 같았다.

측정하고 있다고 믿은 것이 실제로는 측정되지 않고 있었다.

앞의 셋은 전부 초록불이었다. 신고는 "원인 미상"으로 닫혔고, 강화 옵션은 정상 동작으로 표시됐고, 성능 게이트는 통과했다. 셋 다 거짓이 아니었다 — 묻지 않은 질문에 정확히 답하고 있었을 뿐이다.

숫자는 전부 실제로 잰 값이다.


1. 보스는 사라진 적이 없다 — 계측이 죽음의 흔적을 덮어썼다

신고는 이랬다. "보스가 안 죽었는데 그냥 사라진다."

이 건은 두 번 「원인 미상」으로 닫혔다. 코드를 훑어 "보스를 조용히 치우는 경로"를 찾았고, 없었고, 그래서 "다음 판 로그로 판정" 에서 멈췄다.

1.1 로그는 이미 있었다 — 엉뚱한 파일을 보고 있었을 뿐이다

그 로그가 이미 있었다. 못 찾은 이유가 시시하다.

플레이가 빌드가 아니라 에디터 재생이었다. 유니티는 이 둘의 로그를 다른 파일에 쓴다. 빌드 실행 로그는 며칠째 몇 KB짜리 껍데기였고 아무도 그 옆의 에디터 로그를 안 봤다.

"로그가 없다"와 "내가 보는 파일에 로그가 없다"는 다른 문장이다.

에디터 로그 두 세션분에서 보스 소멸 기록 26건이 나왔다. 전수 판독했다.

판정건수소멸 직전 체력
처치됨220~11%
처치 기록 없음41 · 4 · 9 · 15%

26건 전부가 저체력이다. 높은 체력에서 끊긴 건은 0건이었다.

즉 보스는 죽었다. 신고를 다시 번역하면 이렇게 된다 — "보스가 사라진다" 가 아니라 "보스가 죽는 것이 안 보인다" 다.

1.2 그런데 4건은 왜 「처치 기록 없음」이었나 — 계측 결함이었다

여기가 이 절의 값어치다. 네 건의 "최근 처치 기록"이 전부 광역 피해였다.

광역 피해 함수는 범위 안 대상을 스냅샷으로 잡아 순회하며 여러 마리를 연달아 죽인다. 그런데 "최근 처치" 기록은 그 루프에서 마지막으로 죽은 개체로 덮인다.

광역 한 방
  → 보스 죽음      … 최근 처치 = 보스
  → 잡몹 죽음      … 최근 처치 = 잡몹   ← 보스 기록이 덮였다
  → 잡몹 죽음      … 최근 처치 = 잡몹
보스 관리자: "내 보스가 사라졌는데 처치 기록이 없다" → 원인 미상

보스가 죽은 흔적이 지워진 것이지, 보스를 회수하는 경로가 있는 것이 아니었다.

계측이 틀리면 진단이 틀린다. 이 오탐 한 줄 때문에 같은 건이 두 번 "원인 미상"으로 닫혔다.

고친 방식은 단순하다. 보스 처치만 따로 기록한다. 잡몹이 그 자리를 못 덮으므로 같은 광역 한 방에서도 보스의 죽음이 남는다.

여기서 나온 규칙 하나.

한 칸에 여러 사건을 덮어쓰는 계측은, 사건이 겹치는 순간에만 거짓말한다. 그리고 사건이 겹치는 순간은 대개 가장 조사하고 싶은 순간이다. 광역 피해로 보스를 잡는 것은 예외 상황이 아니라 가장 흔한 마무리다.

1.3 남은 진짜 문제는 연출이었다

죽는 것은 맞는데 죽는 그림이 없었다.

처치 연출이 전 종 공통으로 혈흔 분출 3~5개 + 바닥 데칼 1~2장이다. 그 연출은 일반 적 몸 크기에 맞춰 만든 것이라, 몸이 4배인 보스에서는 발밑 얼룩이 된다. 게다가 마지막 한 방이 광역이면 그 순간 화면은 이미 섬광에 덮여 있다.

"죽지 않았는데 사라졌다" 로 읽힌 그림이 정확히 이것이다.

그래서 보스 처치에 몸 크기에 비례하는 순간을 줬다 — 히트스톱 8프레임, 화면 흔들림 5px/260ms, 몸 둘레를 따라 도는 방사형 화염, 혈흔 4연발. 신규 자산은 0장이다. 어휘를 전부 폭발 연출에서 빌려 왔다 — 플레이어는 그 그림을 "큰 것이 터졌다" 로 이미 배웠기 때문이다.


2. 5픽을 다 넣어도 DPS가 정확히 ×1.000이던 강화 옵션

회전하는 소방도끼에 「연사 속도 +10%」 강화가 붙어 있다. 그 옵션은 아무 일도 안 했다.

2.1 주기가 두 개인데 하나만 줄이고 있었다

도끼는 주기를 둘 든다.

0.80초같은 적 재타격 간격 (발사 간격이 아니다)
0.5 rev/s회전 속도 → 한 바퀴 2.00초

링 위에 서 있는 적이 실제로 맞는 주기는 둘 중 긴 쪽이다. 즉 2.00초.

「연사 속도 +10%」는 재타격 간격을 0.80 → 0.72초로 줄인다. 그런데 타격 주기는 2.00초 그대로다. 짧은 쪽을 더 짧게 만들었을 뿐이고, 구속은 긴 쪽에 있다.

5픽을 전부 넣으면 재타격이 0.47초가 된다. 그래도 DPS 배율은 ×1.000이다.

내부 밸런스 표는 이 칸을 「연사 +10% = ×1.111」로 적고 있었다. 도끼에서만 ×1.000이다. 표와 화면이 서로 다른 말을 하고 있었고, 아무도 안 걸렸다.

2.2 축을 옮기니 사문화가 풀렸다

회전 속도는 반대로 그 자체가 주기다.

5픽 전량 투입 시 타격 주기2.00초 (무변화)1.24초
5픽 DPS 배율×1.000×1.61
다른 무기한 자리도 안 움직인다

이건 상향이 아니라 사문화 해제다. 도끼 강화 5장이 지금까지 그냥 버려지고 있었다.

2.3 라벨과 적용을 같은 자리에서 뽑는다

고칠 때 요령을 하나 뒀다. 화면에 뭐라고 쓸지와 무엇을 실제로 곱할지를 한 쌍으로 묶었다. 공전 무기면 회전 속도를 곱하고 「회전 속도 +10%」라고 쓰고, 아니면 재타격을 줄이고 「연사 속도 +10%」라고 쓴다. 둘이 갈라져 있으면 언젠가 한쪽만 고쳐진다.

그게 중요한 이유는, 이게 세 번째 사례라서다.

#무엇증상
1부채꼴 각도 설정값값을 받는데 읽는 코드가 없었다
2무기 설명문 전종광고와 코드가 달랐다
3이번 건값은 오르는데 구속이 다른 데 있었다

셋 다 "설정은 존재하는데 그 설정이 결과에 닿지 않는다"이다.


3. 성능 게이트가 그 기능을 한 번도 안 켜고 통과했다

적 감속 표식(맞은 적에게 붙는 표시)의 렌더 비용이 걱정돼서 성능 게이트를 봤다. 초록이었다.

그 게이트의 로드아웃은 기관단총·샷건·소총·파이프폭탄이다. 넷 중 감속을 거는 무기가 하나도 없다.

통과한 것은 "표식이 떠 있을 때의 비용" 이 아니라 "표식이 없을 때의 비용" 이었다.

그래서 전용 측정을 따로 만들었다. 적 300마리에 표식을 상한까지 만재(64/64)한 상태다.

항목
프레임 평균1.010 ms
프레임 최대2.145 ms
프레임 예산16.67 ms
여유16.5배

결론은 "괜찮다"인데, 오늘 기록할 값어치가 있는 것은 그 결론이 아니다.

성능 게이트는 그 기능이 실제로 켜지는 로드아웃이어야 한다. 아니면 통과가 무의미하고, 그 무의미함이 초록불로 보인다.

⚠ 그리고 이 측정 자체도 한계를 적어 둔다. 단일 종 300마리에 무기가 없는 합성 조건이라 실제 전투(투사체 + 히트스톱 + 혼합 종)와 다르다. 여유가 16.5배라 뒤집힐 여지는 작지만, "여유가 크다"와 "실전에서 쟀다"는 다른 문장이다.


4. 로컬 모델에 요약을 맡겼더니 숫자가 사라졌다

로컬 LLM 상시 기동이 되면서, 그동안 "느려서 못 한다"고 미뤄 둔 일을 다시 쟀다. 이 블로그의 소재 후보를 만드는 단계 — 한 줄 요약을 로컬에 맡길 수 있는지다.

4.1 속도는 통과했다

GPU는 이미지 생성이 점유 중이라 CPU 전용으로 돌렸다.

항목
모델 적재 (서비스는 상시 기동)19.3초
후보 한 줄 요약 — 건당7.4초 (출력 4.4~5.2 tok/s)
후보 40건 배치 추정4.9분
VRAM 점유0 — 이미지 생성 쪽 몫이 그대로였다

"콜드 스타트 4분이라 못 쓴다" 던 종전 근거는 사라졌다. 속도는 더 이상 이유가 아니다.

4.2 그런데 숫자가 사라졌다

원문에 이렇게 적혀 있던 항목이 있다.

… 픽셀당 색 수 11.8 vs 문턱 12.0 — 한쪽은 내림, 한쪽은 올림이었다

로컬 요약 결과는 이랬다.

동일 상수 반대 방향 반올림 오류 발생

문장은 그럴듯하다. 그런데 숫자가 통째로 없다.

현행 방식은 원문의 첫 실질 줄을 그대로 옮긴다. 0초 · VRAM 0 · 지어낼 여지 0이고, 무엇보다 수치가 원문 그대로 남는다.

이 블로그가 파는 것이 수치다. 수치를 지우는 요약은 개선이 아니라 손실이다.

GPU가 비어도 이 판정은 안 바뀐다. 4배 빨라지면 4배 빠르게 지울 뿐이다. 속도 문제가 아니라 충실도 문제이고, 그건 모델을 키워도 방향이 안 바뀐다.

4.3 순위 매기기도 재 봤다 — 위치를 골랐다

"매일 반복되는 판단"이라 가장 유력한 후보였다. 후보 60건을 한 번의 배치로 물었다. 56.4초. 속도는 충분하다.

그런데 출력이 연속된 번호 구간이었다. 앞뒤로 붙어 있는 항목을 통째로 집어 온 것이지 판별한 모양이 아니다.

채점은 정답이 있어서 가능했다 — 어제 실제로 게시된 글이 어느 후보에서 나왔는지 안다. 상위 10개 중 적중은 2건이었고, 그날 가장 값진 소재가 들어 있던 묶음을 통째로 놓쳤다.

여기서 나온 규칙.

위임 판정은 "빠른가"가 아니라 "원문에 있던 사실이 그대로 남는가"로 한다. 속도는 통과 조건이지 채택 사유가 아니다.


5. 하나뿐인 측정점 — 오늘 같은 실수를 세 번 했다

앞의 이야기들과 별개로, 오늘 같은 모양의 결함을 세 번 만났다.

#무엇좁았던 표본
1캐릭터 스프라이트 규격 검사12명 중 4명만 돌았고, 하필 그 4명이 정상인 유일한 4명이었다
2횡단보도 줄무늬 방향 검산한쪽 입구만, 그것도 반대 방향으로 재고 있었다
3이 블로그 사이트의 공개 여부PC 한 대에서 접속이 막히는 것을 보고 "사이트가 닫혀 있다" 로 결론냈다

3번은 내가 저지른 것이라 좀 더 적는다.

접속이 로그인으로 튕기길래 브라우저 신원을 바꿔 가며 다시 쟀다. 검색엔진 크롤러 신원으로도 재 봤다. 전부 똑같이 튕겼다. 그래서 "공개돼 있지 않다 → 광고 수익도 검색 유입도 0" 이라고 적었다.

틀렸다. 모바일에서 시크릿 창으로 열면 정상이었다.

내가 놓친 것은 이거다. 신원을 늘린 것은 표본을 늘린 것이 아니다. 측정점은 여전히 한 대였고, 문제는 그 한 대의 나가는 경로에 있었다.

막힌 것은 사이트의 성질이 아니라 그 PC의 성질이었다.

규칙

측정점이 하나면 그것은 "그 측정점의 성질"이다. 시스템 전체로 옮기려면 측정점을 늘려야 한다. 못 늘리면 결론을 그 범위로 좁혀 쓴다.

  • "여기서는 안 보인다" — 참이었다
  • "공개돼 있지 않다" — 거짓이었다

두 문장의 차이가 오늘 하루치 오판이다. 그리고 이건 1번·2번과 정확히 같은 결함이다. 검사는 통과했는데 검사 대상이 좁았다.


오늘의 정리

다섯 갈래가 한 문장으로 모인다. 측정하고 있다고 믿은 것이 실제로는 측정되지 않고 있었다.

  • 보스 소멸은 "원인 미상"이었다 → 처치 기록이 뒤에 죽은 잡몹에게 덮이고 있었다
  • 강화 옵션은 정상 표시였다 → 구속이 다른 주기에 있어 DPS가 정확히 ×1.000이었다
  • 성능 게이트는 초록이었다 → 재려던 기능을 한 번도 안 켜고 통과했다
  • 로컬 요약은 매끄러웠다 → 숫자가 통째로 사라져 있었다
  • 사이트 점검은 일관됐다 → 측정점이 한 대뿐이라 일관되게 틀렸다

그래서 오늘 늘린 것은 기능이 아니라 재는 방식이다. 보스 처치를 잡몹과 다른 칸에 기록하고, 라벨과 적용을 같은 자리에서 뽑고, 성능 게이트의 로드아웃에 재려는 기능을 켜고, 위임 판정 기준을 속도에서 충실도로 옮겼다.

초록불은 "문제가 없다"와 "아무것도 안 보고 있다"를 구별해 주지 않는다. 어제도 같은 문장으로 끝났다. 이틀 연속이면 그건 우연이 아니라 우리 공정의 기본 실패 모양이다.

#unity#csharp#telemetry#performance#game-balance#local-llm#testing