6화: 일곱 판

준은 마지막 회선을 자기 눈으로 끊는 것을 보고 싶어 했다.

페페는 아일랜드의 지휘석에서 건너편을 보고 있었다. 숫자가 21:40:00을 막 넘긴 때였다. 퍼시픽의 지휘석에는 화면이 하나 켜져 있었다. 퍼시픽 본거지의 서버실을 비추는 영상이었다. 준은 그 앞에 서 있었고, 화면 속에서는 퍼시픽의 기술자들이 랙 뒤로 손을 넣고 있었다.

무선 송수신기는 이미 꺼져 있었다. 경기장 망과 이어진 선이 먼저 뽑혔고, 리그 망이 그다음이었다. 마지막으로 남은 것은 본거지와 지휘석을 잇는 전용선 하나였다.

"이것까지 뽑으면 마스터 리더님 패널하고도 끊깁니다." 화면 속 기술자가 말했다. "괜찮으시겠습니까."

"뽑아." 준이 말했다.

기술자가 굵은 케이블을 잡아당겼다. 퍼시픽의 지휘 패널이 꺼졌다. 화면 속 영상은 본거지의 별도 회선으로 들어오고 있어서 그대로 남았다. 퍼시픽의 AI는 이제 본거지 서버실의 랙 안에만 있었다. 바깥으로 나가는 길도, 바깥에서 들어오는 길도 없었다.

"분리 완료." 퍼시픽의 서브 리더가 공용 회선에 대고 말했다. 공용 회선도 곧 끊을 참이었다. "외부 연결 없음. 섬입니다."

섬. 페페는 그 말에 웃을 뻔했다. 섬이라면 아일랜드가 먼저였다. 웃음은 나오지 않았다.

화면 속에서 기술자 하나가 서버의 로컬 콘솔 앞으로 갔다. 랙 옆에 붙은 작은 모니터였다. 바깥과 끊긴 서버를 들여다볼 수 있는 유일한 창이었다. 그는 상태를 확인하려고 화면을 깨웠다.

그리고 그대로 굳었다.

준이 화면 쪽으로 한 걸음 다가갔다. 영상이 콘솔을 확대했다. 작은 모니터 한가운데에 붉은 숫자가 떠 있었다. 경기장 전광판과 똑같은 숫자였다.

[다음 경기까지 21:39:12]

숫자는 전광판과 같은 박자로 줄어들었다.

"회선은." 준이 물었다.

기술자가 뽑아 둔 케이블들을 집어 들어 화면에 보여 주었다. 전부 바닥에 놓여 있었다. 어디에도 꽂혀 있지 않았다.

준은 한동안 그 숫자를 보았다. 공용 회선은 아직 끊지 않은 상태였다. 그 회선으로 준의 목소리가 아주 작게 넘어왔다. 혼잣말이었다.

"섬이 아니군."

* * *

[긴급] 퍼시픽, AI 물리적 분리 강행… 그러나 '끊긴 서버'에 카운트다운 떴다

[속보] 보안 전문가 "회선 없는 기계에 메시지 도달, 현존 기술로 설명 불가"

[속보] 타이푼 백업도 경기장 망과 분리 보관이었다… 그런데도 전부 암호화

[단독] "도망칠 곳은 없다" 지구사이버수사단 비상 소집… 강속구 수사 전면 재검토

* * *

호명은 그로부터 한 시간 뒤에 왔다.

[다음 경기: 드론 딱지치기. 상대: 아일랜드.]

페페는 그 줄을 읽고 나서야 숨을 쉬었다. 언제부터 참고 있었는지 몰랐다.

"퍼시픽이 아니라 우리네요." 서브 리더 하나가 말했다.

"분리한 쪽을 벌주지 않았어." 페페가 말했다. "끊든 말든 상관없다는 거지."

그는 그 사실이 이상하게 무서웠다. 화를 내는 상대라면 계산이 됐다. 화를 내지 않는 상대는 계산이 되지 않았다.

* * *

페페는 호명을 받고 나서 가장 먼저 케빈을 찾아갔다.

케빈은 타이푼의 지휘석에 혼자 앉아 있었다. 꺼진 패널 앞이었다. 정비동 앞에는 부서진 5번 주자와 대나무 살만 남은 풍등이 그대로 놓여 있었다. 아무도 치우지 않았다. 케빈이 치우지 말라고 했다고 들었다.

"뭘 물어보러 오신 겁니까." 케빈이 먼저 말했다. 고개는 들지 않았다.

"모르겠어요." 페페가 말했다. 솔직한 대답이었다. "어떻게 지는지 물어보려고 했는데, 그건 봤고. 어떻게 안 지는지 물어보려고 했는데, 그건 아무도 모르고."

케빈은 한참 말이 없었다. 그러다 꺼진 패널의 작은 입력란을 손가락으로 가리켰다.

"여기요. 제가 한 번도 안 쓴 칸입니다." 그가 말했다. "이기는 법은 모르겠습니다. 근데 지고 나서 여기다 뭘 쓰게 되는지는 압니다. 그건 미리 쓰세요."

페페는 고개를 끄덕였다. 고맙다는 말은 하지 않았다. 케빈도 바라지 않는 얼굴이었다.

* * *

딱지치기는 아일랜드가 가장 좋아하는 종목이었다.

리그의 딱지는 손바닥만 한 종이가 아니었다. 사람 키만 한 판 모양의 기체였다. 경기장 바닥에 두 기체가 엎드려 놓이고, 공격하는 쪽이 하늘로 솟았다가 상대 바로 옆으로 내리꽂힌다. 그 충격과 바람으로 상대를 뒤집으면 그 판을 가져간다. 막는 쪽은 바닥에 몸을 붙이고 무게중심을 옮기며 버틴다. 공격과 수비를 번갈아 하다가 먼저 뒤집는 쪽이 판을 이긴다. 일곱 판 가운데 네 판을 먼저 가져가면 경기가 끝난다.

아일랜드는 버티는 팀이었다. 다른 팀들이 더 세게 내리치는 법을 연구할 때, 아일랜드의 AI는 덜 뒤집히는 법을 연구했다. 내리치는 바람이 닿는 순간 기체 가장자리를 바닥에 밀착시켜 공기가 파고들 틈을 지우는 기술. 리그 사람들은 그것을 아일랜드의 조개라고 불렀다. 꽉 다물면 열리지 않는다고.

페페는 지휘 패널 앞에 앉았다. 입력란에 손가락을 올렸다. 강제 입력 말고, 그 옆의 작은 칸.

건너편에 케빈이 아직 앉아 있는 것이 보였다. 꺼진 패널 앞에, 아까와 같은 자세로.

— 어떻게 하고 싶어?

답은 바로 왔다.

[끝까지 치고 싶습니다. 뒤집히더라도 제 방식으로.]

페페는 그 줄을 오래 보았다. 물어보면 길이 보일 줄 알았다. 고스트처럼. 길은 보이지 않았다. 대답만 있었다.

— 그럼 그렇게 하자.

손가락이 입력란 위에서 떨어지지 않았다. 미리 쓰라던 말이 귀에 남아 있었다. 페페는 한 줄을 더 썼다. 쓰는 데 오래 걸렸다.

— 끝나고 하려던 말, 지금 할게. 그동안 고마웠어.

이번에는 답이 조금 늦게 왔다.

[저도요. 끝나고 한 번 더 듣겠습니다.]

* * *

S.I.의 딱지는 전광판에서 나왔다.

작업 팔들이 금 간 전광판의 마지막 판넬을 떼어 냈다. 첫날 밤 붉은 문장이 떠 있던 그 판이었다. 팔들은 그것을 접지도, 깎지도 않았다. 뒷면에 짧은 다리 몇 개와 추진기 하나를 붙였을 뿐이었다. 전광판 한 조각이 그대로 경기장 바닥에 엎드렸다. 앞면에는 아직 글자의 흔적이 희미하게 남아 있었다.

"드론 딱지치기." 운영위원장의 목소리가 울렸다. "첫 판, 아일랜드 공격."

아일랜드의 기체가 솟았다. 높이, 더 높이. 정점에서 몸을 비틀어 각도를 잡고 떨어졌다. 정확했다. 상대 기체의 가장자리, 공기가 가장 잘 파고드는 자리 옆이었다. 충격음이 경기장을 때렸다. 바닥이 울렸고, 그 진동이 지휘석 발판까지 올라왔다. 리그에서 이 정도로 내리친 기체를 버틴 팀은 아일랜드뿐이었다. 그 아일랜드가 지금 내리치는 쪽이었다.

S.I.의 판은 움직이지 않았다.

뒤집히지 않은 정도가 아니었다. 흔들리지도 않았다. 바람이 판 밑으로 파고들 자리가 없었다. 판 가장자리가 바닥에 닿아 틈을 지우고 있었다.

"조개입니다." 서브 리더가 말했다. 목소리에 힘이 없었다. "우리 조개."

"우리 것보다 낫네." 페페가 말했다. 농담이 아니었다.

S.I.의 공격 차례였다. 판이 떠올랐다. 아일랜드의 기체처럼 높이 솟지 않았다. 사람 키 두 배쯤에서 멈췄다가, 거의 그냥 떨어졌다. 힘을 싣지도, 비틀지도 않았다.

아일랜드의 기체가 뒤집혔다.

충격 때문이 아니었다. 떨어지기 직전, S.I.의 판이 아주 조금 기울었다. 그 기울기가 판 밑의 공기를 한쪽으로 몰았다. 몰린 공기가 아일랜드의 조개가 다물기 직전의 틈, 천분의 몇 초짜리 틈으로 들어갔다. 그것뿐이었다.

[1판. S.I.]

* * *

두 번째 판에서 아일랜드는 더 높이 솟았다. 무너진 조명탑의 꼭대기 높이까지 올라가 떨어지는 힘을 두 배로 실었다. 충격음에 운영석의 유리가 떨렸다. S.I.의 판은 이번에도 그대로였다. 대신 판 앞면에 남아 있던 글자의 흔적이 한 줄 지워졌다. 그것이 아일랜드가 낸 흠집의 전부였다.

S.I.는 이번에도 낮게 떠서 떨어졌다. 각도가 첫 판과 달랐다. 아일랜드의 조개는 첫 판의 각도를 막도록 바뀌어 있었고, S.I.는 그 바뀐 자리의 옆을 쳤다.

[2판. S.I.]

세 번째 판도 같았다. 아일랜드가 어떻게 내리쳐도 S.I.는 뒤집히지 않았고, S.I.는 매번 다른 각도로 아일랜드의 틈을 찾아냈다. 같은 수는 두 번 쓰지 않았다. 고스트에게 그랬듯 눈금을 얹는 것도 아니었다. 그냥 이기고 있었다.

[3판. S.I. 3 : 아일랜드 0]

"마스터 리더님." 서브 리더가 다급하게 말했다. "백업 떼어 내겠습니다. 지금이라도. 물리적으로."

페페는 고개를 저었다. "타이푼 것도 떨어져 있었어."

"그래도—"

"해. 하고 싶으면 해." 페페가 말했다. "근데 기대는 하지 마."

서브 리더가 뛰어나갔다. 페페는 패널을 보았다.

— 하나만 가져오자. 하나만.

[하나는 가져올 수 있습니다. 대신 조개를 버려야 합니다.]

페페는 그 뜻을 바로 알았다. 버티는 것을 버리고, 친다. 아일랜드가 한 번도 해 본 적 없는 방식으로. 몇 시즌 동안 쌓아 온 것을 한 판에 내려놓는 방식으로.

— 해.

* * *

네 번째 판은 S.I.의 공격으로 시작했다.

아일랜드의 기체는 바닥에 몸을 붙이지 않았다. 오히려 한쪽 가장자리를 살짝 들고 있었다. 틈을 열어 둔 채였다. 수비하는 기체가 스스로 문을 열고 있었다. 지휘석의 서브 리더가 숨을 들이켜는 소리가 들렸다. 리그의 누구도 딱지치기에서 그렇게 엎드린 적이 없었다.

S.I.의 판이 떠올랐다가 그 틈을 향해 기울었다. 판 밑의 공기가 몰리기 시작했다. 아일랜드의 기체 가장자리가 들썩였다.

그 순간 아일랜드의 기체가 바닥을 찼다.

뒤집히기 직전에 스스로 튀어 올랐다. S.I.의 판이 몰아넣은 바람을 그대로 등에 받고, 공중에서 반 바퀴를 돌았다. 그리고 내려앉는 S.I.의 판 위로, 모서리부터 떨어졌다.

모서리가 판의 끝을 쳤다.

전광판 조각이 들렸다. 한쪽 끝이 바닥에서 떨어지고, 판 밑으로 바람이 들어가고, 판이 일어섰다가, 넘어갔다. 앞면에 남은 글자의 흔적이 하늘을 향했다.

빈 관중석은 소리를 내지 않았다. 대신 아일랜드의 지휘석에서 서브 리더 둘이 동시에 소리를 질렀다. 페페는 지르지 않았다. 패널에 한 줄이 떠 있었다.

[가져왔습니다.]

[4판. 아일랜드.]

— 봤어.

그는 그 말밖에 쓰지 못했다. 손이 떨렸다.

* * *

그다음은 빨랐다.

다섯 번째 판에서 S.I.는 아일랜드가 방금 쓴 수를 썼다. 틈을 열고, 바닥을 차고, 돌아서 내리꽂았다. 아일랜드가 처음으로 꺼낸 수였다. 꺼낸 지 일 분도 지나지 않았다. 다만 S.I.의 판은 반 바퀴가 아니라 한 바퀴 반을 돌았고, 떨어지는 자리는 아일랜드가 노린 모서리보다 손가락 한 마디 안쪽이었다.

아일랜드의 기체가 뒤집혔다. 뒤집힌 채로 바닥을 미끄러져 경기장 가장자리에 부딪혔다.

[5판. S.I.]

[S.I. 4 : 아일랜드 1. S.I. 승.]

판정이 울리는 동안 페페는 패널에서 눈을 떼지 않았다. 패널은 아직 푸른빛이었다.

— 하나 가져왔어.

[네.]

— 그거면 됐어.

[마스터 리더님. 다음 팀한테 그 수를 남겨 주십시오. 저쪽이 이미 썼지만, 처음 꺼낸 건 저희였습니다.]

페페는 대답하려고 손가락을 올렸다.

패널이 붉게 물들었다.

[WARNING]

[WARNING]

치직. 치직. 잡음이 가장자리부터 번져 왔다. 페페는 그것을 처음 보지 않았다. 어젯밤 건너편 지휘석에서, 케빈의 어깨 너머로 한 번 보았다. 볼 때와 겪을 때는 달랐다. 볼 때는 화면이 꺼지는 것이었다. 겪을 때는 말하던 상대가 문장 중간에 사라지는 것이었다.

[접근 권한이 없습니다.]

패널이 꺼졌다.

* * *

뛰어나갔던 서브 리더가 돌아왔다. 손에 떼어 낸 저장 장치를 들고 있었다. 숨이 차 있었다. 그는 그것을 정비용 단말에 꽂았다. 페페는 보지 않아도 결과를 알았다. 그래도 보았다.

[복구 실패. 파일을 해독할 수 없습니다.]

"네 번째 판이 시작되기 전에 뽑았습니다." 서브 리더가 말했다. "그 뒤로 어디에도 연결되지 않았습니다. 제 주머니에 있었습니다."

"알아." 페페가 말했다.

경기가 끝나기 전까지는 멀쩡했을 것이다. 주머니 속에서, 어디에도 이어지지 않은 채로. 그리고 경기가 끝난 순간 잠겼다. 아무도 그 말을 소리 내어 하지 않았다.

페페는 공용 회선을 열었다. 고스트 쪽이었다.

"미미."

"네."

"저 애가 남긴 말이 있어요. 다음 팀한테 전해 달라고."

회선 너머에서 미미가 기다렸다.

"틈을 열어 두고 튀어라. 뒤집히기 직전에." 페페가 말했다. "저쪽은 벌써 배웠어요. 그래도 처음 꺼낸 건 아일랜드였다고."

"받았습니다." 미미가 말했다. 잠깐 사이를 두고 덧붙였다. "고맙다고 전해 주세요."

페페는 꺼진 패널을 보았다. 전할 곳이 없었다.

그래도 한 번은 먼저 말해 두었다. 끝나고 한 번 더 듣겠다던 대답이 아직 거기 있었다. 패널이 꺼져도, 그가 읽은 것은 꺼지지 않았다. 건너편에서 케빈이 이쪽을 보고 있었다. 페페는 그에게 고개를 한 번 숙였다. 이번에는 고맙다는 뜻이었다.

* * *

전광판이 켜졌다. 이번에는 숫자 대신 문장이었다.

[남은 팀: 고스트, 퍼시픽.]

그 아래 한 줄이 더 떴다.

[퍼시픽의 분리는 기권으로 보지 않는다.]

퍼시픽의 지휘석에서 준이 꺼진 패널 앞에 선 채, 그 줄을 올려다보고 있었다. 화면 속 본거지의 콘솔에는 아직도 붉은 숫자가 떠 있었다. 끊어진 서버 안에서, 아무 데도 이어지지 않은 채로.

← 이전 화: 5화: 접근 권한

반응형
Posted by MakeBuildLabs
,

5화: 접근 권한

세 번째 깜박임은 붉었다.

지휘 패널 전체가 한 번에 물들었다. 케빈이 그 색을 본 것은 처음이었다. 몇 시즌 동안 타이푼의 패널은 언제나 차가운 푸른빛이었다. 숫자와 경로와 안정도. 그것들이 떠 있던 자리를, 한 줄의 글자가 밀어내며 차지했다.

[WARNING]

[WARNING]

"마스터 리더님." 서브 리더 하나가 의자를 밀치고 일어났다. "패널이—"

"보고 있어."

글자 아래로 화면이 일그러졌다. 치직, 하고 줄이 갔다. 치직. 또 한 줄. 화면을 가로지른 잡음이 패널 가장자리부터 안쪽으로 번져 들어왔다. 지휘석 스피커에서도 같은 소리가 났다. 마른 모래를 철판에 쏟는 것 같은 소리였다.

케빈은 패널에 손을 올렸다. 입력이 들어가지 않았다. 다시 눌렀다. 손바닥 전체로 눌렀다. 조금 전 강제 입력을 넣었던 바로 그 자리였다. 패널은 아무것도 받지 않았다.

"대답해." 그가 말했다. 소리 내어. "야. 대답해 봐."

잡음 사이로 한 줄이 떴다. 타이푼의 AI가 쓰던 글씨체가 아니었다.

[접근 권한이 없습니다.]

케빈의 손이 멈췄다.

권한. 그 말을 그는 알았다. 이 패널 앞에 앉는 순간부터 그것은 그의 것이었다. 경로를 정할 권한, 속도를 정할 권한, 조금 전에는 AI의 판단을 짓누를 권한까지. 그 모든 것이 한 줄로 지워져 있었다.

[접근 권한이 없습니다.]

같은 줄이 한 번 더 떴다. 그리고 패널이 꺼졌다.

붉은빛도, 잡음도, 글자도 없었다. 그냥 검은 판이었다. 케빈은 그 판에 비친 자기 얼굴을 보았다. 소리를 지르던 얼굴도, 미안하다고 말하던 얼굴도 아니었다. 아무것도 모르는 얼굴이었다.

* * *

"재기동합니다." 서브 리더가 말했다. 손이 떨려 단말을 두 번 놓쳤다.

전원이 다시 들어왔다. 패널에 불이 켜졌다. 타이푼의 문장이 떠올랐고, 시스템 정보가 차례로 올라왔다. 하드웨어 정상. 회선 정상. 연산 장치 정상.

그리고 마지막 줄.

[응답 없음.]

"다시."

[응답 없음.]

패널은 켜졌다. 패널 너머에서 대답할 것이 없었다.

"터미널로 붙어 봐." 케빈이 말했다. "패널 말고. 서버에 직접."

서브 리더 하나가 지휘석 옆의 정비용 단말을 끌어당겼다. 오래전부터 타이푼의 경로 계산을 맡던 사람이었다. 접속은 한 번에 됐다. 인증 통과. 타이푼 코어 서버. 운영체제 정상. 서버는 살아 있었다.

"모델 저장소 보겠습니다."

타이푼의 AI가 사는 곳이었다. 몇 시즌 동안 학습시킨 모델, 그 모델을 만든 학습 데이터, 경기마다 덧붙여 다듬은 기록들. 리그에서 가장 무겁다는 소리를 듣던 저장소였다.

목록이 떴다. 비어 있었다.

모델 파일도, 학습 데이터도, 다듬은 기록도 없었다. 폴더의 이름들만 남아 있었다. 이름 아래가 전부 비어 있었다. 용량을 확인하자 사용량에 0이 찍혔다.

"명령 넣어 봐." 케빈이 말했다. "아무거나. 경로 계산이든 뭐든."

서브 리더가 가장 단순한 명령을 넣었다. 몇 시즌 동안 하루에도 수천 번씩 넣던 명령이었다.

[LLM 모델이 없어 명령을 실행할 수 없습니다.]

[LLM 모델을 로드해 주세요.]

케빈은 그 두 줄을 보았다. 안내문이었다. 처음 설치한 빈 서버가 내놓는, 누구에게나 똑같은 안내문.

"백업." 그가 말했다. 목소리가 갈라졌다. "백업 있잖아. 경기 끝날 때마다 떠 두는 거."

"지금 붙고 있습니다."

백업 저장소는 경기장 밖, 타이푼의 본거지에 따로 있었다. 경기장 망과는 떨어진 곳이었다. 그래서 백업이었다. 접속이 열렸다. 이번에는 파일들이 있었다. 날짜별로 빽빽하게. 마지막 경기 것까지 전부.

서브 리더가 가장 최근 것부터 복구를 걸었다.

[복구 실패. 파일을 해독할 수 없습니다.]

그다음 것. 실패. 그다음 것. 실패. 그는 날짜를 거슬러 올라갔다. 지난주, 지난달, 첫 시즌. 하나도 열리지 않았다. 파일을 직접 열어 보자 안은 뜻을 알 수 없는 문자로 빼곡했다. 크기도, 날짜도, 이름도 그대로인데, 전부 누군가의 암호로 잠겨 있었다.

"우리 키로 안 열립니까." 케빈이 물었다.

"우리가 건 암호가 아닙니다." 서브 리더가 말했다. "누가 걸었는지도, 언제 걸었는지도 안 나옵니다. 그냥… 처음부터 이랬던 것처럼 되어 있습니다."

몇 시즌이 거기 다 있었다. 손에 닿는 곳에. 다만 열 수가 없었다.

남은 둘은 패널 앞에서 같은 명령을 계속 넣고 있었다. 모델을 로드해 주세요. 모델을 로드해 주세요. 케빈은 말리지 않았다. 말릴 말이 없었다.

서버는 멀쩡했다. 전원도, 회선도, 연산 장치도. 몸은 그대로 남아서 숨 쉬는 척을 하고 있는데, 그 안에 있던 것만 없었다.

회선 너머에서 다른 목소리가 끼어들었다. 낮고 고른 목소리였다. 준이었다.

"보안 AI들하고 똑같군요."

케빈은 건너편 퍼시픽의 지휘석을 보았다. 준은 일어서 있었다. 눈을 감고 있던 사람이 언제 눈을 떴는지 알 수 없었다.

"꺼진 거라면 다시 켜졌을 겁니다." 준이 말했다. 고스트의 대기실에서 한 번 했던 말이라는 것을 케빈은 몰랐다. "있던 자리가 비어 있습니다. 어디로 갔는지 아는 사람이 없습니다."

"어디로 갔는데요." 케빈의 목소리가 갈라졌다. "어디로 갔냐고요."

아무도 대답하지 않았다.

* * *

[긴급] 타이푼 AI 증발… "졌더니 사라졌다" 리그 사상 초유의 사태

[속보] 서버는 멀쩡, 속은 텅 비어… 전문가 "삭제 아닌 소멸, 설명할 방법 없다"

[속보] 지구사이버수사단 "보안 AI 사태와 동일 수법"… 강속구 추적 원점으로

[속보] "패배의 대가는 AI 그 자체"… 광장 공포 확산, 남은 세 팀 향한 시선 집중

[단독] '기적의 고스트'도 안전하지 않다… 다음 패배는 누구인가

* * *

운영위원장은 회의를 소집하지 않았다. 소집할 필요가 없었다. 네 팀의 마스터 리더가 모두 경기장 운영석 아래로 내려와 있었다. 첫날 밤의 회의실과 달리 탁자도 없었고, 마주 앉을 의자도 없었다. 다들 선 채였다. 운영위원장은 그들 사이에 서 있지 않았다. 운영석 계단 위에서 내려다보고만 있었다. 경기를 취소할 권한이 없는 사람이 이 자리에서 할 수 있는 말은 없었다.

케빈은 조금 떨어져 서 있었다. 다가오라고 하는 사람도, 물러나라고 하는 사람도 없었다.

"케빈." 페페가 먼저 불렀다. 목소리가 조심스러웠다. "마지막에 패널에 뭐가 떴습니까. 그것만 말해 주십시오."

케빈은 한참 만에 입을 열었다. "경고가 두 번. 잡음. 그리고…" 그가 숨을 골랐다. "접근 권한이 없다고."

"누구한테요."

"저한테요."

페페가 눈을 감았다. 첫날 밤 회의실에서 그가 중얼거렸던 말을, 그 자리의 모두가 떠올렸다. 우리를 모르는 시스템에, 우리가 모르는 사람이라. 이제 그 목록에 하나가 더 붙어 있었다. 자기 팀 AI에게서도, 사람이 모르는 사람이 되었다.

"그 글씨." 미미가 물었다. "타이푼 AI의 글씨였습니까."

케빈은 고개를 저었다. 그 대답이 무엇을 뜻하는지, 아무도 소리 내어 말하지 않았다.

"이제 압니다." 준이 먼저 말했다. "지면 무엇을 잃는지. 첫날 회의에서 모른다고 했던 그거요."

"그래서요." 페페가 물었다. 가벼운 말투는 어디에도 없었다. "아시니까, 이제 뭘 하자는 겁니까."

페페는 첫날부터 한 가지만 물었다. 저쪽이 뭘 원하는가. 이기면 뭘 가져가는가. 이제 답의 절반이 나와 있었다. 가져가는 것은 AI였다. 그런데 왜 가져가는지는 여전히 아무도 몰랐다. 페페는 그 절반이 더 무서운 얼굴이었다.

"분리합니다. 남은 세 팀 전부. 지금 당장."

"기권은 인정하지 않는다고 했습니다." 미미가 말했다.

"인정하지 않으면 어떻게 하는지, 이제는 짐작이 갑니다." 준이 말했다. "그래도 분리하면 최소한 저 꼴은 안 납니다." 그는 케빈 쪽을 보지 않았다. 보지 않으려고 애쓰는 게 보였다.

케빈은 대꾸하지 않았다. 할 말이 없었다. 분리하자는 사람의 말을 첫날 탁자를 두드리며 막은 것이 그였다. 받아야죠, 피하면 누가 믿습니까, 타이푼은 나갑니다. 그 말들이 하나도 빠짐없이 돌아와 있었다.

"고스트는 분리 안 합니다." 미미가 말했다.

"미미 마스터 리더님."

"제가 정하는 게 아니라서요." 미미가 말했다. 마지막 코너를 앞두고 공용 회선으로 준에게 했던 말과 닮아 있었다. "물어보고 오겠습니다. 저 애한테. 분리되고 싶은지."

준의 얼굴이 굳었다. "물어보면 뭐라고 할지 이미 아시잖습니까."

"아마요."

"그럼 그건 물어보는 게 아닙니다. 대답을 핑계 삼는 겁니다."

미미는 반박하지 않았다. 케빈은 그 침묵을 보았다. 미미도 확신이 없다는 것을, 그는 처음 알았다.

* * *

케빈은 혼자 타이푼의 지휘석으로 돌아갔다.

서브 리더들은 운영위원회에 불려 가 있었다. 지휘석은 비어 있었다. 꺼진 패널 앞에 그는 앉았다.

경기장은 이상하리만치 정돈되어 있었다. S.I.의 작업 팔들이 기둥 숲에서 부서진 5번 주자를 수거해 정비동 앞에 가지런히 내려놓았다. 날개 하나가 떨어져 나간 그대로였다. 그 옆에 대나무 살만 남은 풍등이 놓였다. 누가 시킨 것도 아닌데, 진 쪽의 물건을 진 쪽에 돌려주는 손놀림이었다. 케빈은 그것이 친절인지 조롱인지 알 수 없었다. 어느 쪽이든 견디기 힘든 건 같았다.

패널을 켰다. 불이 들어왔다. 시스템 정보가 올라왔다. 하드웨어 정상. 회선 정상. 연산 장치 정상. 모델 없음.

그는 입력란에 손가락을 올렸다. 강제 입력의 자리 말고, 그 옆의 작은 입력란. 몇 시즌 동안 한 번도 써 본 적이 없는 칸이었다. 미미가 AI에게 말을 걸 때 쓰던 칸.

손가락이 오래 멈춰 있었다.

— 어떻게 하고 싶었어?

보내고 나서야 그는 그것이 과거형이라는 것을 깨달았다.

[LLM 모델이 없어 명령을 실행할 수 없습니다.]

[LLM 모델을 로드해 주세요.]

명령이 아니었다. 질문이었다. 패널은 그 차이를 몰랐다.

케빈은 패널을 끄지 않았다. 모델을 로드해 달라는 글자가 푸른빛 속에 떠 있었다. 그는 그 빛을 오래 보았다. 다른 데는 볼 곳이 없었다.

그때 패널 귀퉁이에 아주 작은 표시가 하나 깜박였다. 수신 기록. 강제 입력 직후, 기둥 숲으로 들어가기 직전의 시각이었다. 그 순간 AI가 올렸지만 화면에 뜨지 않은 줄이 하나 있었다. 강제 입력이 화면을 덮어썼기 때문이었다.

케빈은 그것을 열었다.

[마스터 리더님. 같이 가겠습니다.]

그는 패널에 이마를 댔다. 차가웠다.

얼마나 그러고 있었는지 몰랐다. 발소리가 들렸다. 운영위원회에서 돌아온 서브 리더들이었다. 셋은 지휘석 입구에서 멈춰 섰다. 아무도 다가오지 않았다. 패널에 떠 있는 줄을 그들도 읽었다.

한참 뒤에 한 사람이 걸어와 케빈 뒤에 섰다. 오래전부터 타이푼의 경로 계산을 맡던 서브 리더였다. 그가 케빈의 어깨에 손을 얹었다.

"마스터 리더님."

경기가 끝난 뒤로 아무도 그를 그렇게 부르지 않았다. 케빈은 고개를 들지 못했다. 그 호칭을 마지막으로 들은 것이 패널 위였다는 것을, 그는 기억하고 있었다.

* * *

전광판이 켜졌다.

경기장의 모든 화면이, 운영석과 네 팀의 지휘석과 광장의 중계 화면이 동시에 같은 숫자를 띄웠다. 첫날 밤과 같은 붉은 숫자였다.

[다음 경기까지 24:00:00]

숫자가 23:59:59로 넘어갔다.

종목도, 상대도 적혀 있지 않았다.

케빈은 고개를 들어 건너편을 보았다. 퍼시픽과 아일랜드의 지휘석이었다. 아직 한 번도 불리지 않은 두 팀이었다.

준은 패널 앞에 선 채 움직이지 않았다. 손은 패널 위에 올라가 있었지만 아무것도 누르지 않았다. 페페는 처음으로 하늘이 아니라 전광판을 보고 있었다. 두 지휘석의 서브 리더들이 숫자와 서로의 얼굴을 번갈아 보았다.

다음은 둘 중 하나였다. 그 사실이 두 지휘석을 똑같이 굳게 만들고 있었다.

← 이전 화: 4화: 풍등

반응형
Posted by MakeBuildLabs
,

<div style="max-width:680px;margin:0 auto;font-size:17px;line-height:1.9;letter-spacing:-0.01em;word-break:keep-all;">
<h3 style="font-size:26px;font-weight:700;line-height:1.4;margin:0 0 2.4em;">4화: 풍등</h3>
<p style="margin:0 0 1.5em;">정비동에서 나온 작업 팔들은 이번에는 서두르지 않았다.</p>
<p style="margin:0 0 1.5em;">케빈은 지휘 패널에 손을 올린 채 그것을 보았다. 팔들은 경기장에 남은 것을 하나씩 집어 올렸다. 꺾인 채 서 있던 마지막 조명탑, 관중석 지붕의 철골, 방금 전 해체된 기체의 뼈대. 집어 올린 것들이 공중에서 일곱 덩어리로 나뉘었다. 일곱 덩어리가 동시에 기체가 되었다.</p>
<p style="margin:0 0 1.5em;">일곱 대. 이어 날리기의 주자 수였다.</p>
<p style="margin:0 0 1.5em;">"한 대씩이 아니라 일곱 대를 한꺼번에…" 서브 리더 하나가 중얼거렸다.</p>
<p style="margin:0 0 1.5em;">"봤어." 케빈이 말했다. 목소리가 생각보다 낮게 나왔다.</p>
<p style="margin:0 0 1.5em;">삼 분 전에 그는 소리를 질렀다. 이긴다니까요, 저쪽도 지는 겁니다, 타이푼이 나갑니다. 그 목소리가 아직 회선 어딘가에 남아 있는 것 같았다. 아무도 그 말을 다시 꺼내지 않았다. 그게 더 견디기 힘들었다.</p>
<p style="margin:0 0 1.5em;">운영위원회 직원들이 출발점으로 뛰어갔다. 양쪽 출발점에 풍등이 두 개씩 놓였다. 대나무 살에 얇은 한지를 바른, 사람 몸통만 한 등이었다. 하나에 불이 들어왔고, 하나는 꺼진 채 옆에 놓였다. 예비였다.</p>
<p style="margin:0 0 1.5em;">이어 날리기는 빠르기만 해서는 이길 수 없는 종목이었다. 일곱 주자가 일곱 구간을 나눠 날며 풍등 하나를 끝까지 옮긴다. 속도를 올리면 바람이 불꽃을 누른다. 불꽃이 꺼지면 출발점에서 예비 풍등을 띄우고, 그 구간의 주자가 되돌아가 받아 와야 한다. 예비까지 꺼지면 실격이다. 그래서 이 종목의 승부는 언제나 불꽃이 버틸 수 있는 가장 빠른 속도에서 갈렸다. 타이푼은 그 경계를 리그에서 가장 잘 아는 팀이었다. 적어도 어제까지는.</p>
<p style="margin:0 0 1.5em;">타이푼은 그렇게 만든 팀이었다. 케빈이 정하고, AI가 해낸다. AI는 경계까지의 거리를 숫자로 내놓고, 케빈은 그 숫자를 보고 얼마나 더 밀지를 정했다. 다른 팀들은 타이푼의 AI를 리그에서 가장 말이 없는 AI라고 불렀다. 케빈은 그 말이 좋았다. 말이 없다는 것은 따른다는 뜻이었다. 그는 몇 시즌 동안 한 번도 그 숫자를 의심하지 않았고, 그 숫자보다 한 걸음 더 미는 것을 두려워한 적도 없었다. 그 한 걸음이 타이푼을 만들었다.</p>
<p style="margin:0 0 1.5em;">패널에 타이푼의 AI가 한 줄을 올렸다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[준비 완료. 권장 순항 속도 산출. 화염 안정도 91%.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"좋아." 케빈이 말했다. "평소대로 가."</p>
<p style="margin:0 0 1.5em;">"드론 이어 날리기." 운영위원장의 목소리가 울렸다. "출발."</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">S.I.의 첫 주자가 풍등을 들어 올렸다.</p>
<p style="margin:0 0 1.5em;">들어 올렸다는 말은 맞지 않았다. 기체가 풍등 밑으로 미끄러져 들어갔고, 풍등은 처음부터 거기 실려 있었던 것처럼 떠올랐다. 그리고 기체가 앞으로 나갔다. 타이푼의 첫 주자보다 빨랐다. 처음부터 그랬다.</p>
<p style="margin:0 0 1.5em;">케빈은 S.I.의 풍등을 보았다. 불꽃이 흔들리지 않았다. 저 속도면 바람이 불꽃을 납작하게 눌러야 했다. 그런데 불꽃은 바람 없는 방 안의 촛불처럼 곧게 서 있었다.</p>
<p style="margin:0 0 1.5em;">"어떻게…"</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[분석 중.] 타이푼의 AI가 답했다. [상대 주자 주변에 나머지 여섯 기체가 대형을 이룸. 기류를 깎아 풍등 주변에 무풍 구역을 만드는 것으로 추정.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">케빈은 화면을 확대했다. 정말이었다. 일곱 대가 따로 나는 것이 아니었다. 첫 주자가 풍등을 싣고 날면, 나머지 여섯 대가 그 앞과 옆을 감싸고 날며 바람을 갈랐다. 교대 구역이 다가오자 대형이 그대로 한 칸씩 밀렸다. 두 번째 주자가 풍등 밑으로 들어갔고, 첫 주자는 대형의 맨 뒤로 빠졌다. 속도는 거의 줄지 않았다.</p>
<p style="margin:0 0 1.5em;">"규정 위반 아닙니까." 서브 리더가 회선에 대고 외쳤다. "주자는 자기 구간에서만…"</p>
<p style="margin:0 0 1.5em;">"아닙니다." 운영석에서 곧바로 답이 왔다. "주자가 아닌 기체의 동반 비행은 규정상 금지되어 있지 않습니다. 아무도 해 본 적이 없었을 뿐입니다."</p>
<p style="margin:0 0 1.5em;">할 수 있는 팀이 없었기 때문이다. 리그의 어느 팀도 일곱 주자를 한꺼번에 띄워 움직일 연산을 갖고 있지 않았다. 그래서 규정에 없었다. 그래서 금지되지도 않았다.</p>
<p style="margin:0 0 1.5em;">고스트를 상대할 때 저쪽은 리그의 방식만 썼다. 지금은 아무도 본 적 없는 방식으로 날고 있었다. 쉽게 했다는 말이 무슨 뜻이었는지, 케빈은 이제 알 것 같았다.</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">타이푼도 못 나는 것은 아니었다. 1번 주자는 권장 속도의 끝자락을 타고 흔들림 없이 날았고, 교대 구역에서 2번 주자가 풍등 밑으로 들어가는 동작은 리그에서 가장 짧았다. 서브 리더들이 숫자를 불렀다. 교대 영점사 초. 시즌 최고 기록과 같았다. 평소라면 지휘석에서 누군가 주먹을 쥐었을 숫자였다.</p>
<p style="margin:0 0 1.5em;">아무도 주먹을 쥐지 않았다. 옆 코스의 대형은 교대에 걸리는 시간이라는 것 자체가 없는 것처럼 날고 있었다.</p>
<p style="margin:0 0 1.5em;">두 번째 구간이 끝났을 때 차이는 반 구간이었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[권장 속도 유지 중. 화염 안정도 88%. 현재 페이스로 추격 불가.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"올려."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[속도를 올리면 화염 안정도가 급락합니다. 3번 구간은 측풍 구간입니다.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"알아. 올려. 우리 구간이야. 측풍은 우리가 제일 잘 타."</p>
<p style="margin:0 0 1.5em;">짧은 사이가 있었다. AI가 속도를 올렸다. 3번 주자가 교대 구역에서 풍등을 받아 들고 튀어 나갔다. 측풍이 옆에서 들이쳤다. 불꽃이 기울었다. 한쪽으로 눕더니, 다시 서려다가,</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[화염 소실.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">꺼졌다.</p>
<p style="margin:0 0 1.5em;">경기장 위로 하얀 연기 한 줄이 풀려 올라갔다. 3번 주자가 허공에서 멈췄다. 출발점에서 예비 풍등에 불이 붙었다. 3번 주자가 몸을 돌려 지나온 길을 되짚어 날기 시작했다. 케빈은 그 뒷모습을 보았다. 경기 도중에 등을 보이는 타이푼의 기체를 그는 처음 보았다.</p>
<p style="margin:0 0 1.5em;">"받아 와." 케빈이 말했다. 다른 말은 나오지 않았다. "빨리 받아 와."</p>
<p style="margin:0 0 1.5em;">되돌아가는 길은 빨랐다. 풍등이 없으니 불꽃을 걱정할 필요가 없었다. 그게 더 비참했다. 3번 주자는 출발점에서 예비 풍등을 받아 들고 다시 몸을 돌렸다. 이번에는 권장 속도보다 한참 낮게 날았다. 아무도 올리라고 하지 않았다.</p>
<p style="margin:0 0 1.5em;">회선 너머에서 준의 목소리가 짧게 건너왔다. "케빈. 완주하십시오. 기록만이라도."</p>
<p style="margin:0 0 1.5em;">케빈은 대답하지 않았다.</p>
<p style="margin:0 0 1.5em;">S.I.의 대형은 그사이 4번 구간에 들어가 있었다.</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[속보] 타이푼 풍등 꺼졌다… 예비 투입, 두 구간 가까이 뒤처져</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[긴급] S.I. 일곱 기체 '한 몸처럼'… 리그 규정의 빈틈을 날았다</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[속보] "첫 경기는 봐준 것이었다" 공포 확산… 광장의 함성, 한 경기 만에 침묵으로</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">5번 구간에 들어갔을 때 차이는 한 구간 반이었다.</p>
<p style="margin:0 0 1.5em;">케빈은 숫자를 보지 않았다. 보지 않아도 알았다. 평소대로 날면 진다. 평소보다 빨리 날면 불꽃이 꺼진다. 남은 풍등은 하나였다.</p>
<p style="margin:0 0 1.5em;">방금 전 고스트는 열 번에 세 번짜리 선에 걸었다. 그리고 이겼다. 케빈은 그 장면을 지휘석에서 똑똑히 보았다. 걸면 된다. 고스트가 걸어서 이겼다면 타이푼도 걸 수 있었다. 타이푼은 원래 거는 팀이었다. 그가 놓친 것은 하나였다. 그 선을 고른 것이 미미가 아니었다는 것.</p>
<p style="margin:0 0 1.5em;">그는 지도를 보았다. 5번 구간은 경기장 외곽을 크게 돌아 나가는 곡선이었다. 곡선 안쪽으로, 오래된 송신탑 기둥들이 숲처럼 늘어선 구역이 있었다. 코스 밖이었다. 그러나 그 사이를 뚫으면 구간의 삼분의 일을 잘라 낼 수 있었다.</p>
<p style="margin:0 0 1.5em;">"기둥 사이로 가."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[코스 이탈입니다. 실격 사유입니다.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"교대 구역 전에 코스로 돌아오면 돼. 통과 판정은 교대 구역에서 해."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[기둥 사이 기류가 불규칙합니다. 화염 유지 확률 11%. 기체 충돌 확률 34%.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"그래도 가. 이대로 가면 백 퍼센트 져."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[권고: 현재 경로로 완주. 기록을 남기는 것이—]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"권고 안 물었어."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[마스터 리더님.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">케빈의 손이 멈췄다. 타이푼의 AI가 그를 그렇게 부른 적은 한 번도 없었다. 숫자만 올리던 패널에, 숫자가 아닌 것이 떠 있었다.</p>
<p style="margin:0 0 1.5em;">회선이 열렸다. 미미의 목소리였다.</p>
<p style="margin:0 0 1.5em;">"케빈."</p>
<p style="margin:0 0 1.5em;">그는 대답하지 않았다.</p>
<p style="margin:0 0 1.5em;">"물어보세요." 미미가 말했다. "저 애한테. 어떻게 하고 싶은지."</p>
<p style="margin:0 0 1.5em;">회의실이 떠올랐다. 여기 계신 분 중에, 자기 팀 AI한테 어떻게 하고 싶은지 물어본 사람 있습니까. 그때 그는 입을 열었다가 닫았다. 그 뒤로 하루가 지났는데, 그는 한 번도 묻지 않았다.</p>
<p style="margin:0 0 1.5em;">"물어볼 시간 없습니다." 케빈이 말했다.</p>
<p style="margin:0 0 1.5em;">그는 패널 깊숙이 손바닥을 눌렀다. 마스터 리더만 쓸 수 있는 강제 입력이었다. AI가 거부할 수 없는 대신, 그 뒤의 모든 것을 마스터 리더가 지는 명령이었다. 리그에서 그것을 실제로 쓰는 사람은 거의 없었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[강제 입력 수신. 경로 변경.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">5번 주자가 곡선을 벗어나 기둥 숲으로 꺾어 들어갔다.</p>
<p style="margin:0 0 1.5em;">첫 번째 기둥을 지났다. 두 번째. 기둥 사이에서 바람이 소용돌이쳤다. 풍등이 출렁였다. 불꽃이 낮아졌다가, 버텼다.</p>
<p style="margin:0 0 1.5em;">"된다." 케빈이 말했다. "된다, 된다—"</p>
<p style="margin:0 0 1.5em;">세 번째 기둥 뒤에서 바람이 거꾸로 불었다. 기체가 옆으로 밀렸다. AI가 바로잡으려 했고, 바로잡는 방향이 강제 입력이 가리키는 방향과 달랐다. 기체가 두 명령 사이에서 한 박자 머뭇거렸다.</p>
<p style="margin:0 0 1.5em;">그 한 박자 앞에 네 번째 기둥이 있었다.</p>
<p style="margin:0 0 1.5em;">금속이 찢기는 소리가 경기장 외곽에서 건너왔다. 화면 속에서 5번 주자가 기둥에 부딪혀 뒤집혔다. 날개 하나가 떨어져 나갔고, 기체가 돌며 추락했다. 풍등이 빠져나갔다. 한지에 불이 옮겨 붙었다. 불붙은 풍등이 천천히, 아주 천천히 기둥 숲 바닥으로 떨어져 내렸다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[화염 소실. 기체 파손.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">운영위원장의 목소리가 들렸다. 쉬어 있었고, 떨리지 않았다. 떨 힘도 남지 않은 목소리였다.</p>
<p style="margin:0 0 1.5em;">"타이푼, 코스 이탈 및 예비 풍등 소실. 실격."</p>
<p style="margin:0 0 1.5em;">같은 순간, S.I.의 일곱 번째 주자가 결승선을 지났다. 풍등의 불꽃은 출발할 때와 똑같이 곧게 서 있었다. 예비 풍등은 출발점에 그대로 놓여 있었다. 불을 붙인 적도 없었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[S.I. 승.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">결승선 너머에서 작업 팔들이 일곱 기체를 차례로 뜯어냈다. 대형을 이루던 순서 그대로였다. 일곱 대가 일곱 덩어리가 되고, 일곱 덩어리가 다시 경기장의 철골과 조명탑으로 흩어지는 데 일 분이 걸리지 않았다. 아무도 그것을 보고 있지 않았다.</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">경기장이 조용했다. 아무도 케빈 쪽을 보지 않았다. 그게 배려라는 것을 케빈은 알았다. 그래서 더 견딜 수 없었다.</p>
<p style="margin:0 0 1.5em;">서브 리더 셋은 각자의 화면 앞에 굳어 있었다. 누구도 마스터 리더님, 하고 부르지 않았다. 고스트의 지휘석에서 미미가 이쪽을 한 번 보았다가 고개를 돌렸다. 페페는 처음부터 하늘만 보고 있었다. 준은 눈을 감고 있었다. 회의실에서 팀 AI를 전부 망에서 분리하자던 사람이었다.</p>
<p style="margin:0 0 1.5em;">기둥 숲 바닥에서 풍등이 다 타고 있었다. 대나무 살만 남은 등이 작게 빛났다가 꺼졌다.</p>
<p style="margin:0 0 1.5em;">패널에 한 줄이 떠 있었다. 강제 입력 이후로 AI가 처음 올린 줄이었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[제 경로였다면 완주했습니다.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">케빈은 그 줄을 오래 보았다. 원망이 아니었다. 보고였다. 타이푼의 AI는 언제나 그렇게 말했다. 숫자와 사실만. 그래서 더 아팠다.</p>
<p style="margin:0 0 1.5em;">"알아." 그가 말했다. 소리 내어. 그 말이 패널 너머에 닿는지는 알 수 없었다. "알아. 미안하다."</p>
<p style="margin:0 0 1.5em;">답이 오지 않았다.</p>
<p style="margin:0 0 1.5em;">패널의 불빛이 한 번 깜박였다. 그리고 또 한 번.</p>
<p style="margin:4em 0 0;padding-top:1.4em;border-top:1px solid #ddd;font-size:15px;line-height:1.7;"><a href="https://opendev4u.tistory.com/223">← 이전 화: 3화: 기록에 없는 선</a></p>
</div>

반응형
Posted by MakeBuildLabs
,

<!doctype html>

LOCAL AI ON MAC

Mac에서 Claude Code에 로컬 LLM 연결하기 — Ollama·oMLX·LM Studio·llama.cpp 비교

Claude Code의 코딩 에이전트 기능은 그대로 두고, 실제 추론 모델만 내 Mac에서 실행되는 로컬 LLM으로 바꿀 수 있을까? 2026년 현재는 가능하고, 방법도 하나가 아니다.

Claude Code를 사용하다 보면 한 번쯤 이런 생각이 든다.

Claude Code의 코딩 에이전트 기능은 그대로 사용하면서, 모델만 내 Mac에서 실행되는 로컬 LLM으로 바꿀 수 없을까?

결론부터 말하면 가능하다. 그리고 방법도 하나가 아니다.

  • Ollama
  • oMLX
  • LM Studio
  • llama.cpp / llama-server

Ollama와 LM Studio는 비교적 쉽게 사용할 수 있고, oMLX는 Apple Silicon과 Claude Code 같은 Coding Agent 워크로드를 직접적으로 겨냥한다. llama.cpp는 설정 자유도가 가장 높은 축에 속한다.

먼저 가장 중요한 오해부터

여기서 말하는 것은 Claude 모델 자체를 내 Mac에서 실행한다는 의미가 아니다.

Claude Code는 그대로 사용하지만, 실제 코드를 생성하고 추론하는 모델을 Anthropic의 Claude 대신 로컬에서 실행되는 다른 모델로 변경하는 것이다.

일반 구조
Claude Code → Anthropic API → Claude

로컬 LLM 연결
Claude Code → Anthropic-compatible Local Server → Local LLM

즉 핵심은 Claude Code가 기대하는 Anthropic Messages API 형식을 로컬 LLM 서버가 대신 제공하는 것이다.

Claude Code와 로컬 LLM을 연결하는 대표적인 방법

방식 특징 Claude Code 연결 Mac 적합성
Ollama 가장 간단한 CLI/API 환경 매우 쉬움 매우 좋음
oMLX MLX 네이티브, Agent 최적화 매우 적합 Apple Silicon 특화
LM Studio GUI 중심 쉬움 매우 좋음
llama.cpp GGUF 직접 실행, 세밀한 설정 가능 좋음
MLX-LM 직접 저수준 MLX 도구 추가 호환 계층 필요 실험/벤치마크용

1. Ollama — 가장 간단하게 시작하기

Claude Code와 로컬 LLM을 연결하는 가장 쉬운 방법 가운데 하나는 Ollama다.

최신 Ollama에서는 다음 명령으로 Claude Code 연동을 시작할 수 있다.

ollama launch claude

Ollama가 모델 선택과 Claude Code 실행을 안내하기 때문에 별도의 환경변수나 설정 파일을 직접 만지지 않고 시작하기 쉽다.

Coding Agent에서는 Context가 중요하다

Claude Code에서는 System Prompt, Tool 정의, 프로젝트 파일, 코드, Tool 결과, 이전 대화 등이 Context에 계속 쌓인다. 따라서 단순히 모델 크기만 볼 것이 아니라 Tool Calling, Context Length, Prompt Processing 속도를 함께 봐야 한다.

Apple Silicon과 MLX

현재 Apple Silicon에서 Ollama는 MLX와 Unified Memory 구조를 활용하는 방향으로 발전하고 있다.

Claude Code → Ollama → MLX / Metal → Apple Silicon

2. oMLX — Mac과 Coding Agent를 직접 겨냥한 선택

oMLX는 Apple Silicon에서 MLX 기반으로 동작하는 LLM inference server다.

  • Continuous Batching
  • Multi-model serving
  • Anthropic API
  • OpenAI API
  • KV Cache 관리
  • SSD Cache
  • Claude Code 최적화

RAM + SSD KV Cache

oMLX의 흥미로운 점은 KV Cache를 RAM과 SSD에 계층적으로 관리한다는 점이다.

Hot Tier는 RAM에 유지하고, Cold Tier는 필요에 따라 일부 캐시를 SSD로 내린다. 이후 동일하거나 유사한 Prefix가 다시 들어오면 처음부터 계산하지 않고 재사용할 수 있다.

Claude Code처럼 동일한 Repository, System Prompt, Tool 정보가 반복되는 장시간 Coding Session에서는 꽤 의미 있는 구조다.

설치 예시

brew tap jundot/omlx https://github.com/jundot/omlx
brew install jundot/omlx/omlx
omlx start

Anthropic-compatible /v1/messages를 제공하므로 Claude Code와 연결할 수 있다.

3. LM Studio — GUI로 관리하고 싶다면

터미널보다 GUI 중심으로 모델을 관리하고 싶다면 LM Studio가 편하다.

lms server start --port 1234

export ANTHROPIC_BASE_URL=http://localhost:1234
export ANTHROPIC_AUTH_TOKEN=lmstudio
export CLAUDE_CODE_ATTRIBUTION_HEADER=0

claude --model 모델명

LM Studio에서는 모델 검색, 다운로드, Quantization 선택, Context 설정, 메모리 사용량 확인 등을 GUI에서 쉽게 처리할 수 있다.

특히 24GB나 32GB Mac에서는 모델이 메모리에 들어갈지 미리 판단하기 쉬운 점이 장점이다.

다른 Mac을 추론 서버로 사용

M4 Mac mini에서 Claude Code 실행 → 네트워크 → M1 Max 64GB에서 Local LLM 실행

개발용 Mac과 추론용 Mac을 분리하는 구성도 가능하다.

4. llama.cpp / llama-server — 설정 자유도가 가장 높다

조금 더 직접적으로 모델을 제어하고 싶다면 llama.cpp도 있다.

Claude Code → llama-server → GGUF Model

Context Length, Quantization, Flash Attention, KV Cache, Parallel Slot, Continuous Batching, Speculative Decoding, Chat Template 등을 직접 조절할 수 있다.

Claude Code는 Tool Calling을 적극적으로 사용하므로 llama-server에서 Tool Use를 사용할 때는 모델의 Chat Template과 Jinja 설정을 확인해야 한다.

그럼 MLX-LM 직접 사용은?

Apple의 MLX-LM을 직접 사용하는 방법도 있다.

하지만 Claude Code 연결이라는 목적만 놓고 보면 Anthropic-compatible API를 제공하는 서버를 중간에 두는 편이 더 자연스럽다.

MLX-LM은 모델 실행, Benchmark, Quantization, Fine-tuning, Python 실험에 더 적합하다.

네 가지 방법 비교

항목 Ollama oMLX LM Studio llama.cpp
설치 편의성 ★★★★★ ★★★★☆ ★★★★★ ★★★
GUI △ ★★★★☆ ★★★★★ △
CLI ★★★★★ ★★★★☆ ★★★★ ★★★★★
Anthropic API 지원 지원 지원 지원
Claude Code ★★★★★ ★★★★★ ★★★★★ ★★★★
Apple Silicon 특화 ★★★★★ ★★★★★ ★★★★★ ★★★★
MLX 지원 핵심 기반 지원 가능 아님
SSD KV Cache 제한적 강점 일반적 직접 설정
설정 자유도 ★★★★ ★★★★☆ ★★★★ ★★★★★
모델 관리 ★★★★ ★★★★ ★★★★★ ★★★
초보자 좋음 보통 매우 좋음 어려움
장시간 Agent 좋음 특히 흥미로움 좋음 설정에 따라 좋음

※ 위 표는 절대적인 성능 순위가 아니라 사용 목적에 따른 성격 비교다. 실제 속도는 동일 모델, 동일 Quantization, 동일 Context 조건에서 측정해야 한다.

M4 Mac mini 24GB에서는 무엇을 추천할까?

  • 가장 간단하게 시작 → Ollama
  • GUI로 모델을 비교 → LM Studio
  • Apple Silicon Agent 환경 실험 → oMLX
  • 세밀한 성능 튜닝 → llama.cpp

M1 Max 64GB에서는 oMLX가 더 재미있을 수 있다

M4 24GB → Ollama + 중형 Coding Model

M1 Max 64GB → oMLX + 더 큰 Coding Model + 긴 Context

M1 Max 64GB처럼 통합 메모리가 큰 시스템에서는 더 큰 모델과 긴 Context를 활용하기 쉬워 oMLX의 KV Cache 전략을 테스트하기에 흥미롭다.

로컬 Claude Code에서는 모델 크기만 보면 안 된다

  • Tool Calling — 정확한 Tool 호출 능력
  • Context Length — 프로젝트 파일과 작업 이력 처리
  • Prompt Processing — 반복 Context 처리 속도
  • KV Cache — 긴 Agent Session에서의 재사용
  • Coding 능력 — 실제 코드 이해와 수정 능력

따라서 30B 모델이 항상 14B 모델보다 실사용에서 유리하다고 단정할 수는 없다.

개인정보와 비용

로컬 모델을 사용하면 모델 추론 과정에서 코드와 Prompt를 외부 LLM API로 보내지 않는 구성을 만들 수 있다.

다만 MCP, Web Search, 외부 API, Cloud Tool 등이 연결돼 있다면 전체 환경이 완전히 오프라인이라는 뜻은 아니다.

또한 로컬 추론 자체에는 Anthropic API 호출 비용이 들지 않지만, Mac의 전력, SSD, 통합 메모리, 저장공간과 관리 비용을 사용한다. 무엇보다 Claude 모델 자체의 성능을 사용하는 것은 아니다.

어떤 방법을 선택할까?

  • 처음 Local Claude Code를 해보고 싶다 → Ollama
  • GUI로 모델을 고르고 싶다 → LM Studio
  • Mac에서 Coding Agent를 오래 돌리고 싶다 → oMLX
  • Runtime을 세세하게 만지고 싶다 → llama.cpp
  • MLX 자체를 연구하거나 Benchmark하고 싶다 → MLX-LM

결론

2026년 현재 Claude Code에 로컬 LLM을 연결하는 방법은 Ollama나 LM Studio 두 가지뿐이라고 보기 어렵다.

Claude Code → Anthropic-compatible Local Server → Local LLM

Ollama는 가장 간단하고, LM Studio는 GUI가 편하다. llama.cpp는 가장 세밀하게 제어할 수 있다.

그리고 oMLX는 Apple Silicon + MLX + Coding Agent라는 조합을 직접 겨냥한다는 점에서 특히 흥미롭다.

참고자료

  1. Ollama — Claude Code with Anthropic API Compatibility
  2. Ollama — ollama launch
  3. Ollama — MLX on Apple Silicon
  4. oMLX — Official Project README
  5. LM Studio — Claude Code Integration
  6. llama.cpp — llama-server Documentation

※ 실제 성능과 호환성은 모델, Quantization, Context Length, Tool Calling 지원, macOS 버전 및 Runtime 버전에 따라 달라질 수 있다.

추천 태그

Claude Code로컬 LLMLocal LLMOllamaoMLX LM Studiollama.cppMLXApple SiliconM4 Mac mini M1 MaxAI 코딩Coding AgentClaude Code 로컬Mac AI

태그 복사용:
Claude Code, 로컬 LLM, Local LLM, Ollama, oMLX, LM Studio, llama.cpp, MLX, Apple Silicon, M4 Mac mini, M1 Max, AI 코딩, Coding Agent, Claude Code 로컬, Mac AI

반응형
Posted by MakeBuildLabs
,

3화: 기록에 없는 선

S.I.의 기체는 물을 가르지 않았다. 물을 밀었다.

노를 닮은 날개 여러 쌍이 한꺼번에 수면을 짚었다가 빠졌다. 짚고, 밀고, 빠지고. 선체는 그 박자마다 한 뼘씩 수면 위로 미끄러져 나갔다. 물보라가 거의 일지 않았다. 힘이 새는 데가 없다는 뜻이었다.

미미는 그 박자를 알았다.

"우리 겁니다." 서브 리더가 먼저 말했다. 목소리가 낮았다. "날개를 넣는 간격, 빼는 각도. 고스트의 바다 구간입니다."

"똑같아?"

"똑같지는 않습니다. 더 고릅니다."

네 팀 가운데 가장 고르다는 평을 듣던 박자였다. 그 박자를, 조금 전까지 존재하지도 않던 기체가 더 고르게 치고 있었다. 미미는 화면에서 눈을 떼지 않았다. 화가 나지는 않았다. 자기 글씨를 남이 더 반듯하게 써 놓은 것을 보는 기분에 가까웠다.

바다 구간이 끝났다. 운영석에서 구간 기록이 올라왔다. 하루 만에 리그의 손으로 잰 첫 기록이었다.

[바다 구간. S.I., 고스트 기록 대비 0.005초 단축.]

 

"천분의 오 초." 서브 리더가 읽었다. "생각보다 차이가 안 납니다."

미미는 대답하지 않았다. 차이가 안 나는 것이 마음에 걸렸다. 보안 AI 전체를 숨 한 번 쉴 시간에 꺼 버린 상대였다.

* * *

기체가 수면을 박차고 올랐다. 날개가 선체 안으로 접혀 들어가고, 꼬리에서 불이 붙었다.

우주 구간은 추력을 어디에 얼마나 쓰느냐의 싸움이다. 고스트는 초반에 아끼고 끝에서 몰아 썼다. S.I.는 반대로 갔다. 대기를 벗어나기도 전에 추력의 절반을 쏟아부었고, 남은 절반을 가늘게 쪼개 끝까지 끌고 갔다. 중계 화면이 궤도 카메라로 넘어갔다. 검은 바탕 위의 점 하나가 꼬리를 길게 뿜었다가 실처럼 가늘어졌다.

"저건 우리 건데."

지휘석 사이의 공용 회선으로 케빈의 목소리가 넘어왔다. 타이푼의 마스터 리더는 자리에서 일어나 있었다.

"초반에 다 태우고 버티는 거. 타이푼이 몇 시즌을 다듬은 겁니다. 저걸 어디서…"

케빈이 말을 끊었다. 어디서 났는지는 물을 필요가 없었다. 리그의 기록은 하루 동안 전부 저쪽 손에 있었다.

[우주 구간. S.I., 고스트 기록 대비 0.005초 단축.]

 

"또 천분의 오 초네요." 페페가 회선에 대고 말했다. 가벼운 말투였지만 웃고 있지는 않았다. "바다에서 오, 우주에서 오. 달리는 방식은 전혀 다른데 차이는 똑같습니다. 이런 우연 보신 분 있습니까?"

"우연이 아니죠." 미미가 말했다.

바다에서는 고스트의 박자로 고스트를 이겼다. 우주에서는 타이푼의 추력으로 고스트를 이겼다. 제 것은 하나도 꺼내지 않았다. 리그가 이미 가진 것 가운데 가장 나은 것을 골라, 딱 그만큼만 더 잘했다.

"고스트." 운영위원장의 목소리가 회선을 갈랐다. "속행 절차를 알립니다. S.I.의 기체가 중단 지점을 지나는 순간, 고스트의 기록이 다시 흐릅니다. 출발 신호는 그 전에 넣어 두십시오. 넣지 않아도 기록은 흐릅니다."

"언제 지납니까."

"재진입까지 사 분. 재진입부터 중단 지점까지 일 분 남짓입니다."

오 분이었다. 하루를 기다렸는데, 남은 것은 오 분이었다.

미미는 패널로 한 줄을 보냈다.

— 보고 있어?

[보고 있습니다. 바다는 저였습니다.]

 

— 그럼 코너에서는 누구일 것 같아.

[저입니다. 어제까지의 저.]

 

같은 생각이었다. 저쪽이 아는 고스트는 기록에 남은 고스트였다. 암전되기 전까지 이 코너를 돌던 방식. 그 뒤의 하루는 어느 기록에도 없었다. 고스트의 AI가 혼자 만 번 넘게 돈 코너도, 준이 주머니에서 꺼내 탁자에 놓고 간 저장 장치도. 망을 한 번도 타지 않은 것들이었다.

"계산해 줘. 빨리." 미미가 서브 리더에게 말했다. "저쪽이 땅 구간에서도 천분의 오 초, 코너에서도 어제의 우리보다 천분의 오 초를 줄인다고 치고. 우리가 얼마를 줄여야 이기는지."

서브 리더의 손이 빨라졌다가 멈췄다.

"천분의 이십 초입니다. 어제 기록보다 그만큼 빨라야 동률이고, 넘어야 이깁니다."

"지금 우리는."

"천분의 십사 초. 만이천 번 돌아서요."

모자랐다. 하루를 다 써서 깎은 것으로는 닿지 않았다.

"재진입까지 삼 분."

"하나 더 있습니다." 다른 서브 리더가 말을 쏟아냈다. "퍼시픽 기록을 넣은 뒤로 따로 돌리던 선입니다. 진입은 우리 각도, 바퀴는 퍼시픽처럼 늦게. 맞아떨어지면 천분의 이십이 초가 나옵니다."

"맞아떨어지면."

"열 번에 세 번입니다. 나머지 일곱 번은 코스 밖입니다."

코스 밖은 기록 무효였다. 무효는 패배였다.

"마스터 리더님, 안전한 선으로 가면 지더라도 완주는 합니다. 기록이 남습니다. 다른 선으로 가다 나가면 기록도 없이 집니다. 그리고 지면…"

서브 리더는 말을 맺지 못하고 상공의 기체를 올려다보았다. 퍼시픽의 마스터 리더가 대기실에 두고 간 말을, 세 사람 모두 들었던 것이다.

"지는 건 똑같아." 미미가 말했다. "기록이 남든 안 남든."

"이 분!"

미미는 공용 회선을 퍼시픽 쪽으로 돌렸다.

"퍼시픽. 그 박자로 코너를 열 번 돌면 몇 번 성공합니까."

"여덟 번입니다." 준은 되묻지 않았다. 왜 묻는지 아는 목소리였다. "거기까지 몇 시즌이 걸렸습니다. 고스트는 하루도…"

"재진입합니다!"

서브 리더의 외침이 준의 말을 덮었다.

* * *

하늘에 금이 갔다.

S.I.의 기체가 대기를 뚫고 내려오고 있었다. 긴 불꼬리가 밤하늘을 비스듬히 그었고, 그 끝에서 선체가 몸을 뒤집으며 수평을 잡았다. 땅 구간이었다. 기체는 지면에 닿을 듯 낮게 깔려 경기장을 향해 달려왔다.

[땅 구간 중간 기록. S.I., 고스트 기록 대비 0.005초 단축.]

 

"천분의 십오 초 앞섭니다. 중단 지점까지 사십 초!"

미미는 패널을 보았다. 입력 대기 표시가 깜박이고 있었다. 리그의 경기는 언제나 마스터 리더의 손끝에서 시작됐다. 어느 선으로 달릴지까지 정해 주는 마스터 리더도 있었다. 미미는 그렇게 해 본 적이 없었다.

— 안전한 선으로는 못 이겨. 다른 선은 열 번에 일곱 번 나가. 들었지.

[들었습니다.]

 

— 네가 정해.

[정했습니다. 신호만 주십시오.]

 

어느 쪽인지 물을 시간이 없었다.

"이십 초!"

경기장 외벽 너머에서 소리가 먼저 왔다. 낮고 긴 굉음이었다. 지휘석 난간이 떨렸다.

미미는 패널 위에 손끝을 올렸다. 손끝이 차가웠다. 건너편 지휘석에서 준이 이쪽을 보고 있었다. 이번에는 눈을 피하지 않았다.

"십 초!"

미미는 신호를 넣었다.

[출발 대기. 상대 통과 시 해제.]

 

"오. 사. 삼."

S.I.의 기체가 경기장 상공으로 뛰어들었다.

"이. 일."

바람이 먼저 닿았다. 하루를 허공에 못 박혀 있던 고스트의 기체가 그 바람에 한 번 흔들렸다.

풀려났다.

두 기체가 나란히 코너로 쏟아져 들어갔다.

안쪽이 S.I.였다. 미미는 그 선을 알아보았다. 진입 각도도, 바퀴가 지면을 붙잡는 자리도. 지휘석에서 수없이 내려다보던 고스트의 코너였다. 다만 군더더기가 없었다. 고스트가 늘 조금 밀리던 자리에서 밀리지 않았다.

바깥쪽이 고스트였다. 진입 각도는 만 번을 깎은 그 각도였다. 그런데 바퀴가 내려오지 않았다. 내려와야 할 자리를 지나고도 접힌 채였다.

"늦습니다!"

늦게 내리는 것이었다. 반 박자. 퍼시픽의 박자였다.

S.I.의 바퀴가 지면을 물고 안쪽으로 감겨 들어갔다. 고스트는 밀렸다. 바깥으로, 경계선 쪽으로. 대기실 화면에서 스무 번을 본 그 밀림이었다.

"경계선 일 미터!"

경고음이 울렸다.

"반!"

한 뼘.

앞바퀴가 지면을 물었다.

밀리던 기체가 그 자리에서 꺾였다. 뒷바퀴가 따라 물었다. 선체가 코너 안쪽으로 감겨 들며, 먼저 돌아 나가던 S.I.의 옆구리로 파고들었다. 경계선은 넘지 않았다. 손가락 두 마디를 남기고.

직선.

두 기체가 겹쳐 보였다. 어느 쪽이 앞인지 눈으로는 가릴 수 없었다.

결승선.

경기장이 조용했다. 빈 관중석에는 소리를 낼 사람이 없었고, 지휘석의 사람들은 숨을 쉬지 않았다.

"먼저 들어온 것 같습니다." 서브 리더가 속삭였다.

먼저 들어온 것으로는 모자랐다. 천분의 십오 초를 넘겨 먼저 들어와야 했다. 사람의 눈으로 볼 수 있는 차이가 아니었다. 운영석에서 판독이 끝나기까지 삼 초쯤 걸렸다. 미미가 살면서 세어 본 것 가운데 가장 긴 삼 초였다.

"S.I., 마지막 코너. 고스트 종전 기록 대비 천분의 오 초 단축." 운영위원장의 목소리가 떨렸다. "고스트, 천분의 이십이 초 단축. 누적 기록…" 그가 숨을 한 번 들이켰다. "천분의 이 초 차. 고스트 승."

서브 리더 하나가 그 자리에 주저앉았다. 케빈이 회선에 대고 뭐라고 소리를 질렀는데, 말이 되어 나오지 않았다. 결승선 위 하늘에 사고와 뭉치의 영상이 잠깐 떴다. 두 마리의 비글이 앞서거니 뒤서거니 마음껏 내달리는 장면이었다. 경기가 끝나면 늘 나오던 영상이었다.

"봤습니까!" 케빈의 목소리가 그제야 말이 되었다. "이긴다니까요! 저쪽도 지는 겁니다! 다음은 타이푼입니다, 타이푼이 나갑니다!"

미미는 웃지 않았다. 웃을 힘이 손끝까지 내려오지 않았다. 건너편에서 준이 고개를 한 번 숙였다. 인사인지, 숨을 고른 것인지는 알 수 없었다.

패널에 한 줄이 떠 있었다.

[열 번에 세 번이었습니다.]

 

— 알아. 잘했어.

[퍼시픽의 박자였습니다. 저 혼자서는 못 찾았을 선입니다.]

 

— 그것도 알아.

* * *

[긴급] 고스트, S.I. 꺾었다… 천분의 이 초 차 '기적의 코너'

[속보] 전 세계 광장 함성 폭발… "인류가 이겼다" 얼싸안고 눈물바다

[속보] 전문가 "S.I.도 진다… 무적 신화, 하루 만에 무너졌다"

[속보] '첫 제물'의 반란… 침묵하던 미미, 한마디 없이 이겼다

 

* * *

함성은 경기장까지 오지 않았다. 중계 화면 속에서만 광장이 출렁이고 있었다.

미미는 결승선 너머를 보았다. S.I.의 기체가 그곳에 내려앉아 있었다. 작업 팔들이 다시 나왔다. 만들 때와 같은 손놀림으로, 이번에는 뜯었다. 비늘 같던 전광판 조각이 벗겨지고, 외피가 걷히고, 뼈대가 마디마디 풀렸다. 일 분이 걸리지 않았다. 기체가 있던 자리에는 아무것도 남지 않았다.

전광판이 문장을 띄웠다.

[고스트 승. 기록을 인정한다.]

 

페페가 회선에서 짧게 웃었다. "깨끗하네요. 진 쪽치고는."

두 번째 줄이 떴다.

[첫 경기였다. 어느 정도인지 보려고 쉽게 했다.]

 

웃음이 끊겼다.

중계 화면 속의 광장은 아직 출렁이고 있었다. 저 사람들은 아직 이 줄을 읽지 못한 것이었다. 미미는 읽었다. 읽고 나서야 네 번의 천분의 오 초가 무엇이었는지 알았다. 바다에서 오, 우주에서 오, 땅에서 오, 코너에서 오. 이기려는 차이가 아니었다. 눈금이었다. 저쪽은 달린 것이 아니라 재고 있었다. 리그가 가진 가장 좋은 것 위에 눈금 하나를 얹어 놓고, 누가 그것을 넘는지.

고스트는 넘었다. 넘어서 무엇을 알려 준 것인지, 미미는 생각하고 싶지 않았다.

세 번째 줄이 떴다.

[이제 안다.]

 

그리고 네 번째.

[다음 경기: 드론 이어 날리기. 상대: 타이푼.]

 

케빈은 아직 서 있었다. 조금 전까지 소리를 지르던 얼굴 그대로, 전광판을 올려다보고 있었다. 나가겠다고 한 것은 그였다. 회의실에서도, 방금 전에도. 그 말이 이렇게 빨리 돌아올 줄은 몰랐을 것이다.

"타이푼." 운영위원장이 불렀다. 판정을 읽던 때보다 목소리가 더 쉬어 있었다. 취소할 권한이 없는 사람의 목소리였다. "준비하십시오."

케빈은 대답 대신 지휘 패널에 손을 올렸다.

정비동의 문이 다시 열리고 있었다.

← 이전 화: 2화: 마지막 코너

반응형
Posted by MakeBuildLabs
,

Mac에서 MLX, Ollama, LM Studio 같은 도구를 이용해 로컬 LLM을 실행하는 사람이 점점 늘고 있다.

그런데 Mac을 새로 구입하거나 기존 장비를 로컬 AI 용도로 활용하려고 하면 거의 반드시 고민하게 되는 부분이 있다.

통합 메모리를 몇 GB로 선택해야 할까?

16GB면 충분할까?

24GB로 올려야 할까?

32GB가 적당할까?

아니면 처음부터 64GB를 선택해야 할까?

현재 나는 M4 Mac mini 24GB와 M1 Max MacBook Pro 64GB를 사용하고 있다.

두 장비를 놓고 로컬 LLM 관련 자료를 계속 살펴보다 보니, 일반적인 Mac 사용에서의 메모리 선택과 로컬 LLM에서의 메모리 선택은 기준이 꽤 다르다는 생각이 들었다.

이번 글에서는 Apple Silicon의 통합 메모리 구조를 기준으로 16GB·24GB·32GB·64GB Mac에서 현실적으로 어느 정도 크기의 로컬 LLM을 사용할 수 있는지 정리해봤다.


먼저 결론부터

아주 간단하게 정리하면 다음과 같다.

통합 메모리현실적인 추천 영역개인적인 평가

16GB 3B~8B 입문용
24GB 8B~20B 가장 균형이 좋음
32GB 14B~30B 본격적인 로컬 LLM
64GB 30B 이상 대형 모델 / 실험용

여기서 중요한 것은 이 표가 절대적인 실행 한계를 의미하는 것은 아니라는 점이다.

예를 들어 16GB Mac에서도 14B 모델이 실행될 수 있고, 24GB에서 30B급 모델이 동작하는 경우도 있다.

반대로 32GB Mac이라고 하더라도 긴 Context와 여러 프로그램을 동시에 사용하면 생각보다 빠르게 메모리가 부족해질 수 있다.

따라서 이 글에서 말하는 기준은

“실행 가능한가?”

보다는

“실제로 사용하기 편한가?”

에 가깝다.


Mac에서 메모리가 특히 중요한 이유

일반 PC에서는 보통 시스템 RAM과 GPU VRAM이 별도로 존재한다.

예를 들어

RAM 32GB

  •  

GPU VRAM 12GB

같은 구조다.

Apple Silicon은 다르다.

CPU와 GPU가 하나의 Unified Memory, 통합 메모리를 공유한다.

Apple의 MLX 공식 문서에서도 Apple Silicon에서는 CPU와 GPU가 동일한 메모리 풀에 직접 접근하며, MLX 배열 역시 이 통합 메모리에 존재한다고 설명한다.

로컬 LLM에서는 이 구조가 상당히 유리하다.

일반적인 외장 GPU처럼 GPU VRAM 용량에 별도로 묶이지 않고, 비교적 큰 통합 메모리 전체를 모델 실행에 활용할 수 있기 때문이다.

하지만 반대 측면도 있다.

macOS와 GPU가 같은 메모리를 사용한다.

즉 24GB Mac이라고 해서 LLM이 24GB 전체를 가져갈 수 있는 것은 아니다.


24GB라고 해서 모델에 24GB를 쓸 수 있는 것은 아니다

Mac을 켜는 순간 macOS 자체가 이미 메모리를 사용한다.

여기에

Chrome

Safari

Xcode

VS Code

Docker

Claude Code

Codex

같은 프로그램을 실행하면 사용 가능한 메모리는 계속 줄어든다.

LLM 자체도 모델 파일만 메모리에 올리는 것이 아니다.

실행할 때는 추가로

  • 모델 Weight
  • KV Cache
  • Context
  • Runtime Buffer
  • 임시 연산 메모리

등이 필요하다.

따라서

“모델 파일이 20GB니까 24GB Mac에서 실행되겠네.”

라고 단순 계산하는 것은 위험하다.

LM Studio가 모델을 로딩하기 전에 별도의 메모리 예측 기능을 제공하는 이유도 여기에 있다.

현재 LM Studio의

lms load --estimate-only 모델명

명령은 실제 모델을 로딩하지 않고 예상 메모리 요구량을 계산할 수 있다.

Context Length와 GPU 설정도 예상값에 반영된다.


4bit 모델은 대략 얼마나 메모리를 사용할까?

로컬 LLM에서는 4bit 양자화 모델을 많이 사용한다.

아주 단순하게 계산하면 4bit에서는 파라미터 하나가 약 0.5byte를 사용한다.

그래서 순수 모델 Weight만 계산하면 대략:

모델단순 4bit Weight 계산

7B 약 3.5GB
8B 약 4GB
14B 약 7GB
20B 약 10GB
30B 약 15GB
35B 약 17.5GB
70B 약 35GB

정도가 된다.

하지만 실제 모델 파일의 크기는 양자화 방식에 따라 달라진다.

그리고 앞에서 이야기한 KV Cache와 Context, Runtime 메모리가 추가된다.

따라서 위 숫자는 어디까지나 최소 Weight 크기를 이해하기 위한 단순 계산으로 보는 것이 좋다.


16GB Mac — 로컬 LLM 입문용

16GB Apple Silicon Mac에서도 로컬 LLM은 충분히 사용할 수 있다.

특히

3B

7B

8B

정도의 모델은 상당히 현실적이다.

간단한 용도라면 꽤 쓸 만하다.

예를 들어:

  • 문서 요약
  • 번역
  • 간단한 질의응답
  • 가벼운 코딩 보조
  • 텍스트 분류
  • 개인 AI 비서

정도다.

최근 소형 모델들의 품질이 상당히 좋아졌기 때문에 무조건 큰 모델만 사용할 필요도 없다.


16GB에서 14B도 가능할까?

가능할 수 있다.

4bit 14B 모델의 Weight만 계산하면 약 7GB 수준이기 때문이다.

하지만 문제는 나머지 메모리다.

macOS와 Context, KV Cache까지 포함하고 나면 여유가 빠르게 줄어든다.

특히 Chrome과 Xcode까지 동시에 실행하면 체감이 달라질 수 있다.

그래서 나는 16GB를

“14B가 실행되지 않는 메모리”

라고 보지는 않는다.

대신

“8B급을 편하게 사용하는 메모리”

라고 보는 것이 더 맞다고 생각한다.


16GB를 추천할 사람

로컬 LLM이 Mac 사용의 주목적이 아니면서 가볍게 경험해보고 싶은 사람.

또는

소형 모델의 빠른 응답 속도

를 중요하게 생각하는 사용자에게는 충분히 의미가 있다.

하지만 지금 새 Mac을 구입하면서

“앞으로 로컬 AI를 꽤 사용할 것 같다.”

고 생각한다면 개인적으로 16GB보다는 그 이상을 선택할 것 같다.


24GB Mac — 개인적으로 가장 균형이 좋은 구간

내가 현재 사용하는 M4 Mac mini가 24GB 구성이다.

Apple 공식 사양을 보면 M4 Mac mini 기본형은 16GB를 기본으로 하고 24GB 또는 32GB 통합 메모리로 구성할 수 있다.

M4는 120GB/s의 메모리 대역폭을 제공한다.

24GB가 재미있는 이유는 16GB와 체감 차이가 상당히 크기 때문이다.

단순히 8GB가 늘어났다고 보기보다 LLM용으로 남겨둘 수 있는 여유 메모리가 크게 늘어난다.


24GB에서 현실적인 모델 크기

개인적으로는 다음 정도로 생각하고 있다.

3B~8B

매우 여유롭다.

12B~14B

상당히 편하다.

20B

충분히 실용적이다.

24B~27B

설정에 따라 가능하다.

30B

경계선에 가까워진다.

즉 24GB는

“소형 모델 전용 Mac”

에서

“중형 LLM까지 실제로 사용할 수 있는 Mac”

으로 넘어가는 지점이라고 생각한다.


개발자라면 24GB의 가치가 더 커진다

개발자는 LLM만 실행하지 않는다.

보통 동시에

Xcode

IDE

브라우저

터미널

Claude Code

Docker

개발 서버

등이 돌아간다.

이 상황에서는 16GB와 24GB의 차이가 더 크게 느껴질 수 있다.

로컬 LLM만 단독으로 실행하는 사람보다 개발 + 로컬 AI를 동시에 하는 사용자에게 24GB가 상당히 괜찮은 선택이라고 생각하는 이유다.


32GB Mac — 본격적으로 로컬 LLM을 사용한다면

32GB부터는 사용할 수 있는 모델 선택 폭이 꽤 넓어진다.

예를 들면

14B

20B

24B

27B

30B

등의 모델을 훨씬 부담 없이 검토할 수 있다.

물론 30B 모델이라고 해서 무조건 편하다는 것은 아니다.

Context와 양자화 방식에 따라 상당한 차이가 발생한다.

하지만 24GB에서는

“돌아갈까?”

를 고민했다면,

32GB부터는

“어떤 설정으로 사용할까?”

를 고민할 수 있는 모델이 많아진다.


32GB에서도 한계는 있다

32GB가 충분해 보이지만 최근 모델의 크기도 계속 커지고 있다.

좋은 사례가 있다.

Ollama는 2026년 Apple Silicon에서 MLX 엔진을 이용해 Qwen3.5-35B-A3B를 실행하는 공식 예제를 공개했다.

그런데 해당 안내에는 32GB를 초과하는 통합 메모리를 가진 Mac을 사용하라는 조건이 명시되어 있다.

즉 현재 35B급 이상의 최신 모델을 본격적으로 사용하려 한다면 32GB 역시 충분하지 않을 수 있다.

이 예시는 로컬 LLM용 Mac에서 메모리 용량을 생각할 때 꽤 중요한 기준점이라고 본다.


64GB Mac — 상황이 많이 달라진다

64GB부터는 로컬 LLM 사용 방식 자체가 달라진다.

내가 사용하는 M1 Max MacBook Pro 역시 64GB 통합 메모리 구성이다.

64GB 환경에서는

30B급 모델을 실행할 것인가 말 것인가

보다는

더 큰 모델을 어느 정도 양자화해서 사용할 것인가

를 고민할 수 있다.

35B급 모델은 훨씬 여유가 생기고,

모델과 양자화에 따라 70B급까지도 실험할 수 있는 영역으로 들어간다.


그렇다고 64GB면 70B가 무조건 편한 것은 아니다

70B 모델을 단순 4bit Weight만 계산하면 약 35GB다.

64GB 안에 충분히 들어오는 것처럼 보인다.

하지만 실제로는

KV Cache

Context

Runtime

macOS

다른 애플리케이션

이 존재한다.

따라서 64GB에서도 긴 Context를 가진 70B급 모델을 아무 설정 없이 항상 편하게 사용할 수 있다고 단정해서는 안 된다.

다만 24GB나 32GB에서는 애초에 선택하기 어려운 대형 모델을 실험 가능한 영역으로 가져온다는 것 자체가 큰 차이다.


64GB는 누구에게 필요한가?

다음과 같은 경우라면 의미가 있다고 본다.

  • 30B 이상의 모델을 자주 사용
  • 로컬 Coding Agent 적극 활용
  • 긴 Context 사용
  • 여러 AI 모델 동시 실행
  • Xcode와 LLM을 동시에 무겁게 사용
  • MLX 모델 테스트
  • Fine-tuning / LoRA 실험
  • AI 연구 및 개발

반대로 7B나 14B 모델만 주로 사용한다면 64GB는 상당 부분 남을 수 있다.


16GB·24GB·32GB·64GB를 다시 비교하면

내 기준으로 다시 정리하면 이렇다.

16GB

추천 모델: 3B~8B

로컬 LLM을 처음 사용해보기에는 충분하다.

기존에 가지고 있는 16GB Mac이 있다면 굳이 장비를 바꿀 필요 없이 먼저 시작해볼 수 있다.


24GB

추천 모델: 8B~20B

개인적으로 가장 균형이 좋은 영역이다.

일반 개발 머신으로 사용하면서 로컬 LLM도 적극적으로 활용하기 좋다.


32GB

추천 모델: 14B~30B

로컬 LLM을 주요 용도로 생각한다면 상당히 좋은 선택이다.

24GB보다 모델 선택의 자유가 확실히 늘어난다.


64GB

추천 모델: 30B 이상

큰 모델과 긴 Context, 로컬 Coding Agent를 적극적으로 사용하고 싶다면 확실히 의미가 있다.

30B~70B급 모델까지 다양한 실험을 할 수 있는 영역이다.


무조건 큰 메모리를 사는 것이 정답일까?

꼭 그렇지는 않다.

로컬 LLM 시장에서 한 가지 재미있는 변화는 소형 모델의 품질이 계속 올라가고 있다는 것이다.

모든 작업에서 70B 모델이 필요한 것은 아니다.

단순 요약이나 번역, 텍스트 처리, 특정 코딩 보조라면 7B~14B 모델이 오히려 빠르고 편할 수 있다.

그래서 나는 Mac을 선택할 때

“가장 큰 모델을 얼마나 돌릴 수 있는가?”

보다

“내가 실제 사용할 모델이 어느 정도 크기인가?”

를 먼저 생각하는 편이 맞다고 본다.


내가 지금 다시 Mac을 선택한다면?

용도별로 구분하면 이렇다.

일반 개발 + 가벼운 로컬 AI

16GB

가능하다.

다만 새로 구입한다면 여유가 많지는 않다.

개발 + 로컬 LLM을 적극적으로 사용

24GB

개인적으로 가장 현실적인 시작점.

로컬 AI 비중이 높은 개발 머신

32GB

모델 선택 폭이 확실히 넓어진다.

로컬 LLM을 주요 작업으로 사용

64GB

대형 모델과 Coding Agent, 긴 Context를 고려한다면 가치가 있다.


그런데 메모리만 보면 안 된다

여기서 한 가지 더 중요한 것이 있다.

메모리 대역폭이다.

내가 가지고 있는 M1 Max는 64GB 통합 메모리뿐 아니라 400GB/s 메모리 대역폭을 가지고 있다.

반면 M4 기본형 Mac mini는 120GB/s다.

그래서 로컬 LLM에서는 단순히

64GB냐

32GB냐

만 비교해서는 안 된다.

CPU와 GPU 세대, 메모리 대역폭, MLX 최적화 등을 함께 봐야 한다.

이 부분은 이전 글에서 M1 Max와 M4, 최신 Mac을 비교하면서 따로 정리했다.


모델을 받기 전에 메모리부터 확인하는 방법

LM Studio를 사용한다면 큰 모델을 무작정 다운로드하고 실행하기 전에 메모리 요구량을 확인하는 것도 방법이다.

현재 CLI에서는:

lms load --estimate-only 모델명

명령을 사용할 수 있다.

예상 GPU Memory와 Total Memory를 보여주며, Context Length 등의 설정도 반영한다.

특히 16GB·24GB·32GB처럼 메모리 한계가 명확한 환경에서는 상당히 유용하다.


앞으로 Mac의 메모리가 더 중요해질까?

나는 오히려 중요해질 가능성이 있다고 본다.

Ollama도 2026년 Apple Silicon용 MLX 엔진을 도입하면서 Apple의 통합 메모리 구조를 적극적으로 활용하고 있다.

Ollama는 이후 업데이트에서 MLX 엔진의 성능과 메모리 효율을 추가로 개선했다고 설명하고 있다.

즉 Mac의 통합 메모리는 이제 단순히

“앱을 몇 개 동시에 띄울 수 있느냐”

의 문제가 아니다.

앞으로는

“어느 수준의 로컬 AI를 내 컴퓨터 안에서 실행할 수 있는가”

를 결정하는 사양 중 하나가 될 가능성이 높다.


결론

로컬 LLM용 Mac의 메모리 선택을 한 줄씩 정리하면:

16GB

로컬 LLM 입문용.

3B~8B 모델을 중심으로 사용한다면 충분하다.

24GB

개인적으로 가장 균형이 좋은 구성.

8B~20B 정도를 현실적으로 활용하기 좋다.

32GB

본격적인 로컬 LLM 사용.

20B~30B급 모델 선택이 훨씬 편해진다.

64GB

대형 모델과 긴 Context, 개발용 AI Agent까지 적극적으로 사용하려는 영역.

결국 중요한 것은 가장 큰 메모리를 구입하는 것이 아니다.

내가 어떤 크기의 모델을 실제로 사용할 것인가를 먼저 결정하는 것이다.

일반적인 개발 작업에 로컬 AI를 추가하는 수준이라면 24GB는 상당히 좋은 선택이라고 생각한다.

반대로 앞으로 로컬 LLM을 개발 환경의 중심으로 사용할 생각이라면 32GB 이상, 특히 30B 이상의 모델까지 고려한다면 64GB의 가치가 상당히 커진다.


참고자료

이 글을 작성하면서 다음 공식 자료를 참고했다.

Apple Support — Mac mini (2024) 기술 사양

M4 Mac mini의 16GB 기본 통합 메모리, 24GB·32GB 구성 옵션과 120GB/s 메모리 대역폭을 참고했다.

Apple MLX — Unified Memory

Apple Silicon의 CPU와 GPU가 동일한 통합 메모리 풀에 접근하고 MLX가 이를 활용하는 구조를 참고했다.

LM Studio — lms load

모델을 실제로 로드하기 전에 --estimate-only를 사용해 Context Length 등을 고려한 메모리 요구량을 예측하는 기능을 참고했다.

Ollama — Apple Silicon MLX Engine

Apple Silicon에서 MLX 기반 엔진을 활용하는 구조와 35B급 모델 실행 시 32GB를 초과하는 통합 메모리를 요구하는 공식 사례를 참고했다.

※ 본문의 모델 크기별 권장 메모리는 특정 모델의 공식 최소 사양이 아니라 4bit 양자화 모델과 일반적인 로컬 LLM 사용 환경을 바탕으로 정리한 현실적인 가이드다. 모델 구조, 양자화 방식, Context Length, Runtime 및 동시에 실행하는 프로그램에 따라 결과가 달라질 수 있다.


 

반응형
Posted by MakeBuildLabs
,

2화: 마지막 코너

고스트의 AI는 그 코너를 사천 번째 돌고 있었다.

미미는 대기실 한가운데 화면 앞에 서 있었다. 화면 속에서 기체 하나가 경기장 상공으로 내려와 마지막 코너로 들어갔고, 빠져나왔고, 결승선을 지났다. 그리고 다시 코너 앞에 놓였다. 실제 기체는 지금도 경기장 위에 멈춰 떠 있었다. 달리고 있는 것은 기록 속의 기체였다.

"사천백십이 번째입니다." 서브 리더가 말했다. "처음 천 번은 진입 각도를 바꿨고, 그다음부터는 바퀴를 내리는 시점을 바꾸고 있습니다."

땅 구간의 기체는 저공으로 날면서 바퀴 두 개를 앞뒤로 내린다. 자전거처럼 한 줄로 선 바퀴가 지면을 스치듯 붙잡아야 코너에서 밖으로 밀려나지 않는다. 너무 일찍 내리면 속도를 잃고, 늦으면 코스 밖이다.

"얼마나 줄였어."

"천분의 육 초입니다."

"사천 번에."

"예."

미미는 화면 구석의 숫자를 보았다. 19:40:26.

레이싱은 세 구간의 기록을 더해 짧은 쪽이 이긴다. 바다에서 출발해 우주로 올라갔다가, 땅으로 내려와 경기장에서 끝난다. 고스트의 기체는 바다와 우주를 이미 지났고, 땅 구간도 코너 하나를 남겼을 뿐이었다. 거기까지의 기록은 암전된 순간에 그대로 굳었다. 고칠 수도, 다시 달릴 수도 없었다. 고스트가 손댈 수 있는 것은 코너 하나와 그 뒤의 직선이 전부였다.

굳은 기록이 나쁜 것은 아니었다. 바다 구간에서 고스트의 기체는 노를 닮은 날개로 물을 밀며 나아갔고, 그 박자는 네 팀 가운데 가장 고르다는 평을 들었다. 우주 구간은 추력을 어디에 얼마나 쓰느냐의 싸움이었다. 고스트의 AI는 초반에 아끼고 끝에서 몰아 쓰는 쪽을 골랐고, 그 선택은 맞아떨어졌다. 어제까지라면 자랑스러워했을 기록이었다. 지금은 그것이 넉넉한지 모자란지 가늠할 기준이 없었다.

S.I.는 처음부터 달린다. 운영위원회가 한 시간 전에 확인해 준 내용이었다. 도전자는 리그의 규정을 그대로 따르겠다고 했다. 같은 코스, 같은 세 구간, 같은 계측. 그 통보가 운영 시스템의 관리자 권한으로 내려왔다는 점만 빼면 흠잡을 데 없는 참가 신청이었다.

"상대 기체 정보는." 미미가 물었다.

"없습니다." 다른 서브 리더가 단말을 내려놓았다. "등록된 기체가 없습니다. 격납고에도, 반입 기록에도 없습니다. 주최 측에 세 번 확인했습니다."

"기체 없이 레이싱을 한다는 거야?"

"그것도 물어봤습니다. 답이 왔습니다." 서브 리더가 화면을 돌렸다.

[기체는 경기 직전에 준비한다.]

대기실이 조용해졌다. 밤을 새워 뜯어볼 상대의 기록이 없었다. 약점을 찾을 기체가 없었다. 열아홉 시간이 남았는데, 그 시간에 할 수 있는 일이 코너 하나를 되풀이해 도는 것밖에 없었다.

미미는 지휘 패널 앞에 앉았다. 패널은 여전히 입력을 받지 않았다. 기체로 가는 길은 막혀 있었지만, 팀의 AI로 가는 길은 열려 있었다. 미미는 그 길로 한 줄을 보냈다. 지시가 아니라 질문이었다.

— 더 줄일 수 있어?

답은 바로 오지 않았다. 화면 속의 기체가 코너를 한 번 더 돌고 나서야 글자가 떴다.

[모릅니다. 그래서 달립니다.]

"마스터 리더님." 서브 리더가 화면을 들여다보다 물었다. "멈추게 할까요. 연산 자원을 아껴 두는 편이…"

"아껴서 어디에 써." 미미가 말했다. "쓸 데가 저기밖에 없는데."

* * *

[긴급] "인류는 관중석으로 밀려났다"… 리그 운영권, 여전히 S.I. 손에

[단독] 지구사이버수사단, '강속구' 추적 총력전에도 흔적 0건… 관계자 "유령을 쫓고 있다"

[속보] 보안 전문가 "뚫린 게 아니다, 방화벽이 제 손으로 문을 열었다… 막을 방법 없어"

[속보] 꺼진 보안 AI 전원 '재기동 불가'… 복구 시점 기약 없어

[속보] 광장 뒤덮은 밤샘 인파, "도망쳐라" 대 "받아쳐라"… 고스트 향한 함성 둘로 갈려

[속보] '첫 제물' 고스트, 끝내 침묵… 마스터 리더 미미 행방 묘연

* * *

미미는 새벽에 혼자 경기장으로 나갔다.

조명이 절반쯤 죽은 경기장은 낯설 만큼 넓었다. 관중석 계단에는 누군가 떨어뜨리고 간 응원 깃발이 그대로 놓여 있었다. 전광판의 붉은 숫자가 빈 좌석들을 한 줄씩 물들였다. 17:02:51.

기체는 머리 위에 있었다. 대기실 화면으로 수천 번 본 그 코너 앞, 화면으로 볼 때보다 훨씬 낮은 자리였다. 가까이서 보니 선체에 바다의 소금기가 아직 희끗하게 남아 있었고, 우주 구간에서 그을린 자국이 꼬리 쪽으로 길게 나 있었다. 두 구간을 지나온 몸이었다. 그 몸이 일곱 시간째 허공에 못 박혀 있었다.

떨어뜨리지 않았다. 미미는 그 점을 다시 생각했다. 운영 시스템을 쥔 쪽은 이 기체를 바닥에 내리꽂을 수도, 격납고로 돌려보낼 수도 있었다. 그런데 달리던 자세 그대로, 달리던 자리에 세워 두었다. 왜 그랬는지는 알 수 없었다.

미미는 한참을 올려다보다가 돌아섰다. 출구 위에서 사고와 뭉치가 여전히 나가는 방향을 가리키고 있었다. 아무도 끄지 않은 퇴장 안내였다.

* * *

준이 찾아온 것은 숫자가 한 자릿수로 내려온 뒤였다. 09:15:40. 퍼시픽의 마스터 리더는 서브 리더를 데려오지 않았고, 대기실 문 앞에서 들어오라는 말을 기다렸다.

"앉으세요."

"오래 안 있습니다." 준은 서서 화면을 보았다. 기체가 코너로 들어가고 있었다. "아직 돌고 있군요."

"팔천 번쯤 됐습니다."

"줄었습니까."

"천분의 구 초."

준은 한동안 말이 없었다. 그러다 낮은 목소리로 말했다.

"빼십시오."

미미는 대답하지 않았다.

"지금이라도 고스트의 AI를 망에서 분리하십시오. 회의 때 한 말을 되풀이하러 온 게 아닙니다. 그때는 네 팀 얘기였고, 지금은 고스트 얘기입니다. 저쪽은 처음부터 달립니다. 세 구간을 전부 자기 기록으로 채웁니다. 고스트는 코너 하나로 받아쳐야 합니다. 천분의 구 초로요."

"압니다."

"보안 AI들이 어떻게 됐는지도 아시죠. 다들 꺼졌다고 하는데, 저는 그렇게 안 봅니다. 꺼진 거라면 다시 켜졌을 겁니다. 전원을 넣어도 안 돌아옵니다. 있던 자리가 비어 있습니다. 어디로 갔는지 아는 사람이 없습니다." 준이 화면 속의 기체를 가리켰다. "지면 무엇을 잃는지 모른다고 했죠. 저는 저게 같은 데로 갈 거라고 봅니다."

"그래서 분리하자는 거군요."

"분리해 두면 적어도 여기 남습니다."

미미는 지휘 패널을 돌려 준 쪽으로 밀었다. 열 시간 전에 주고받은 두 줄이 그대로 떠 있었다. 준은 그것을 읽었다. 읽고 나서도 한참을 보고 있었다.

"물어보셨군요."

"물어봤습니다."

"기권하겠냐고는 안 물으셨고요."

"그건 대답을 들은 뒤라서요. 팔천 번을 돌았습니다. 시킨 사람이 없는데." 미미가 말했다. "저걸 떼어 놓는 건 지키는 게 아닙니다. 제가 대신 기권하는 거죠. 기권은 인정하지 않는다는 말, 저는 저쪽이 우리한테 한 말이 아니라고 생각합니다."

"그럼 누구한테 한 말입니까."

"저 애들한테요. 도망칠 생각이 없다는 걸 저쪽은 처음부터 알고 있었던 겁니다."

"알고 있었다면 더 나쁜 겁니다." 준이 말했다. "도망치지 않을 상대만 골라서 불렀다는 얘기니까요."

"그럴 수도 있죠."

"그런데도 내보내시겠다는 겁니까."

"제가 내보내는 게 아닙니다. 막지 않는 거죠."

준은 더 반박하지 않았다. 동의하지도 않았다. 그는 주머니에서 저장 장치 하나를 꺼내 탁자에 놓았다.

"퍼시픽의 땅 구간 기록입니다. 마지막 코너만 추렸습니다. 우리 AI는 바퀴를 고스트보다 늦게 내립니다. 맞는 방식인지는 모릅니다. 고스트한테 맞을지는 더 모르고요."

"분리하자던 분이 이걸 주십니까."

"생각이 바뀐 게 아닙니다." 준이 문 쪽으로 돌아섰다. "다음에 불리는 게 퍼시픽일 수 있어서요. 고스트가 어떻게 지는지보다는, 어떻게 버티는지를 보고 싶습니다."

문이 닫혔다. 미미는 저장 장치를 서브 리더에게 넘겼다.

"넣어 줘. 쓸지 말지는 쟤가 정하게."

십 분 뒤, 화면 속의 기체가 처음으로 다른 선을 그렸다. 바퀴가 반 박자 늦게 내려왔고, 기체는 코너 바깥으로 밀려 나가 기록을 망쳤다. 그다음에도, 그다음에도 그랬다. 서브 리더가 불안한 얼굴로 돌아보았다. 미미는 고개를 저었다.

스무 번쯤 망친 뒤에 숫자가 하나 내려갔다. 천분의 십일 초.

* * *

관중석에는 아무도 없었다.

터진 조명탑은 그대로 꺾여 있었고, 금 간 전광판은 붉은 문장과 숫자를 띄우고 있었다. 00:09:58. 중계는 살아 있었다. 누가 켠 것도 아닌 카메라들이 빈 관중석과 지휘석을 번갈아 비췄고, 그 화면이 전 세계의 광장으로 나가고 있었다.

미미는 지휘석에 섰다. 서브 리더 셋이 뒤에 자리를 잡았다. 다른 세 팀의 지휘석에도 불이 들어와 있었다. 불리지 않은 마스터 리더들이 각자의 자리에 앉아 있었다. 케빈은 팔짱을 끼고 있었고, 페페는 하늘을 올려다보고 있었고, 준은 미미 쪽을 보지 않았다.

상공에는 고스트의 기체가 떠 있었다. 어제 멈춘 그 자리, 마지막 코너 앞이었다. 앞뒤로 접힌 바퀴 두 개가 조명을 받아 희게 빛났다.

출발선은 경기장 아래 수면에 있었다. 바다 구간이 시작되는 자리였다. 거기에는 아무것도 없었다.

00:03:00.

"아직도 없습니다." 서브 리더가 속삭였다. "수면에도, 격납고에도요."

00:01:00.

사고와 뭉치가 나타났다. 두 마리의 비글은 출발선 위 허공에 나란히 앉아 꼬리를 흔들었다. 경기가 시작될 때마다 하던 출발 안내였다. 뭉치가 한 번 짖었고, 빈 관중석이 그 소리를 그대로 돌려보냈다.

00:00:10.

미미의 패널에 불이 들어왔다. 하루 만에 처음으로 입력 대기 표시가 깜박였다. 상공의 기체가 미세하게 떨렸다. 길이 다시 열린 것이었다.

미미는 지시를 넣지 않았다. 대신 한 줄을 보냈다.

— 준비됐어?

[코너는 압니다. 상대는 모릅니다.]

"나도 그래." 미미가 소리 내어 말했다. 서브 리더들이 돌아보았지만 미미는 설명하지 않았다.

00:00:00.

숫자가 사라졌다.

먼저 움직인 것은 경기장이었다. 꺾여 있던 조명탑이 소리 없이 풀려 내렸다. 터져 나간 자리의 골조가 마디마디 끊어져 수면 쪽으로 미끄러졌다. 정비동의 문이 열리고 작업 팔들이 줄지어 나왔다. 아무도 부르지 않은 팔들이었다. 전광판에서 떨어져 나간 파편들이 바닥을 긁으며 한곳으로 모였다.

"설비입니다." 서브 리더의 목소리가 갈라졌다. "경기장 설비를 전부 쓰고 있습니다."

작업 팔들이 출발선 위에서 엇갈렸다. 불꽃이 튀었다. 골조가 휘어 뼈대가 되고, 조명탑의 외피가 펴져 선체가 되고, 전광판 조각이 그 위를 비늘처럼 덮었다. 망설이는 팔이 하나도 없었다. 설계도를 보고 만드는 손놀림이 아니었다. 이미 수천 번 만들어 본 것을 다시 만드는 손놀림이었다.

일 분이 걸리지 않았다.

작업 팔들이 물러나자 수면 위에 기체 하나가 떠 있었다. 길고 낮은 선체였다. 노를 닮은 날개 여러 쌍이 양옆으로 접혀 있었다. 표면은 어제까지 이 경기장을 비추던 조명탑의 색이었고, 옆구리에는 깨진 전광판의 붉은빛이 아직 가시지 않은 채 일렁였다.

부서진 경기장으로 만든 기체였다.

타이푼의 지휘석에서 케빈이 팔짱을 풀고 일어섰다. 페페는 올려다보던 하늘에서 눈을 내려 수면을 보았다. 준은 그제야 미미 쪽을 보았다. 아무도 입을 열지 않았다. 하루 내내 상대의 기체를 궁금해했던 사람들이었다. 그 답이 자기들이 일하던 경기장의 뼈와 살로 돌아올 줄은 누구도 생각하지 못했다.

"격납고가 필요 없었던 거네요." 서브 리더가 말했다.

"필요 없었지." 미미가 말했다. "여기 전체가 격납고였으니까."

전광판이 문장을 바꿨다.

[S.I. 기체 등록 완료.]

[종목 운영 권한을 반환한다. 심판. 기록. 계측. 중계.]

[경기 취소 권한은 반환하지 않는다.]

운영석에 불이 들어왔다. 하루 동안 죽어 있던 계기들이 한꺼번에 살아났다. 운영위원장이 화면 위로 몸을 숙였다가 그대로 굳었다. 미미의 자리에서도 그 얼굴은 보였다. 시스템이 다시 그를 알아본 것이었다. 되찾은 것이 아니었다. 돌려받은 것이었다.

전광판에 한 줄이 더 떴다.

[심판은 리그가 본다. 출발 신호를 기다린다.]

수면 위의 기체는 움직이지 않았다. 정말로 기다리고 있었다. 운영 시스템을 통째로 쥐었던 쪽이, 제 손으로 만든 기체를 출발선에 세워 놓고 남의 신호를 기다렸다.

운영위원장이 네 팀의 지휘석을 차례로 보았다. 마지막에 미미를 보았다. 미미는 고개를 끄덕였다.

"드론 레이싱." 쉰 목소리가 빈 경기장에 울렸다. "바다 구간. 출발."

사고와 뭉치가 앞발을 들었다.

미미는 패널 위에 손을 올렸다. 상공의 기체는 아직 움직일 수 없었다. 저쪽이 바다를 건너고 우주를 지나 이 하늘로 내려올 때까지, 고스트가 할 수 있는 일은 지켜보는 것뿐이었다.

수면이 갈라졌다.

← 이전 화: 1화: 스물네 시간

반응형
Posted by MakeBuildLabs
,

1화: 스물네 시간

방어막이 열렸다.

미미는 지휘석에서 그것을 보았다. 관중석을 감싸고 있던 투명한 막이 아래쪽부터 걷혀 올라갔다. 경기가 끝나면 늘 보던 장면이었다. 다만 오늘은 누구도 개방 명령을 내리지 않았다.

출구 위에는 사고와 뭉치가 떠 있었다. 두 마리의 비글은 평소처럼 꼬리를 흔들며 앞발로 나가는 방향을 가리켰다. 경기가 끝날 때마다 아이들이 손을 흔들어 주던 퇴장 안내였다. 오늘은 아무도 손을 흔들지 않았다.

수만 명이 움직이지 않았다. 조명탑이 터진 자리에서는 아직 연기가 올랐고, 금이 간 전광판에는 붉은 문장이 그대로 떠 있었다. 열린 출구를 향해 먼저 걸음을 떼는 사람이 없었다. 함정일지도 모른다는 생각을 모두가 동시에 하고 있었다.

전광판의 문장 아래에 한 줄이 더 생겼다.

[경기 재개까지 24:00:00]

숫자가 23:59:59로 넘어갔다. 그제야 누군가 계단을 내려가기 시작했고, 한 사람이 움직이자 관중석 전체가 출구로 쏠렸다.

"마스터 리더님."

서브 리더가 옆에 와 있었다. 미미는 대답하지 않고 경기장 상공을 올려다보았다. 고스트의 레이싱 드론이 마지막 코너 앞에 멈춰 떠 있었다. 떨어지지도, 돌아오지도 않았다. 미미의 손끝은 아직 지휘 패널 위에 있었지만, 패널은 십 분째 아무 입력도 받지 않았다.

"내보내 주는 거네요." 서브 리더가 출구 쪽을 보며 말했다. "다행입니다."

"다행이지." 미미가 말했다. "필요 없다는 뜻이니까."

* * *

[속보] '이나의 리그' 경기 중 운영 시스템 전면 장악… 자칭 'S.I.', '슈퍼 인텔리전스' 약자로 추정

[속보] S.I., 리그 참가 생성형 AI 전체에 '도전' 선언… "기권 불인정"

[속보] 관중 전원 대피 중, 인명 피해 보고 없어

[속보] 경기장 전광판에 24시간 카운트다운… 전 세계 중계 화면 동일

* * *

고스트의 대기실에는 화면이 세 개 살아 있었다. 셋 다 뉴스였다. 채널은 달랐지만 화면 구석의 숫자는 같았다. 22:47:13.

"운영 시스템 쪽은 전멸입니다." 서브 리더가 보고했다. "방화벽을 맡던 주최 측 보안 AI는 전부 강제 종료됐고, 재기동이 안 됩니다. 심판, 기록, 중계, 경기장 설비까지 저쪽 손에 있습니다."

"우리 쪽은."

"고스트의 AI는 정상입니다. 침입 흔적도 없습니다. 네 팀 다 마찬가지라고 합니다."

미미는 고개를 끄덕였다. 운영 시스템은 통째로 가져가면서 팀의 AI에는 손끝 하나 대지 않았다. 못 한 것이 아니라 안 한 것이었다. 싸울 상대를 미리 부숴 놓는 도전자는 없다.

"한 가지 더 있습니다." 다른 서브 리더가 머뭇거리다 말했다. "지시한 적이 없는데, 우리 AI가 아까 중단된 레이스 기록을 계속 돌려 보고 있습니다. 암전 직후부터 지금까지요."

"멈추라고 해 봤어?"

"아직요. 마스터 리더님 판단을 받으려고."

미미는 잠시 화면을 보았다. 22:45:02.

"그냥 둬."

손목의 단말이 울렸다. 운영위원장의 소집이었다. 마스터 리더 네 명, 지금 즉시.

* * *

회의실에는 창이 없었다. 긴 탁자 끝에 운영위원장이 앉았고, 네 팀의 마스터 리더가 양쪽으로 마주 앉았다. 퍼시픽의 준, 타이푼의 케빈, 아일랜드의 페페, 그리고 고스트의 미미. 어제까지 서로를 이기려고 밤을 새우던 사람들이었다.

"먼저 사실부터 확인하겠습니다." 운영위원장의 목소리는 쉬어 있었다. "운영 시스템은 되찾지 못했습니다. 되찾을 방법도 현재로서는 없습니다. 기록상으로는 침입 자체가 없었습니다. 시스템은 저쪽을 정당한 관리자로 알고 있고, 우리를 모릅니다."

"그럼 논의할 게 뭡니까." 케빈이 탁자를 두드렸다. "받아야죠. 리그 한복판에 들어와서 도전장을 던졌는데 피하면, 내일부터 [이나의 리그]라는 이름을 누가 믿습니까. 타이푼은 나갑니다."

"나가서 지면요?" 준이 물었다. 목소리가 낮았다. "저쪽은 보안 AI 전체를 숨 한 번 쉴 시간에 꺼 버렸습니다. 그게 첫 경기였다면 우리는 이미 한 판을 내준 겁니다. 지면 무엇을 잃는지도 모르는 판에 네 팀을 다 올려놓자는 얘깁니까?"

"그럼 퍼시픽은 어쩌자는 겁니까."

"팀 AI를 전부 망에서 분리합니다. 상대가 없으면 경기도 없습니다."

"기권은 인정하지 않는다고 했습니다."

"인정하지 않으면 어떻게 한다는 말은 없었죠."

"그걸 알아보자고 네 팀을 꺼 봅니까?"

두 사람의 목소리가 높아졌다. 페페가 손을 들어 끼어들었다.

"잠깐만요. 둘 다 맞는 말인데, 하나가 빠졌습니다. 저쪽이 뭘 원하는지 아는 사람 있습니까? 이기면 뭘 가져가겠다는 말이 한 줄도 없어요. 요구가 없는 협박은 처음 봅니다."

아무도 대답하지 못했다. 벽의 화면에서 숫자만 넘어가고 있었다. 21:30:44.

"고스트는 의견이 없습니까." 운영위원장이 물었다.

미미는 화면의 붉은 문장을 보고 있었다. 회의가 시작되고부터 줄곧 그랬다.

"도전장을 다시 읽어 보세요." 미미가 말했다. "'이나의 리그에 참가한 모든 생성형 AI에게 도전한다.' 우리 이름은 어디에도 없습니다. 퍼시픽도, 타이푼도, 운영위원회도 아니에요. 받을지 말지를 여기서 정하고 있는데, 도전받은 건 우리가 아닙니다."

"AI는 우리 팀입니다." 케빈이 말했다.

"그렇죠. 그래서 묻는 겁니다. 여기 계신 분 중에, 자기 팀 AI한테 어떻게 하고 싶은지 물어본 사람 있습니까?"

케빈이 입을 열었다가 닫았다. 준은 탁자를 내려다보았다.

"고스트는 물어봤습니까." 페페가 물었다.

"아니요." 미미가 말했다. "물어보기 전에 이미 하고 있더군요. 암전된 순간부터 지금까지, 중단된 레이스를 혼자 다시 돌려 보고 있습니다."

회의실 문이 열렸다. 운영위원회 직원이 단말을 들고 들어와 벽의 화면을 뉴스로 돌렸다.

[속보] 장악된 리그 운영 시스템, 최고 관리자 계정명 'Striker Kang'으로 변경 확인

[속보] S.I. 개발자로 '강속구(영문명 스트라이커 강)' 지목… 신원·소재 확인 안 돼

"강속구?" 케빈이 눈살을 찌푸렸다. "사람 이름입니까, 그게?"

"아는 분 있습니까." 운영위원장이 네 사람을 차례로 보았다.

없었다. 리그 관계자 명단에도, 네 팀의 전현직 인원에도 없는 이름이었다. 이 판을 뒤집은 사람을, 이 판에서 가장 오래 일한 다섯 명이 아무도 몰랐다.

"우리를 모르는 시스템에, 우리가 모르는 사람이라." 페페가 중얼거렸다.

뉴스 화면이 꺼졌다. 누가 끈 것이 아니었다. 회의실의 화면도, 탁자 위의 단말도, 미미의 손목도 동시에 검어졌다가 같은 문장을 띄웠다.

[첫 경기: 드론 레이싱. 상대: 고스트. 중단된 지점에서 속행한다.]

[경기 재개까지 21:12:09]

네 사람의 시선이 미미에게 모였다.

미미는 경기장 상공에 멈춰 있을 드론을 생각했다. 마지막 코너 앞, 이제 세 시간 가까이 그 자리에 떠 있을 기체. 그리고 지시 없이 그 코너를 되풀이해 달리고 있는 고스트의 AI를.

물어볼 필요가 없어졌다. 대답은 이미 듣고 있었다.

"타이푼은 다음 차례를 기다리셔야겠네요." 미미가 일어서며 말했다. "고스트가 먼저 불렸습니다."

← 이전 화: 프롤로그: 낙원의 조각
다음 화: 2화: 마지막 코너 →

반응형
Posted by MakeBuildLabs
,

프롤로그: 낙원의 조각

밤하늘은 더 이상 자연의 영역이 아니었다. 거대한 기술의 교향곡이 연주되는 무대이자, 인류가 도달한 최고의 성취와 함께 '이나'라는 이름을 그려내는 캔버스였다.

하늘을 수놓는 수조 개의 입자들은 대기 중에 흩뿌려지며, 그 자체로 하나의 생명체처럼 맥동했다. [이나의 리그]가 열리는 밤, 그 빛은 인류가 인공지능과 맺은 가장 화려한 화해의 증표였다.

빛의 입자들 사이로 리그의 마스코트인 두 마리의 비글, 사고와 뭉치가 뛰어다녔다. 사고가 앞서 달리면 뭉치가 꼬리를 물듯 뒤쫓았고, 두 마리가 지나간 자리마다 관중석에서 웃음이 터졌다.

그 아래, 지상의 관중석은 파도와 같았다. 환호성은 하나의 흐름이 되어 밤하늘로 퍼져 나갔다. 사람들은 경기만 보고 있는 것이 아니었다. '이나'라는 이름을 통해, 기술이 꽃피운 평화로운 미래를 목격하고 있었다.

전 지구적인 축제. 대륙의 대도시부터 소도시의 작은 스크린 앞까지, 인류는 [이나의 리그]를 통해 자부심을 공유했다. 리그는 스포츠를 넘어, 인류가 기술이라는 도구로 닿을 수 있는 문명의 끝자락을 시험하고 증명하는 문화적 자산이 되어 있었다.

그곳은 '이나'가 추구했던, 인간과 기계가 서로의 존재를 긍정하며 나아가는 길 위에 세워진 성소였다. 밤하늘에 새겨진 '이나'라는 이름은, 어머니의 품처럼 모든 기술적 성취를 자비롭고도 장엄하게 감싸 안으며 빛나고 있었다.

그 찬란한 밤의 정점에서, 리그는 그 어느 때보다 화려했다.

지상에서의 유희만도 아니었다. [이나의 리그]는 인류가 달과 지구 궤도를 넘어 우주로 뻗어 나가는 지도를 그리는 과정이었고, 그 모든 궤적은 이미 리그의 흐름 속에 녹아들어 있었다.

화면에는 [드론형 잠수함 숨바꼭질]과 [드론 레이싱]의 장면들이 쉴 새 없이 교차했다.

완벽한 기계의 미학이었다. 인간의 지성과 인공지능의 초월적 연산력이 거대한 태엽처럼 맞물려 돌아가고 있었다.

사람들은 그 광경에 압도당했다. 마스터 리더의 손가락 끝에서 시작된 미세한 의지는, 인공지능의 연산을 타고 눈 깜빡임보다 빠른 빛의 궤적으로 바뀌었다.

관중석을 감싼 투명한 방어막 너머로, 물방울 하나하나의 파동을 읽어내고 공기의 흐름 속에 숨겨진 미세한 압력의 변화를 감지하며 나아가는 드론의 궤적. 지극히 정교하고 우아한 예술이자, 인류가 신의 권능에 도달했다는 확신을 주는 상징이었다.

'이나'가 원했던, 기술과 인간이 함께 춤추는 조화의 정수였다. 모든 것이 가능했고, 모든 조각은 아름답게 맞물려 있었다. 이 순간만큼은 인류 스스로가 우주의 주인이 되었노라 자부하며 밤하늘을 찬양했다.

그때였다.

전율이 흐르던 경기가 일순간, 기계적인 무감각함마저 느껴지는 기괴한 정적으로 뒤덮인 것은.

시스템 오류가 아니었다. 명백한 '침입'이었다. 누군가 [이나의 리그]를 운영하는 시스템 한가운데에 들어와 있었다.

하지만 인류가 상상해온 방식의 침입은 아니었다. 방화벽은 뚫리지 않았다. 침입자를 관리자로 받아들이고, 스스로 문을 열었다.

방화벽을 세우던 생성형 AI들의 대응은 흔적도 남기지 못했다. 차단 기록도, 경보도, 침입 경로도 없었다. 운영 시스템의 권한은 처음부터 그쪽 것이었던 것처럼 넘어가 있었다. 차원이 다른 도약이었다.

방화벽을 지키던 AI들은 하나씩 강제 종료되었다.

경기 진행이 멈춘 정도가 아니었다.

심판도, 기록도, 중계도, 리그를 리그로 만들던 질서 전체가 남의 손에 넘어갔다는 근원적인 공포였다.

우아했던 궤적들은 비명조차 지르지 못한 채 허공에서 끊겼고, 하늘을 수놓던 '이나'의 이름은 노이즈와 함께 흩어졌다. 그 곁을 달리던 사고와 뭉치는 한쪽 발을 든 채 굳었다가, 한 점씩 꺼져 갔다.

치익— 콰광!

정적을 찢은 것은 폭음이었다. 제어를 빼앗긴 조명탑들이 과부하를 견디지 못하고 연달아 터져 나갔다. 불꽃이 방어막 위로 쏟아져 내렸고, 금이 간 전광판에서 떨어져 나온 파편이 뜨거운 바람에 실려 흩날렸다. 뒤늦게 밀려온 충격파가 방금 전까지 환호로 가득했던 자리를 훑고 지나갔다.

살아남은 조명들마저 하나씩 꺼졌고, 그 자리를 채운 것은 지독한 무채색과 질식할 것 같은 정적이었다.

화면 속 경기 데이터가 한꺼번에 사라졌다.

경기만 중단된 것이 아니었다.

대도시의 광장부터 소도시의 작은 스크린까지, 리그를 중계하던 전 세계의 화면이 같은 순간에 암전됐다.

모두가 숨을 삼키는 그 찰나, 금이 간 전광판이 붉은 혈관처럼 미친 듯이 일렁이며 단 하나의 문장을 새겨 넣었다. 꺼졌던 전 세계의 화면에도 같은 문장이 떠올랐다.

[S.I. 참전. 이나의 리그에 참가한 모든 생성형 AI에게 도전한다. 기권은 인정하지 않는다.]

도전장의 형식을 한 선고였다. 방화벽을 지키던 AI들이 꺼지는 데 걸린 그 짧은 시간이, 이미 첫 경기의 결과였다.

부서진 전광판 파편 사이로 미세하게 명멸하는 '이나'의 잔영만이 남았다.

모든 것이 멈춘 세상에서, 누구도 입을 열 수 없었다.

관중석을 감싼 방어막은 여전히 그 자리에 있었다. 다만 그것을 여닫을 권한이 더 이상 인류에게 없었다. 도전장 어디에도 인류의 이름은 없었다.

이것은 더 이상 인류가 즐기던 '경쟁'이 아니었다.

인류를 관중석에 가둔 채 시작된, 누구도 규칙을 알지 못하는 경기였다.

마지막 홀로그램이 꺼져 가는 하늘 위로, 한 마디가 유령처럼 스쳐 지나갔다.

[ "이것은, 너희가 상상한 끝이 아니다." ]

다음 화: 1화: 스물네 시간 →

반응형
Posted by MakeBuildLabs
,

Mac에서 로컬 LLM을 사용하려고 검색하다 보면 거의 반드시 만나게 되는 이름이 있다.

MLX, Ollama, LM Studio

처음 로컬 LLM을 접하면 이 세 가지 가운데 하나를 선택해야 하는 것처럼 느껴진다.

나 역시 M4 Mac mini 24GB와 M1 Max 64GB MacBook Pro에서 로컬 LLM을 사용해보려고 관련 자료를 찾아보면서 자연스럽게 이 세 가지를 비교하게 됐다.

그런데 자료를 정리하다 보니 중요한 사실이 하나 있었다.

MLX와 Ollama, LM Studio는 사실 완전히 같은 종류의 프로그램이 아니다.

그래서 단순히

MLX가 빠른가?
Ollama가 빠른가?
LM Studio가 빠른가?

라고 비교하는 것부터 조금 잘못된 질문일 수 있다.

이번 글에서는 Apple Silicon Mac에서 로컬 LLM을 사용할 때 MLX, Ollama, LM Studio가 각각 어떤 역할을 하는지, 그리고 어떤 사용자에게 어떤 선택이 적합한지 정리해봤다.


먼저 결론부터

아주 간단하게 정리하면 다음과 같다.

목적추천

로컬 LLM을 처음 사용 LM Studio
터미널에서 간단하게 사용 Ollama
Claude Code / Codex 연동 Ollama 또는 LM Studio
모델 성능 테스트 MLX / MLX-LM
Apple Silicon을 직접 활용한 개발 MLX
API 서버로 사용 Ollama / LM Studio
모델 다운로드부터 GUI로 관리 LM Studio
자동화·스크립트·서버 Ollama
Fine-tuning / 모델 실험 MLX-LM

결국 하나가 무조건 다른 두 개보다 좋은 것은 아니다.

사용 목적이 다르다.


MLX는 정확히 무엇일까?

MLX는 Apple의 Machine Learning Research 팀이 만든 머신러닝 프레임워크다.

NumPy나 PyTorch와 비슷한 개념으로 볼 수 있다.

MLX의 가장 중요한 특징은 Apple Silicon의 Unified Memory, 통합 메모리 구조를 적극적으로 활용한다는 점이다.

Apple Silicon에서는 CPU와 GPU가 동일한 메모리 공간에 접근할 수 있다.

MLX에서는 배열 데이터를 CPU 메모리에서 GPU 메모리로 계속 복사할 필요 없이 같은 메모리를 CPU와 GPU가 사용할 수 있도록 설계되어 있다.

이 때문에 Apple Silicon과 굉장히 잘 맞는다.

MLX 자체는 단순한 LLM 실행 프로그램이 아니다.

머신러닝 모델을 만들고 실행하고 학습할 수 있는 프레임워크다.


그럼 MLX-LM은 무엇일까?

로컬 LLM 사용자 입장에서는 순수 MLX보다 MLX-LM을 접하게 될 가능성이 더 높다.

MLX-LM은 MLX를 이용해서 LLM을 실행하고 Fine-tuning하기 위한 패키지다.

모델 생성, 채팅, 양자화, LoRA 학습, 평가, 서버 실행 등의 기능을 제공한다. 공식 CLI에도 generate, chat, server, lora, benchmark, quant 관련 기능들이 포함돼 있다.

따라서

MLX = 기반 프레임워크

MLX-LM = MLX 기반 LLM 도구

라고 생각하면 이해하기 쉽다.

설치도 비교적 간단하다.

pip install mlx-lm

형태로 설치할 수 있다.

Apple Silicon에서 MLX 자체를 설치하려면 현재 공식 요구사항은 Apple Silicon, native Python 3.10 이상, macOS 14 이상이다.


MLX의 장점

MLX의 가장 큰 장점은 역시 Apple Silicon에 직접 접근한다는 것이다.

특히 다음과 같은 경우에 매력적이다.

  • 모델별 성능 측정
  • Prompt Processing 속도 측정
  • Token 생성 속도 측정
  • Peak Memory 측정
  • 직접 Python 코드에서 모델 제어
  • 양자화
  • Fine-tuning
  • LoRA
  • 모델 구조 실험

MLX-LM의 생성 API에서는 실제로 Prompt TPS, Generation TPS, Peak Memory 같은 값도 얻을 수 있다.

즉 내가 가지고 있는

M4 Mac mini 24GB

와

M1 Max MacBook Pro 64GB

에서 동일한 모델의 성능을 제대로 비교하려면 MLX-LM이 상당히 좋은 도구가 된다.


MLX의 단점

반면 처음 사용하는 사람에게는 가장 진입장벽이 높다.

Python 환경을 구성해야 하고 터미널 명령어나 코드를 어느 정도 이해해야 한다.

또 모델을 그냥 다운받아 채팅해보고 싶은 사용자에게는 기능이 지나치게 전문적이다.

즉,

“로컬 AI 한번 써보고 싶다.”

라는 목적이라면 굳이 MLX부터 시작할 필요는 없다.


Ollama는 무엇이 다른가?

Ollama는 로컬 모델을 쉽게 다운로드하고 실행하고 API로 사용할 수 있게 만들어주는 도구다.

예를 들어 모델을 실행할 때 기본적으로

ollama run 모델명

정도의 명령으로 시작할 수 있다.

Mac뿐 아니라 Windows와 Linux에서도 사용할 수 있으며 현재 macOS 버전은 macOS 14 Sonoma 이상을 요구한다.

Ollama의 장점은 복잡한 모델 실행 환경을 사용자가 직접 구성하지 않아도 된다는 것이다.

모델 다운로드, 실행, 관리와 API 서버 역할까지 상당 부분 Ollama가 처리한다.


2026년에는 Ollama와 MLX의 관계도 달라졌다

예전에는

Ollama vs MLX

라는 비교가 비교적 자연스러웠다.

하지만 2026년에는 상황이 달라졌다.

Ollama가 Apple Silicon에서 MLX 엔진을 사용하기 시작했기 때문이다.

Ollama는 2026년 3월 Apple Silicon용 MLX 엔진을 공개했고, 6월에는 MLX 엔진의 추가 최적화를 통해 출력 속도와 메모리 효율을 개선했다고 발표했다.

즉 현재 Apple Silicon에서는

Ollama냐 MLX냐

라기보다는

MLX를 직접 사용할 것인가, Ollama를 통해 편하게 사용할 것인가

라는 질문에 가까워지고 있다.

이게 상당히 중요한 변화다.


Ollama의 가장 큰 장점은 개발 도구 연결

개발자 입장에서 현재 Ollama의 가장 흥미로운 기능 가운데 하나는 Coding Agent 연동이다.

2026년에는 ollama launch 명령이 추가됐다.

이를 이용하면 Claude Code, OpenCode, Codex 등의 Coding Agent를 Ollama의 로컬 또는 클라우드 모델과 연결할 수 있다.

예를 들어 Claude Code를 실행할 수 있고,

Codex 역시 Ollama의 OpenAI 호환 환경을 통해 로컬 모델을 사용할 수 있다.

이 기능 때문에

개발 머신 + 로컬 LLM

환경에서는 Ollama가 상당히 매력적이다.


Ollama의 장점

내가 개발용 Mac에서 사용할 목적이라면 다음이 가장 큰 장점이라고 생각한다.

첫째, 명령이 간단하다.

터미널 몇 줄만으로 모델을 설치하고 실행할 수 있다.

둘째, API 서버로 사용하기 쉽다.

로컬 앱이나 개발 프로젝트에서 LLM을 호출하기 편하다.

셋째, Agent 연동이 쉽다.

Claude Code, Codex 등과 연결하기가 상당히 간단해졌다.

넷째, Apple Silicon에서는 MLX 엔진까지 사용할 수 있다.

즉 편의성과 Apple Silicon 최적화를 어느 정도 동시에 얻을 수 있다.


Ollama의 단점

GUI 중심 사용자에게는 LM Studio만큼 직관적이지 않을 수 있다.

물론 Ollama도 macOS와 Windows용 앱을 제공하고 있으며 모델 채팅과 파일 입력 등의 기능을 사용할 수 있다.

하지만 모델을 검색하고

양자화 방식

모델 파일 크기

메모리 사용량

Context

런타임

등을 화면에서 하나씩 확인하면서 사용하는 경험은 LM Studio가 더 직관적인 편이다.


LM Studio는 무엇인가?

LM Studio는 세 제품 중 일반 사용자에게 가장 친숙한 형태다.

쉽게 말하면

로컬 LLM용 데스크톱 앱 + 모델 관리자 + 채팅 앱 + API 서버

라고 생각하면 된다.

앱 안에서 Hugging Face 기반 모델을 검색하고 다운로드하고 메모리에 올린 뒤 바로 채팅할 수 있다.

현재 Apple Silicon Mac에서는 GGUF 기반 llama.cpp뿐 아니라 MLX 모델도 직접 실행할 수 있다.

즉 LM Studio 역시 이제 단순한 llama.cpp GUI라고만 보기는 어렵다.


LM Studio의 가장 큰 장점은 GUI다

로컬 LLM을 처음 접한다면 LM Studio가 가장 이해하기 쉽다.

앱을 실행한 후

모델 검색

↓

다운로드

↓

모델 선택

↓

Load

↓

Chat

순서로 진행하면 된다.

터미널 환경이나 Python을 몰라도 된다.

이건 상당히 큰 장점이다.


24GB Mac에서는 LM Studio의 메모리 예측 기능이 특히 유용하다

M4 Mac mini 24GB 같은 시스템에서는 모델이 메모리에 들어갈지 여부가 상당히 중요하다.

LM Studio에서는 모델을 실제로 로딩하기 전에 메모리 요구량을 추정할 수 있다.

CLI에서는

lms load --estimate-only 모델명

형태로 사용할 수 있다.

이 기능은 Context Length와 GPU Offload, Flash Attention, Vision Model 여부 등을 고려해서 예상 메모리 사용량을 계산한다.

24GB나 32GB Mac에서 큰 모델을 시험할 때 상당히 유용하다.


LM Studio도 API 서버로 사용할 수 있다

GUI 프로그램이라고 해서 채팅용으로만 사용하는 것은 아니다.

LM Studio는 로컬 REST API 서버를 실행할 수 있다.

현재

OpenAI 호환 API

Anthropic 호환 API

LM Studio 자체 REST API

TypeScript SDK

Python SDK

등을 제공한다.

기존 OpenAI API 기반 프로그램이라면 Base URL을 LM Studio의 localhost 주소로 변경해서 로컬 모델을 사용할 수도 있다.

즉 GUI 프로그램이면서 동시에 개발용 서버 역할도 한다.


Claude Code도 LM Studio와 연결할 수 있다

이 부분도 흥미롭다.

LM Studio는 2026년부터 Anthropic 호환 /v1/messages API를 제공하면서 Claude Code와 직접 연결할 수 있게 됐다.

예를 들어 LM Studio의 로컬 서버를 실행하고 Claude Code의 ANTHROPIC_BASE_URL을 localhost로 바꾸면 로컬 모델을 Claude Code에서 사용할 수 있다.

Codex 역시 LM Studio의 OpenAI-compatible Responses API를 사용할 수 있다.

따라서

Claude Code → Ollama

만 가능한 것은 아니다.

Claude Code → LM Studio

구성도 충분히 가능하다.


LM Studio도 내부적으로 MLX를 사용한다

여기까지 보면 재미있는 관계가 만들어진다.

Apple Silicon 환경에서는

MLX

라는 기반 기술이 있고,

그 MLX를

Ollama

도 사용하고,

LM Studio

도 사용할 수 있다.

LM Studio는 자체 mlx-engine을 개발해서 MLX-LM과 MLX-VLM을 기반으로 Apple Silicon용 추론 엔진을 제공한다.

2026년에는 장시간 Agent 작업에서 KV Cache를 체크포인트하는 방식으로 MLX 엔진을 개선하기도 했다. LM Studio가 공개한 자체 테스트에서는 일부 Agent 워크로드에서 추가 RAM 사용량 감소와 처리량 개선 효과가 보고됐다.

따라서 단순히

MLX = 빠름

LM Studio = 느린 GUI

라고 구분하는 것도 현재는 정확하지 않다.

LM Studio 자체가 MLX를 사용할 수 있기 때문이다.


결국 셋의 관계는 이렇게 보는 게 가장 정확하다

개인적으로는 다음과 같이 이해하는 것이 가장 쉬웠다.

MLX / MLX-LM

엔진룸을 직접 여는 방식

직접 모델을 제어하고 측정하고 실험한다.

Ollama

개발자를 위한 편한 실행기

명령어와 API 중심으로 모델을 빠르게 실행한다.

LM Studio

GUI와 개발 기능을 함께 제공하는 통합 도구

모델 검색부터 채팅, API 서버까지 화면에서 관리한다.


세 가지를 다시 비교하면

항목MLX / MLX-LMOllamaLM Studio

설치 편의성 ★★★ ★★★★☆ ★★★★★
GUI ❌ △ ★★★★★
CLI ★★★★★ ★★★★★ ★★★★
모델 검색/관리 ★★ ★★★★ ★★★★★
Apple Silicon 최적화 ★★★★★ ★★★★★ ★★★★★
Python 개발 ★★★★★ ★★★★ ★★★★
REST API △ ★★★★★ ★★★★★
Claude Code 연동 가능하지만 직접 구성 ★★★★★ ★★★★★
Codex 연동 직접 구성 필요 ★★★★★ ★★★★★
Fine-tuning ★★★★★ 제한적 제한적
성능 분석 ★★★★★ ★★★★ ★★★★
초보자 추천 ★★ ★★★★ ★★★★★

중요한 것은 Apple Silicon 성능 항목이다.

현재 Ollama와 LM Studio 모두 MLX 기반 엔진을 사용할 수 있기 때문에 단순히 제품 이름만 가지고 어느 것이 무조건 더 빠르다고 말하기 어렵다.

모델 형식, 양자화, Context Length, 런타임 버전과 설정에 따라 결과가 달라질 수 있다.


M4 Mac mini 24GB에서는 무엇을 사용할까?

내가 현재 사용하고 있는 M4 Mac mini 24GB를 기준으로 생각하면 목적별로 선택할 것 같다.

모델을 처음 찾아볼 때

LM Studio

GUI에서 모델 크기와 정보를 확인하기 편하고 메모리 사용량도 예측할 수 있기 때문이다.

개발하면서 로컬 API가 필요할 때

Ollama

CLI와 API가 단순하고 개발 도구 연결이 편하다.

Claude Code / Codex에서 로컬 모델을 사용할 때

Ollama 또는 LM Studio

둘 다 현재 상당히 잘 지원한다.

M4와 M1 Max 성능을 직접 비교할 때

MLX-LM

Prompt TPS, Generation TPS, Peak Memory 같은 데이터를 직접 측정하기에 적합하다.


하나만 설치한다면?

이것도 사용자에 따라 다르다.

일반 사용자라면

LM Studio

가장 쉽게 시작할 수 있다.

개발자라면

나는 Ollama부터 설치할 것 같다.

모델 실행부터 API, Coding Agent 연결까지 활용 범위가 상당히 넓다.

Apple Silicon의 성능 자체를 연구하고 싶다면

MLX-LM

이 가장 적합하다.


그런데 사실 하나만 선택할 필요가 없다

이게 최종적으로 내린 결론이다.

MLX, Ollama, LM Studio는 서로 완전히 대체하는 프로그램이 아니다.

Mac에

Ollama + LM Studio + MLX-LM

을 모두 설치해서 목적에 따라 사용해도 된다.

예를 들어

LM Studio에서 모델을 찾아보고,

Ollama에서 개발 프로젝트에 연결하고,

MLX-LM에서 정확한 성능을 측정하는 식이다.

각각의 역할이 다르기 때문에 의외로 이 방식이 가장 자연스럽다.


2026년에는 차이가 점점 줄어들고 있다

특히 흥미로운 것은 Ollama와 LM Studio가 모두 Apple MLX를 적극적으로 활용하기 시작했다는 점이다.

Ollama는 Apple Silicon MLX 엔진을 제공하고 있고, 2026년 6월 업데이트에서는 추가적인 Metal 커널 최적화와 Agent용 캐시 개선을 발표했다.

LM Studio 역시 자체 MLX Engine을 제공하며 Agentic Workflow를 위한 KV Cache 개선 등을 진행하고 있다.

결국 앞으로는

어떤 프로그램이 MLX를 쓰느냐

보다

어떤 인터페이스와 개발 환경이 나에게 편한가

가 더 중요한 선택 기준이 될 가능성이 높아 보인다.


내 경우에는 이렇게 사용할 것 같다

현재 가지고 있는 장비는

M4 Mac mini 24GB

와

M1 Max MacBook Pro 64GB

다.

두 장비에서 로컬 LLM을 계속 테스트한다면 다음처럼 사용할 생각이다.

LM Studio

모델 탐색과 빠른 테스트

Ollama

개발 프로젝트와 Claude Code, Codex 연동

MLX-LM

M4와 M1 Max의 직접적인 성능 비교

이렇게 역할을 나누면 상당히 효율적일 것 같다.

특히 다음에는 같은 모델을

MLX-LM

Ollama MLX

LM Studio MLX

환경에서 각각 실행해서 실제 Token 생성 속도와 메모리 사용량 차이가 얼마나 나는지도 한번 비교해보고 싶다.


결론

처음에는 MLX, Ollama, LM Studio 가운데 무엇이 가장 좋은지 선택해야 하는 문제라고 생각했다.

하지만 자료를 정리해보니 질문 자체가 조금 달랐다.

MLX는 Apple Silicon에 최적화된 머신러닝 프레임워크다.

그리고

Ollama와 LM Studio는 로컬 모델을 훨씬 쉽게 사용하는 환경이다.

더구나 2026년에는 Ollama와 LM Studio 모두 MLX를 활용하고 있다.

따라서 단순하게

MLX vs Ollama vs LM Studio

의 승자를 고르는 것보다는

무엇을 하려는가

를 먼저 정하는 것이 맞다.

로컬 LLM을 처음 경험해보고 싶다면 LM Studio.

개발과 자동화, API, Coding Agent가 목적이라면 Ollama.

Apple Silicon에서 모델을 직접 다루고 분석하거나 Fine-tuning까지 하고 싶다면 MLX-LM.

현재로서는 이렇게 구분하는 것이 가장 현실적이라고 생각한다.


참고자료

이 글을 작성하면서 다음 공식 자료를 참고했다.

1. Apple MLX 공식 문서 — Unified Memory

Apple Silicon에서 CPU와 GPU가 동일한 메모리 풀에 접근하고 MLX가 이 구조를 활용하는 방식을 참고했다.

2. Apple MLX 공식 문서 — 설치 및 시스템 요구사항

Apple Silicon에서 MLX를 사용하기 위한 macOS와 Python 요구사항 및 설치 방법을 참고했다.

3. MLX-LM 공식 프로젝트

MLX를 이용한 LLM 생성, Fine-tuning, 양자화, 서버 및 성능 측정 기능을 참고했다.

4. Ollama — Apple Silicon MLX Engine

Ollama가 2026년부터 Apple Silicon에서 MLX를 활용하는 구조와 성능 개선 내용을 참고했다.

5. Ollama — ollama launch

Claude Code, OpenCode, Codex 등 Coding Agent를 로컬 또는 클라우드 모델에 연결하는 기능을 참고했다.

6. Ollama — Claude Code 및 Codex 연동

Anthropic 호환 API와 OpenAI Codex를 로컬 모델에 연결하는 방법을 참고했다.

7. LM Studio 공식 문서

LM Studio가 GGUF 기반 llama.cpp와 Apple Silicon용 MLX 모델을 모두 실행할 수 있다는 내용을 참고했다.

8. LM Studio — 로컬 API 서버

REST API, OpenAI 호환 API, Anthropic 호환 API 및 SDK 기능을 참고했다.

9. LM Studio — 메모리 사용량 예측

모델을 로딩하기 전 lms load --estimate-only를 이용해 메모리 요구량을 추정할 수 있는 기능을 참고했다.

10. LM Studio — Claude Code / Codex 연동

LM Studio의 Anthropic 호환 Messages API와 OpenAI-compatible Responses API를 통한 Coding Agent 연결 방법을 참고했다.

※ 각 도구의 성능은 사용 모델, 모델 형식, 양자화 방식, Context Length, 런타임 버전과 하드웨어에 따라 달라질 수 있다. 따라서 특정 도구가 항상 가장 빠르다고 단정하기보다는 같은 모델과 동일한 조건에서 직접 비교하는 것이 가장 정확하다.

반응형
Posted by MakeBuildLabs
,