From 11edd14c8839c1a247cea0189aea76726ab67f69 Mon Sep 17 00:00:00 2001 From: toki Date: Wed, 8 Jul 2026 09:56:20 +0900 Subject: [PATCH] Update files --- .../skills/project/dev-corp-runtime-deploy/SKILL.md | 12 +++++++----- agent-ops/skills/project/dev-runtime-deploy/SKILL.md | 3 +++ agent-test/dev-corp/edge-smoke.md | 10 ++++++---- agent-test/dev-corp/inventory.yaml | 10 ++++++++++ agent-test/dev-corp/node-smoke.md | 8 +++++--- agent-test/dev/edge-smoke.md | 6 ++++-- agent-test/dev/node-smoke.md | 7 +++++-- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/agent-ops/skills/project/dev-corp-runtime-deploy/SKILL.md b/agent-ops/skills/project/dev-corp-runtime-deploy/SKILL.md index a0766b1..a203579 100644 --- a/agent-ops/skills/project/dev-corp-runtime-deploy/SKILL.md +++ b/agent-ops/skills/project/dev-corp-runtime-deploy/SKILL.md @@ -34,10 +34,10 @@ dev-corp provider pool을 현재 dev-runtime과 같은 구조로 배포한다. - [ ] Edge config의 OpenAI-compatible adapter endpoint는 각 Node process 기준으로 평가된다. direct preflight는 `192.168.2.x` 주소로 하되, Edge가 Node에 내려주는 provider endpoint는 node-local `127.0.0.1:`를 우선한다. - [ ] 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:26b` alias와 총 capacity `13`은 `agent-test/dev-corp/inventory.yaml`의 최신 검증 상태를 기준으로 판단한다. 새 배포에서 Edge config 반영과 capacity smoke가 통과하기 전에는 새 결과를 확정값으로 보고하지 않는다. -- [ ] DGX Spark vLLM provider는 capacity `4`, 호출당 최대 context window `262144`, requested KV `262144x2` 이상을 기준으로 한다. 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 vLLM provider는 capacity `4`, 호출당 최대 context window `262144`, requested KV `262144x2` 이상을 기준으로 한다. 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`도 함께 둔다. Gemma4 agent/tool-call profile은 `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, Gemma4 tool chat template, `--reasoning-parser gemma4`를 함께 둔다. - [ ] DGX Spark 02 endpoint는 Docker publish 때문에 `192.168.2.4:8004`이다. `8000`, `8001`, `8002`를 기본 endpoint로 쓰지 않는다. - [ ] Mac Studio `192.168.2.3:8005` DiffusionGemma endpoint는 secondary provider 후보이며 기본 pool에 자동 포함하지 않는다. -- [ ] Mac Studio `192.168.2.3:8004` provider catalog type은 `openai_compat`이고 실제 runtime은 vLLM-MLX이다. vLLM-MLX runtime은 capacity `5`, 호출당 최대 context window `262144`, requested KV `262144x3` 기준으로 `--max-num-seqs 5`, `--max-request-tokens 262144`, `--max-kv-size 786432`을 사용한다. +- [ ] Mac Studio `192.168.2.3:8004` provider catalog type은 `openai_compat`이고 실제 runtime은 vLLM-MLX이다. vLLM-MLX runtime은 capacity `5`, 호출당 최대 context window `262144`, requested KV `262144x3` 기준으로 `--max-num-seqs 5`, `--max-request-tokens 262144`, `--max-kv-size 786432`을 사용한다. Gemma4 agent/tool-call profile은 현재 지원되는 `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--reasoning-parser gemma4`를 함께 둔다. - [ ] Mac Studio `192.168.2.3:8004` vLLM-MLX runtime은 2026-06-25 기준 detached `screen` session `vllm_mlx_8004`로 관리한다. 이 host는 Python `pyexpat` 로딩에 `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`로 실행한다. @@ -49,6 +49,7 @@ dev-corp provider pool을 현재 dev-runtime과 같은 구조로 배포한다. - 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는 host `8004` -> container `8004` 기준이다. +- Gemma4 tool-call/parser profile은 capacity/KV 튜닝과 별개로 agent 동작 가능성을 결정한다. DGX Spark 01은 `/home/digitalcommerce_dgx_spark_01/tool_chat_template_gemma4.jinja`, DGX Spark 02는 `/vllm-workspace/examples/tool_chat_template_gemma4.jinja`를 `--chat-template`로 사용하고, 둘 다 `--enable-auto-tool-choice --tool-call-parser gemma4 --reasoning-parser gemma4`를 둔다. Mac Studio vLLM-MLX는 별도 chat template override 없이 `--enable-auto-tool-choice --tool-call-parser gemma4 --reasoning-parser gemma4`를 둔다. - Mac Studio는 `DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib` 없이 Python `pyexpat` import가 실패할 수 있다. `screen` session `vllm_mlx_8004` 안에서 이 환경변수를 export한 뒤 시작한다. - 2026-07-02 재확인 기준 DGX Spark 01은 `--gpu-memory-utilization 0.40`로 재기동 후 mac-mini 내부 endpoint `http://192.168.2.2:8002`에서 `/health` 200과 `/v1/models` smoke를 통과했고 startup log에서 GPU KV cache `834,507` tokens, full-context concurrency `3.18x`를 확인했다. - 2026-06-25 재확인 기준 DGX Spark 02는 Docker `vllm-gemma4` host/container `8004`, `--gpu-memory-utilization 0.40`, `--max-model-len 262144`, `--max-num-seqs 4`로 동작하며 mac-mini와 node-local `/health`, `/v1/models`, 직접 동시성 `1..4` chat completion benchmark를 통과했다. startup log에서 GPU KV cache `860,222` tokens, full-context concurrency `3.28x`를 확인했다. @@ -96,9 +97,9 @@ dev-corp provider pool을 현재 dev-runtime과 같은 구조로 배포한다. - 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`를 확인하고 tmux `vllm_server_8002`를 재기동한다. FlashInfer FP4 JIT가 first compile 중 `ninja`를 PATH에서 찾는다. - - provider runtime 옵션을 갱신하는 배포라면 DGX Spark 02는 Docker container `vllm-gemma4`를 image entrypoint `vllm 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`로 재기동한다. + - 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`, `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--chat-template /home/digitalcommerce_dgx_spark_01/tool_chat_template_gemma4.jinja`, `--reasoning-parser gemma4`를 확인하고 tmux `vllm_server_8002`를 재기동한다. FlashInfer FP4 JIT가 first compile 중 `ninja`를 PATH에서 찾는다. + - provider runtime 옵션을 갱신하는 배포라면 DGX Spark 02는 Docker container `vllm-gemma4`를 image entrypoint `vllm 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`, `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--chat-template /vllm-workspace/examples/tool_chat_template_gemma4.jinja`, `--reasoning-parser gemma4`를 둔다. + - 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`, `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--reasoning-parser gemma4`로 재기동한다. - 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 원문은 로그/보고에 남기지 않는다. 8. **배포 후 연결 검증** @@ -115,6 +116,7 @@ dev-corp provider pool을 현재 dev-runtime과 같은 구조로 배포한다. - 각 provider의 `in_flight`가 자기 capacity를 넘지 않고, 적어도 한 번은 기대 capacity까지 차는지 확인한다. - 모든 요청 완료 후 같은 status에서 대상 provider들의 `in_flight=0`, `queued=0`으로 돌아오는지 확인한다. - Gemma 계열 reasoning/tool-parser 텍스트는 정상 응답으로 허용한다. exact-output match를 smoke 성공 기준으로 삼지 않는다. + - Pi/Cline형 agent/tool-call 경계를 검증할 때는 forced tool call, auto tool call, streaming `delta.tool_calls`, multi-turn tool result 후 최종 답변을 provider direct와 Edge OpenAI-compatible 경로에서 나눠 확인한다. provider direct가 통과하고 Edge 경유만 실패하면 provider runtime option 문제가 아니라 Edge/Node relay 또는 validation 경계 문제로 분리한다. 10. **결과 보고** - source ref, clean sync 결과, 테스트 결과, 빌드 산출물, process/port 상태, connected node 목록, provider capacity snapshot, capacity smoke 관측값을 보고한다. diff --git a/agent-ops/skills/project/dev-runtime-deploy/SKILL.md b/agent-ops/skills/project/dev-runtime-deploy/SKILL.md index a13485a..4dd2f00 100644 --- a/agent-ops/skills/project/dev-runtime-deploy/SKILL.md +++ b/agent-ops/skills/project/dev-runtime-deploy/SKILL.md @@ -29,6 +29,7 @@ dev-runtime provider pool을 제품 검증이 끝난 상태로 배포한다. 배 - [ ] `agent-ops/rules/project/domain/testing/rules.md`를 읽고 사용자 실행 파이프라인 검증 기준을 확인한다. - [ ] dev 환경은 `agent-test/dev/inventory.yaml`을 먼저 읽는다. 파일이 없으면 `agent-test/dev/rules.md`, `agent-test/dev/edge-smoke.md`, `agent-test/dev/node-smoke.md`로 fallback하고, 구조화 inventory 누락을 보고한다. - [ ] dev-runtime provider pool과 compose/local profile을 섞지 않는다. dev-runtime은 native Edge/Node runtime과 dev-runtime config를 기준으로 한다. +- [ ] Qwen vLLM/vLLM-MLX runtime option은 `agent-test/dev/inventory.yaml`의 provider별 값을 우선한다. 현재 tracked Qwen evidence는 mac-mlx-vllm에 `tool_call_parser: qwen`, `reasoning_parser: qwen3`, `default_chat_template_kwargs.enable_thinking=true`가 있고, GX10 vLLM에는 `reasoning_parser: qwen3`, `default_chat_template_kwargs.enable_thinking=true`가 기록되어 있다. GX10을 Pi/Cline형 agent tool-call provider로 쓰려면 먼저 `tools[]` non-stream/stream 검증으로 `--tool-call-parser`/`--chat-template` 확정값을 만들고 inventory에 기록한다. - [ ] OneXPlayer SSH 접속 정보는 현재 host 기준 `ssh r0bin@192.168.0.59`이다. `toki` 사용자명 또는 remote runner를 경유한 OneXPlayer 접속을 사용하지 않는다. - [ ] 현재 구현의 completion 검증 대상은 legacy `/v1/completions`가 아니라 `/v1/chat/completions`이다. `/v1/completions`는 route가 구현되어 있을 때만 별도 검증한다. - [ ] token, secret header, bootstrap token, private key 경로는 최종 보고에 원문으로 출력하지 않는다. @@ -82,6 +83,7 @@ dev-runtime provider pool을 제품 검증이 끝난 상태로 배포한다. 배 - 각 provider의 `in_flight`가 자기 capacity를 넘지 않고, 적어도 한 번은 기대 capacity까지 차는지 확인한다. - 모든 요청 완료 후 같은 status에서 대상 provider들의 `in_flight=0`, `queued=0`으로 돌아오는지 확인한다. - Qwen 계열 reasoning/thinking 텍스트는 정상 응답으로 허용한다. exact-output match를 smoke 성공 기준으로 삼지 않는다. + - Pi/Cline형 agent/tool-call 경계를 검증할 때는 forced tool call, auto tool call, streaming `delta.tool_calls`, multi-turn tool result 후 최종 답변을 provider direct와 Edge OpenAI-compatible 경로에서 나눠 확인한다. raw native marker나 reasoning text가 assistant content로 새면 해당 model/runtime의 parser/template profile 미확정으로 보고한다. 9. **결과 보고** - source ref, clean sync 결과, 테스트 결과, 빌드 산출물, process/port 상태, connected node 목록, provider capacity snapshot, capacity smoke 관측값을 보고한다. @@ -126,5 +128,6 @@ dev-runtime 배포 결과 - OneXPlayer에 `toki` 사용자명으로 접속하거나 remote runner에서 다시 OneXPlayer로 SSH 접속하지 않는다. - OneXPlayer 장기 실행을 Windows OpenSSH 세션 내부 `Start-Process`에 의존하지 않는다. - Qwen reasoning/thinking 출력을 실패로 판정하거나 exact-output smoke를 기본 성공 기준으로 삼지 않는다. +- Qwen provider를 agent/tool-call 용도로 쓰면서 provider별 `--tool-call-parser`/`--chat-template` 검증 없이 배포 완료로 선언하지 않는다. - OpenAI-compatible 요청 성공만으로 capacity 검증 성공을 선언하지 않는다. provider snapshot의 `in_flight/queued` 관측을 함께 남긴다. - 이 프로젝트 전용 배포 절차를 `agent-ops/rules/common/_templates` 또는 common skill에 넣지 않는다. diff --git a/agent-test/dev-corp/edge-smoke.md b/agent-test/dev-corp/edge-smoke.md index 092d89e..7286f1f 100644 --- a/agent-test/dev-corp/edge-smoke.md +++ b/agent-test/dev-corp/edge-smoke.md @@ -65,7 +65,7 @@ dev-corp provider pool과 3-node 연결 상태를 점검할 때는 `agent-test/d - Edge connectivity: current native runtime uses mac-mini reverse SSH tunnel `127.0.0.1:28085/28087`; tunnel pid file is `build/dev-corp-runtime/node01-tunnel.pid`. - served model: `gemma-4-26B-A4B-it-NVFP4` - capacity baseline 후보: `4` - - runtime: tmux `vllm_server_8002`, start script `/home/digitalcommerce_dgx_spark_01/start_vllm_8002.sh`, `vllm=0.23.0`, `PATH=/home/digitalcommerce_dgx_spark_01/vllm_env/bin:$PATH`, `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, 2026-07-02 startup log GPU KV cache `834,507` tokens / full-context concurrency `3.18x`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` + - runtime: tmux `vllm_server_8002`, start script `/home/digitalcommerce_dgx_spark_01/start_vllm_8002.sh`, `vllm=0.23.0`, `PATH=/home/digitalcommerce_dgx_spark_01/vllm_env/bin:$PATH`, `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--chat-template /home/digitalcommerce_dgx_spark_01/tool_chat_template_gemma4.jinja`, `--reasoning-parser gemma4`, 2026-07-02 startup log GPU KV cache `834,507` tokens / full-context concurrency `3.18x`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` - DGX Spark 02 vLLM node: `corp-dgx-spark-02-vllm-node` / `corp-dgx-spark-02-vllm` - SSH/user: mac-mini에서 `ssh dplab@192.168.2.4` - provider endpoint: `http://192.168.2.4:8004/v1` @@ -73,7 +73,7 @@ dev-corp provider pool과 3-node 연결 상태를 점검할 때는 `agent-test/d - Edge connectivity: node02는 mac-mini `172.24.63.178:18085/18086/18087` 직접 접근이 timeout이므로 mac-mini의 reverse SSH tunnel `127.0.0.1:28085/28087`을 사용한다. - served model: `gemma-4-26B-A4B-it-NVFP4` - capacity baseline 후보: `4` - - runtime: Docker container `vllm-gemma4`, start script `/home/dplab/start_vllm_gemma4_8004.sh`, host `8004` -> container `8004`, `vllm=0.23.0`, `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, startup log GPU KV cache `860,222` tokens / full-context concurrency `3.28x`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` + - runtime: Docker container `vllm-gemma4`, start script `/home/dplab/start_vllm_gemma4_8004.sh`, host `8004` -> container `8004`, `vllm=0.23.0`, `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--chat-template /vllm-workspace/examples/tool_chat_template_gemma4.jinja`, `--reasoning-parser gemma4`, startup log GPU KV cache `860,222` tokens / full-context concurrency `3.28x`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` - Mac Studio vLLM-MLX node: `corp-mac-studio-mlx-vllm-node` / `corp-mac-studio-mlx-vllm` - SSH/user: mac-mini에서 `ssh dc_dev@192.168.2.3` - provider endpoint: `http://192.168.2.3:8004/v1` @@ -81,7 +81,7 @@ dev-corp provider pool과 3-node 연결 상태를 점검할 때는 `agent-test/d - Edge provider catalog type: `openai_compat`; provider runtime type remains `vllm-mlx`. - served model: `mlx-community/gemma-4-26b-a4b-it-nvfp4` - capacity baseline 후보: `5` (`--max-num-seqs 5` 기준) - - runtime: `vllm-mlx=0.3.0`, start script `/Users/dc_dev/iop-dev-corp-field/start_vllm_mlx_8004.sh`, `--max-num-seqs 5`, `--max-kv-size 786432`, `--max-request-tokens 262144` + - runtime: `vllm-mlx=0.3.0`, start script `/Users/dc_dev/iop-dev-corp-field/start_vllm_mlx_8004.sh`, `--max-num-seqs 5`, `--max-kv-size 786432`, `--max-request-tokens 262144`, `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--reasoning-parser gemma4` - process manager: 2026-06-25 기준 detached `screen` session `vllm_mlx_8004`; `DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib` 필요 Mac Studio의 `http://192.168.2.3:8005/v1` mlx-vlm DiffusionGemma endpoint는 확인된 secondary provider 후보지만, 기본 provider pool에는 넣지 않는다. 별도 alias와 capacity policy가 결정된 뒤 추가한다. @@ -91,9 +91,11 @@ Mac Studio의 `http://192.168.2.3:8005/v1` mlx-vlm DiffusionGemma endpoint는 - DGX Spark 01 provider runtime은 capacity `4`, context window `262144`, requested KV `262144x2` 이상의 기준으로 재설정했다. dev-corp DGX01 vLLM 기준으로는 `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` 조합이며, 2026-07-02 startup log에서 GPU KV cache `834,507` tokens와 `262144` tokens/request concurrency `3.18x`를 확인했다. - DGX Spark 02 provider runtime은 capacity `4`, context window `262144`, requested KV `262144x2` 이상의 기준으로 설정됐다. Docker `vllm-gemma4`는 host/container `8004` 기준으로 동작하며 startup log에서 GPU KV cache `860,222` tokens와 `262144` tokens/request concurrency `3.28x`를 확인했다. - DGX Spark 01은 FlashInfer FP4 JIT가 `ninja`를 PATH에서 호출하므로 start script에 `PATH=/home/digitalcommerce_dgx_spark_01/vllm_env/bin:$PATH`를 둔다. -- Mac Studio provider runtime은 capacity `5`, context window `262144`, requested KV `262144x3` 기준으로 `--continuous-batching`, `--max-num-seqs 5`, `--prefill-batch-size 5`, `--completion-batch-size 5`, `--chunked-prefill-tokens 1024`, `--max-request-tokens 262144`, `--max-kv-size 786432`, `--reasoning-parser gemma4`을 적용했고 `/health`, `/v1/models`, 직접 동시성 `1..5` chat completion benchmark 통과를 확인했다. +- Gemma4 agent/tool-call compatibility profile은 DGX Spark 01/02에서 `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, Gemma4 tool chat template, `--reasoning-parser gemma4`를 함께 둔다. Mac Studio vLLM-MLX는 현재 지원되는 `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--reasoning-parser gemma4`를 둔다. +- Mac Studio provider runtime은 capacity `5`, context window `262144`, requested KV `262144x3` 기준으로 `--continuous-batching`, `--max-num-seqs 5`, `--prefill-batch-size 5`, `--completion-batch-size 5`, `--chunked-prefill-tokens 1024`, `--max-request-tokens 262144`, `--max-kv-size 786432`, `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--reasoning-parser gemma4`을 적용했고 `/health`, `/v1/models`, 직접 동시성 `1..5` chat completion benchmark 통과를 확인했다. - 2026-07-02 재확인 기준 DGX Spark 01은 mac-mini 내부 endpoint `http://192.168.2.2:8002`에서 `/health` 200과 `/v1/models`를 통과했다. DGX Spark 02는 mac-mini에서 SSH, provider `/health`, `/v1/models`가 회복됐고 직접 provider benchmark를 통과했다. Edge OpenAI-compatible capacity smoke는 Control Plane status snapshot 기준으로 재검증 완료됐다. - Gemma provider-pool `gemma4:26b`는 `default_thinking_token_budget: 1024` 기준으로 thinking을 기본 활성화한다. Edge strict output이 켜져 있어도 provider-pool catalog의 thinking policy가 우선하며, vLLM/vLLM-MLX adapter에는 `chat_template_kwargs.enable_thinking=true`로 전달되는지 확인한다. +- Gemma provider를 Pi/Cline형 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming `delta.tool_calls`, multi-turn tool result 후 최종 답변을 확인한다. raw `<|tool_call>`/`<|"|>` marker나 thought channel text가 assistant content로 새면 provider parser/template profile 또는 Edge relay 경계 문제로 판정한다. - Gemma provider-pool의 IOP queue timeout은 두지 않는다. config 값은 `queue_timeout_ms=0`이며, caller context cancellation 또는 연결 종료로만 queued request를 중단한다. OpenAI run timeout과 backend request timeout은 long reasoning/long-context 요청을 위해 각각 `openai.timeout_sec=1800`, `request_timeout_ms=1800000`으로 둔다. ## 2026-07-02 dev-corp native runtime 상태 diff --git a/agent-test/dev-corp/inventory.yaml b/agent-test/dev-corp/inventory.yaml index dd4ff27..0647ee3 100644 --- a/agent-test/dev-corp/inventory.yaml +++ b/agent-test/dev-corp/inventory.yaml @@ -231,6 +231,10 @@ nodes: gpu_memory_utilization: 0.40 max_model_len: 262144 max_num_seqs: 4 + enable_auto_tool_choice: true + tool_call_parser: gemma4 + chat_template: /home/digitalcommerce_dgx_spark_01/tool_chat_template_gemma4.jinja + reasoning_parser: gemma4 max_num_batched_tokens: auto_2496 max_num_batched_tokens_note: vLLM raised the default from 2048 to 2496 for the Gemma4 prefix-LM/video path; it is a scheduler iteration budget, not the total KV cache size context_window_max: 262144 @@ -290,6 +294,10 @@ nodes: gpu_memory_utilization: 0.40 max_model_len: 262144 max_num_seqs: 4 + enable_auto_tool_choice: true + tool_call_parser: gemma4 + chat_template: /vllm-workspace/examples/tool_chat_template_gemma4.jinja + reasoning_parser: gemma4 max_num_batched_tokens: auto_2496 max_num_batched_tokens_note: vLLM raised the default from 2048 to 2496 for the Gemma4 prefix-LM/video path; it is a scheduler iteration budget, not the total KV cache size context_window_max: 262144 @@ -348,6 +356,8 @@ nodes: max_request_tokens: 262144 context_window_max: 262144 kv_size_tokens_effective: 786432 + enable_auto_tool_choice: true + tool_call_parser: gemma4 reasoning_parser: gemma4 default_chat_template_kwargs: enable_thinking: true diff --git a/agent-test/dev-corp/node-smoke.md b/agent-test/dev-corp/node-smoke.md index 8e11248..8c0d504 100644 --- a/agent-test/dev-corp/node-smoke.md +++ b/agent-test/dev-corp/node-smoke.md @@ -53,7 +53,7 @@ dev-corp의 실제 3-node 연결을 점검할 때는 mac-mini `ssh fe@172.24.63. - Edge addr: `127.0.0.1:28087` via mac-mini reverse SSH tunnel in the current native runtime - served model: `gemma-4-26B-A4B-it-NVFP4` - capacity baseline 후보: `4` - - runtime capacity/context/KV: `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`; 2026-07-02 startup log 기준 GPU KV cache `834,507` tokens, `262144` full-context concurrency `3.18x`; FP4 MoE env `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` + - runtime capacity/context/KV: `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`; agent/tool-call profile `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--chat-template /home/digitalcommerce_dgx_spark_01/tool_chat_template_gemma4.jinja`, `--reasoning-parser gemma4`; 2026-07-02 startup log 기준 GPU KV cache `834,507` tokens, `262144` full-context concurrency `3.18x`; FP4 MoE env `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` - start script: `/home/digitalcommerce_dgx_spark_01/start_vllm_8002.sh` - 주의: FlashInfer FP4 JIT가 first compile 중 `ninja`를 호출하므로 start script에서 `/home/digitalcommerce_dgx_spark_01/vllm_env/bin`을 `PATH` 앞에 둔다. - workspace: `/home/digitalcommerce_dgx_spark_01` @@ -64,7 +64,7 @@ dev-corp의 실제 3-node 연결을 점검할 때는 mac-mini `ssh fe@172.24.63. - Edge addr: `127.0.0.1:28087` via mac-mini reverse SSH tunnel - served model: `gemma-4-26B-A4B-it-NVFP4` - capacity baseline 후보: `4` - - runtime capacity/context/KV: `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`; 2026-06-25 startup log 기준 GPU KV cache `860,222` tokens, `262144` full-context concurrency `3.28x`; FP4 MoE env `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` + - runtime capacity/context/KV: `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`; agent/tool-call profile `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--chat-template /vllm-workspace/examples/tool_chat_template_gemma4.jinja`, `--reasoning-parser gemma4`; 2026-06-25 startup log 기준 GPU KV cache `860,222` tokens, `262144` full-context concurrency `3.28x`; FP4 MoE env `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` - start script: `/home/dplab/start_vllm_gemma4_8004.sh` - workspace: `/home/dplab` - 주의: Docker publish 때문에 host endpoint와 container endpoint 모두 `8004`이다. `8000`, `8001`, `8002`를 기본 endpoint로 쓰지 않는다. @@ -75,7 +75,7 @@ dev-corp의 실제 3-node 연결을 점검할 때는 mac-mini `ssh fe@172.24.63. - Edge provider catalog type: `openai_compat`; provider runtime type remains `vllm-mlx`. - served model: `mlx-community/gemma-4-26b-a4b-it-nvfp4` - capacity baseline 후보: `5` (`--max-num-seqs 5` 기준) - - runtime capacity/context/KV: `--max-num-seqs 5`, `--max-request-tokens 262144`, requested KV `262144x3` mapped to `--max-kv-size 786432` + - runtime capacity/context/KV: `--max-num-seqs 5`, `--max-request-tokens 262144`, requested KV `262144x3` mapped to `--max-kv-size 786432`; agent/tool-call profile `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--reasoning-parser gemma4` - start script: `/Users/dc_dev/iop-dev-corp-field/start_vllm_mlx_8004.sh` - workspace: `/Users/dc_dev` - process manager: 2026-06-25 기준 detached `screen` session `vllm_mlx_8004`; 이 host는 Python `pyexpat` 로딩에 `DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib`가 필요하다. @@ -93,6 +93,8 @@ Mac Studio의 secondary `http://192.168.2.3:8005/v1` endpoint는 기본 Node/pro - DGX Spark 01은 FlashInfer FP4 JIT가 first compile 중 `ninja`를 PATH에서 찾으므로 `/home/digitalcommerce_dgx_spark_01/vllm_env/bin` PATH prefix가 필요하다. - Mac Studio에는 capacity `5`, context window `262144`, requested KV `262144x3` 기준을 `--max-num-seqs 5`, `--max-request-tokens 262144`, `--max-kv-size 786432`로 반영했고 `/health`, `/v1/models`, 직접 동시성 `1..5` chat completion benchmark 통과를 확인했다. - Gemma provider-pool은 `default_thinking_token_budget: 1024` 기준으로 thinking을 기본 활성화한다. vLLM과 vLLM-MLX provider 모두 Edge/Node adapter 요청에서 `chat_template_kwargs.enable_thinking=true`가 적용되는 방향으로 검증한다. +- Gemma4 agent/tool-call compatibility profile은 DGX Spark 01/02에서 `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, Gemma4 tool chat template, `--reasoning-parser gemma4`를 함께 둔다. Mac Studio vLLM-MLX는 현재 지원되는 `--enable-auto-tool-choice`, `--tool-call-parser gemma4`, `--reasoning-parser gemma4`를 둔다. +- Gemma provider를 Pi/Cline형 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming `delta.tool_calls`, multi-turn tool result 후 최종 답변을 확인한다. raw `<|tool_call>`/`<|"|>` marker나 thought channel text가 assistant content로 새면 provider parser/template profile 또는 Edge relay 경계 문제로 판정한다. - Gemma provider-pool의 provider queue timeout은 두지 않는다. config 값은 `queue_timeout_ms=0`이며, backend request timeout은 30분 기준인 `request_timeout_ms=1800000`으로 맞춘다. - 2026-07-02 재확인 기준 DGX Spark 02는 mac-mini에서 SSH, provider `/health`, `/v1/models`가 회복됐고 직접 provider benchmark를 통과했다. Edge OpenAI-compatible capacity smoke는 Control Plane status snapshot 기준으로 재검증 완료됐다. diff --git a/agent-test/dev/edge-smoke.md b/agent-test/dev/edge-smoke.md index 2b4b572..c856a25 100644 --- a/agent-test/dev/edge-smoke.md +++ b/agent-test/dev/edge-smoke.md @@ -65,7 +65,7 @@ dev-runtime provider pool과 3-node 연결 상태를 점검할 때는 `agent-tes - capacity baseline: `2` - priority baseline: `2` - workdir: `/Users/toki/agent-work/iop-mlx-vllm` - - runtime baseline: `vllm-mlx`, `--max-num-seqs 2`, `--max-kv-size 262144`, `--max-request-tokens 262144`, `--use-paged-cache --paged-cache-block-size 64 --max-cache-blocks 4096` + - runtime baseline: `vllm-mlx`, `--max-num-seqs 2`, `--max-kv-size 262144`, `--max-request-tokens 262144`, `--use-paged-cache --paged-cache-block-size 64 --max-cache-blocks 4096`, `--tool-call-parser qwen`, `--reasoning-parser qwen3`, `default_chat_template_kwargs.enable_thinking=true` - KV policy: per-call window bound `262144`, one full context-size setting - long-context admission baseline: `total_context_tokens=262144`, `long_context_capacity=1` (KV budget `262144` fits one full 262144-window request; long slot count is not the normal capacity `2`) - GX10 vLLM node: `gx10-vllm-node` / `gx10-vllm` @@ -74,7 +74,8 @@ dev-runtime provider pool과 3-node 연결 상태를 점검할 때는 `agent-tes - served model: `nvidia/Qwen3.6-35B-A3B-NVFP4` - capacity baseline: `4` - priority baseline: `0` - - runtime baseline: `vllm`, `--max-model-len 262144`, `--max-num-seqs 4`, `--gpu-memory-utilization 0.30`, `--reasoning-parser qwen3` + - runtime baseline: `vllm`, `--max-model-len 262144`, `--max-num-seqs 4`, `--gpu-memory-utilization 0.30`, `--reasoning-parser qwen3`, `default_chat_template_kwargs.enable_thinking=true` + - agent/tool-call note: tracked GX10 runtime evidence has not yet fixed a Qwen tool-call parser/template option; before using this provider for Pi/Cline-style agent tools, validate `tools[]` non-stream/stream responses and then record the chosen `--tool-call-parser`/`--chat-template` values in `agent-test/dev/inventory.yaml`. - long-context admission baseline: `total_context_tokens=262144`, `long_context_capacity=1` (conservative; `max-model-len 262144` until runtime evidence proves a larger concurrent long-context budget) - workspace: `/home/toki/iop-gx10-vllm` - OneXPlayer Lemonade node: `onexplayer-lemonade-node` / `onexplayer-lemonade` @@ -131,6 +132,7 @@ mac-mlx-vllm provider는 mac-codex-node 소속 resource로, Edge host와 같은 - long-context admission 시나리오(normal 10-way, mixed long/normal, all-long-slot-full)와 최종 회복 근거는 `agent-test/dev/long-context-admission-smoke.md`와 `scripts/e2e-long-context-admission-smoke.sh`를 사용한다. - 2026-06-24 dev 13-way 확장 smoke는 Mac capacity가 `3`이던 이전 관측이다. 해당 run에서는 `/v1/chat/completions` 13개 요청 성공, peak `in_flight=10`, 실제 queue 대기 `3`개, 최종 회복 `in_flight=0`, `queued=0`이 관측되었다. 현재 Mac capacity `2` 기준 13-way 확장 smoke 기대치는 peak `in_flight=9`, queue 대기 `4`개 이상이다. - Qwen provider-pool smoke는 thinking/reasoning 텍스트가 포함될 수 있다. 추론 출력 자체를 실패로 보지 말고 HTTP 성공, model alias, final marker 포함 여부, provider node log/run count 증가로 판정한다. 응답 전체가 특정 token과 정확히 같은지 비교하는 strict exact-match는 이 profile의 기본 판정으로 쓰지 않는다. +- Qwen provider를 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming `delta.tool_calls`, multi-turn tool result 후 최종 답변을 확인한다. raw native marker나 reasoning text가 assistant content로 새면 해당 model/runtime의 parser/template profile 미확정으로 보고한다. - bootstrap 사용자 명령은 완성된 URL과 positional token 하나만 포함한다. ## 기준 출력 예시 diff --git a/agent-test/dev/node-smoke.md b/agent-test/dev/node-smoke.md index 83e65d2..bbb3420 100644 --- a/agent-test/dev/node-smoke.md +++ b/agent-test/dev/node-smoke.md @@ -54,7 +54,7 @@ dev-runtime의 실제 3-node 연결을 점검할 때는 원격 runner `ssh toki@ - capacity baseline: `2` - priority baseline: `2` - workdir: `/Users/toki/agent-work/iop-mlx-vllm` - - runtime baseline: `vllm-mlx`, `--max-num-seqs 2`, `--max-kv-size 262144`, `--max-request-tokens 262144`, `--use-paged-cache --paged-cache-block-size 64 --max-cache-blocks 4096` + - runtime baseline: `vllm-mlx`, `--max-num-seqs 2`, `--max-kv-size 262144`, `--max-request-tokens 262144`, `--use-paged-cache --paged-cache-block-size 64 --max-cache-blocks 4096`, `--tool-call-parser qwen`, `--reasoning-parser qwen3`, `default_chat_template_kwargs.enable_thinking=true` - KV policy: per-call window bound `262144`, one full context-size setting - long-context admission baseline: `total_context_tokens=262144`, `long_context_capacity=1` (KV budget `262144` fits one full 262144-window request; long slot count is not the normal capacity `2`) - GX10 vLLM node: `gx10-vllm-node` / `gx10-vllm` @@ -63,7 +63,8 @@ dev-runtime의 실제 3-node 연결을 점검할 때는 원격 runner `ssh toki@ - served model: `nvidia/Qwen3.6-35B-A3B-NVFP4` - capacity baseline: `4` - priority baseline: `0` - - runtime baseline: `vllm`, `--max-model-len 262144`, `--max-num-seqs 4`, `--gpu-memory-utilization 0.30`, `--reasoning-parser qwen3` + - runtime baseline: `vllm`, `--max-model-len 262144`, `--max-num-seqs 4`, `--gpu-memory-utilization 0.30`, `--reasoning-parser qwen3`, `default_chat_template_kwargs.enable_thinking=true` + - agent/tool-call note: tracked GX10 runtime evidence has not yet fixed a Qwen tool-call parser/template option; before using this provider for Pi/Cline-style agent tools, validate `tools[]` non-stream/stream responses and then record the chosen `--tool-call-parser`/`--chat-template` values in `agent-test/dev/inventory.yaml`. - long-context admission baseline: `total_context_tokens=262144`, `long_context_capacity=1` (conservative; `max-model-len 262144` until runtime evidence proves a larger concurrent long-context budget) - workspace: `/home/toki/iop-gx10-vllm` - OneXPlayer Lemonade node: `onexplayer-lemonade-node` / `onexplayer-lemonade` @@ -85,6 +86,8 @@ mac-mlx-vllm provider는 mac-codex-node 소속 resource로, Edge host와 같은 OneXPlayer에서 SSH 세션 안의 `Start-Process`로 `iop-node.exe`를 띄우면 SSH 세션 종료와 함께 process가 정리될 수 있다. dev 반복 배포에서는 `Win32_Process.Create` 또는 동등한 세션 독립 실행 방식으로 `C:/Users/r0bin/iop-field`에서 `iop-node.exe --config node.yaml serve`를 시작하고, WMI/process query와 `iop-node.log`의 `connected to edge` 로그로 유지 여부를 확인한다. +Qwen provider를 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming `delta.tool_calls`, multi-turn tool result 후 최종 답변을 확인한다. raw native marker나 reasoning text가 assistant content로 새면 해당 model/runtime의 parser/template profile 미확정으로 보고한다. + ## 명령 - setup: