İçindekiler

  1. Mimari Özet
  2. Ön Koşullar
  3. DGX Spark Düğümlerin Hazırlığı
  4. Management Ağı (10GbE) Bağlantısı
  5. Compute Ağı (200GbE QSFP) Fiziksel Bağlantısı
  6. Spark’lara Sparkrun Yüklenmesi
  7. Hız ve RDMA Testleri
  8. sparkrun ile Model Çalıştırma
  9. Sonuç ve Doğrulama
  10. Sorun Giderme

Bu ürünü satın almak için ilgili sayfayı ziyaret edebilirsiniz.

Bu doküman, 3 NVIDIA DGX Spark node’undan oluşan ring (mesh) topolojisine sahip
bir AI cluster’ın kurulum ve konfigürasyon adımlarını baştan sona anlatmaktadır.
Cluster, dağıtık AI iş yüklerini ve model çalıştırmayı yönetmek için sparkrun
araç setini kullanır.

Doküman; management ve compute ağlarının hazırlanması, ConnectX-7 QSFP112 port
yapılandırması, RoCEv2/RDMA ayarları, SSH erişimi ve cluster sağlık kontrolü
adımlarını kapsar.

Mimari Özet

Bileşen Açıklama
DGX Spark × 3 Her birinde ConnectX-7 200GbE QSFP112 port bulunur
QSFP112 Kablo x3 Amphenol: NJAAKK-N911
sparkrun Cluster yönetim, SSH mesh ve CX7 yapılandırma araç seti

Ön Koşullar

Donanım

  • 3× NVIDIA DGX Spark sistemi
  • 3× Amphenol: NJAAKK-N911 Kablo
  • Cat6 kablolar (management ağı)

Yazılım ve İşletim Sistemi

  • DGX OS (her Spark sisteminde kurulu)
  • İnternet erişimi (paket indirmeleri ve güncellemeler için)

Bilgi ve Erişim

  • Linux komut satırı temel bilgisi
  • Tüm cihazların fiziksel erişimi (kablo bağlantıları için)

DGX Spark OS Kurulumu

DGX Spark OS kurulumu için aşağıdaki videoyu kullanabilirsiniz:

NVIDIA DGX Spark Kurulumu Part 1

DGX Spark Düğümlerin Hazırlığı

Fiziksel bağlantılar ve ağ yapılandırmalarına geçmeden önce tüm Spark sistemlerinin güncel yazılım ve firmware sürümlerini kullandığından emin olunmalıdır. Kurulum sırasında karşılaşılan performans problemlerinin önemli bir kısmı eski sürücüler, eksik güncellemeler veya firmware uyumsuzluklarından kaynaklanabilmektedir.

Aşağıdaki işlemler üç Spark sistemi üzerinde de uygulanmalıdır.

Sistem ve Firmware Güncellemeleri

İlk olarak işletim sistemi paketleri güncellenir:

sudo apt update
sudo apt dist-upgrade

Daha sonra sistem firmware’leri güncellenir:

sudo fwupdmgr refresh --force
sudo fwupdmgr upgrade

DGX Dashboard üzerinden, herhangi bir güncelleme olmadığı kontrol edilir, eğer varsa yapılır:

Güncellemelerin tamamlanmasının ardından sistem yeniden başlatılır:

sudo reboot

Kurulum sırasında yapılan testlerde, güncel olmayan firmware sürümleri nedeniyle bağlantı performansının beklenen seviyeye ulaşmadığı gözlemlenmiştir. Bu nedenle kurulumun ilk adımı olarak tüm sistemlerin güncellenmesi önerilmektedir.

Docker Yapılandırması

Sonraki adımlarda kullanılacak container tabanlı araçların sudo gerektirmeden çalıştırılabilmesi için her bir Spark üzerinde Docker post-install işlemleri uygulanır.

Öncelikle mevcut kullanıcı Docker grubuna eklenir:

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

Yapılandırmanın başarılı olduğu aşağıdaki test ile doğrulanabilir:

docker run hello-world

Komutun başarılı şekilde çalışması ve Docker’ın örnek container’ı başlatabilmesi, sonraki adımlarda kullanılacak container tabanlı araçlar için gerekli hazırlığın tamamlandığını göstermektedir.

Depolama Sürücüsünün Kontrolü

Ayrıca tüm Spark düğümlerinde Docker depolama sürücüsü kontrol edildi. docker info çıktısında Storage Driver değerinin overlayfs olduğu doğrulandı. overlay2 veya farklı bir depolama sürücüsü tespit edilmesi durumunda Docker, containerd snapshotter (overlayfs) kullanacak şekilde yapılandırıldı ve Docker servisi yeniden başlatıldı. Böylece tüm düğümlerde aynı depolama altyapısı kullanılarak tutarlı bir çalışma ortamı sağlandı.

Öncelikle mevcut depolama sürücüsü aşağıdaki komut ile kontrol edildi:

docker info -f 'Driver= DriverStatus= DockerRootDir='

Çıktıda sürücünün overlay2 olarak görülmesi durumunda aşağıdaki yapılandırma uygulandı:

sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "features": {
    "containerd-snapshotter": true
  }
}
EOF

sudo systemctl restart docker

Yapılandırma sonrasında aynı kontrol komutu tekrar çalıştırıldı ve depolama sürücüsünün overlayfs olduğu doğrulandı.

Management Ağı (10GbE) Bağlantısı

Her bir DGX Spark’ın 10GbE Ethernet portu kullanılacak switch’in RJ45 portlarından birine Cat6 kablo ile bağlanır. Kablo takıldıktan sonra switch üzerindeki ilgili portun bağlantı göstergesinin yandığı teyit edilir.

Spark masaüstünde terminal açılır ve cihazın IP adresi alıp almadığını kontrol edin:

ip addr show

Çıktıda, örnekte olduğu gibi 10GbE arayüzünde bir IP adresi görüyorsanız, management ağı üzerinden SSH erişimi sağlanabilir. IP adresi alınmamışsa, DGX OS masaüstü üzerinden manuel olarak atanır:

  1. Sağ üst köşedeki ağ simgesine tıklayın → Wired Settings seçin
  2. İlgili 10GbE bağlantısının yanındaki dişli (⚙) simgesine tıklayın
  3. IPv4 sekmesine geçin
  4. Method alanını Manual olarak değiştirin
  5. Aşağıdaki bilgileri girin:
    • Address: 192.168.1.163 (her Spark için farklı ve kendi ağınıza uygun olarak— .147, .148)
    • Netmask: 255.255.255.0
    • Gateway: 192.168.1.1 (varsa, yoksa boş bırakın)
    • DNS: 1.1.1.1,8.8.8.8
  6. Apply butonuna basın ve bağlantıyı kapatıp tekrar açın

İnternet erişimi varsa 10GbE management bağlantısı hazırdır. Diğer iki Spark üzerinde de aynı adımları tekrarlayın ve her birine farklı bir IP adresi atayın.

Düğümler Arası Erişim Kontrolü

Management ağı üzerinden tüm Spark’ların birbirini görebildiğini teyit edin. Bir Spark üzerinden diğerlerine ping atın:

ping -c 4 192.168.1.147
ping -c 4 192.168.1.148

Tüm ping’ler başarılıysa management ağı hazır ve tüm düğümler birbiriyle iletişim kurabiliyor demektir.

Compute Ağı (200GbE QSFP) Fiziksel Bağlantısı

Mevcut kurulumda her Spark, üzerinde bulunan iki ConnectX-7 QSFP portu üzerinden 100GbE hızında (iki port toplamı 200GbE) diğer iki Spark’a bağlanır.

Kablo Planı

Üç Spark sistemi arasında oluşturulacak fiziksel bağlantıların port eşleşmeleri aşağıdaki gibidir:

Kaynak Hedef
Spark1 Port0 Spark2 Port1
Spark1 Port1 Spark3 Port0
Spark2 Port0 Spark3 Port1

Spark’lara Sparkrun Yüklenmesi

Kullanıcı ve SSH Yapılandırması

Ağ yapılandırması tamamlandıktan sonra Spark sistemlerinin birbirleriyle şifresiz olarak haberleşebilmesi için tüm node’larda ortak bir kullanıcı oluşturulmalıdır. sparkrun, bu kullanıcı üzerinden tüm node’lara SSH ile bağlanır ve cluster yönetim işlemlerini gerçekleştirir.

Hostname Ayarlama
Her Spark’a benzersiz bir hostname verin. Bu, SSH known_hosts yönetimi, log analizi ve cluster node takibi için gereklidir:

# Spark 1 üzerinde:
sudo hostnamectl set-hostname spark1

# Spark 2 üzerinde:
sudo hostnamectl set-hostname spark2

# Spark 3 üzerinde:
sudo hostnamectl set-hostname spark3

Ortak Kullanıcı Oluşturma
Tüm Spark sistemlerinde aynı kullanıcı adı oluşturulmalıdır. Bu dokümanda nvidia kullanıcı adı kullanılacaktır. Aşağıdaki komutlar üç Spark sistemi üzerinde de çalıştırılır:

sudo useradd -m nvidia
sudo usermod -aG sudo nvidia
sudo passwd nvidia

Tüm sistemlerde aynı şifreyi kullanın — yönetim süreçlerini kolaylaştırır. sparkrun SSH mesh kurulumu sırasında ilk bağlantıda bu şifre sorulur, sonrasında anahtar tabanlı kimlik doğrulamaya geçilir.

Passwordless Sudo Yapılandırması

sparkrun, CX7 ağ yapılandırması sırasında sudo ile komutlar çalıştırır. Her seferinde şifre sormaması için passwordless sudo ayarlanmalıdır:

echo "nvidia ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/nvidia
sudo chmod 440 /etc/sudoers.d/nvidia

sparkrun Kurulumu

Kurulum nvidia kullanıcısı olan hesapta yapılır.

su - nvidia

Önce uv paketi kurulur:

curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.bashrc

Sonra Sparkrun kurulur:

uvx sparkrun setup

Kurulum esnasında sorulan sorulara uygun cevaplar verilir:

  1. öncelikle cihazların ip adresleri girilir:
  2. cluster için bir isim verilir
  3. SSH kullanıcı adı olarak önceki adımda oluşturulan nvidia ismi girilir.
  4. MESH kurulumu için Y seçilir

  5. Configure CX7 networking? sorusuna Y denir:
  6. Topology seçimi “auto” olarak bırakılır veya ring de seçilebilir:

  7. Add ‘nvidia’ to the docker group on all hosts? sorusuna Y seçilir
  8. Install sudoers entries? sorusuna “Y” seçilir
  9. Install earlyoom? sorusuna “Y” seçilir
  10. Setup complete mesajı geldiğinde kurulum başarıyla tamamlanmış demektir

Hız ve RDMA Testleri

Bu adımda, compute ağının doğru çalıştığını ve RoCEv2 üzerinden RDMA iletişiminin beklendiği gibi performans verdiğini doğrulayacağız. Testler iki Spark arasında yapılır.

IP Ataması Referansı
sparkrun wizard tarafından CX7 arayüzlerine atanan IP adresleri aşağıda göründüğü gibidir, sizin senaryoda bu adresler yerine kendi adreslerinizi kullanmanız gerekir:

Spark Management (enP7s7) enp1s0f0np0 enp1s0f1np1 enP2p1s0f0np0 enP2p1s0f1np1
Spark 1 192.168.1.163 192.168.0.2 192.168.3.1 192.168.2.2 192.168.4.1
Spark 2 192.168.1.147 192.168.5.2 192.168.2.1 192.168.6.2 192.168.0.1
Spark 3 192.168.1.148 192.168.4.2 192.168.6.1 192.168.3.2 192.168.5.1

Ring topolojisinde her node çifti arasında 2 subnet bulunur (toplam 6 subnet). Testler bir node çifti üzerinden yapılır; diğer çiftler için benzer şekilde tekrarlanabilir:

  • Link 0 (Spark 1 ↔ Spark 2): 192.168.0.0/24 + 192.168.2.0/24
  • Link 1 (Spark 1 ↔ Spark 3): 192.168.3.0/24 + 192.168.4.0/24
  • Link 2 (Spark 2 ↔ Spark 3): 192.168.5.0/24 + 192.168.6.0/24

IP ve MTU Testi
Spark 1’den Spark 2’ye ping ile bağlantı ve jumbo frame testi yapın:

# Spark 1 üzerinde:
ping -c 4 192.168.0.1
ping -M do -s 8972 -c 4 192.168.0.1

İlk ping normal bağlantıyı, ikinci ping 9000 byte MTU’yu test eder. -M do fragmentation’ı engeller — paket düşmezse MTU 9000 uçtan uca çalışıyor demektir.

İkinci subnet için de tekrarlayın:

ping -c 4 192.168.2.1
ping -M do -s 8972 -c 4 192.168.2.1

TCP Throughput Testi (iperf3)
Ethernet/IP katmanı üzerinden temel bant genişliğini ölçün. Bu test RDMA değildir — TCP üzerinden CPU involvement’lı transferdir.

# Spark 2 üzerinde (sunucu):
iperf3 -s
# Spark 1 üzerinde (istemci):
iperf3 -c 192.168.0.1 -P 8 -t 30

-P 8 sekiz paralel akış, -t 30 otuz saniye test süresi. Beklenen sonuç: ~100-120 Gbps toplam throughput.

Not: iperf3 kurulu değilse yükleyin:

sudo apt install iperf3

RDMA Cihazlarını Belirleme
RDMA cihaz adlarını öğrenin:

ibdev2netdev

Örnek çıktı:
rocep1s0f0 port 1 ==> enp1s0f0np0 (Up)
rocep1s0f1 port 1 ==> enp1s0f1np1 (Up)
roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Up)
roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up)

RDMA Write Testi (ib_write_bw)
RoCEv2 üzerinden RDMA write işleminin bant genişliğini ölçün. Bu test CPU involvement olmadan doğrudan bellek transferini test eder.

Subnet 192.168.0.0/24:
Spark 2 üzerinde (sunucu):

ib_write_bw -d roceP2p1s0f1 -F --report_gbits

Spark 1 üzerinde (istemci):

ib_write_bw -d rocep1s0f0 -F --report_gbits 192.168.0.1

Beklenen sonuç: ~100-111 Gbps.

Subnet 192.168.2.0/24:
Spark 2 üzerinde (sunucu):

ib_write_bw -d rocep1s0f1 -F --report_gbits

Spark 1 üzerinde (istemci):

ib_write_bw -d roceP2p1s0f0 -F --report_gbits 192.168.2.1

Beklenen sonuç: ~100-111 Gbps.

İki arayüz de ~100 Gbps veriyorsa, her Spark arasında toplam ~200 Gbps RDMA bant genişliği mevcuttur.

RDMA Read Testi (ib_read_bw)
RDMA read işleminin bant genişliğini ölçün:

Subnet 192.168.0.0/24:
Spark 2 üzerinde (sunucu):

ib_read_bw -d roceP2p1s0f1 -F --report_gbits

Spark 1 üzerinde (istemci):

ib_read_bw -d rocep1s0f0 -F --report_gbits 192.168.0.1

Beklenen sonuç: ~95-110 Gbps.

Subnet 192.168.2.0/24:
Spark 2 üzerinde (sunucu):

ib_read_bw -d rocep1s0f1 -F --report_gbits

Spark 1 üzerinde (istemci):

ib_read_bw -d roceP2p1s0f0 -F --report_gbits 192.168.2.1

Beklenen sonuç: ~95-110 Gbps.

RDMA Latency Testi (ib_write_lat)
Spark 2 üzerinde (sunucu):

ib_write_lat -d roceP2p1s0f1

Spark 1 üzerinde (istemci):

ib_write_lat -d rocep1s0f0 192.168.0.1

Beklenen sonuç: ~1-3 microsecond latency.

sparkrun ile Model Çalıştırma

Bu adımda, sparkrun üzerinden çok node’lu bir inference iş yükü çalıştırarak cluster’ın uçtan uca çalıştığını doğrulayacağız.

Model ve Recipe
Bu testte Intel/Qwen3.5-397B-A17B-int4-AutoRound modeli kullanılır. Model, 3 node üzerinde pipeline parallelism ile çalıştırılır. sparkrun varsayılan recipe’si tensor parallelism kullanacak şekilde yapılandırılmıştır; bu nedenle 3 node için pipeline parallelism kullanmak üzere özel bir YAML dosyası hazırlanmıştır.

Modelin Çalıştırılması
Aşağıdaki YAML dosyasını qwen3.5-397b-a17b-int4-vllm.yaml adıyla kaydedin:

model: Intel/Qwen3.5-397B-A17B-int4-AutoRound
runtime: vllm-ray
min_nodes: 3
container: ghcr.io/spark-arena/dgx-vllm-eugr-nightly:latest

metadata:
  description: "Qwen3.5-397B-A17B int4 AutoRound - 3 Node PP3"

defaults:
  port: 8000
  host: 0.0.0.0
  tensor_parallel: 1
  pipeline_parallel: 3
  gpu_memory_utilization: 0.85
  max_model_len: 131072
  load_format: auto
  tool_call_parser: qwen3_coder
  reasoning_parser: qwen3

env:
  VLLM_MARLIN_USE_ATOMIC_ADD: "1"
  NCCL_DEBUG: "INFO"
  HF_TOKEN: ${HF_TOKEN}
  HF_HUB_OFFLINE: "1"
  TRANSFORMERS_OFFLINE: "1"
  HF_DATASETS_OFFLINE: "1"

command: |
  vllm serve {model} \
    --trust-remote-code \
    --gpu-memory-utilization {gpu_memory_utilization} \
    -tp {tensor_parallel} \
    -pp {pipeline_parallel} \
    --max-model-len {max_model_len} \
    --load-format {load_format} \
    --enable-auto-tool-choice \
    --tool-call-parser {tool_call_parser} \
    --reasoning-parser {reasoning_parser} \
    --host {host} \
    --port {port}

Ardından modeli çalıştırın:

sparkrun run qwen3.5-397b-a17b-int4-vllm.yaml

SSH Authorization Hatası Çözümü
Eğer sparkrun komutu çalıştırıldıktan sonra kendine bağlanırken authorization ile ilgili bir hata alınırsa aşağıdaki komut kullanılır ve sparkrun tekrar çalıştırılır:

cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

Modelin Hazır Olduğunun Doğrulanması
Model başladığında “Application startup complete.” şeklinde bir mesaj alırsınız, artık model kullanıma hazırdır:

Benchmark Sonuçları
Bu şekilde ayağa kalkan modelde linkte verdiğimiz benchmark aracıyla yapılan testler sonucunda elde edilen ortalama değerler şu şekildedir:

Eşzamanlı İstek TTFT (ms) Token/sn Gecikme (sn) Verim (RPS)
1 452 16.69 7.67 0.13
2 708 13.63 9.40 0.11
4 827 10.19 12.57 0.08
8 1394 6.54 19.57 0.05

Sonuç ve Doğrulama

Bu dokümandaki adımları takip ederek aşağıdaki bileşenlerden oluşan tam fonksiyonel bir DGX Spark AI cluster’ı kurulmuş olur:

Bileşen Durum Doğrulama Yöntemi
Management Ağı (10GbE) Hazır Düğümler arası ping başarılı
Compute Ağı (200GbE QSFP) Hazır ib_write_bw ~100-111 Gbps
RoCEv2 / RDMA Hazır ib_write_lat ~1-3 µs
sparkrun Cluster Hazır sparkrun setup tamamlandı
Model Servisi Hazır “Application startup complete.” mesajı

Cluster Sağlık Kontrolü Özeti

Kurulumun tamamlandığını doğrulamak için aşağıdaki kontrolleri gerçekleştirebilirsiniz:

  1. Management ağı: Tüm düğümler birbirini ping edebiliyor mu?
  2. Compute ağı: ib_write_bw testinde her subnet ~100 Gbps veriyor mu?
  3. MTU: ping -M do -s 8972 testi paket düşmeden geçiyor mu?
  4. sparkrun mesh: Tüm node’lara şifresiz SSH erişimi çalışıyor mu?
  5. Model: Benchmark sonuçları yukarıdaki tabloyla tutarlı mı?

Tüm bu kontroller başarılıysa cluster AI iş yükleri için hazırdır.

Sorun Giderme

Docker Storage Driver overlay2 Görünüyor

docker info çıktısında overlay2 görüyorsanız /etc/docker/daemon.json dosyasına containerd-snapshotter feature’ını ekleyin ve Docker’ı yeniden başlatın (bkz. Docker Yapılandırması).

ping -M do ile Jumbo Frame Testi Başarısız

Spark tarafında CX7 arayüzlerinin MTU değerlerinin 9000 olduğundan emin olun: ip link show.

RDMA Bant Genişliği Düşük (~100 Gbps Altında)

  • Tüm sistem ve firmware güncellemelerinin yapıldığından emin olun (bkz. Sistem ve Firmware Güncellemeleri).
  • Kablo bağlantılarının sağlam olduğunu kontrol edin.
  • ibdev2netdev çıktısı ile arayüz-cihaz eşleşmesini doğrulayın.

sparkrun SSH Authorization Hatası

sparkrun çalıştırıldığında authorization hatası alınırsa:

cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

Komutunu çalıştırın ve sparkrun’u tekrar çalıştırın.