참고 자료

Isaac Sim 진행자·운영자 과정

14–18장은 진행자·운영자 선택 과정입니다. 사용자가 지정한 현재 AWS 계정, 기존 서울 VPC, 전용 gpu-cluster-01을 사용합니다. 00–13장의 참가자별 robot-lab-<팀> 실습과 권한·실행 위치가 다릅니다.

일반 참가자는 아래 운영 명령을 실행하지 않습니다. 진행자가 실제 GPU·물리·보안·복구 검증을 마친 뒤 제공한 웹에서 세션에 속한 작업만 실행합니다. 참가자 준비기 lab.py는 이 공용 GPU 환경을 만들지 않습니다.

범위와 현재 근거

구분 기준
운영 CLI 원본 저장소의 scripts/isaac.py
고정 설정 infra/isaac/config.json과 deployment.config()의 계정/VPC/클러스터 가드
전용 클러스터 gpu-cluster-01, 서울, 기존 Private Subnet 두 개
전용 스택 RobotAtlasIsaac, RobotAtlasIsaacAddons, RobotAtlasIsaacBuild
Kubernetes namespace robot-atlas-isaac, 기본 GPU pool isaac-sim-spot, 선택 GPU pool isaac-sim-ondemand
보호 대상 기존 GPU01, Jeju 자원, 운영 Fargate, 공유 VPC·Subnet·NAT·인증서·DNS
참가자 범위 검증 후 개방된 웹 API. kubeconfig·운영자 AWS 권한을 배포하지 않음

2026-09-13에 제공된 인프라 확인 결과는 클러스터 생성과 Private g6e.2xlarge의 L40S, 드라이버 580.178.04, Public IP 없음입니다. 이것은 nvidia-smi와 배치 근거입니다. Isaac Sim의 실제 RTX 프레임, 물리 성공, Spot 복구 완료를 뜻하지 않습니다.

새 계정이나 VPC용 설정을 만들려고 가드를 해제하지 않습니다. 다른 환경은 별도로 검토한 구현이 필요하며 이 과정의 복사·수정 대상이 아닙니다.

운영자 터미널 준비

진행자에게 준비된 AWS 인증 체인을 사용합니다. 자격 증명 파일이나 Secret 값을 읽어 교재에 복사하지 않습니다. Node 24, Python 3.11, uv, AWS CLI, kubectl, jq, Docker, crane이 필요합니다. 이미지 보강은 전용 AMD64 CodeBuild에서 수행합니다.

아래는 운영자용 Python 환경의 최초 준비입니다. 패키지 설치에는 네트워크가 필요하며 AWS 자원을 만들지 않습니다.

터미널bash
VSCode Server 터미널에서 실행
set -euo pipefail
export ISAAC_REPO=/home/ec2-user/my-project/robot-arm
cd "$ISAAC_REPO"
export ISAAC_CONFIG="$ISAAC_REPO/infra/isaac/config.json"
export ISAAC_EVIDENCE="$ISAAC_REPO/.local/isaac/workshop"
export ISAAC_PYTHON="$ISAAC_REPO/.local/isaac/operator-venv/bin/python"
umask 077
mkdir -p "$ISAAC_EVIDENCE"
if [ ! -x "$ISAAC_PYTHON" ]; then
  uv venv --python 3.11 "$ISAAC_REPO/.local/isaac/operator-venv"
fi
uv pip install --python "$ISAAC_PYTHON" \
  -r isaac/requirements-cloud.txt 'PyYAML==6.0.3'
"$ISAAC_PYTHON" -c 'import sys,boto3,yaml; assert sys.version_info[:2] == (3,11); print("Python 3.11 operator environment")'
aws --version
kubectl version --client -o json
jq --version

이미 준비한 새 터미널에서는 같은 경로 변수를 설정하고 다음 도움 함수를 정의합니다. isaac은 기존 CLI를 그대로 호출하는 셸 함수이며 새로운 하위 명령을 추가하지 않습니다.

터미널bash
VSCode Server 터미널에서 실행
isaac() {
  (
    cd "$ISAAC_REPO"
    "$ISAAC_PYTHON" scripts/isaac.py --config "$ISAAC_CONFIG" "$@"
  )
}
ik() {
  kubectl --kubeconfig "${ISAAC_KUBECONFIG:?isaac kubeconfig를 먼저 실행하세요}" \
    --context gpu-cluster-01 "$@"
}
isaac --help
isaac status > "$ISAAC_EVIDENCE/stacks.json"
jq . "$ISAAC_EVIDENCE/stacks.json"

status도 실제 STS 계정과 소유 태그를 확인하는 AWS 조회입니다. 기본 kubeconfig를 다른 클러스터로 바꾸지 않고 전용 파일을 명시합니다.

터미널bash
VSCode Server 터미널에서 실행
export ISAAC_KUBECONFIG="$(isaac kubeconfig)"
test -s "$ISAAC_KUBECONFIG"
test "$(ik config current-context)" = gpu-cluster-01

소스 경로가 달라졌거나 계정·VPC 가드가 실패하면 중지합니다. 오류를 피하려고 --config를 다른 계정 파일로 바꾸지 않습니다. .local/isaac/는 운영 상태·로그·결과 저장 위치이며 공개 교재에 포함하지 않습니다.

실제 CLI와 출력 형식

명령 동작 결과를 읽는 방법
status 소유 세 스택 조회 stdout JSON
kubeconfig 소유 클러스터 조회, 전용 로컬 파일 기록 stdout은 파일 경로
plan --component cluster|addons|build AWS 변경 세트 생성 .local/isaac/<component>-plan.json
apply --plan PATH 검토한 변경 세트 실행, 완료 대기는 별도 stdout JSON 후 status 조회
nodes NodeClass·NodePool·namespace 적용 kubectl 출력, 이후 실제 자원 조회
build-controller ARM64 컨트롤러 빌드와 ECR 게시 .local/isaac/controller-image.json
start-hardening 소스 ZIP 게시·AMD64 CodeBuild 시작 stdout JSON, hardening-build.json
hardening-status 빌드 조회, 성공 시 base digest 기록 stdout JSON, hardened-base.json
build-worker 고정 base에 worker 계층 추가·ECR 게시 .local/isaac/worker-image.json
scan --component controller|base|worker 전체 검사 결과 조회·로컬 저장 stdout 요약 JSON, <component>-scan.json
workloads namespace의 컨트롤러·RBAC·Quota·정책 적용 server dry-run 및 실제 kubectl 출력
submit --scenario … --seed … --order … 운영자 실행 등록 stdout JSON, last-run.json
submit --capacity-type spot|on-demand --memory-profile standard|rtx96 … 운영자가 선택한 구매·VRAM 조건으로 등록 stdout JSON. 기본값은 Spot·standard
enable-ondemand 같은 Private NodeClass의 선택 pool 생성 kubectl 출력. 작업 요청 전에는 GPU 미생성
warm --replicas 1 낮은 우선순위 Spot GPU·이미지 holder 적용 kubectl 출력과 JSON. 유휴 GPU 과금 발생
warm --replicas 0 소유 holder를 0으로 축소 kubectl 출력과 JSON
run --id ID 실제 실행 레코드 조회 stdout JSON, results/<ID>.json
artifact --id ID --kind replay|preview|checkpoint 본인 실행의 S3 산출물 다운로드 stdout JSON의 path, sha256
recover --id ID 명시적 운영자 복구 시험의 NodeClaim·Pod 교체 results/<ID>-recovery.json
promote-cache --id ID 성공한 실행의 검증된 캐시 후보 게시 stdout JSON

plan은 JSON 뒤에 경로가, recover는 kubectl 출력이 섞일 수 있습니다. 그 stdout 전체를 jq에 전달하지 않습니다. 저장된 JSON을 읽습니다. 빌드 출력도 전용 이미지 기록 파일로 확인합니다.

현재 이 CLI에는 cleanup, capacity, wait라는 하위 명령은 없습니다. 용량 선택에는 실제 구현된 enable-ondemand, warm, submit 옵션을 사용하며 자동으로 활성화하지 않습니다. 아래 대기 함수는 문서의 셸 도움 함수입니다. 정리는 18장의 소유권 검사가 있는 명시적 절차를 사용합니다.

터미널bash
VSCode Server 터미널에서 실행
isaac_wait_run() {
  local run_id="${1:?run ID 필요}"
  local seconds="${2:-1800}"
  local end=$(( $(date +%s) + seconds ))
  [[ "$run_id" =~ ^isaac-[0-9a-f-]{36}$ ]] || return 2
  while [ "$(date +%s)" -lt "$end" ]; do
    isaac run --id "$run_id" > "$ISAAC_EVIDENCE/$run_id-latest.json"
    jq '{id,state,phase,attempts,checkpointCompleted,createdAt,updatedAt}' \
      "$ISAAC_EVIDENCE/$run_id-latest.json"
    case "$(jq -er '.state' "$ISAAC_EVIDENCE/$run_id-latest.json")" in
      succeeded) return 0 ;;
      failed|cancelled) return 1 ;;
      queued|starting|running) sleep 5 ;;
      *) return 2 ;;
    esac
  done
  printf '%s\n' "대기 제한 시간 초과: 상태와 deadlineAt을 확인하세요." >&2
  return 1
}

실행·시간·ID 계약

필드 의미
id DynamoDB·API의 isaac-<UUID> 실행 ID
owner 웹 세션 소유자 또는 operator-validation
state queued, starting, running, succeeded, failed, cancelled
createdAt, updatedAt ISO 8601 문자열. 이 이름과 형식을 그대로 유지
deadlineAt, expiresAt, workerLeaseUntil epoch 초 숫자
attempts, workerId 시도 횟수와 현재 Pod UID
checkpointCompleted, checkpointKey 커밋된 완료 action 수와 S3 키
readyEvidence 실제 씬·PhysX·RTX 프레임 준비 근거
operatorCapacityType 운영자 제출의 spot 또는 on-demand 선택
minimumVramMiB 운영자 standard는 40000, rtx96은 90000. 스케줄링은 이 값 초과 어피니티

CloudFormation 계획 파일의 createdAt은 계획 유효기간 검사용 epoch 값입니다. 실행 테이블의 ISO createdAt과 혼동하지 않습니다. GSI state-created, owner-created도 실행 테이블의 문자열 createdAt을 사용합니다.

현재 worker는 웹용 replay의 id를 외부 실행 ID로 지정합니다. 시뮬레이터의 checkpoint.runId와 readyEvidence.runId는 그보다 안쪽의 물리 실행 ID입니다. 복구 전후에는 외부 ID끼리, 물리 ID끼리 같은지 비교합니다. 두 종류를 억지로 같게 편집하지 않습니다.

웹 API 경계

경로 계약
GET /api/config isaac.enabled와 maxJobSeconds 설정. GPU 검증 성공을 뜻하지 않음
POST /api/plan 기존 Bedrock/AgentCore 계획. 세션에 plan ID 보관
POST /api/isaac/runs {planId,seed}로 등록, HTTP 202
GET /api/isaac/runs 현재 세션 실행 목록
GET /api/isaac/runs/:id 공개 상태. 내부 starting은 status: running으로 표시
GET /api/isaac/runs/:id/replay 완료된 성공/실패의 검증된 JSON
GET /api/isaac/runs/:id/preview 완료된 결과의 PNG, private/no-store
POST /api/isaac/runs/:id/cancel 취소 요청. 실제 GPU 정리와 admission 해제는 후속 처리

변경 요청에는 같은 세션의 쿠키·CSRF·정확한 Origin이 필요합니다. GPU API에 임의 action, 좌표, 이미지 URI, operatorRecoveryTest를 받지 않습니다. 운영 CLI의 submit은 모델을 호출하지 않고 provider: rules인 운영자 검증 계획을 등록합니다.

설정되지 않은 경로는 503 isaac_disabled, 진행 중인 공용 작업이 있으면 429 isaac_busy, 다른 세션 실행은 404입니다. 운영자 CLI 실행은 웹 방문자의 세션 실행 목록에 속하지 않습니다. GPU Pod에 공개 IP·서비스 포트·WebRTC를 열지 않습니다.

공개 웹 작업은 항상 standard Spot입니다. 구매·메모리 프로파일과 warm은 운영자 선택 기능입니다. warm은 /bin/sleep으로 GPU와 worker 이미지를 예약하며 Isaac 프로세스·RTX renderer를 미리 시작하지 않습니다. namespace GPU quota 2는 Spot·On-Demand·holder 요청의 합계에 적용됩니다. 유휴 노드·교체 중첩까지 포함한 절대 과금 상한은 아닙니다.

물리·보안·최적화의 범위

  • 물리는 CPU PhysX TGS 240 Hz, pose 기록은 20 Hz, 카메라는 RTX GPU의 480×360 RGB입니다. GPU 배치 RL이나 20 FPS 영상 스트리밍이 아닙니다.
  • 이미지 API 계열은 Isaac Sim 5.1.0으로 고정합니다. 관리형 580 드라이버와 검증 범위를 유지하며 호스트 드라이버·커널·userData를 변경하지 않습니다.
  • 보강 문서는 isaac/README-security.md입니다. CodeBuild 성공, CPU import 검사, ECR 재검사, 실제 GPU 실행은 별개입니다. 잔여 CVE를 숨기거나 0건으로 표현하지 않습니다.
  • S3 캐시 identity는 Isaac 버전·이미지 digest·scene revision·GPU 이름·드라이버를 포함합니다. 복원 파일 수와 실제 엔진 재사용 효과를 구분합니다.
  • 사용자가 제공한 2026-09-02-eks-llm-serving-cold-start.md에서는 단계별 계측과 호환 캐시 원칙을 가져옵니다. vLLM streamer·sleep, hostPath, EC2NodeClass userData 및 그 문서의 성능 숫자를 Isaac 결과로 사용하지 않습니다.

FIS와 관리형 EC2 조회

Auto Mode의 미지원 FIS EC2 작업은 공식 문서에 ec2:RebootInstances, ec2:SendSpotInstanceInterruptions, ec2:StartInstances, ec2:StopInstances, ec2:TerminateInstances, ec2:PauseVolumeIO로 나열되어 있습니다. 같은 문서는 FIS EKS Pod 작업 지원을 명시합니다. 현재 recover는 어느 FIS API도 호출하지 않는 별도 NodeClaim·Pod 교체 리허설입니다.

2026-04-22 이후 생성된 Auto Mode 관리형 EC2 자원은 기본 목록에서 숨겨질 수 있지만 계속 동작하고 과금됩니다. Kubernetes NodeClaim·노드 providerID와 특정 instance ID를 사용해 조회합니다. 계정 전체의 managed resource visibility나 기존 GPU01·공유 VPC의 discovery 태그는 변경하지 않습니다.

공식 참고 문서

진행 순서: 14. EKS → 15. 실제 실행 → 16. 복구 시험 → 17. 운영 → 18. 정리.