Index
2026-09-08 — Engineering

Colab 지원 포팅 — 커널 다리와 저 RAM 체크포인트 로더

AI899 | nb1-code_chanhee 의 Colab 파일 3개 → KO/EN 최신본 · 손 편집 노트북을 생성물로

TL;DR

11/11
커널 다리 테스트
813
텐서 전부 동일
15.0→8.2
최대 CPU RSS (GB)
70→11
체크포인트 로딩 (s)
10
원본 대비 수정 건수
PASS
sudo+apt 분기 (컨테이너)
6/6
커널 격리
788 MB
경량 에셋 팩 (원본 8.5 GB)
10/10
경량 팩 렌더 검증

1 배경 / 목적

사용자 제보: nb1-code_chanhee/ 에 Colab 에서 돌아가게 만든 버전이 있으니 그 부분만 가져와 고쳐 달라. 현재 KO/EN 최신본(9/6 미니멀 마크다운)과 비교해 보니 차이는 두 가지뿐이었습니다.

핵심 문제: chanhee 의 Colab 노트북은 생성기를 거치지 않은 손 편집본이었습니다 (빌더에 colab 문자열이 하나도 없음). 본문을 고칠 때마다 Colab 판을 손으로 다시 만들어야 하는 구조였습니다.

2 메커니즘

Colab 은 파이썬 3.11, 강의 환경은 3.10 입니다 (robocasa 가 numpy 1.23 을 핀). 한 프로세스에 못 올리므로 강의 코드는 별도 커널에서 돌리고 출력만 가져옵니다.

파일하는 일
colab_setup.py/content/vla 에 setup/install.sh 로 환경 설치, 커널 등록, kernel.json 격리 패치
vla_colab.pyKernelManager 로 vla-lecture 커널 기동 + %%vla 셀 매직. iopub 메시지(stdout / display / error)를 Colab 으로 되돌린다
vla_colab_policy.pymeta 디바이스 + safetensors 텐서 단위 GPU 업로드 (CPU fp32 사본 회피)
scripts/make_colab_nb.py 신규빈칸본 → Colab 판 순수 변환

kernel.json 에 붙는 인자 3개(--IPKernelApp.kernel_class, extensions=[], extra_extensions=[])와 IPYTHONDIR 의 정체는 Colab 이 심어 둔 google.colab 확장 자동 로드를 막는 것입니다. 그 패키지는 3.10 venv 에 없습니다.

build_notebook.py → make_student_nb.py → make_colab_nb.py ├ 준비 셀 4개 삽입 (안내 / Drive 마운트 / colab_setup / connect) ├ 모든 code 셀에 %%vla 부착, outputs 제거 ├ 커널 가드 문구를 Colab 용으로 구조적 치환 ├ vla_utils import 뒤에 저 RAM 로더 import 삽입 └ 생성 직후 모든 code 셀 compile() 검사

3 고친 것 (원본 대비 10건)

#문제수정
1env={**os.environ} 로 Colab 3.11 의 PYTHONPATH 가 3.10 커널로 샌다. activate.sh 가 PYTHONPATH 를 덧붙이므로 그대로 살아남는다환경변수 8개 제거 후 전달
2인라인 백엔드 미설정 → plt.show() 가 조용히 아무것도 안 그릴 위험connect() 에서 %matplotlib inline silent 실행
3kernel.json 을 두 번 쓰고 spec['env'] 를 통째 교체한 번만 쓰고 병합
4GPU 없는 런타임에서 install.sh 중간까지 갔다 죽음nvidia-smi 선검사 + 메뉴 안내
5커널 종료 수단 없음shutdown()
6%%vla 셀마다 "이미 연결됨" 출력 (33회)connect(quiet=True)
7가드 문구가 "커널 'VLA (강의)' 를 고르세요" — Colab 에선 커널을 고르지 않는다Colab 용 문구로 교체
8update_display_data 미처리, gradient_checkpointing 무조건 접근처리 추가 / getattr
9배포 zip 에 Colab 파일 없음INCLUDE 에 노트북 + 모듈 3개
10README 에 Colab 안내 없음KO/EN 에 4-1 절 추가

4 검증 결과

커널 다리 — 이 클러스터의 실제 vla-lecture 커널로

11 PASS / 0 FAIL: 커널 기동, stdout 전달, 셀 간 변수 유지, plt.show() → image/png, 에러의 예외 전파, 에러 후 커널 생존, MUJOCO_GL=egl/CKPT_ROOT/sys.path 주입, vla_utils import, shutdown.

저 RAM 로더 — 두 로더를 별도 프로세스로 돌려 비교

colab 로더표준 로더
텐서 수 / 파라미터813 / 4,143,404,816813 / 4,143,404,816
로드 시간11.4 s70.5 s
최대 CPU RSS8.16 GB15.03 GB
GPU 할당7.48 GB7.49 GB
전 / 후처리 스텝6 / 26 / 2
텐서 813개 전부 shape·dtype·sum·absmax 동일. 그리고 표준 로더의 15.03 GB 는 Colab 무료 런타임 RAM(12.7 GB)을 넘습니다 — 이 로더 없이는 세션이 죽는다는 것이 수치로 확인됐습니다. 덤으로 로딩이 6배 빠릅니다.

산출물

5 Takeaway

6 Next

실제 Colab 에서는 미검증. 확인한 것은 커널 다리와 로더뿐입니다. 남은 것: Drive 마운트, /content/vla 로의 install.sh 완주(= sudo+apt 분기, 여태 한 번도 안 탄 경로), Colab IPython 설정 격리가 실제로 먹는지, T4 에서 bf16 이 도는지. 배포 전 Colab 무료 런타임 1회 완주(30~50분)가 필요합니다.

7 업데이트 — Colab 을 못 돌리는 대신 무엇을 검증했나

사용자 질문: "실제 Colab 무료 런타임에서 한 번 돌려볼 수는 없어?" → 불가능합니다. 이 환경에는 브라우저도 구글 인증도 없고, 무료 Colab 런타임을 붙일 API 도 없습니다 (google.colab 모듈 없음, gcloud/colab CLI 없음). 대신 Colab 이 탈 경로 중 여기서 재현 가능한 것 두 개를 실제로 돌렸습니다.

7-1. install.sh 의 sudo + apt 분기 — 여태 한 번도 안 탄 경로

이 클러스터는 sudo 가 없어 micromamba 분기만 검증돼 있었습니다. Colab 은 root + sudo 라 apt 분기를 탑니다. 로그인 노드의 DinD 사이드카로 Colab 과 같은 조건(ubuntu:22.04 · root · sudo 설치 · 가짜 nvidia-smi)을 만들어 진짜 install.sh 를 돌렸습니다. 의존성 9.2 GB 는 범위 밖이라 [2/6] 로그에서 중단했습니다.

apt 분기 PASS. 배포 문서에 "sudo+apt 경로 미테스트" 로 남아 있던 항목이 닫혔습니다.

7-2. 커널 격리 장치 — 6 PASS / 0 FAIL, 그리고 메커니즘을 오해하고 있었습니다

colab_setup.py 가 kernel.json 에 심는 argv 3개 + IPYTHONDIR 은 chanhee 원본에서 그대로 가져온 것이라 "왜 필요한지" 를 검증한 적이 없었습니다. 확인하다가 처음 두 번은 테스트가 틀렸습니다 — 적대적 설정을 JUPYTER_CONFIG_DIR 에 심었는데 커널이 멀쩡히 떴습니다.

원인

IPKernelApp.config_file_paths 를 직접 찍어 보니 비어 있었습니다. IPKernelApp 은 BaseIPythonApplication 이라 설정을 Jupyter 설정 폴더가 아니라 IPython 프로필 폴더에서 읽습니다. 즉 Colab 설정의 진짜 관문은 JUPYTER_CONFIG_DIR 이 아니라 IPYTHONDIR 이고, colab_setup.py 의 IPYTHONDIR 지정이 핵심 장치입니다. argv 3개는 CLI 가 config 를 이기므로 붙이는 이중 안전장치입니다. 코드 주석을 이 사실에 맞게 고쳤습니다 (KO/EN).

적대적 설정을 IPYTHONDIR/profile_default/ipython_kernel_config.json 으로 옮기니 테스트가 의미를 갖게 됐습니다.

케이스결과
A. 적대적 설정 + 맨몸 커널죽는다 — kernel_class ... could not be imported → Kernel died before replying to kernel_info
B. 같은 설정 + 격리 장치뜬다
C. 적대 env 를 그대로 넘기면 PYTHONPATH 가 커널까지 새는가샌다 (확인)
C. _kernel_env 가 PYTHONPATH / IPYTHONDIR / JUPYTER_* 제거제거됨
C. 걸러낸 env 로 커널 기동 + sys.path 에 가짜 경로 없음확인

7-3. 그래도 남는 것

Colab 없이는 불가: Drive 마운트, /content/vla 로의 install.sh 완주(여기서는 [1/6] 까지만 — 나머지 5단계는 이 클러스터에서 이미 통과), Colab 이 실제로 심어 두는 설정의 내용(위 테스트는 "같은 자리에 같은 방식으로 들어간 설정" 으로 모사), T4(sm_75) 에서 bf16 이 도는지.

부품은 전부 검증됐고 조립만 미검증입니다. 배포 전 Colab 무료 런타임 1회 완주(30~50분)는 여전히 필요합니다.

8 사용자가 Colab 에서 실제로 돌린 뒤 — 그림 깨짐과 설치 시간

피드백: "colab 에 띄우니까 기본 30~50이 처음에 걸리고, 이후에도 image 안보이고, 뭐 되게 별론데?"

8-1. 본문 그림 8장이 전부 안 보인 이유 — 내 실수

노트북 마크다운이 ![루프](assets/fig_loop.svg) 처럼 상대경로를 참조합니다. 로컬 Jupyter 는 노트북 폴더를 HTTP 로 서빙하므로 보이지만, Colab 은 Drive 폴더를 파일로 서빙하지 않습니다. 8장 전부 깨집니다. Colab 판을 한 번도 열어 보지 않고 넘긴 것이 원인입니다.

수정: make_colab_nb.py 가 마크다운 이미지를 data URI 로 노트북에 임베드합니다. KO/EN 각 8장, 남은 상대경로 0, base64 디코드 8/8 정상. 노트북 68 KB → 1.22 MB. 사용자가 확인하지 못했던 영상·그래프는 정답본 Colab 노트북(*_colab_solution.ipynb)을 새로 만들어 끝까지 돌려볼 수 있게 했습니다.

8-2. 경량 에셋 팩 — 세 번 깨지고 세 번 고쳤습니다

받는 것은 의존성 9.2 GB + 에셋 9.5 GB + 체크포인트 7 GB + 데이터셋 1.8 GB ≈ 27.5 GB. 이 중 에셋이 압도적으로 낭비였습니다. Colab 무료 런타임은 vCPU 2개라 다운로드보다 수만 개 파일 압축 해제가 더 오래 걸립니다.

#깨진 곳원인고친 방법
1arenas/empty_kitchen_arena.xmlrobosuite 가 파이썬에서 ET.parse 로 직접 연다 — XML 의 file= 스캔에 안 잡힘arenas/scenes 무조건 포함
2fixtures/fixture_registry/wall.yamlrobocasa 가 open() 으로 읽는 설정메시·텍스처를 뺀 비바이너리 전량(2,236 파일 14.8 MB) 포함
3objects/objaverse/milk/milk_0/...obj설계 오류: env 생성자가 관측 공간을 잡으려고 내부에서 한 번 더 reset() 하는데 그 씬을 안 봤다강의의 결정적 접근 패턴을 그대로 재현

핵심 발견 — "많이 돌려 모은 합집합" 은 틀린 방법이었습니다

RoboCasa 는 reset 마다 방해 물체를 새로 뽑습니다. 24회 reset 을 돌려도 합집합이 수렴하지 않았습니다 (회당 +68~141 파일, 24회에 1.1 GB, objaverse 카테고리 48/81 종). 어떤 시드에서도 안전하게 만들려면 카테고리를 통째로 담아야 하는데 그러면 7.8 GB 라 9.5 GB 대비 1.7 GB 밖에 못 줄입니다.

대신 강의가 env 를 쓰는 방식은 결정적입니다. make_env(task, n_envs=N, seed=0) 이 하위 env i 를 seed 0+i 로 생성하고, reset(seed=0) 이 seed 0+i 로 리셋합니다. 그래서 i = 0..N-1 각각의 (생성 씬, 리셋 씬) 두 개씩만 담으면 정확히 커버됩니다. 노트북 N=2, verify N=8, 기본값 10 이므로 seed 0~11 을 담았습니다.

경량 팩원본
압축788 MB3.7 GB (zip 4개)
해제 후1,325 MB · 5,056 파일8,461 MB · 34,929 파일
검증seed 0~9 생성+reset 10/10 정상 렌더 (eye_in_hand std 25~79)
설치 총량19.4 GB27.5 GB

검증은 ~/vla 를 건드리지 않고 robocasa 패키지의 심볼릭 링크 사본에 경량 에셋만 얹어서 했습니다. VLA_SLIM_ASSETS=1 일 때만 쓰이고, colab_setup.py 가 이를 지정합니다. 로컬 설치의 기본값은 그대로 전체 에셋입니다.

제약: base seed 를 0 이 아닌 값으로 바꾸거나 VLA_N_ENVS 를 12 이상으로 올리면 팩에 없는 에셋을 찾을 수 있습니다. 그때는 VLA_SLIM_ASSETS 없이 다시 설치해야 합니다 (README·install.sh 주석에 명시). 데이터셋 1.8 GB 는 Part 4-2 의 dataloader 가 shuffle=True 라 아무 에피소드나 열 수 있어 트리밍하지 않았습니다.
업로드 완료: 사용자 승인 후 DAVIAN-Robotics/vla-lecture-env 에 올렸습니다 (787,849,918 B + manifest 312 kB). install.sh 와 같은 파이프라인(curl -sfL --retry 3 | tar xz)으로 실제 다운로드+해제까지 확인 — HTTP 200, 5,056 파일 / 1,274 MB, apple_0/model.xml·arenas·fixture_registry/wall.yaml 존재, generative_textures 없음(의도대로).
다음: 사용자가 Colab 에서 한 번 더 돌려 체감 설치 시간을 확인해 주시면 됩니다.