E
Enhar Ormeci
Misafir
Misafir
Bu eğitimde, tek bir DGX Spark üzerinde bir büyük dil modelini Unsloth kullanarak ince ayar (fine-tuning) yapacaksını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 modelin ince ayarını yapacağız.
Model olarak GPT-OSS 20B (21 milyar parametreli bir Mixture-of-Experts modeli), ince ayar framework’ü olarak Unsloth, ve eğitim yöntemi olarak Pekiştirmeli Öğrenme (Reinforcement Learning — RL) kullanacağız. Unsloth, modeli 4-bit kuantizasyonla (QLoRA) yükleyip sadece küçük LoRA adaptörlerini eğiterek %70’e varan bellek tasarrufu sağlayacak. Eğitim, dil modelinin “2048” adlı oyununu oynamayı öğrenmesini sağlayacak.
Bu eğitim üç bölümden oluşur:
- Kurulum: Docker imajı derleme ve konteyner başlatma
- Eğitim: Notebook’u çalıştırma, model yükleme ve GRPO eğitimi
- Sonuç: Eğitilmiş modeli test etme ve kapatma
Bu eğitim tek Spark üzerindendir; ince ayar çoklu Spark gerektirmez.
Kurulum
1. Spark’a Bağlanma
Spark’a ilk kez uzaktan bağlanıyorsanız IP adresini bulmanız gerekir. Spark’a bir monitör ve klavye bağlayıp giriş yapın ve terminalden şu komutu çalıştırın:
Copy to Clipboard
ip route get 1.1.1.1 | grep -oP 'src \K\S+'
Komut, Spark’ın varsayılan ağ arayüzünün IP adresini verir:
Copy to Clipboard
192.168.1.162
Bu adresi not edin; eğitim boyunca spark-ip yerine bu adresi kullanacaksınız. Alternatif olarak, NVIDIA Sync uygulamasını kontrol ederek de IP adresini bulabilirsiniz.
Bilgisayarınızın Spark’la aynı ağa bağlı olduğundan emin olun. Ardından, bilgisayarınızdan bir terminal açın ve Spark’a SSH ile bağlanın:
Copy to Clipboard
ssh nvidia@
İlk bağlantıda bir fingerprint uyarısı göreceksiniz. yes yazıp Enter’a basın. Ardından parola sorulduğunda Spark’ın parolasını girin:
Copy to Clipboard
The authenticity of host '192.168.1.162 (192.168.1.162)' can't be established. ED25519 key fingerprint is SHA256:S6EECYc6Pw2aLoLmhblFZ0QEoeVtJP41jJ5IYsdOmMM. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.1.162' (ED25519) to the list of known hosts. [email protected]'s password: Welcome to NVIDIA DGX Spark Version 7.5.0 (GNU/Linux 6.17.0-1026-nvidia aarch64) System information as of Fri Jul 29 12:00:00 PM UTC 2026 System load: 1.68 Temperature: 50.0 C Usage of /: 25% of 3.67TB Processes: 575 Memory usage: 3% Users logged in: 1 Swap usage: 7% IPv4 address for enP7s7: 192.168.1.162 2 devices have a firmware upgrade available. Run `fwupdmgr get-upgrades` for more information. Last login: Fri Jul 29 12:00:00 2026 from 192.168.1.77
Bağlandığınızda Spark, bu terminalden gönderdiğiniz komutları kabul etmeye başlayacak. Eğitim boyunca karşınıza çıkan tüm komutları bilgisayarınızın bu terminaline gireceksiniz.
2. Docker İmajını Derleme
Unsloth, GB10 Grace Blackwell Superchip için özel olarak derlenmiş triton ve xformers çekirdeklerine ihtiyaç duyar. Bu çekirdekler standart Docker imajlarında bulunmaz; bu yüzden Unsloth’un DGX Spark için hazırladığı Dockerfile’ı kullanarak kendi docker imajımızı derleyeceğiz.
Önce Dockerfile’ı indirin:
Copy to Clipboard
cd ~ wget -O Dockerfile "
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
"Copy to Clipboard
--2026-07-29 12:09:38--
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1070 (1.0K) [text/plain] Saving to: 'Dockerfile' 0K . 100% 249M=0s 2026-07-29 12:09:38 (249 MB/s) - 'Dockerfile' saved [1070/1070]Bu Dockerfile şunları içerir:
- nvcr.io/nvidia/pytorch:25.11-py3 — NGC PyTorch 25.11. Temel imaj (PyTorch 2.10, CUDA 13.0).
- triton (kaynaktan derleme) — Sürüm 3.4.0. Blackwell (SM 12.1) desteği için attention çekirdekleri.
- xformers (kaynaktan derleme) — Sürüm 0.0.33. Blackwell (SM 12.1) desteği için bellek verimli attention.
- unsloth — Sürüm 2026.7.5. İnce ayar optimizasyonu (2x hız, %70 az VRAM).
- unsloth_zoo — Sürüm 2026.7.6. Unsloth yardımcı araçları.
- bitsandbytes — Sürüm 0.50.0. 4-bit kuantizasyon (NF4).
- transformers — Sürüm 4.56.2. Model yükleme ve tokenizasyon.
- trl — Sürüm 0.22.2. GRPO eğitim döngüsü.
Şimdi imajı derleyin. Bu işlem yaklaşık 25-30 dakika sürecektir:
Copy to Clipboard
docker build -f Dockerfile -t unsloth-dgx-spark .
Derleme sırasında şu aşamaları göreceksiniz:
Copy to Clipboard
#4 [1/5] FROM nvcr.io/nvidia/pytorch:25.11-py3 ← Temel imaj indiriliyor (~160s) #5 [2/5] RUN git clone ... triton ... ← Triton derleniyor (~880s / ~15dk) #6 [3/5] RUN git clone ... xformers ... ← xformers derleniyor (~68s) #7 [4/5] RUN pip install --no-deps bitsandbytes ← Paketler kuruluyor (~10s) #8 [5/5] RUN pip install unsloth unsloth_zoo ← Unsloth kuruluyor (~10s) #9 exporting to image ← İmaj yazılıyor (~450s / ~7.5dk)
Derleme tamamlandığında şu çıktıyı göreceksiniz:
Copy to Clipboard
#9 naming to docker.io/library/unsloth-dgx-spark:latest done #9 unpacking to docker.io/library/unsloth-dgx-spark:latest 68.6s done #9 DONE 448.5s 2 warnings found (use docker --debug to expand): - UndefinedVar: Usage of undefined variable '$C_INCLUDE_PATH' (line 8) - UndefinedVar: Usage of undefined variable '$CPLUS_INCLUDE_PATH' (line 9)
Önemli: UndefinedVar uyarıları zararsızdır, görmezden gelebilirsiniz.
İmajı kontrol edelim:
Copy to Clipboard
docker images unsloth-dgx-spark
Copy to Clipboard
IMAGE ID DISK USAGE CONTENT SIZE EXTRA unsloth-dgx-spark:latest ab8ba088e6cf 54.5GB 15.9GB U
3. Konteyneri Başlatma
Eğitimin yapılacağı Docker konteynerini, GPU erişimi ve depolama birimi bağlama (volume mount) parametreleriyle başlatın:
Copy to Clipboard
docker run -it \ --gpus=all \ --net=host \ --ipc=host \ --ulimit memlock=-1 \ --ulimit stack=67108864 \ -v $(pwd):$(pwd) \ -v $HOME/.cache/huggingface:/root/.cache/huggingface \ -w $(pwd) \ unsloth-dgx-spark
Copy to Clipboard
============= == PyTorch == ============= NVIDIA Release 25.11 (build 210907838) PyTorch Version 2.10.0a0+b558c986e8.nv25.11 Container image Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. Copyright (c) 2014-2024 Facebook Inc. Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert) Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu) Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu) Copyright (c) 2011-2013 NYU (Clement Farabet) Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston) Copyright (c) 2006 Idiap Research Institute (Samy Bengio) Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz) Copyright (c) 2015 Google Inc. Copyright (c) 2015 Yangqing Jia Copyright (c) 2013-2016 The Caffe contributors All rights reserved. Various files include modifications (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. GOVERNING TERMS: The software and materials are governed by the NVIDIA Software License Agreement (found at
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
) and the Product-Specific Terms for NVIDIA AI Products (found at
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
).Eğitim
4. Notebook’u İndirme
Unsloth’un GPT-OSS 20B modeline 2048 oynamayı öğreten RL notebook’unu indirin:
Copy to Clipboard
NOTEBOOK_URL="https://raw.githubusercontent.com/unslothai/notebooks/refs/heads/main/nb/gpt_oss_(20B)_Reinforcement_Learning_2048_Game_DGX_Spark.ipynb" wget -O "gpt_oss_20B_RL_2048_Game.ipynb" "$NOTEBOOK_URL"
Copy to Clipboard
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133 Connecting to raw.githubusercontent.com|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 480510 (469K) [text/plain] Saving to: 'gpt_oss_20B_RL_2048_Game.ipynb' gpt_oss_20B_RL_2048_Game.ipynb 100%[=============================================>] 469.25K --.-KB/s in 0.05s 2026-07-29 12:44:12 (9.39 MB/s) - 'gpt_oss_20B_RL_2048_Game.ipynb' saved [480510/480510]
Bu Jupyter Notebook’u 60 hücreden (cell) oluşur ve şu adımları içerir:
- Modeli 4-bit QLoRA ile yükleme
- LoRA adaptörleri ekleme
- Oyun ortamını kurma
- Ödül fonksiyonları tanımlama
- GRPO (Grup Göreli Politika Optimizasyonu—Group Relative Policy Optimization) ile 1000 adımlı eğitim
- Eğitilmiş modeli kaydetme
5. Jupyter’ı Başlatma ve Notebook’u Çalıştırma
Konteyner içinde Jupyter Notebook sunucusunu başlatın:
Copy to Clipboard
jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root
Copy to Clipboard
[I 2026-07-29 12:44:36.779 ServerApp] Serving notebooks from local directory: /home/nvidia [I 2026-07-29 12:44:36.779 ServerApp] Jupyter Server 2.17.0 is running at: [I 2026-07-29 12:44:36.779 ServerApp]
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
[I 2026-07-29 12:44:36.779 ServerApp]
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
[I 2026-07-29 12:44:36.779 ServerApp] Use Control-C to stop this server and shut down all kernelsBu sunucu, Spark’taki .ipynb uzantılı dosyaları düzenlemenize ve çalıştırmanıza imkan veren bir web arayüzü sağlar. Arayüze erişmek için bilgisayarınızın tarayıcısından şu adrese gidin:
Copy to Clipboard
http://:8888/tree?token=
token kısmını terminalde gördüğünüz token (örn. 0388154bcd8cca584336b88ea9b84d09dbc302068f1e9a49) ile değiştirin. Dosya tarayıcısından gpt_oss_20B_RL_2048_Game.ipynb dosyasına tıklayarak notebook’u açın.
Model Kaydetme: Eğitim sırasında her 100 adımda bir kontrol noktası (checkpoint,) LoRA adaptör ağırlıklarıyla birlikte outputs/ dizinine otomatik kaydedilir. Fakat bu adaptör ağırlıklarının orijinal modelle birleştirilmiş (merge) halini kaydetme seçeneği devre dışıdır. Eğer eğitim sonrası modeli vLLM ile çıkarım için kullanmak üzere kaydetmek isterseniz, notebook’u çalıştırmadan önce bu seçeneği devreye almalısınız. Bunun için notebook’un son hücresine (Cell 58) gidin, bu hücredeki if False: satırlarını if True: olarak değiştirin. MXFP4 (OpenAI’nin 4-bit formatı) veya 16-bit formatından birini seçebilirsiniz:
model.save_pretrained_merged(“finetuned_model”, tokenizer, save_method = “mxfp4”)
Menü çubuğundan Cell → Run All’ı seçerek tüm hücreleri tek seferde sırayla çalıştırın. Her hücre çalışırken sol tarafında
In [*]: göreceksiniz; tamamlandığında In [1]:, In [2]: şeklinde numaralanır. Eğitim sürecinin kalanını Jupyter kendisi halledecek. Dilerseniz notebook’un ilerleme sürecini web arayüzünden izleyebilirsiniz.Önemli: Eğitim yaklaşık 4 saat sürecektir. Model indirme (~2 dk), model yükleme (~2 dk) ve 1000 adım eğitim (~3-4 saat) dahildir.
Aşağıda eğitim sonrası notebook’un web arayüzünden bazı ekran görüntüleri bulunmaktadır. Burada çeşitli kod hücrelerini ve açıklamaları görebilirsiniz:
Notebook hücreleri çalıştıkça, sırayla aşağıdaki adımlar gerçekleşecektir.
6. Model Yükleme
İlk kod hücresi (Cell 5) modeli 4-bit kuantizasyonla yükler. Bu adım modeli Hugging Face‘ten indirir (~12 GB) ve GPU belleğine yükler:
Copy to Clipboard
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.
Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored! Loading checkpoint shards: 0%| | 0/4 [00:00s] Loading checkpoint shards: 25%|██▌ | 1/4 [00:29it] Loading checkpoint shards: 50%|█████ | 2/4 [00:56it] Loading checkpoint shards: 75%|███████▌ | 3/4 [01:15it] Loading checkpoint shards: 100%|██████████| 4/4 [01:22it] Loading checkpoint shards: 100%|██████████| 4/4 [01:22it] Unsloth: Offloading embeddings to RAM to save 1.08 GB.Ardından LoRA adaptörleri eklenir (Cell 7):
Copy to Clipboard
Unsloth: Explicit target_modules are constrained by the finetune_(vision|language|attention|mlp) filters; adapters attach only where both select. Unsloth: Detected MoE model with per-expert Linear experts. Enabling LoRA on 64 expert projection modules.
Bu noktada model hazırdır.
7. GRPO Eğitimi
Eğitim,
trainer.train() hücresi çalıştığında başlar. GRPO (Group Relative Policy Optimization — Grup Göreli Politika Optimizasyonu) algoritması şu döngüyü 1000 kez tekrarlar:- Modele
“2048 için bir strateji fonksiyonu yaz”promptu gönderilir. - Model 2 aday fonksiyon üretir.
- Her fonksiyon çalıştırılır:
- Geçerli Python mu? (
function_worksödülü) - Hile yapıyor mu? (
no_cheatingödülü) - 2048 oyununu kazanıyor mu? (
strategy_succeedsödülü)
- Geçerli Python mu? (
- Ödüller hesaplanır ve LoRA ağırlıkları güncellenir.
Eğitim başladığında şu çıktıyı göreceksiniz:
Copy to Clipboard
==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1 \ /| Num examples = 1,000 | Num Epochs = 1 | Total steps = 1000 O^O/ \_/ \ Batch size per device = 2 | Gradient accumulation steps = 1 \ / Data Parallel GPUs = 1 | Total batch size (2 x 1 x 1) = 2 "-____-" Trainable parameters = 46,227,456 of 20,960,984,640 (0.22% trained) `generation_config` default values have been modified to match model-specific defaults: {'max_length': 131072}. Unsloth: Will smartly offload gradients to save VRAM!
İlk adımlarda model çoğunlukla zaman aşımına uğrayan veya hata veren stratejiler üretir. Yaklaşık 150-200 adımdan sonra model geçerli stratejiler üretmeye başlar ve oyunları kazanmaya başlar. 1000 adım ve yaklaşık 4 saatlik eğitimden sonra model, orijinalinden çok daha iyi 2048 oynar.
Eğitim sırasında her adım için ödül değerlerini göreceksiniz:
Copy to Clipboard
def strategy(board): import random moves = "WASD" ... Steps = 1236 State = success
State = success gördüğünüzde model bir strateji üretmiş ve 2048’e ulaşmıştır. Eğitim tamamlandığında şu çıktıyı göreceksiniz:
Copy to Clipboard
TrainOutput(global_step=1000, training_loss=..., metrics={'train_runtime': ..., 'train_steps_per_second': ..., 'total_flos': 0.0, 'train_loss': ...})
Sonuç
8. Eğitilmiş Modelin Değerlendirilmesi
Eğitim sonrası notebook, modelin yeni bir strateji (Python fonksiyonu olarak) üretmesini test eder. Eğitilmiş model, oyun tahtasını analiz eden, boş hücreleri sayan ve olası birleştirmeleri tespit eden sofistike stratejiler üretir:
Copy to Clipboard
def strategy(board): def move(b, dir): n = len(b) new = [[0]*n for _ in range
Bu strateji, her hamlede boş hücre sayısını ve olası birleştirme fırsatlarını puanlar ve en yüksek puanlı hamleyi seçer. Bu, 2048 oyununda yaygın kullanılan bir sezgisel (heuristic) yaklaşımdır.
9. Kapatma
İşiniz bittiğinde konteynerden
exit ile çıkın. Jupyter sunucusunu önce Ctrl+C ile durdurun. Konteyner durur ama Docker imajı, model önbelleği ve eğitim çıktıları diskte kalır. Tekrar eğitime devam etmek için 3. adımdaki docker run komutunu tekrar çalıştırmanız yeterlidir.Eğitim sırasında kullanılan birleşik bellek (unified memory) kullanımı şu şekildedir:
- Boş Spark: ~4 GB
- Model yüklü (4-bit QLoRA): ~17 GB GPU + ~1 GB embedding offload
- Eğitim aktif: ~30 GB sistem toplam
- Boş bellek: ~90 GB
Aynı eğitim adımları GPT-OSS 120B modeli için uygulanırsa yaklaşık 68 GB birleşik bellek kullanılır — bu da DGX Spark‘ın 128 GB birleşik belleği içinde rahatça sığar.
Bu bağlantıyı görüntüleyebilmek için kayıt olmalı zaten üyeyseniz üye girişi yapmalısınız.