native Control Plane이 활성화된 provider-pool 상태와 capacity smoke 결과를 dev-corp 테스트 규칙과 인벤토리에 반영한다.
18 KiB
18 KiB
| name | version | description |
|---|---|---|
| dev-corp-runtime-deploy | 1.0.1 | dev-corp 배포, 회사망 mac-mini Edge와 내부 DGX/Mac Studio provider pool 배포 및 OpenAI-compatible capacity smoke 절차 |
dev-corp-runtime-deploy
목적
dev-corp provider pool을 현재 dev-runtime과 같은 구조로 배포한다. 배포는 mac-mini checkout 준비, source clean sync, 테스트, dev-corp runtime rebuild, native Control Plane 활성화, Edge/Node 재시작, provider snapshot 기반 capacity 검증까지 포함한다.
언제 호출할지
- 사용자가
dev-corp 배포,dev-corp runtime 배포,회사 dev 환경 배포처럼 dev-corp 환경 배포를 요청할 때 - mac-mini Edge와 DGX Spark 01/02 vLLM node, Mac Studio vLLM-MLX node로 이루어진 provider pool을 갱신할 때
- dev-corp model alias, provider endpoint, provider capacity, node 접속 정보를 배포 절차에 반영할 때
- dev-corp OpenAI-compatible
/v1/responses또는/v1/chat/completions경로가 provider capacity만큼 채워지는지 검증할 때
입력
env: 배포 대상 환경. 기본값은dev-corp이다.model: OpenAI-compatible model alias. 지정하지 않으면agent-test/dev-corp/inventory.yaml의model.alias를 사용한다.capacity_targets: provider별 기대 capacity. 지정하지 않으면agent-test/dev-corp/inventory.yaml의 target 후보 값을 사용한다.source_ref: 배포할 git ref. 지정하지 않으면 mac-mini checkout의 기본 배포 branch 기준을 따른다.
먼저 확인할 것
agent-ops/rules/project/domain/testing/rules.md를 읽고 사용자 실행 파이프라인 검증 기준을 확인한다.agent-test/dev-corp/inventory.yaml을 먼저 읽는다. 파일이 없으면agent-test/dev-corp/rules.md,agent-test/dev-corp/edge-smoke.md,agent-test/dev-corp/node-smoke.md로 fallback하고, 구조화 inventory 누락을 보고한다.- dev-corp provider pool과 compose/local/dev-runtime profile을 섞지 않는다. dev-corp provider pool은 mac-mini Edge와 dev-corp config를 기준으로 한다.
- mac-mini에
/Users/fe/agent-work/iop-dev-corpcheckout이 없으면 배포를 시작하지 말고 checkout 생성과 source sync를 setup blocker로 보고한다. - mac-mini에서
192.168.2.2:8002,192.168.2.4:8004,192.168.2.3:8004의/health와/v1/models가 성공하는지 확인한다. - Edge config의 OpenAI-compatible adapter endpoint는 각 Node process 기준으로 평가된다. direct preflight는
192.168.2.x주소로 하되, Edge가 Node에 내려주는 provider endpoint는 node-local127.0.0.1:<provider-port>를 우선한다. - DGX Spark 01/02가 mac-mini
172.24.63.178:18085/18086/18087에 직접 접근하지 못하면 mac-mini에서 reverse SSH tunnel을 유지하고 해당 Node Edge addr을 tunnel local port로 설정한다. gemma4:26balias와 총 capacity13은agent-test/dev-corp/inventory.yaml의 최신 검증 상태를 기준으로 판단한다. 새 배포에서 Edge config 반영과 capacity smoke가 통과하기 전에는 새 결과를 확정값으로 보고하지 않는다.- DGX Spark vLLM provider는 capacity
4, 호출당 최대 context window262144, requested KV262144x2이상을 기준으로 한다. vLLM에는 vLLM-MLX식--max-kv-size가 없으므로 실제 KV cache는gpu_memory_utilization적용 후 startup log의GPU KV cache size와Maximum concurrency for 262,144 tokens per request로 검증한다. DGX01/02 검증 기준은--max-num-seqs 4,--max-model-len 262144,--gpu-memory-utilization 0.40이고, FP4 MoE 커널 한계 보정을 위해VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304도 함께 둔다. - DGX Spark 02 endpoint는 Docker publish 때문에
192.168.2.4:8004이다.8000,8001,8002를 기본 endpoint로 쓰지 않는다. - Mac Studio
192.168.2.3:8005DiffusionGemma endpoint는 secondary provider 후보이며 기본 pool에 자동 포함하지 않는다. - Mac Studio
192.168.2.3:8004provider catalog type은openai_compat이고 실제 runtime은 vLLM-MLX이다. vLLM-MLX runtime은 capacity5, 호출당 최대 context window262144, requested KV262144x3기준으로--max-num-seqs 5,--max-request-tokens 262144,--max-kv-size 786432을 사용한다. - Mac Studio
192.168.2.3:8004vLLM-MLX runtime은 2026-06-25 기준 detachedscreensessionvllm_mlx_8004로 관리한다. 이 host는 Pythonpyexpat로딩에DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib가 필요하므로 재시작 명령에 반드시 포함한다. - 현재 구현의 completion 검증 대상은 legacy
/v1/completions가 아니라/v1/chat/completions이다./v1/completions는 route가 구현되어 있을 때만 별도 검증한다. - dev-corp current runtime은 OpenAI-compatible bearer token이 켜져 있다. smoke는 token 원문을 출력하지 말고
OPENAI_API_KEY=$(cat build/dev-corp-runtime/.secrets/openai_api_key)또는--api-key-file로 실행한다. - token, secret header, bootstrap token, private key 경로는 최종 보고에 원문으로 출력하지 않는다.
known/current runtime update notes
- DGX Spark 01/02의 requested KV
262144x2는 vLLM에서 직접--max-kv-size로 표현하지 않는다.--max_num_batched_tokens는 scheduler iteration budget이므로 KV cache 총량으로 취급하지 않는다. dev-corp 기준은--max-model-len 262144와gpu_memory_utilization적용 후 startup log의 KV cache/concurrency 확인이다. - DGX Spark에서 explicit
--max-num-batched-tokens 524288를 사용하는 경우 first profile 중 FP4 MoE token-per-expert 기본 한계에 걸릴 수 있다.VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304를 반드시 유지한다. - DGX Spark 01은 FlashInfer FP4 JIT가 first compile 중
ninja실행 파일을 PATH에서 찾는다.ninja는 venv에 있으므로/home/digitalcommerce_dgx_spark_01/vllm_env/bin을 PATH 앞에 둔다. - DGX Spark 02 Docker image
vllm/vllm-openai:latest의 entrypoint는 이미vllm serve이다. container command에는serve를 중복으로 넣지 말고 positional model/models/gemma-4-26B-A4B-it-NVFP4부터 둔다. 현재 Docker publish는 host8004-> container8004기준이다. - Mac Studio는
DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib없이 Pythonpyexpatimport가 실패할 수 있다.screensessionvllm_mlx_8004안에서 이 환경변수를 export한 뒤 시작한다. - 2026-07-02 재확인 기준 DGX Spark 01은
--gpu-memory-utilization 0.40로 재기동 후 mac-mini 내부 endpointhttp://192.168.2.2:8002에서/health200과/v1/modelssmoke를 통과했고 startup log에서 GPU KV cache834,507tokens, full-context concurrency3.18x를 확인했다. - 2026-06-25 재확인 기준 DGX Spark 02는 Docker
vllm-gemma4host/container8004,--gpu-memory-utilization 0.40,--max-model-len 262144,--max-num-seqs 4로 동작하며 mac-mini와 node-local/health,/v1/models, 직접 동시성1..4chat completion benchmark를 통과했다. startup log에서 GPU KV cache860,222tokens, full-context concurrency3.28x를 확인했다. - 2026-07-02 기준 native Control Plane은 mac-mini provider-pool runtime에서
18002/19004/19005를 listen하고, Edge iddev-corp-edge가127.0.0.1:19005로 connected 상태다. status URL은http://127.0.0.1:18002/edges/dev-corp-edge/status이다. - 2026-07-02 기준 provider-pool 전체 Edge OpenAI-compatible capacity smoke는
/v1/responses와/v1/chat/completions모두 14개 동시 요청 14/14 성공, peak totalin_flight=13,queued=3, 완료 후 provider별in_flight=0,queued=0회복을 확인했다.
실행 절차
-
환경 인벤토리 확정
- 배포 대상 runner, repo path, Edge id, Control Plane status URL, OpenAI base URL, Edge admin URL, Node SSH 정보를
agent-test/dev-corp/inventory.yaml에서 확정한다. - provider pool 대상 model alias와 provider별 capacity target을 확정한다.
- 필수 정보가 없거나 서로 충돌하면 배포를 시작하지 말고 누락/충돌 항목을 보고한다.
- 배포 대상 runner, repo path, Edge id, Control Plane status URL, OpenAI base URL, Edge admin URL, Node SSH 정보를
-
provider direct preflight
- mac-mini에서 DGX Spark 01
http://192.168.2.2:8002/v1/models, DGX Spark 02http://192.168.2.4:8004/v1/models, Mac Studiohttp://192.168.2.3:8004/v1/models를 확인한다. - 각 endpoint가 기대
served_model을 노출하는지 확인한다. - DGX Spark 02가 provider port down과 SSH banner exchange timeout을 동시에 보이면 runtime 추가 조작을 보류하고, SSH 회복 후 process/log부터 확인한다.
- 실패한 provider는 Edge config에 넣지 않거나 배포 blocker로 보고한다.
- mac-mini에서 DGX Spark 01
-
mac-mini checkout clean sync
- mac-mini checkout에서
git fetch후 배포 기준 ref로git reset --hard를 수행한다. - dirty 파일은 보존 대상으로 보지 않는다. 배포 전 clean 상태를 만든다.
- 기본 cleanup은
git clean -fd이다.git clean -fdx는 config, token, secret, runtime artifact까지 삭제할 수 있으므로 사용하지 않는다. - sync 후
git status --short --branch와git log --oneline -1을 기록한다.
- mac-mini checkout에서
-
빌드 전 테스트
- clean source 기준으로
go test ./...를 실행한다. - client/Flutter, proto, Makefile, script, config 변경이 배포 범위에 포함되면 해당 도메인 규칙의 테스트도 추가한다.
- 테스트가 실패하면 build/deploy를 진행하지 않고 실패 패키지와 핵심 오류를 보고한다.
- mac-mini 또는 로컬 PATH에 Go가 없으면 시스템 전역 설치 대신
build/.tools같은 ignored runtime 경로에 임시 Go toolchain을 두고 사용한다.
- clean source 기준으로
-
dev-corp runtime rebuild
- 같은 source ref에서 dev-corp Control Plane binary, Edge binary, mac node binary, Linux ARM64 node binary를 다시 빌드한다.
- mac-mini에서 직접 빌드할 수 없으면 같은 source ref 기준으로 로컬에서 빌드한 뒤
rsync/scp로 mac-mini runtime 경로에 배포한다. - Windows AMD64 node binary는 dev-corp 기본 provider pool 대상이 아니다.
- stale binary가 의심되거나
config refreshsubcommand, admin port, version 출력이 맞지 않으면 clean sync부터 다시 시작한다. - 빌드 산출물 경로, timestamp, 크기, 실행 가능 여부를 기록한다.
-
빌드 후 config check
- 빌드된 Edge binary로
config check,config refresh --help,config refresh --mode dry-run을 실행한다. - dry-run이
rejected또는 예상 밖restart_required를 반환하면 배포를 멈추고 config diff를 보고한다.
- 빌드된 Edge binary로
-
배포와 재시작
- Control Plane은 mac-mini에서
build/dev-corp-runtime/bin/control-plane기준으로18002/19004/19005dev-corp port를 listen하게 재시작한다. - Edge는 mac-mini에서 빌드 산출물 기준으로 재시작하고, Edge config의
control_plane.enabled=true,wire_addr=127.0.0.1:19005를 확인한다. - DGX Spark 01/02는 Linux ARM64 node binary를 mac-mini 경유로 배포하고 기존 node process를 재시작한다.
- Mac Studio는 macOS node binary를 mac-mini 경유로 배포하고 기존 node process를 재시작한다.
- provider runtime 옵션을 갱신하는 배포라면 DGX Spark 01은
/home/digitalcommerce_dgx_spark_01/start_vllm_8002.sh의PATH=/home/digitalcommerce_dgx_spark_01/vllm_env/bin:$PATH,VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304,--max-num-seqs 4,--max-model-len 262144,--gpu-memory-utilization 0.40를 확인하고 tmuxvllm_server_8002를 재기동한다. FlashInfer FP4 JIT가 first compile 중ninja를 PATH에서 찾는다. - provider runtime 옵션을 갱신하는 배포라면 DGX Spark 02는 Docker container
vllm-gemma4를 image entrypointvllm serve기준으로 재생성한다. container env에는VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304를 넣고, container args는 positional model/models/gemma-4-26B-A4B-it-NVFP4뒤에--max-model-len 262144,--gpu-memory-utilization 0.40,--max-num-seqs 4,--port 8004를 둔다. - provider runtime 옵션을 갱신하는 배포라면 Mac Studio는
screen -dmS vllm_mlx_8004안에서DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib를 export한 뒤vllm_mlx.cli serve를--max-num-seqs 5,--max-kv-size 786432,--max-request-tokens 262144로 재기동한다. - Node bootstrap은 Edge의
node register가 출력한 OS별 완성 명령을 우선한다. 다만 node-local provider endpoint, 별도IOP_HOME, 또는 DGX Spark 01/02 reverse tunnel처럼 host별 Edge addr이 필요한 경우에는~/iop-dev-corp-field/node.yaml을 수동 배치할 수 있고, token 원문은 로그/보고에 남기지 않는다.
- Control Plane은 mac-mini에서
-
배포 후 연결 검증
- Edge, OpenAI-compatible listener, Node TCP, admin port, Control Plane status port가 열려 있는지 확인한다.
- Control Plane status에서 Edge가 connected이고 dev-corp 기준 3개 provider node가 connected인지 확인한다.
- 각 node의
provider_snapshots에서 providerid,capacity,in_flight,queued,health,served_models를 확인한다. /v1/models가 대상 model alias를 노출하는지 확인한다.
-
OpenAI-compatible capacity smoke
/v1/responses와/v1/chat/completions를 각각 검증한다. legacy/v1/completions는 구현되어 있지 않으면 실패로 보지 않는다.- 표준 부하 프롬프트는 700~1200 token 수준의 구조화된 답변을 유도해 요청이 동시에 관측될 시간을 만든다.
- endpoint별로 총 provider capacity + 1개 요청을 동시에 보낸다. Edge config에서 기본 dev-corp 후보 capacity
4 + 4 + 5 = 13을 확정한 경우 14개 동시 호출을 보낸다. - 요청 실행 중 Control Plane status를 반복 polling하여 대상 provider들의
in_flight합이 총 capacity에 도달하고queued합이 1 이상이 되는 순간을 증거로 남긴다. - 각 provider의
in_flight가 자기 capacity를 넘지 않고, 적어도 한 번은 기대 capacity까지 차는지 확인한다. - 모든 요청 완료 후 같은 status에서 대상 provider들의
in_flight=0,queued=0으로 돌아오는지 확인한다. - Gemma 계열 reasoning/tool-parser 텍스트는 정상 응답으로 허용한다. exact-output match를 smoke 성공 기준으로 삼지 않는다.
-
결과 보고
- source ref, clean sync 결과, 테스트 결과, 빌드 산출물, process/port 상태, connected node 목록, provider capacity snapshot, capacity smoke 관측값을 보고한다.
- 실패한 단계가 있으면 다음 단계를 진행했는지 여부를 명확히 구분한다.
- capacity smoke가 타이밍 문제로 관측 실패했으면 요청 성공과 별도로
capacity 관측 미충족으로 보고하고, 프롬프트 길이 또는 status polling 간격 조정을 제안한다.
실행 결과 검증
- mac-mini checkout이 배포 기준 ref로 clean sync되었는가
- provider direct endpoint 3개가 mac-mini에서
/health와/v1/models에 성공했는가 - 빌드 전
go test ./...와 필요한 추가 테스트가 통과했는가 - dev-corp Control Plane/Edge/mac/Linux ARM64 binary가 같은 source ref에서 rebuild되었는가
- 빌드 후 config check, refresh help, refresh dry-run이 통과했는가
- Edge와 3개 provider node가 재시작되고 connected 상태인가
/v1/responsescapacity smoke에서 총 capacity만큼in_flight가 차고 초과 요청이 queue에 잡혔는가/v1/chat/completionscapacity smoke에서 총 capacity만큼in_flight가 차고 초과 요청이 queue에 잡혔는가- 완료 후 provider
in_flight=0,queued=0으로 회복되었는가 - 검증 실패 시: 실패 단계, 실패한 host/provider/endpoint, 관측된 snapshot, 진행 중단 여부를 보고한다.
출력 형식
dev-corp runtime 배포 결과
- Source: <branch/ref/commit>, clean=<yes|no>
- Provider preflight: dgx01=<pass|fail>, dgx02=<pass|fail>, mac-studio=<pass|fail>
- Pre-build tests: <command> - <pass|fail|not-run>
- Build: control-plane=<path>, edge=<path>, mac-node=<path>, linux-arm64-node=<path>
- Post-build checks: config-check=<pass|fail>, refresh-help=<pass|fail>, refresh-dry-run=<status>
- Deployment: control-plane=<pid/status>, edge=<pid/status>, dgx01=<pid/status>, dgx02=<pid/status>, mac-studio=<pid/status>
- Ports: <port summary>
- Nodes: <node_id connected summary>
- Providers: <provider_id capacity/in_flight/queued/health summary>
- OpenAI-compatible: models=<pass|fail>, responses-capacity=<pass|fail>, chat-completions-capacity=<pass|fail>
- Capacity evidence: <endpoint별 max in_flight/queued snapshot>
- Blockers/Risk: <없음 또는 내용>
금지 사항
- mac-mini checkout이 없거나 dirty/divergent 상태인데 배포를 계속하지 않는다.
git clean -fdx를 기본 cleanup으로 사용하지 않는다.- 빌드 전 테스트 실패 후 배포를 계속하지 않는다.
- DGX Spark 02 provider endpoint를
192.168.2.4:8000,8001,8002로 잘못 사용하지 않는다. - Mac Studio secondary
8005endpoint를 별도 alias/capacity 결정 없이 기본 provider pool에 포함하지 않는다. - Mac Studio
8004vLLM-MLX runtime 재시작 방식을 확인하지 않고 provider process를 임의 종료하지 않는다. - node02처럼 tunnel 예외가 필요한 경우를 제외하고 Node bootstrap 기본 경로에서 수동 token 치환, named env parameter, 수동
node.yaml작성을 요구하지 않는다. - Gemma reasoning/tool-parser 출력을 실패로 판정하거나 exact-output smoke를 기본 성공 기준으로 삼지 않는다.
- OpenAI-compatible 요청 성공만으로 capacity 검증 성공을 선언하지 않는다. provider snapshot의
in_flight/queued관측을 함께 남긴다. - 이 프로젝트 전용 배포 절차를
agent-ops/rules/common/_templates또는 common skill에 넣지 않는다.