참고 자료
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 자원을 만들지 않습니다.
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를 그대로 호출하는 셸 함수이며 새로운 하위 명령을 추가하지 않습니다.
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를 다른 클러스터로 바꾸지 않고 전용 파일을 명시합니다.
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장의 소유권 검사가 있는 명시적 절차를 사용합니다.
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 태그는 변경하지 않습니다.