개발 2026.07.23

똥컴으로도 되는 AI 영상 만들기 — Kaggle 무료 GPU 세팅 기록

주당 30시간 공짜 GPU 위에서 Krea 2로 이미지를, LTX 2.3으로 한국어 대사 영상을 만드는 노트북 두 개를 만들었다. 아직 가입도 안 했지만, 쓸 준비는 끝냈다.

유튜브에서 "Kaggle 무료 GPU로 AI 이미지·영상 만들기" 영상을 하나 봤다. 요지는 간단했다. 구글 Kaggle이 주당 30시간, 16GB GPU 두 장을 공짜로 빌려주니 내 컴퓨터 사양과 상관없이 오픈소스 모델을 돌릴 수 있다는 것.

영상을 보고 나서 Claude에게 "이거 보고 같은 방식으로 세팅해줘"라고 시켰다. 결과물은 노트북 두 개짜리 작업 폴더다. 아직 Kaggle 가입도 안 했으니, 정확히 말하면 쓸 준비만 끝낸 상태다.

무엇을 만들었나

~/tools/kaggle-free-ai/ 아래에 Kaggle에 그대로 올려서 Run All 하면 되는 노트북 두 개.

노트북모델받는 용량생성 시간
이미지Krea 2 Turbo약 14GB1장 10~30초
영상LTX 2.3 22B distilled약 31GB480p 5~9분 / 720p 12~18분

영상 노트북은 텍스트만으로도, 이미지 한 장으로도, 첫 장면과 끝 장면을 주는 방식으로도 만들 수 있다. 프롬프트 안에 한국어 대사를 큰따옴표로 넣으면 그 대사를 말하는 영상이 나온다. 음성까지 함께.

A young woman looks at the camera and says in Korean "안녕하세요, 오늘 날씨 좋네요."

구조는 이렇다. 계산은 ComfyUI가 하고, 화면은 Gradio가 만든다. 주방과 카운터를 나눈 셈이다. 영상에서 "마지막에 링크가 하나 나타납니다"라고 했던 그 링크가 바로 Gradio가 열어주는 카운터 주소다.

그대로 따라 하지 않은 부분

영상 속 노트북은 제작자가 만든 것이라 내려받을 수 없었다. 그래서 같은 방식을 처음부터 다시 구성했는데, 이 과정에서 세 가지를 바꿨다.

첫째, GGUF를 기본값으로 썼다. Kaggle이 주는 GPU는 T4다. 요즘 모델들이 쓰는 fp8 연산에서 아무 이득을 못 보는 세대다. 그래서 양자화된 GGUF 버전을 기본으로 쓰고, 혹시 최신 GPU가 잡히면 자동으로 원본 가중치를 받도록 분기를 넣었다.

둘째, 모델 저장 위치를 옮겼다. Kaggle의 작업 폴더는 20GB 제한이 있다. 영상 모델은 31GB다. 애초에 안 들어간다. 그래서 모델은 임시 영역에 두고, 결과물만 작업 폴더에 남겨 Output 패널에서 내려받게 했다.

셋째, 워크플로 배선의 근거를 남겼다. LTX 2.3 영상 워크플로는 ComfyUI 공식 템플릿의 배선을 그대로 따랐다. 커스텀 노드 의존을 걷어내서, 남의 저장소가 사라져도 돌아가게. 이미지 쪽은 내가 평소 쓰던 Krea 2 Turbo 구성(8스텝, cfg 1)을 옮겼다.

실행해보지 않고 어떻게 검증했나

가장 신경 쓴 부분이다. Kaggle 계정이 없으니 실제로 돌려볼 수가 없었다. 그래서 돌려보지 않고도 확인할 수 있는 것들을 골라 점검 스크립트를 따로 만들었다.

  • 노트북 셀 소스 열 개의 문법 검사
  • 워크플로 그래프 여덟 종(이미지 2, 영상 6)의 노드 참조 무결성 — 존재하지 않는 노드를 가리키는 연결이 하나도 없는지
  • 프레임 길이 규칙 검사 — LTX는 프레임 수가 8의 배수 더하기 1이어야 한다
  • HuggingFace 모델 파일 아홉 개가 실제로 존재하는지, 용량이 얼마인지 HTTP로 확인

python tools/selftest.py 한 번이면 전부 돈다. 전부 통과했다.

그래도 이건 "문법이 맞고 파일이 실재한다"까지의 보증이지, "Kaggle에서 돌아간다"의 보증은 아니다. 첫 실행에서 패키지 버전이 충돌하거나 720p에서 메모리가 모자랄 가능성은 남아 있다. 그래서 증상별 대처법을 문서로 따로 정리해뒀다.

남은 일

Kaggle 가입과 휴대폰 인증. 이게 있어야 GPU 옵션이 열린다. 아직 안 했다.

늘 이런 식이다. 도구를 먼저 다 만들어 놓고, 정작 쓰기 시작하는 건 한참 뒤다. 그래도 이번엔 "나중에 다시 꺼낼 때 밟을 순서"까지 적어뒀으니 덜 헤맬 것 같다.

배운 것 하나

작업하면서 가장 중요했던 판단은 기술적인 게 아니라 태도 쪽이었다. 실행해보지 못한 것을 "됩니다"라고 말하지 않는 것.

돌려보지 않은 코드는 돌아간다고 말할 수 없다. 대신 돌려보지 않고도 확인할 수 있는 것들을 최대한 확인하고, 확인한 것과 확인하지 못한 것의 경계를 분명히 그어두는 것. 그게 검증 스크립트를 따로 만든 이유다.

세션을 끄면 모델도 결과물도 전부 사라진다는 것도 기억할 만하다. 그래서 프롬프트를 미리 다 만들어두고 한 번에 몰아 쓰는 편이 훨씬 이득이다. 무료 GPU를 켜놓고 프롬프트를 고민하는 건 가장 비싼 낭비다.


업데이트 (2026-07-24) — 드디어 돌렸다. 그리고 정적 점검이 못 잡은 데서 막혔다.

위 글은 Kaggle 계정도 없이 "쓸 준비만" 끝낸 상태에서 썼다. 그 뒤 실제로 계정을 붙여 돌려봤다. 결론부터 — 문법 검사와 파일 존재 확인을 다 통과했어도, 실제 실행은 정적 점검이 볼 수 없는 세 군데서 막혔다. 그걸 고쳐서야 진짜 영상이 나왔다. 정직하게 남긴다.

작업 폴더는 mission-1m/kaggle-ltx/로 옮겼고, 처음부터 새로 짠 노트북 대신 검증된 커뮤니티 노트북(LTX 2.3 Q4)을 배치용으로 개조하는 쪽으로 방향을 틀었다. 이유가 아래 첫 번째다.

막힌 것 1 — 대화형 Gradio는 자동화에 못 쓴다. 원래 계획은 "마지막에 뜨는 Gradio 링크"에 API로 요청을 넣는 것이었다. 13분을 기다렸는데 취소됐다. 이유가 있었다. ① Gradio 큐는 요청을 한 줄로 세워 처리해서, 사람이 화면을 쓰는 동안 내 자동 요청은 대기만 하다 잘린다. ② 그 gradio.live 주소는 세션마다 바뀌고 종료 즉시 사라진다. → 배치 커널로 갈아탔다. 프롬프트 목록(prompts.json)을 통째로 던지면 알아서 만들고 커널이 스스로 종료된다. kaggle kernels push 한 번.

막힌 것 2 — 배치로 던지면 T4가 아니라 P100이 잡힌다. 이게 전부를 죽였다. 위 글에서 나는 "Kaggle이 주는 GPU는 T4"라고 단정했다. 틀렸다. 배치 커널은 기본으로 P100을 배정하는데, 이 세대는 요즘 PyTorch가 지원을 끊어서 영상을 그리는 바로 그 순간 "CUDA error: no kernel image is available"로 죽는다. 42분을 돌고 "완료"라고 떴는데 결과물이 없었다. 모델 다운로드·로딩은 다 성공했는데 생성만 실패한 것이다. 원인은 실행 로그를 받아서야 알았다. 해결: push할 때 --accelerator NvidiaTeslaT4로 GPU를 못박는다(kernel-metadata.json의 machine_shape도 같이). 그 한 줄을 넣으니 T4가 잡혔고, 장면당 5~10분에 영상이 나왔다.

막힌 것 3 — 결과물이 엔진 파일 수천 개에 묻힌다. 노트북이 엔진(Wan2GP)을 작업 폴더에 통째로 복제해서, 정작 내 영상이 수천 개 파일에 섞여 회수가 느리고 잘렸다. → 생성이 끝나면 엔진 폴더를 작업 폴더에서 지우고 결과물만 남겼다. 회수가 몇 초로 줄었다.

부수적으로: 실행 로그는 output 다운로드가 아니라 API의 로그 조회(kernels_logs)로 받아야 나온다. 한글이 든 노트북을 Windows에서 push할 땐 PYTHONUTF8=1이 없으면 인코딩 오류가 난다.

그래서 지금은? 이 파이프라인으로 짧은 드라마 세 편과 느와르 뮤직비디오 한 편을 실제로 만들어 올렸다. 장르를 바꾸는 건 프롬프트 목록과 배경음악만 바꾸는 것뿐이다. 처음 글에 적었던 원칙 — "실행해보지 못한 것을 됩니다라고 말하지 않는다" — 이 그대로 값을 했다. 안 돌려봤을 땐 T4를 확신했지만, 돌려보니 P100이었다. 정적 점검은 문법과 파일까지만 보증한다. 나머지는 실제로 돌려봐야 안다.

블로그 목록