TypeScript 클라이언트는 스냅샷 마운트, 복원, 실행 중 스냅샷, 스냅샷 관리를 지원하지만 중지 시 스냅샷은 지원하지 않습니다.
인증 방식 선택
섹션에서 CoreWeave Kubernetes Service(CKS)를 지정하지 않는 한, 이 예시는 서버리스 용량에서 실행됩니다. 샌드박스를 소유한 계정의 사용자 인증 정보를 선택하세요. 키 또는 토큰을 획득하는 방법은 사용자 인증 정보 선택 및 가져오기를 참조하세요. 사용하는 언어에 맞는 설정 파일을 이 페이지에서 실행할 스크립트와 같은 위치에 저장하세요. Python 예시는sandbox_auth.py에서 AUTH를 임포트하고, TypeScript 예시는 sandbox-client.mts에서 client를 임포트합니다. 이 파일은 사용자 인증 정보를 저장하지 않고 인증 방식만 선택합니다. Python의 경우 활성화된 가상 환경을 사용하세요. TypeScript의 경우 먼저 npm install @coreweave/cwsandbox@1.0.0로 클라이언트를 설치하세요.
- Forge API 키
- CoreWeave API 액세스 토큰
SDK의
wandb 인테그레이션에서 Forge API 키를 사용하세요. [WANDB-API-KEY]를 API 키로 바꾸세요.- Python
- TypeScript
sandbox_auth.py
SandboxDefaults에서 placement_mode="cks"를 설정하세요. TypeScript에서 CKS를 선택하려면 CoreWeave 토큰을 선택하고 비어 있지 않은 runnerIds 배열을 설정하세요. auth=AUTH로 Python 세션을 생성하면 해당 세션이 소유한 샌드박스도 함께 인증됩니다. 샌드박스에 다시 연결하거나 목록을 조회하거나 정리할 때도 동일한 사용자 인증 정보를 사용하세요.
HTTP API 예시를 실행하려면 사용자 인증 정보 탭의 Bash 명령어를 요청을 보낼 셸과 같은 셸에서 실행하세요. 선택한 인증 헤더는 sandbox_headers 배열로 전달됩니다. HTTP 생성 예시는 서버리스 배치를 사용합니다.
작동 방식
FSS가 적용된 샌드박스는 선택한 경로에 쓰기 가능한 임시 파일 시스템을 마운트합니다. 러너는 객체 저장소를 직접 마운트하는 대신EmptyDir를 이 마운트의 기반으로 사용합니다. 스냅샷 및 복원 오퍼레이션은 로컬 파일 시스템과 조직 범위의 객체 저장소 버킷 간에 tarball을 복사합니다.
각 스냅샷은 서버가 부여한 fileSystemSnapshotId로 식별되는 FileSystemSnapshot 리소스입니다. 스냅샷에는 다음 세 가지 주요 속성이 있습니다.
- 불변성: 스냅샷을 생성하면 아카이브 하나가 기록됩니다. 스냅샷을 복원해도 원본 스냅샷은 변경되지 않으므로 이후에 복원할 때도 항상 원본 바이트를 사용합니다.
- 조직 범위: 자신의 조직에서 생성한 스냅샷만 복원할 수 있습니다. 같은 조직에서 샌드박스 액세스 권한이 있는 팀원은 본인의 사용자 인증 정보로 내 스냅샷을 복원할 수 있습니다. 다른 조직의 스냅샷 ID는 찾을 수 없는 것으로 처리됩니다.
- 독립적인 라이프사이클: 스냅샷은 샌드박스와 별도로 관리됩니다. 샌드박스를 삭제해도 해당 스냅샷은 삭제되지 않으며, 스냅샷을 삭제해도 해당 스냅샷에서 이미 실행 중인 샌드박스에는 영향을 주지 않습니다.
스냅샷 마운트로 샌드박스 시작하기
샌드박스는 새로 생성된 빈 임시 파일 시스템 또는 기존 스냅샷을 복원한 파일 시스템 중 하나를 기반으로 시작할 수 있습니다.새 임시 공간
새 임시 파일 시스템은 빈 상태로 시작하며 나중에 스냅샷을 생성할 수 있습니다. run 중 쓰기 가능한 로컬 상태가 필요한 워크플로에 사용하세요.- Python
- TypeScript
- HTTP API
스냅샷에서 복원
복원은 기존 스냅샷에서 파일 시스템을 시작합니다. 마운트의 스냅샷 소스에 스냅샷 ID를 설정하세요.- Python
- TypeScript
- HTTP API
READY 상태여야 합니다. CREATING 상태인 스냅샷을 복원하면 실패합니다. 스냅샷 상태 및 실패를 참조하세요.
복원 시간 계획
스냅샷을 복원할 때는 샌드박스가 애플리케이션을 실행하기 전에 아카이브를 복사하고 압축을 해제합니다. 대용량 모델 스냅샷은 복원하는 데 몇 분이 걸릴 수 있습니다. 시작 시간은 다음 요소에 따라 달라집니다.- 아카이브 크기
- 파일 수
- 사용 가능한 CPU
- 로컬 저장소
- 네트워크 처리량
- 이미지 시작 작업
CREATING 상태만으로는 스케줄링을 기다리는 중인지 파일을 복원하는 중인지 구분할 수 없습니다. 시작이 느린 샌드박스를 삭제하기 전에 status_reason을 확인하고, 지원팀에 문의할 수 있도록 샌드박스 ID를 보관해 두세요. 고정 기한을 두면 대기 시간을 제한할 수 있지만, 시간이 오래 걸린다는 사실만으로 복원이 실패했다고 판단할 수는 없습니다.
스냅샷 생성
스냅샷은 두 가지 방식으로 캡처할 수 있습니다. 샌드박스가 종료될 때 캡처하거나, 실행 중인 샌드박스에서 캡처할 수 있습니다.중지 시 스냅샷
샌드박스가 종료될 때 파일 시스템을 보존하려면 중지 시 스냅샷 기능을 활성화한 상태로 샌드박스를 중지하세요. 일시 중단 및 재개는 다음 방식으로 진행합니다. 스냅샷을 생성하며 중지한 다음, 나중에 해당 스냅샷을 복원하는 새 샌드박스를 시작합니다.- Python
- TypeScript
- HTTP API
실행 중 스냅샷
실행 중 스냅샷은 실행 중인 샌드박스를 중지하지 않고 캡처합니다. 캡처하는 동안은 물론 캡처한 후에도 샌드박스는 계속 실행됩니다. 캡처는 실행 중인 파일 시스템을 스캔하는 방식이며 원자적으로 수행되지 않으므로, 캡처 도중 발생한 쓰기는 스냅샷에 일관되게 반영되지 않을 수 있습니다. 일관된 상태가 필요하다면 캡처하는 동안 애플리케이션의 쓰기를 일시 중지하거나, 캡처 전에 애플리케이션 체크포인트를 생성하세요.- Python
- TypeScript
- HTTP API
snapshot()은 기본적으로 스냅샷이 READY 상태가 될 때까지 기다린 후 스냅샷 ID를 반환합니다.스냅샷 포크하기
동일한 스냅샷을 여러 샌드박스에 복원할 수 있습니다. 각 스냅샷은 불변이므로, 복원된 샌드박스는 동일한 바이트로 시작한 후 쓰기 작업에 따라 서로 달라집니다.- 중지 시 스냅샷 또는 실행 중 스냅샷을 사용하여
READY스냅샷을 생성하세요. fileSystemSnapshotId를 해당 스냅샷으로 설정하여 샌드박스 A를 시작하세요.- 동일한
fileSystemSnapshotId로 샌드박스 B를 시작하세요. - 샌드박스 A와 샌드박스 B의 쓰기 작업은 서로 독립적으로 이루어집니다. 원본 스냅샷은 변경되지 않으므로, 나중에 동일한 ID로 복원해도 어느 포크에서든 기록한 내용이 아닌 원본 스냅샷을 사용합니다.
- Python
- TypeScript
스냅샷 관리
스냅샷을 생성한 샌드박스와 독립적으로 스냅샷을 목록 조회, 가져오기, 삭제합니다.- Python
- TypeScript
- HTTP API
list_snapshots(), get_snapshot(), delete_snapshot()은 auth를 통해 AuthHeaders 객체도 받을 수 있습니다.
스냅샷 상태 및 실패
스냅샷은 비동기적으로 생성됩니다. 아카이브가 아직 기록 중이어도 스냅샷 요청이 성공하여fileSystemSnapshotId를 반환할 수 있으며, 이후 스냅샷이 실패할 수 있습니다. 이는 waitForReady가 false이거나 러너가 아직 아카이브를 생성하는 동안 클라이언트 timeout이 발생할 때 가장 자주 일어납니다.
HTTP API로 진행 상황을 확인하려면 스냅샷을 조회하고 다음 필드를 확인하세요.
status: 라이프사이클 상태입니다. 최종 값은FILE_SYSTEM_SNAPSHOT_STATUS_READY와FILE_SYSTEM_SNAPSHOT_STATUS_FAILED입니다.statusReason:status가FILE_SYSTEM_SNAPSHOT_STATUS_FAILED일 때 채워지며, 실패 이유를 설명합니다.
state와 stateReason을 확인하세요. 이에 해당하는 상태 값은 "ready"와 "failed"입니다.
스냅샷을 복원하기 전에 준비 완료 상태가 될 때까지 GetFileSystemSnapshot을 폴링하세요. Python 클라이언트의 snapshot()과 get_snapshot()은 결과를 기다릴 때 이 폴링을 대신 처리합니다. TypeScript 클라이언트의 snapshot()은 state가 "ready"가 될 때까지 기다리며, 스냅샷이 실패하면 예외를 발생시킵니다.
실패한 스냅샷 요청 복구하기
실행 중 스냅샷 실패를 복구하는 동안에는 소스 샌드박스를 계속 실행 상태로 유지하세요. 스냅샷 원격 프로시저 호출(RPC)이 실패해도 그 자체로 샌드박스나 마운트가 삭제되지는 않습니다. 하지만 Python 샌드박스 컨텍스트 관리자를 벗어나거나 종료 코드를 실행하면 샌드박스가 중지될 수 있으며, 이때 준비 완료 상태의 스냅샷에 반영되지 않은 데이터는 삭제될 수 있습니다. 따라서 이러한 정리 작업이 실행되기 전에 실패를 처리하세요. 버킷을 처음 사용할 때는 프로비저닝 과정에서CWSANDBOX_FSS_BUCKET_PROVISIONING이 반환될 수 있습니다. Python 클라이언트는 일시적인 스냅샷 RPC 실패를 정해진 예산 내에서 재시도합니다. 프로비저닝이 이 예산보다 오래 걸리면 소스 샌드박스를 유지한 채 백오프를 적용하여 재시도하세요. 성공 여부가 불분명한 전송 실패 후 동일한 요청을 재시도할 때는 서버가 중복 요청을 제거할 수 있도록 명시적인 request_id를 재사용하세요. timeout 이후에 스냅샷 ID를 확인할 수 있다면 아카이브를 다시 요청하기 전에 해당 스냅샷의 상태를 먼저 확인하세요. 스냅샷이 FAILED 상태가 되었다면 데이터를 다시 캡처하기 위해 새로 요청해야 합니다.
Python 클라이언트 1.19.6에서는 일시적인 스냅샷 실패 시 SandboxUnavailableError가, 그 밖의 스냅샷 실패 시 SandboxSnapshotError가 발생할 수 있습니다. 빌드를 보존하려면 두 오류를 모두 처리하고, 오류의 reason을 확인하여 재시도가 적절한지 판단하세요. 할당량 또는 설정 관련 실패는 원인을 해결하지 않은 채 재시도하지 마세요.
다음 table은 일반적인 실패 이유와 각 이유에 대한 조치 방법을 나열합니다.
러너가 아카이브 업로드를 완료했지만 결과를 기록하지 못하면, 버킷에 객체가 존재하더라도 스냅샷 행이
FAILED 상태가 될 수 있습니다. 이 경우 스냅샷 생성을 다시 시도하세요.
비동기 실패의 경우 플랫폼은 sandbox.file_system_snapshot.async_fail 이벤트도 발생시키므로, 다운스트림 알림 시스템은 원래 호출이 반환된 후 실패한 스냅샷에 대응할 수 있습니다.
제한 사항
FSS 버전 1은 스냅샷 기반 로컬 임시 저장소를 제공합니다. 이는 공유 파일 시스템이 아니며 라이브 다중 작성자 마운트를 지원하지 않습니다. 샌드박스는 실행 중에 서로의 파일 시스템을 읽거나 쓰지 않습니다. 상태를 공유하는 유일한 방법은 스냅샷팅과 복원입니다.SDK 예시
샌드박스를 시작하고, 실행 중 스냅샷을 생성하고, 이를 포크하고, 중지 시 스냅샷을 캡처하고, 스냅샷을 관리하는 완전한 실행 가능한 Python 예시는cwsandbox-client 저장소의 file_system_snapshots.py를 참조하세요. TypeScript의 경우 cwsandbox-js 저장소의 file-system-snapshots.ts에서 실행 중 스냅샷을 생성하고, 복원하고, 스냅샷을 관리하는 예시를 확인할 수 있습니다.
관련 리소스
- 파일 시스템 스냅샷에 자체 버킷 사용: 소유한 버킷에 스냅샷을 저장하세요.
- 볼륨: 여러 샌드박스가 공유하는 임시 볼륨과 등록된 볼륨입니다.
-
샌드박스 라이프사이클:
stop()과 샌드박스 상태의 작동 방식을 알아보세요. - Python 클라이언트: SDK를 설치하고 API를 살펴보세요.