Control Tower 개발로그 · 2화
Control Tower에 두 번째 스파크와 서버 속도를 붙이고, 스파크 업무를 예약하는 스파크테이블을 만들었다
9월 29일부터 10월 8일까지 집의 컴퓨터를 한 화면에서 보는 Control Tower를 고쳤다. 윈도우 에이전트는 창 없이 부팅 때 뜨고, 두 번째 DGX Spark가 붙어 다섯 대가 됐고, 모델 줄에 서버 전체 생성 속도가 뜬다. 10월 8일에는 스파크가 비는 대로 예약한 업무를 이어서 돌리는 스파크테이블을 만들었다.
Control Tower는 집에 있는 컴퓨터들의 상태와 로컬 LLM을 한 화면에서 보고 바꾸는 관제판이다. 9월 29일에 포트폴리오를 올릴 때는 네 대였다. 지금은 다섯 대가 붙어 있고, 보는 화면 말고 스파크에 일을 맡기는 화면이 하나 더 생겼다.
9월 29일, 윈도우 에이전트가 창 없이 부팅 때 뜨고 꺼지면 다시 뜬다
윈도우 PC에 깐 에이전트는 로그인할 때마다 검은 콘솔 창을 띄웠고, 그 창을 닫으면 에이전트도 같이 죽었다. 창을 숨기라는 옵션을 줬는데도 소용이 없었다. 윈도우 11은 콘솔을 Windows Terminal로 띄우는데, Windows Terminal이 그 옵션을 무시했다. 관리자 권한으로 설치하면 이제 부팅 때 창 없이 도는 예약 작업으로 등록하고, 그렇지 않으면 창 없는 콘솔로 로그인 때 띄운다. 에이전트가 죽으면 다시 띄우는 반복도 넣었다.
두 번째 스파크를 붙이자 모델을 돌리고 있는데도 쉬는 것으로 보였다
10월 2일 DGX Spark를 한 대 더 들이면서 대시보드에 카드를 붙이고, 1번과 같은 모델 전환기(Flash Next, 27B FP8, 27B NVFP4)를 달았다. 재부팅 직후 기기 이름으로 찾지 못하는 일이 있어서 두 스파크는 고정 주소로 찾게 했다.
그런데 2번 스파크는 요청 16개를 처리하는 중에도 모델이 돌고 있다는 표시가 뜨지 않았다. 에이전트는 docker에 물어서 모델 컨테이너가 떠 있는지 보는데, 2번의 에이전트가 docker를 쓸 권한이 없었다. 세팅하면서 계정을 docker 그룹에 넣었지만, 그 전에 이미 떠 있던 백그라운드 서비스 관리자는 재부팅 전까지 새 그룹을 모른다. 에이전트를 docker 그룹으로 띄우는 설정 하나를 더해 해결했다. 새 리눅스 기기를 붙일 때는 에이전트를 띄우기 전에 그룹부터 넣어야 한다는 것도 기록해 뒀다.
모델 줄에 서버 전체의 최근 1분 생성 속도를 띄웠다
10월 3일, 처리 중인 요청 수 옆에 속도도 넣을 수 있느냐고 물었다. 이제 돌고 있는 모델 줄이 “처리 중 16 · 생성 169 tok/s · 누적 …“처럼 읽힌다. 이 속도는 서버가 최근 1분 동안 모든 요청을 합쳐 만든 토큰 수다. 마우스를 올리면 프롬프트를 읽는 속도도 나온다. 새 프롬프트를 읽는 동안에는 생성 속도가 떨어지기 때문에 둘을 같이 봐야 한다. 상세 패널의 예전 속도 항목은 사실 요청 하나의 속도였는데, 16개가 동시에 돌면 초당 12토큰쯤으로 나와 헷갈렸다. 그 항목에는 “요청당”이라는 이름을 붙였다. 이 숫자를 붙이게 된 사정은 스파크 활용 4화에 있다.
10월 8일, 스파크가 비는 대로 예약한 업무를 이어서 돌리는 스파크테이블을 만들었다
스파크 두 대에는 매일 도는 자동화가 있고, 그 사이사이 내가 맡기는 긴 일이 있다. 스파크가 언제 비는지 지켜보다가 손으로 다음 일을 띄우는 게 번거로웠다. 그래서 식당 예약 앱처럼 스파크 업무를 미리 예약해 두고, 스파크가 비면 바로 이어서 하게 하자고 했다. Control Tower 안에 “스파크테이블”이라는 화면이 생겼다.
화면에서는 업무와 스파크만 고른다. 업무는 미리 등록해 둔 메뉴에서만 고를 수 있고, 명령을 직접 칠 수는 없다. 이 화면이 집의 네트워크에 열려 있어서다. 지금 메뉴는 네 가지다. 사유고2의 투자 책 146권으로 지식 연결망 만들기(약 2시간 30분), 795권 전체로 만들기(약 12시간), 자주 틀리는 반박·구체화 관계를 생각을 켜고 다시 판정하기(약 1시간), 새로 들어온 책의 구조 지도 만들기(약 1시간)다.
허브는 20초마다 두 스파크에 언어 모델 요청이 몇 개 돌고 있는지, 영상 대기열이 비었는지 확인한다. 스파크가 2분 동안 계속 비어 있으면 다음 예약을 시작한다. 1번 스파크는 아침 딥리서치와 저녁 카드릴스·딥리서치 시간(06:15~07:45, 16:40~19:40)에는 새 일을 시작하지 않는다. 예약은 스파크마다 순서대로 돌고, 두 대를 다 쓰는 예약은 두 대가 모두 빌 때 시작한다.
업무는 맥에서 따로 떼어 실행하고 로그와 종료 코드를 파일로 남긴다. 그래서 허브를 다시 켜도 돌던 업무를 이어서 지켜본다. 같은 날 오전에 기능을 계속 붙였다.
- 진행 중인 업무의 시작 시각, 예상 완료, 남은 시간. 예약마다 앞 업무가 끝나는 시각에 이어 붙인 예상 시작과 완료.
- 순서 바꾸기(맨 앞으로, 한 칸 위·아래), 지금 바로 실행, 줄 맨 앞에 넣는 우선 예약.
- 일시정지와 다시 시작. 메뉴에 정지 방법이 있으면 그걸 쓰고, 없으면 프로세스를 멈춘다. 취소하면 스파크에 남은 작업기도 멈춘다.
- 테이블 밖에서 돌고 있는 일도 보여 준다. 다른 곳에서 예약해 스파크를 빌려 쓰는 업무, 맥에서 돌고 있는 언내츄럴·딥리서치·카드릴스 같은 프로세스, 출처를 모르는 요청 수까지 스파크마다 표시한다.
- 1번 스파크의 매일 자동화(06:20 딥리서치 오전판, 17:25 카드릴스, 18:10 딥리서치 오후판)는 맥의 예약 작업 설정에서 직접 읽어 와 다음 순서와 남은 시간을 보여 준다.
- 맥 앱의 메뉴바 메뉴에서 ⌘T로 바로 연다.
테스트를 쓰다가 저장이 동시에 두 번 일어나면 임시 파일 이름이 겹쳐 저장이 실패하는 것을 찾았다. 저장을 한 줄로 세워서 고쳤다. 첫 실제 예약은 2번 스파크의 “지식 연결망: 투자 책 146권”이었다.
배운 것
공유하는 기계를 예약하려면 예약 밖에서 돌아가는 일까지 알아야 했다. 처음 만든 테이블은 자기가 띄운 업무만 알아서, 다른 세션이 스파크를 쓰고 있으면 왜 기다리는지 설명하지 못했다. 맥의 프로세스와 자동화 설정까지 읽게 하자 화면이 “지금 이 스파크가 무엇을 하고 있는가”에 답하기 시작했다.
그리고 네트워크에 열린 화면에는 명령 입력칸을 두지 않았다. 할 수 있는 일을 메뉴로 미리 정해 두면 누가 이 화면을 열어도 그 메뉴 밖의 일은 시킬 수 없다.