Vast.ai CLI 101: 실제로 사용할 수 있는 GPU 오퍼 찾기
요약
본 글은 Vast.ai CLI를 사용하여 AI 워크로드에 적합한 GPU 오퍼를 검색하는 방법을 안내합니다. 단순히 저렴한 가격만 볼 것이 아니라, 모델 가중치 다운로드 및 배치 실행 등 실제 엔지니어링 요구사항을 고려하여 신뢰도, 디스크 공간, 네트워크 비용 등을 필터링해야 합니다.
핵심 포인트
- GPU 선택은 단순 가격 비교가 아닌 엔지니어링 결정이다.
- CLI 검색 시 최소 0.97 이상의 신뢰도와 무료 인바운드 트래픽을 필터링한다.
- 대규모 모델 가중치 다운로드를 위해 충분한 디스크 공간(예: 150GB 이상) 확보가 필수적이다.
요약: 워크로드의 GPU 및 메모리 요구 사항부터 시작하여, 신뢰도가 최소 0.97 이상이고, 인바운드 트래픽이 무료이며, 충분한 디스크 공간을 갖추고, 컨테이너와 호환되는 드라이버를 가진 오퍼를 검색합니다. 시간당 가격으로 정렬하고, 원본 오퍼 데이터를 검사하여 모든 조건을 통과하는 가장 저렴한 오퍼를 선택해야 합니다. 낮은 시간당 요금은 인스턴스가 작업을 실행하고 모델 가중치를 예상치 못한 비용 없이 수신할 수 있을 때만 유용합니다.
워크로드부터 시작하기
이 글은 Vast.ai를 통해 실제 AI 작업에 필요한 GPU를 임대하는 8부작 시리즈의 첫 번째 글입니다. 저희는 작은 콘텐츠 팀이며, 저희의 작업은 모델 가중치를 다운로드하고, 배치(batches)를 실행하며, 결과를 집으로 복사하는 경향이 있습니다. 따라서 오퍼 선택은 검색 페이지에서 가장 낮은 숫자를 찾는 경쟁이라기보다는 실질적인 엔지니어링 결정입니다.
검색하기 전에, 저희는 작업이 요구하는 것을 기록합니다:
- 사용할 계획인 모델과 설정에 충분한 메모리를 가진 GPU.
- 호스트 드라이버가 지원할 수 있는 CUDA 요구 사항을 가진 컨테이너 이미지.
- 이미지, 가중치(weights), 입력(inputs), 임시 파일 및 출력을 위한 충분한 디스크 공간.
- 허용 가능한 신뢰도와 네트워크 비용.
- 설정 및 파일 전송에 필요한 연결성.
대규모 모델 다운로드의 경우, 최소 150 GB의 디스크를 할당합니다. 40 GB 디스크는 더 작은 워크로드에는 충분할 수 있지만, 가중치 자체만으로도 상당한 경우가 많기 때문에 기본값으로는 좋지 않습니다. 저희 MiniMax H3 설정은 72 GB의 가중치를 다운로드했습니다. 디스크 공간은 이 실행을 예측 가능하게 만드는 요소 중 하나였습니다.
GPU 메모리 요구 사항 또한 정확한 워크플로우에 따라 달라집니다. LatentSync 1.6 (512 px)는 공유 로컬 GPU가 제공하는 것보다 더 많은 메모리가 필요했지만, LatentSync 1.5 (256 px)는 로컬에서 실행되었습니다. 모든 리프-싱크(lip-sync) 작업이 동일한 임대된 GPU를 필요로 한다고 추론해서는 안 됩니다. 먼저 워크로드를 선택하고, 그것에 맞는 하드웨어를 검색해야 합니다.
계속 따라 할 계정을 설정하는 경우, 여기가 저희의 Vast.ai 추천 링크입니다.
CLI를 사용하여 오퍼 검색하기
기본 검색 명령어는 다음과 같습니다:
vastai search offers \
'reliability >= 0.97 inet_down_cost = 0 disk_space >= 150' \
-o 'dph+' \
...
따옴표로 묶인 표현식은 오퍼를 필터링합니다. reliability >= 0.97은 저희가 설정한 시작 임계값입니다. inet_down_cost = 0은 인바운드 트래픽에 비용을 청구하는 오퍼를 제외합니다. disk_space >= 150은 대용량 다운로드를 위한 여유 공간을 확보합니다. -o 'dph+' 옵션은 시간당 가격이 낮은 순서대로 표시하며, --raw는 저희가 검사하거나 스크립트에 전달할 수 있는 데이터를 반환합니다.
이것들은 시작 필터일 뿐이며 완전한 호환성 테스트는 아닙니다. 오퍼가 이 필터를 통과하더라도 여전히 잘못된 GPU나 부적합한 드라이버, 또는 설정에 필요한 충분한 연결성이 있을 수 있습니다. 검색 결과는 장비가 사용 가능해지거나 임대될 때마다 변경됩니다. 오퍼 ID는 영구적인 추천이 아니라 검사해야 할 후보로 취급하십시오.
CLI는 gpu_name, num_gpus, disk_space, cuda_vers, cuda_max_good, driver_version, direct_port_count, inet_down, inet_down_cost, rentable, verified, 그리고 geolocation을 포함한 필드를 허용합니다. 쿼리 표현식에서 GPU 이름은 표시된 이름에 공백이 있는 경우 밑줄(_)을 사용합니다. 저희는 작업과 관련된 필드들을 사용하고, 인스턴스를 생성하기 전에 반환된 기록들을 검토합니다.
필터가 실제로 직면했던 문제와 어떻게 매핑되는지 알려드리겠습니다:
| 필터 | 방지하는 문제 |
|---|---|
reliability >= 0.97 | 실행 도중 연결이 끊기는 호스트 |
| ... |
시간당 가격 전에 인바운드 트래픽 확인하기
인바운드 트래픽은 저희가 오퍼를 신중하게 읽는 법에 대해 가장 명확한 교훈을 주었습니다. 이전 테스트에서, 저희는 RTX PRO 6000 Blackwell 96GB를 시간당 $1.625에 임대했습니다. 56분 세션 비용은 $2.18이었는데, 이는 GPU 사용 시간에 대한 $1.47과 모델 가중치 245 GB 다운로드 후 인바운드 트래픽에 대한 $0.64로 구성되었습니다.
이 다운로드 요금은 컴퓨팅 요금에 비해 상당한 금액이었습니다. 시간당 요율이 약간 더 높고 인바운드 트래픽이 무료인 다른 오퍼가 가중치(weight)가 많은 설정에는 더 저렴했을 수 있습니다. 이제 저희는 오퍼를 확정하기 전에 시간당 가격과 함께 inet_down_cost를 확인합니다.
다운로드할 양은 이미지에 이미 존재하는 내용과 작업이 필요로 하는 가중치(weights)에 따라 달라집니다. 저희의 부트스트랩 이미지(bootstrap image)는 시작 시 선택된 가중치 그룹만 다운로드합니다. 이는 불필요한 전송을 줄여주지만, 오퍼의 네트워크 가격을 검사해야 할 필요성을 없애지는 못합니다.
오퍼를 비교할 때는 전체 세션을 추정해야 합니다. 즉, 설정 및 다운로드 시간, 처리 시간, 디스크 사용량, 그리고 모든 트래픽 비용을 말합니다. 시간당 GPU 금액은 그 청구서의 일부만을 설명할 뿐입니다.
드라이버(driver), CUDA, 이미지 통합 확인하기
저희 컨테이너 이미지는 호스트 드라이버와 함께 작동해야 합니다. 원시 오퍼 필드인 driver_version, cuda_vers, 그리고 cuda_max_good은 임대하기 전에 이를 평가하는 데 도움을 줍니다. 저희는 이 값들을 의도한 이미지의 요구사항과 비교합니다.
저희가 이런 경험을 한 적이 있습니다. 스웨덴에서 드라이버 버전 535를 가진 A100 오퍼를 만났는데, 이는 계획했던 이미지와 맞지 않았습니다. GPU 이름과 메모리는 매력적이었지만, 소프트웨어 스택을 호환 가능하게 만들지는 못했습니다. 저희는 GPU 모델 자체를 작업이 실행될 것이라는 증거로 간주하기보다는 다른 오퍼로 넘어갔습니다.
LatentSync 1.6 설정을 위해 저희는 Vast RTX 3090에서 pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime을 사용했습니다. 오퍼를 확인할 때는 정확한 이미지가 중요합니다. 이미지를 변경하면 CUDA 및 드라이버 요구사항이 바뀔 수 있습니다. 사용할 계획인 이미지를 기록하고, 그 요구사항을 읽은 다음, 이를 오퍼의 원시 필드와 비교하세요. 만약 어떤 필드가 없거나 불분명하다면, 인스턴스를 생성하기 전에 오퍼를 더 자세히 검사해야 합니다.
포트(ports)와 위치에도 동일하게 적용됩니다. 설정이 직접 연결에 의존하는 경우 direct_port_count를 확인하세요. 작업 흐름에서 위치가 중요한 경우에는 geolocation을 사용하세요. 저희는 익숙한 GPU 이름이 이러한 필드들에 대해 어떤 정보도 알려준다고 가정하지 않습니다.
원시 결과를 데이터로 읽기
원시 JSON은 여러 오퍼를 일관되게 검토하기 쉽게 만듭니다. 먼저 정렬된 검색 결과를 저장합니다:
vastai search offers \
'reliability >= 0.97 inet_down_cost = 0 disk_space >= 150' \
-o 'dph+' \
...
다음은 간단한 pick_offer.py 헬퍼 스크립트입니다. 이 스크립트는 CLI 검색 결과가 시간당 가격(ascending hourly price) 순으로 정렬되어 있기 때문에, 반복적인 검증을 통과하는 첫 번째 오퍼를 가져옵니다. 결과를 특정 GPU 이름으로 제한하려면 WANTED_GPU를 설정하세요. MIN_CUDA 또는 MIN_DRIVER는 선택한 이미지의 요구 사항을 확인한 후에만 설정해야 합니다.
import json
import os
import re
...
이 헬퍼 스크립트는 의도적으로 '단기 목록(shortlist)' 도구입니다. 이는 -o 'dph+'가 제공하는 순서에 의존하며, 전체 작업 비용을 계산하거나 이미지가 실행될 것임을 증명하지는 않습니다. 인스턴스를 생성하기 전에 선택된 레코드를 검사하여 GPU 메모리와 연결성을 확인하고, 이미지의 드라이버 요구 사항을 점검하세요. 만약 CLI의 원시 응답(raw response) JSON 구조가 다르다면, 불완전한 데이터에서 조용히 선택하는 대신 offers 추출 부분을 직접 검사하여 조정해야 합니다.
신중하게 선택했을 때 발생한 일들
MiniMax H3 이미지-투-비디오의 경우, 우리는 체코에서 A100 SXM4 80GB 오퍼를 GPU 시간당 $1.19(디스크 포함 시 시간당 약 $1.25)에 사용했습니다. 이 작업은 설정 비용을 포함하여 총 $3.59에 세션 동안 82개의 히어로 클립을 생성했습니다. 가중치 다운로드 및 설정도 세션의 일부였기 때문에, 클립당 처리 시간만으로는 실제 비용을 과소평가하게 됩니다.
LatentSync 1.6의 경우, 우리는 UAE에서 RTX 3090 오퍼를 무료 인바운드 트래픽과 함께 시간당 $0.27에 사용했습니다. 설정에는 약 9분이 소요되었습니다. 이것이 우리가 작업을 한 세션으로 배치하는 이유입니다. 반복적인 설정은 짧은 실행 시간을 지배할 수 있기 때문입니다. 대기열에 넣은 단일 배치 자체 테스트에서, 설정에만 15.9분 중 11분이 소요되었습니다.
이제 우리의 선택 체크리스트에는 최종 운영 단계가 추가되었습니다. 출력을 복사한 후, 백업을 검증하고 인스턴스를 파괴합니다. 정지된(stopped) 인스턴스는 스토리지에 대한 청구를 계속합니다. 우리는 한 번 정지된 인스턴스를 며칠 동안 방치했다가 잔액이 마이너스가 되자 접근 권한을 잃었고, 학습된 결과물을 다운로드하지 못했습니다. 좋은 오퍼도 미완료된 종료 절차를 보상할 수는 없습니다.
우리가 지출한 비용
- A100 SXM4 80GB에서 MiniMax H3: GPU 시간당 $1.19, 디스크 포함 시 약 $1.25; 82개의 히어로 클립은 설정 시간을 포함하여 약 3시간 세션에 $3.59가 소요되었습니다.
- 이전 RTX PRO 6000 Blackwell 테스트: GPU 시간 $1.47과 245 GB의 가중치 다운로드 후 인바운드 트래픽 $0.64를 포함하여 56분 동안 $2.18가 소요되었습니다.
- 무료 인바운드를 사용하는 RTX 3090에서 LatentSync 1.6: 시간당 $0.27; 클립 하나는 238초가 걸렸고 약 $0.09가 소요되었습니다.
- 90 GB 디스크를 가진 중지된 인스턴스는 파괴될 때까지 시간당 약 $0.0167, 즉 하루에 약 $0.40이 청구되었습니다.
시리즈의 나머지 내용을 계속 따라가고 싶다면, 여기에서 저희 추천 링크를 확인해 주세요. 가장 저렴하고 유용한 오퍼는 워크로드(workload)의 요구 사항을 가장 낮은 세션 비용으로 충족시키는 것입니다. 우리에게 있어 신뢰성, 인바운드 트래픽, 디스크, 드라이버 호환성이 첫 번째 점검 항목입니다. 시간당 가격이 남아있는 오퍼들 사이에서 결정합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기