İçindekiler
- Mimari Özet
- Ön Koşullar
- DGX Spark Düğümlerin Hazırlığı
- Management Ağı (10GbE) Bağlantısı
- Compute Ağı (200GbE QSFP) Fiziksel Bağlantısı
- Spark’lara Sparkrun Yüklenmesi
- Hız ve RDMA Testleri
- sparkrun ile Model Çalıştırma
- Sonuç ve Doğrulama
- 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:
- Sağ üst köşedeki ağ simgesine tıklayın → Wired Settings seçin
- İlgili 10GbE bağlantısının yanındaki dişli (⚙) simgesine tıklayın
- IPv4 sekmesine geçin
- Method alanını Manual olarak değiştirin
- 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
- 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:
- öncelikle cihazların ip adresleri girilir:
- cluster için bir isim verilir
- SSH kullanıcı adı olarak önceki adımda oluşturulan
nvidiaismi girilir. -
MESH kurulumu için Y seçilir

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

- Add ‘nvidia’ to the docker group on all hosts? sorusuna Y seçilir
- Install sudoers entries? sorusuna “Y” seçilir
- Install earlyoom? sorusuna “Y” seçilir
-
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:
- Management ağı: Tüm düğümler birbirini ping edebiliyor mu?
- Compute ağı:
ib_write_bwtestinde her subnet ~100 Gbps veriyor mu? - MTU:
ping -M do -s 8972testi paket düşmeden geçiyor mu? - sparkrun mesh: Tüm node’lara şifresiz SSH erişimi çalışıyor mu?
- 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.