• Forumu şuan da Ziyaretçi olarak görüntülüyorsunuz. Forum ziyaretçileri tüm konu ve bağlantıları görüntüleyemez ve kaynaklara erişimi yoktur. Eğer üye iseniz buradan üye girişi yapın ya da burayı tıklayarak şimdi üye olun.
  • Ubden® Topluluk Projelerine, Aracılığınızla Destek Vermektedir.

    Topluluk projelerine katkı yapmak ve topluğumuza ulaşan genç girişimcilere destek olmak için Buradaki  bağlantıdan işlem kanallarına ulaşabilirsiniz.

    Desteklerinizle 9.000 kişilik bir ekosistem olduk ve büyümeye devam ediyoruz. Desteğiniz için teşekkürler.

Haber Dört DGX Spark Üzerinde GLM-5.2 Sunumu

  • Konbuyu başlatan Enhar Ormeci
  • Başlangıç tarihi
E

Enhar Ormeci

Misafir
Misafir
4spark-cluster.webp

Bu eğitimde, GLM-5.2 büyük dil modelini 4 adet DGX Spark üzerinde paylaştırarak çalıştıracağız. Bunun için sparkrun kullanacağız.

Spark, monitör ve klavye bağlayarak doğrudan bilgisayar olarak kullanılabileceği gibi, başka bir bilgisayarla uzaktan bağlanılan bir sunucu olarak da kullanılabilir. Biz bu eğitimde Spark’a uzaktan bağlanacağız ve gerekli yazılımları kurup modeli çalıştıracağız.

Dil modeli olarak GLM-5.2 (744 milyar parametreli bir Mixture-of-Experts modeli, ~40 milyar parametre aktif, int4/int8 kuantizasyonu), çıkarım motoru olarak vLLM, ve yönetim aracı olarak sparkrun kullanacağız. vLLM, modelin eğitilmiş ağırlıklarını GPU belleğine yükleyip çalıştıracak ve dışarıdan istek kabul eden bir API sunacak. sparkrun ise komut satırı üzerinden Docker konteynerlerini ve Spark’lar arasında model dağıtımını yönetecek. Bu sayede imaj senkronizasyonu, model aktarımı ve cluster yapılandırması gibi işlemleri otomatik olacak. İkisi de ana Spark üzerinde, Docker konteynerleri içinde çalışacak.

Bu eğitim üç bölümden oluşur:

  • Kurulum: Docker imajı indirme ve recipe hazırlama
  • Çalıştırma: Modeli 4 Spark üzerinde başlatma, izleme, test etme ve kapatma
  • Benchmark: Farklı eşzamanlılık seviyelerinde performans ölçümü

Eğitim boyunca ana cihaza Main Spark, diğer cihazlara ise Worker Spark denileceğini unutmayın.

Kurulum​


Önceki eğitimlerde Spark’a bağlanma, ve sparkrun kurulumu ve çoklu Spark küme yapılandırma süreçleri adım adım anlatıldı. Bu eğitimde tüm bu adımların yapılmış ve kurulumunuzun hazır olduğunu varsayıyoruz.

Bu eğitim 4 DGX Spark gerektirir. Ana cihaza main-spark-ip, diğer üç cihaza ise worker-spark-ip-1, worker-spark-ip-2 ve worker-spark-ip-3 diyeceğiz. Her cihazın IP adresini önceden not edin.

1. Docker İmajını İndirme​


GLM-5.2’nin DeepSeek Sparse Attention (DSA) mimarisi, GB10 (SM 12.1) için derlenmiş çekirdeklere ihtiyaç duyar. Standart vLLM imajları bu çekirdekleri içermez. Bu yüzden, gereken yamaları içeren özel bir Docker imajı kullanacağız.

OpenZeka tarafından hazırlanmış docker imajını indirmek için şu komutu çalıştırın:

Copy to Clipboard
docker pull registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest


İmajı doğrulayın:

Copy to Clipboard
docker images registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest
Copy to Clipboard
REPOSITORY TAG IMAGE ID CREATED SIZE registry.cordata.ai/spark-cluster/vllm-zatz-dcp latest f4c351b85b27 2 minutes ago 29.2GB

2. Recipe Hazırlama​


Recipe, sparkrun’ın modeli nasıl çalıştıracağını tanımlayan bir YAML dosyasıdır. Model, Docker imajı, vLLM bayrakları ve bellek ayarları tek dosyada toplanır. GLM-5.2 için bu recipe, 4 düğümde tensor parallelism (model ağırlık matrisleri paylaşımı) ve decode context parallelism (KV önbelleği ve attention hesaplaması paylaşımı) kullanır.

Aşağıdaki komutu kullanarak recipe dosyasını kaydedin.

Copy to Clipboard
cat > ~/glm52-dcp4-cc128.yaml glm52-dcp4-cc128.yaml # 4-node cluster (TP=4, DCP=4) model: QuantTrio/GLM-5.2-Int4-Int8Mix runtime: vllm-distributed container: registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest min_nodes: 4 max_nodes: 4 metadata: description: GLM-5.2 Int4-Int8Mix TP4 DCP4 128K MTP k=4 cudagraph FULL maintainer: local model_params: 744B-MoE-40B-active model_dtype: int4-int8mix defaults: port: 8210 host: 0.0.0.0 tensor_parallel: 4 pipeline_parallel: 1 decode_context_parallel: 4 gpu_memory_utilization: 0.885 max_model_len: 131072 max_num_seqs: 5 max_num_batched_tokens: 2048 kv_cache_dtype: fp8_ds_mla kv_cache_memory_bytes: 9000000000 max_cudagraph_capture_size: 32 load_format: auto served_model_name: glm-5.2 quantization: compressed-tensors reasoning_parser: glm45 tool_call_parser: glm47 env: NCCL_IB_TC: "106" HF_HUB_OFFLINE: "1" VLLM_MARLIN_USE_ATOMIC_ADD: "1" TRANSFORMERS_OFFLINE: "1" SAFETENSORS_FAST_GPU: "1" CUDA_DEVICE_ORDER: "PCI_BUS_ID" CUDA_DEVICE_MAX_CONNECTIONS: "32" CUTE_DSL_ARCH: "sm_121a" TORCH_CUDA_ARCH_LIST: "12.1a" VLLM_ALLOW_LONG_MAX_MODEL_LEN: "1" VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS: "1800" NCCL_MAX_NCHANNELS: "4" NCCL_MIN_NCHANNELS: "4" NCCL_CROSS_NIC: "1" NCCL_CUMEM_ENABLE: "0" NCCL_IGNORE_CPU_AFFINITY: "1" NCCL_NET_PLUGIN: "none" NCCL_IB_MERGE_NICS: "0" NCCL_IB_SUBNET_AWARE_ROUTING: "1" NCCL_DEBUG: "WARN" NCCL_IB_HCA: "rocep1s0f1,roceP2p1s0f1" NCCL_SOCKET_IFNAME: "enp1s0f1np1,enP2p1s0f1np1" GLOO_SOCKET_IFNAME: "enp1s0f1np1,enP2p1s0f1np1" PYTORCH_CUDA_ALLOC_CONF: "expandable_segments:True" VLLM_WORKER_MULTIPROC_METHOD: "spawn" VLLM_USE_FLASHINFER_SAMPLER: "1" VLLM_USE_V2_MODEL_RUNNER: "1" VLLM_USE_B12X_SPARSE_INDEXER: "1" VLLM_DCP_GLOBAL_TOPK: "1" VLLM_DCP_SHARD_DRAFT: "1" VLLM_KZ_TRIM_AFTER_LOAD: "1" VLLM_USE_B12X_MOE: "0" VLLM_USE_B12X_FP8_GEMM: "0" VLLM_DISABLE_TP_MQ_BROADCASTER: "1" VLLM_ENABLE_PCIE_ALLREDUCE: "0" VLLM_MEMORY_PROFILER_ESTIMATE_CUDAGRAPHS: "0" VLLM_SPARSE_INDEXER_MAX_LOGITS_MB: "256" USES_B12X: "True" FLASHINFER_DISABLE_VERSION_CHECK: "1" RAY_memory_usage_threshold: "0.99" RAY_memory_monitor_refresh_ms: "0" command: | vllm serve {model} \ --served-model-name {served_model_name} \ --trust-remote-code \ --load-format {load_format} \ --quantization {quantization} \ --tensor-parallel-size {tensor_parallel} \ --pipeline-parallel-size {pipeline_parallel} \ --decode-context-parallel-size {decode_context_parallel} \ --dcp-comm-backend ag_rs \ --dcp-kv-cache-interleave-size 1 \ --gpu-memory-utilization {gpu_memory_utilization} \ --max-model-len {max_model_len} \ --max-num-seqs {max_num_seqs} \ --max-num-batched-tokens {max_num_batched_tokens} \ --kv-cache-dtype {kv_cache_dtype} \ --kv-cache-memory-bytes {kv_cache_memory_bytes} \ --generation-config vllm \ --hf-overrides '{"use_index_cache":true,"index_topk_pattern":"FFFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSS"}' \ --default-chat-template-kwargs '{"clear_thinking":false}' \ --port {port} \ --host {host} \ --compilation-config '{"cudagraph_mode":"FULL","max_cudagraph_capture_size":32}' \ --no-enable-log-requests \ --attention-backend B12X_MLA_SPARSE \ --moe-backend flashinfer_cutlass \ --reasoning-parser {reasoning_parser} \ --tool-call-parser {tool_call_parser} \ --enable-auto-tool-choice \ --enable-prefix-caching \ --speculative-config '{"model":"QuantTrio/GLM-5.2-Int4-Int8Mix","method":"mtp","num_speculative_tokens":4,"quantization":"compressed-tensors","moe_backend":"flashinfer_cutlass","draft_attention_backend":"B12X_MLA_SPARSE","draft_sample_method":"probabilistic"}' \ --long-prefill-token-threshold 2048 \ --async-scheduling RECIPE


Dosyayı doğrulayın:

Copy to Clipboard
cat ~/glm52-dcp4-cc128.yaml

Çalıştırma​

1. Önbelleği Temizleme​


vLLM’i başlatmadan önce her Spark’ta dosya sistemi önbelleğini boşaltın. Bunu yapmamızın temel sebebi DGX Spark’ın birleşik bellek mimarisi (UMA) olmasıdır: İşletim sistemi, diskten okuduğu model dosyalarını RAM’de önbelleğe alır. vLLM, buradaki model ağırlıklarını GPU belleğine yükler. Yükleme bittikten sonra önbellekte kalan veri bir daha kullanılmayacak olsa da hemen temizlenmez. Ayrı bellek kullanan sistemlerde bu önemli değildir. Çıkarım GPU belleğinde çalıştığından RAM’in doluluğu performansı etkilemez. Spark’ta ise CPU ve GPU aynı RAM’i paylaştığından, önbellek GPU’nun kullanabileceği alanı daraltır. Komut, bu önbelleği boşaltarak vLLM için maksimum bellek sağlar.

Main Spark’ta önbelleği temizleyin:

Copy to Clipboard
sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches' [sudo] password for nvidia:


Main Spark’tan SSH ile Worker Spark’larda da aynı temizliği uygulayın:

Copy to Clipboard
for ip in ; do echo "=== $ip ===" ssh nvidia@$ip "sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches'" echo "" done === === [sudo] password for nvidia: === === [sudo] password for nvidia: === === [sudo] password for nvidia:

2. Başlatma Öncesi Kontroller​


sparkrun’ın recipe’yi doğru ayrıştırdığını ve bellek bütçesinin uygun olduğunu doğrulayın:

Copy to Clipboard
sparkrun show ~/glm52-dcp4-cc128.yaml Name: /home/nvidia/glm52-dcp4-cc128.yaml Description: GLM-5.2 Int4-Int8Mix TP4 DCP4 128K MTP k=4 cudagraph FULL Maintainer: local Runtime: vllm-distributed Model: QuantTrio/GLM-5.2-Int4-Int8Mix Container: registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest Nodes: 4 - 4 Defaults: decode_context_parallel: 4 gpu_memory_utilization: 0.885 host: 0.0.0.0 kv_cache_dtype: fp8_ds_mla kv_cache_memory_bytes: 9000000000 load_format: auto max_cudagraph_capture_size: 32 max_model_len: 131072 max_num_batched_tokens: 2048 max_num_seqs: 5 pipeline_parallel: 1 port: 8210 quantization: compressed-tensors reasoning_parser: glm45 served_model_name: glm-5.2 tensor_parallel: 4 tool_call_parser: glm47 Environment: CUDA_DEVICE_MAX_CONNECTIONS=32 CUDA_DEVICE_ORDER=PCI_BUS_ID CUTE_DSL_ARCH=sm_121a FLASHINFER_DISABLE_VERSION_CHECK=1 GLOO_SOCKET_IFNAME=enp1s0f1np1,enP2p1s0f1np1 HF_HUB_OFFLINE=1 NCCL_CROSS_NIC=1 NCCL_CUMEM_ENABLE=0 NCCL_DEBUG=WARN NCCL_IB_HCA=rocep1s0f1,roceP2p1s0f1 NCCL_IB_MERGE_NICS=0 NCCL_IB_SUBNET_AWARE_ROUTING=1 NCCL_IB_TC=106 NCCL_IGNORE_CPU_AFFINITY=1 NCCL_MAX_NCHANNELS=4 NCCL_MIN_NCHANNELS=4 NCCL_NET_PLUGIN=none NCCL_SOCKET_IFNAME=enp1s0f1np1,enP2p1s0f1np1 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True RAY_memory_monitor_refresh_ms=0 RAY_memory_usage_threshold=0.99 SAFETENSORS_FAST_GPU=1 TORCH_CUDA_ARCH_LIST=12.1a TRANSFORMERS_OFFLINE=1 USES_B12X=True VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 VLLM_DCP_GLOBAL_TOPK=1 VLLM_DCP_SHARD_DRAFT=1 VLLM_DISABLE_TP_MQ_BROADCASTER=1 VLLM_ENABLE_PCIE_ALLREDUCE=0 VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=1800 VLLM_KZ_TRIM_AFTER_LOAD=1 VLLM_MARLIN_USE_ATOMIC_ADD=1 VLLM_MEMORY_PROFILER_ESTIMATE_CUDAGRAPHS=0 VLLM_SPARSE_INDEXER_MAX_LOGITS_MB=256 VLLM_USE_B12X_FP8_GEMM=0 VLLM_USE_B12X_MOE=0 VLLM_USE_B12X_SPARSE_INDEXER=1 VLLM_USE_FLASHINFER_SAMPLER=1 VLLM_USE_V2_MODEL_RUNNER=1 VLLM_WORKER_MULTIPROC_METHOD=spawn Command: vllm serve {model} \ --served-model-name {served_model_name} \ --trust-remote-code \ --load-format {load_format} \ --quantization {quantization} \ --tensor-parallel-size {tensor_parallel} \ --pipeline-parallel-size {pipeline_parallel} \ --decode-context-parallel-size {decode_context_parallel} \ --dcp-comm-backend ag_rs \ --dcp-kv-cache-interleave-size 1 \ --gpu-memory-utilization {gpu_memory_utilization} \ --max-model-len {max_model_len} \ --max-num-seqs {max_num_seqs} \ --max-num-batched-tokens {max_num_batched_tokens} \ --kv-cache-dtype {kv_cache_dtype} \ --kv-cache-memory-bytes {kv_cache_memory_bytes} \ --generation-config vllm \ --hf-overrides '{"use_index_cache":true,"index_topk_pattern":"FFFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSS"}' \ --default-chat-template-kwargs '{"clear_thinking":false}' \ --port {port} \ --host {host} \ --compilation-config '{"cudagraph_mode":"FULL","max_cudagraph_capture_size":32}' \ --no-enable-log-requests \ --attention-backend B12X_MLA_SPARSE \ --moe-backend flashinfer_cutlass \ --reasoning-parser {reasoning_parser} \ --tool-call-parser {tool_call_parser} \ --enable-auto-tool-choice \ --enable-prefix-caching \ --speculative-config '{"model":"QuantTrio/GLM-5.2-Int4-Int8Mix","method":"mtp","num_speculative_tokens":4,"quantization":"compressed-tensors","moe_backend":"flashinfer_cutlass","draft_attention_backend":"B12X_MLA_SPARSE","draft_sample_method":"probabilistic"}' \ --long-prefill-token-threshold 2048 \ --async-scheduling Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. VRAM Estimation: Model dtype: int4_int8mix Model params: 202,740,507,008 KV cache dtype: fp8_ds_mla Architecture: 78 layers, 64 KV heads, 192 head_dim Model weights: 0.00 GB Tensor parallel: 4 Per-GPU total: 0.00 GB DGX Spark fit: YES GPU Memory Budget: gpu_memory_utilization: 88% Usable GPU memory: 107.1 GB (121 GB x 88%) Available for KV: 107.1 GB Warning: Unknown dtype 'int4_int8mix'; cannot estimate model weight VRAM Warning: Unknown KV cache dtype 'fp8_ds_mla'

sparkrun, recipe’yi doğru ayrıştırdı, vllm-distributed’ı seçti ve ‘DGX Spark fit: YES’ onayını verdi. Bilinmeyen dtype uyarılarını görmezden gelebilirsiniz — bunlar b12x/DCP’ye özel tiplerdir ve sparkrun tanıyamaz.

Şimdi başlatma planını önizleyin:

Copy to Clipboard
sparkrun run ~/glm52-dcp4-cc128.yaml --dry-run Warning: metadata.model_params '744B-MoE-40B-active' is not a valid parameter count Warning: metadata.model_dtype 'int4-int8mix' is not a recognized dtype sparkrun v0.2.40 Runtime: vllm-distributed Image: registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest Model: QuantTrio/GLM-5.2-Int4-Int8Mix Mode: cluster (4 nodes) Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. VRAM Estimation: Model dtype: int4_int8mix Model params: 202,740,507,008 KV cache dtype: fp8_ds_mla Architecture: 78 layers, 64 KV heads, 192 head_dim Model weights: 0.00 GB Tensor parallel: 4 Per-GPU total: 0.00 GB DGX Spark fit: YES GPU Memory Budget: gpu_memory_utilization: 88% Usable GPU memory: 107.1 GB (121 GB x 88%) Available for KV: 107.1 GB Warning: Unknown dtype 'int4_int8mix'; cannot estimate model weight VRAM Warning: Unknown KV cache dtype 'fp8_ds_mla' Hosts: default cluster 'default' Head: Workers: , , [1/6] Preparing done (0.0s) [2/6] Building image — skipped (no builder) [3/6] Distributing resources Distributing image registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest to 4 host(s) Distributing model QuantTrio/GLM-5.2-Int4-Int8Mix to 4 host(s) Model synced to 4 host(s) done (0.1s) [4/6] Syncing tuning configs done (0.0s) [5/6] Launching vllm runtime Step 1/7: Cleaning up existing containers Step 2/7: Detecting InfiniBand Step 3/7: Detecting head node IP Step 4/7: Launching containers Step 5/7: Running pre-serve hooks Step 6/7: Starting head node serve Step 7/7: Starting worker nodes done (0.1s) Cluster: sparkrun_1e20fe4f386b Serve command: vllm serve QuantTrio/GLM-5.2-Int4-Int8Mix \ --served-model-name glm-5.2 \ --trust-remote-code \ --load-format auto \ --quantization compressed-tensors \ --tensor-parallel-size 4 \ --pipeline-parallel-size 1 \ --decode-context-parallel-size 4 \ --dcp-comm-backend ag_rs \ --dcp-kv-cache-interleave-size 1 \ --gpu-memory-utilization 0.885 \ --max-model-len 131072 \ --max-num-seqs 5 \ --max-num-batched-tokens 2048 \ --kv-cache-dtype fp8_ds_mla \ --kv-cache-memory-bytes 9000000000 \ --generation-config vllm \ --hf-overrides '{"use_index_cache":true,"index_topk_pattern":"FFFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSS"}' \ --default-chat-template-kwargs '{"clear_thinking":false}' \ --port 8210 \ --host 0.0.0.0 \ --compilation-config '{"cudagraph_mode":"FULL","max_cudagraph_capture_size":32}' \ --no-enable-log-requests \ --attention-backend B12X_MLA_SPARSE \ --moe-backend flashinfer_cutlass \ --reasoning-parser glm45 \ --tool-call-parser glm47 \ --enable-auto-tool-choice \ --enable-prefix-caching \ --speculative-config '{"model":"QuantTrio/GLM-5.2-Int4-Int8Mix","method":"mtp","num_speculative_tokens":4,"quantization":"compressed-tensors","moe_backend":"flashinfer_cutlass","draft_attention_backend":"B12X_MLA_SPARSE","draft_sample_method":"probabilistic"}' \ --long-prefill-token-threshold 2048 \ --async-scheduling [6/6] Post-launch hooks — skipped


Dry run başarılı. Recipe geçerli, ‘Mode: cluster (4 nodes)’ görüldü ve serve command tüm bayrakları içeriyor. Model Spark’ta kurulu değilse, sparkrun ilk başlatmada modeli Hugging Face’ten otomatik indirecektir. Dry run bu indirmeyi tetiklemez, indirme yalnızca gerçek başlatmada olur.

3. Modeli Başlatma​


Şimdi modeli başlatalım:

Copy to Clipboard
sparkrun run ~/glm52-dcp4-cc128.yaml --no-follow


–no-follow bayrağı, sparkrun’ın konteynerleri başlattıktan sonra komut satırına dönmesini sağlar. sparkrun otomatik olarak imajı Worker’lara senkronize eder (aynı ID ise atlar), modeli head node’a indirir ve Worker’lara dağıtır (zaten varsa atlar), NCCL yapılandırmasını CX-7 arayüzleri için ayarlar ve her Spark’ta konteyner başlatır.

Copy to Clipboard
Warning: metadata.model_params '744B-MoE-40B-active' is not a valid parameter count Warning: metadata.model_dtype 'int4-int8mix' is not a recognized dtype sparkrun v0.2.40 Runtime: vllm-distributed Image: registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest Model: QuantTrio/GLM-5.2-Int4-Int8Mix Mode: cluster (4 nodes) Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. VRAM Estimation: Model dtype: int4_int8mix Model params: 202,740,507,008 KV cache dtype: fp8_ds_mla Architecture: 78 layers, 64 KV heads, 192 head_dim Model weights: 0.00 GB Tensor parallel: 4 Per-GPU total: 0.00 GB DGX Spark fit: YES GPU Memory Budget: gpu_memory_utilization: 88% Usable GPU memory: 107.1 GB (121 GB x 88%) Available for KV: 107.1 GB Warning: Unknown dtype 'int4_int8mix'; cannot estimate model weight VRAM Warning: Unknown KV cache dtype 'fp8_ds_mla' Hosts: default cluster 'default' Head: Workers: , , [1/6] Preparing done (0.1s) [2/6] Building image — skipped (no builder) [3/6] Distributing resources Distributing image registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest to 4 host(s) Container image stale on 3 of 4 host(s), syncing Distributing model QuantTrio/GLM-5.2-Int4-Int8Mix to 4 host(s) Fetching 142 files: 0%| | 0/142 [00:00s] Downloading (.…): 0%| | 0.00/378G [00:00s] Downloading (.…): 100%|██████████| 378G/378G [42:18s] Fetching 142 files: 100%|██████████| 142/142 [42:19s] Model synced to 4 host(s) done (2418.5s) [4/6] Syncing tuning configs done (0.0s) [5/6] Launching vllm runtime Step 1/7: Cleaning up existing containers Step 2/7: Detecting InfiniBand Step 3/7: Detecting head node IP Step 4/7: Launching containers Step 5/7: Running pre-serve hooks Step 6/7: Starting head node serve Step 7/7: Starting worker nodes done (52.1s) Cluster: sparkrun_1e20fe4f386b Serve command: vllm serve QuantTrio/GLM-5.2-Int4-Int8Mix \ --served-model-name glm-5.2 \ --trust-remote-code \ --load-format auto \ --quantization compressed-tensors \ --tensor-parallel-size 4 \ --pipeline-parallel-size 1 \ --decode-context-parallel-size 4 \ --dcp-comm-backend ag_rs \ --dcp-kv-cache-interleave-size 1 \ --gpu-memory-utilization 0.885 \ --max-model-len 131072 \ --max-num-seqs 5 \ --max-num-batched-tokens 2048 \ --kv-cache-dtype fp8_ds_mla \ --kv-cache-memory-bytes 9000000000 \ --generation-config vllm \ --hf-overrides '{"use_index_cache":true,"index_topk_pattern":"FFFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSSFSSS"}' \ --default-chat-template-kwargs '{"clear_thinking":false}' \ --port 8210 \ --host 0.0.0.0 \ --compilation-config '{"cudagraph_mode":"FULL","max_cudagraph_capture_size":32}' \ --no-enable-log-requests \ --attention-backend B12X_MLA_SPARSE \ --moe-backend flashinfer_cutlass \ --reasoning-parser glm45 \ --tool-call-parser glm47 \ --enable-auto-tool-choice \ --enable-prefix-caching \ --speculative-config '{"model":"QuantTrio/GLM-5.2-Int4-Int8Mix","method":"mtp","num_speculative_tokens":4,"quantization":"compressed-tensors","moe_backend":"flashinfer_cutlass","draft_attention_backend":"B12X_MLA_SPARSE","draft_sample_method":"probabilistic"}' \ --long-prefill-token-threshold 2048 \ --async-scheduling Runtime versions: cuda: 13.2 nccl: (2, 28, 9) python: 3.12.3 torch: 2.11.0+cu130 vllm: 0.1.dev17863+ge232d2623.d20260713 [6/6] Post-launch hooks — skipped


sparkrun 6 adımı başarıyla tamamladı. ‘Mode: cluster (4 nodes)’ görüldü. sparkrun, imajı 3 Worker’a CX-7 ağı üzerinden senkronize etti ve modeli Hugging Face’ten indirip 4 düğüme dağıttı. Serve command içinde tüm bayraklar doğru çözüldü.

4. Başlangıç Sürecini İzleme​


Model indirme tamamlandıktan sonra vLLM’in servise hazır hale gelmesi birkaç dakika alabilir. Bu süreçte vLLM model ağırlıklarını GPU belleğine yükler, GPU çekirdeklerini derler ve çıkarım için bellek ayırır.

vLLM loglarını izlemek için:

Copy to Clipboard
sparkrun logs ~/glm52-dcp4-cc128.yaml


Loglarda şunları göreceksiniz:

Copy to Clipboard
(APIServer pid=43) INFO 07-31 06:56:57 [api_utils.py:339] ▄▄ ▄█ █ █ █ ▀▄▀ █ version 0.1.dev17863+ge232d2623.d20260713 (APIServer pid=43) INFO 07-31 06:56:57 [api_utils.py:339] █▄█▀ █ █ █ █ model QuantTrio/GLM-5.2-Int4-Int8Mix (APIServer pid=43) INFO 07-31 06:57:05 [model.py:598] Resolved architecture: GlmMoeDsaForCausalLM (APIServer pid=43) INFO 07-31 06:57:05 [model.py:1725] Using max model len 131072 (APIServer pid=43) INFO 07-31 06:57:05 [cache.py:279] Using fp8_ds_mla data type to store kv cache. (APIServer pid=43) INFO 07-31 06:57:12 [model.py:598] Resolved architecture: DeepSeekMTPModel (APIServer pid=43) INFO 07-31 06:57:12 [speculative.py:1072] Overriding draft model max model len from 1048576 to 131072 (APIServer pid=43) INFO 07-31 06:57:12 [scheduler.py:252] Chunked prefill is enabled with max_num_batched_tokens=2048. (APIServer pid=43) INFO 07-31 06:57:12 [vllm.py:1051] Asynchronous scheduling is enabled. (EngineCore pid=113) INFO 07-31 06:57:20 [core.py:114] Initializing a V1 LLM engine (v0.1.dev17863+ge232d2623.d20260713) with config: ... (EngineCore pid=113) INFO 07-31 06:57:20 [multiproc_executor.py:140] DP group leader: node_rank=0, master_addr=, world_size=4 (Worker pid=129) INFO 07-31 06:57:28 [parallel_state.py:1568] world_size=4 rank=0 distributed_init_method=tcp://:25000 backend=nccl (Worker_TP0_DCP0 pid=129) INFO 07-31 06:58:07 [model_runner.py:312] Loading model from scratch... (Worker_TP0_DCP0 pid=129) INFO 07-31 06:58:07 [cuda.py:404] Using AttentionBackendEnum.B12X_MLA_SPARSE backend. (Worker_TP0_DCP0 pid=129) INFO 07-31 06:58:10 [selector.py:166] Using FLASH_ATTN MLA prefill backend. (Worker_TP0_DCP0 pid=129) INFO 07-31 06:58:10 [compressed_tensors_moe.py:155] Using CompressedTensorsWNA16MarlinMoEMethod (Worker_TP0_DCP0 pid=129) INFO 07-31 06:58:14 [weight_utils.py:914] Filesystem type for checkpoints: EXT4. Checkpoint size: 377.63 GiB. Available RAM: 16.52 GiB. (Worker_TP0_DCP0 pid=129) Loading safetensors checkpoint shards: 100% Completed | 128/128 [05:14it] (Worker_TP0_DCP0 pid=129) INFO 07-31 07:03:29 [default_loader.py:451] Loading weights took 314.57 seconds (Worker_TP0_DCP0 pid=129) INFO 07-31 07:03:40 [weight_utils.py:914] Filesystem type for checkpoints: EXT4. Checkpoint size: 9.36 GiB. Available RAM: 15.73 GiB. (Worker_TP0_DCP0 pid=129) Loading safetensors checkpoint shards: 100% Completed | 4/4 [00:07it] (Worker_TP0_DCP0 pid=129) INFO 07-31 07:03:48 [default_loader.py:451] Loading weights took 7.63 seconds (Worker_TP0_DCP0 pid=129) INFO 07-31 07:03:56 [model_runner.py:333] Model loading took 96.71 GiB and 349.827079 seconds (Worker_TP0_DCP0 pid=129) INFO 07-31 07:04:10 [backends.py:1089] Using cache directory: /tmp/.cache/vllm/torch_compile_cache/.../backbone for vLLM's torch.compile (Worker_TP0_DCP0 pid=129) INFO 07-31 07:04:36 [monitor.py:53] torch.compile took 38.46 s in total (Worker_TP0_DCP0 pid=129) INFO 07-31 07:05:15 [backends.py:1089] Using cache directory: /tmp/.cache/vllm/torch_compile_cache/.../eagle_head for vLLM's torch.compile (Worker_TP0_DCP0 pid=129) INFO 07-31 07:05:20 [monitor.py:53] torch.compile took 6.47 s in total (Worker_TP0_DCP0 pid=129) INFO 07-31 07:05:25 [gpu_worker.py:407] Initial free memory 113.45 GiB, reserved 8.38 GiB memory for KV Cache as specified by kv_cache_memory_bytes config and skipped memory profiling. (EngineCore pid=113) INFO 07-31 07:05:25 [kv_cache_utils.py:2152] GPU KV cache size: 657,664 tokens (EngineCore pid=113) INFO 07-31 07:05:25 [kv_cache_utils.py:2153] Maximum concurrency for 131,072 tokens per request: 5.02x (Worker_TP0_DCP0 pid=129) WARNING 07-31 07:05:25 [compilation.py:1361] CUDAGraphMode.FULL is not supported with B12xNonCompressedIndexerBackend backend; setting cudagraph_mode=FULL_AND_PIECEWISE (Worker_TP0_DCP0 pid=129) Capturing CUDA graphs (PIECEWISE): 100%|██████████| 6/6 [00:01s] (Worker_TP0_DCP0 pid=129) Capturing CUDA graphs (FULL): 100%|██████████| 5/5 [00:06s] (Worker_TP0_DCP0 pid=129) INFO 07-31 07:05:39 [model_runner.py:766] Graph capturing finished in 14 secs, took 0.27 GiB (APIServer pid=43) INFO 07-31 07:06:04 [parser_manager.py:37] "auto" tool choice has been enabled. (APIServer pid=43) INFO 07-31 07:06:07 [api_server.py:576] Starting vLLM server on
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
(APIServer pid=43) INFO: Started server process [43] (APIServer pid=43) INFO: Waiting for application startup. (APIServer pid=43) INFO: Application startup complete.


Application startup complete. satırını gördüyseniz model sunucusu hazır demektir. Ctrl+C tuşlarına basarak log izlemeyi durdurun. Sunucu arka planda çalışmaya devam edecektir.

Başlangıç süreci yaklaşık 10 dakika sürer. Bu süreçte:

  • Mimari GlmMoeDsaForCausalLM olarak çözümlenir (DeepSeek Sparse Attention + MoE)
  • MTP draft modeli (DeepSeekMTPModel) başlatılır — speculative decoding aktif (k=4)
  • B12X_MLA_SPARSE attention backend’i seçilir — DeepGEMM atlanır
  • 128 safetensors shard yüklenir (~5 dakika, düğüm başına 96.71 GiB)
  • Draft modeli 4 shard olarak yüklenir (~8 saniye)
  • torch.compile ~38 saniye (backbone) + ~6 saniye (eagle head) sürer
  • CUDA graph capture FULL + PIECEWISE modlarda başarıyla yakalanır (14 saniye)
  • KV cache: 8.38 GiB, 657,664 token, 131K token için 5.02x eşzamanlılık

5. Modeli Test Etme​


Öncelikle sunucunun çalıştığını doğrulayın:

Copy to Clipboard
curl -s -o /dev/null -w "HTTP %{http_code}" http://:8210/health


‘HTTP 200’ yanıtı sunucunun sağlıklı olduğunu gösterir. Şimdi sparkrun konteyner durumunu kontrol edin:

Copy to Clipboard
sparkrun status Job: /home/nvidia/glm52-dcp4-cc128.yaml (tp=4, pp=1) [1e20fe4f386b] (4 container(s)) node_0 Up 35 minutes registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest node_1 Up 35 minutes registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest node_2 Up 35 minutes registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest node_3 Up 35 minutes registry.cordata.ai/spark-cluster/vllm-zatz-dcp:latest logs: sparkrun logs 1e20fe4f386b stop: sparkrun stop 1e20fe4f386b Total: 4 container(s) across 4 host(s)


Dört konteyner de çalışıyor.

Kayıtlı modelleri listeleyin:

Copy to Clipboard
curl -s
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
| python3 -m json.tool
Copy to Clipboard
{ "object": "list", "data": [ { "id": "glm-5.2", "object": "model", "created": 1784789897, "owned_by": "vllm", "root": "QuantTrio/GLM-5.2-Int4-Int8Mix", "parent": null, "max_model_len": 131072 } ] }


Model glm-5.2 olarak kayıtlı.

Şimdi modeli, tek cümlelik “2+2 kaç eder?” promptuyla test edin:

Copy to Clipboard
curl -s
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
\ -H "Content-Type: application/json" \ -d '{ "model": "glm-5.2", "messages": [{"role": "user", "content": "2+2 kac eder? Tek cumle?"}], "max_tokens": 200 }' | python3 -m json.tool


Yanıtın basitleştirilmiş hali aşağıdaki gibi olacaktır. content alanında (modelin verdiği yanıt) “2+2, 4 eder.” ifadesini göreceksiniz. Buradan, modelin toplama işlemini doğru yaptığını anlayabilirsiniz. Ayrıca yanıtın bir de reasoning alanı var. Bu alan, modelin düşünce sürecini içerir:

Copy to Clipboard
{ "id": "chatcmpl-aefb2db7bdfbc5c9", "object": "chat.completion", "created": 1785483144, "model": "glm-5.2", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "2+2 dört eder.", "refusal": null, "annotations": null, "audio": null, "function_call": null, "tool_calls": [], "reasoning": "1. **Analyze the Request:**\n * Question: \"2+2 kac eder?\" (What is 2+2?)\n * Constraint: \"Tek cumle.\" (Single sentence.)\n * Language: Turkish.\n\n2. **Formulate the Answer:**\n * 2 + 2 = 4.\n * Turkish translation: \"2 artı 2 dört eder.\" or simply \"2+2 dört eder.\" or \"İki artı iki dört eder.\"\n\n3. **Check Constraints:**\n * Is it a single sentence? Yes.\n\n4. **Select the Best Option:**\n * \"2+2 dört eder.\" is direct, accurate, and perfectly fits the single sentence constraint." }, "logprobs": null, "finish_reason": "stop", "stop_reason": 154827, "token_ids": null, "routed_experts": null } ], "service_tier": null, "system_fingerprint": "vllm-0.1.dev17863+ge232d2623.d20260713-tp4-d57ceda6", "usage": { "prompt_tokens": 25, "total_tokens": 198, "completion_tokens": 173, "prompt_tokens_details": null }, "prompt_logprobs": null, "prompt_token_ids": null, "prompt_text": null, "kv_transfer_params": null }


LLM şu an çalışıyor ve Main Spark’ın 8210 portundan servis sağlıyor. GLM-5.2’ye soru sorup cevap alabiliyoruz. Dilerseniz, modeli bir web arayüzü (ör. Open WebUI) veya ajan mimarisiyle (ör. OpenCode) kullanabilirsiniz.

6. Kapatma​


İşiniz bittiğinde modeli durdurun:

Copy to Clipboard
sparkrun stop ~/glm52-dcp4-cc128.yaml


Bu komutla konteyner durdurulur ve bellek alanı boşalır. Ama konteyner, Docker imajı ve model dosyaları diskte kalır. Böylelikle tekrar başlatmak için yeniden indirme yapmanız gerekmez. 3. adımdaki sparkrun run komutunu tekrar çalıştırmanız yeterli.

Benchmark​


GLM-5.2 modelini farklı eşzamanlılık (concurrency) seviyelerinde test ettik. Ölçümlerde ortalama TTFT (Time to First Token — ilk token’ın üretime başlama süresi) ve TPS (Tokens Per Second — saniye başına üretilen token sayısı) değerleri kaydedilmiştir. Görüldüğü üzere, saniyede 27 token değerinin üzerine çıkılmıştır.

Eşzamanlılık​
TTFT Ort. (ms)​
TPS ort. (tok/s)​
1​
490​
27.4​
2​
717​
20.0​
4​
955​
14.3​
8​
6560​
8.5​

Ölçümler,
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
kullanılarak alınmıştır. Bu araç,
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
tarafından geliştirilen ve OpenAI uyumlu API’lere sahip LLM sunucularını test eden bir benchmarking uygulamasıdır. Aşağıda, benchmark aracımızın web arayüzünü ve ürettiği çeşitli grafikleri görebilirsiniz:

glm_benchmark_3-1024x579.webp

glm_benchmark_1.webp

glm_benchmark_2.webp

Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
 
Üst