TRL documentation
İşlerle Eğitim
İşlerle Eğitim
Hugging Face Jobs, eğitimlerinizi Hugging Face GPU'larında çalıştırır. Her çalıştırma için donanımı siz seçersiniz ve yalnızca çalıştığı saniyeler için ödeme yaparsınız. --push_to_hub ile eğitim tamamlanınca model Hub'a yüklenir.
Bu kılavuzda şunları öğreneceksiniz:
- Bir komutla TRL eğitim betiğini başlatın
- Bir çalışmayı izleyin ve kayıp eğrilerini görüntüleyin
- Donanım ayarları dosyada bulunan kendi betiğinizi çalıştırın
- Kontrol noktalarını koruyun ve yarıda kalan çalıştırmayı yeniden başlatın
- Birden fazla GPU üzerinde eğitim
Genel olarak Jobs'un nasıl çalıştığı, donanım ve fiyatlandırma dahil, Jobs belgeleri'ne bakın.
Gereksinimler
- Pozitif kredi bakiyesi olan bir Hugging Face hesabı. İşler kullanım başına ücretlendirilir: yalnızca kullandığınız saniyeler için ödeme yaparsınız.
- Hugging Face Hub'a giriş yapıldı (
hf auth login)
İlk çalışma
Bu komut, TRL SFT betiğiyle Capybara sohbet veri setinde Qwen2-0.5B-Instruct modelini ince ayarlar, ardından modeli hesabınıza yükler:
hf jobs uv run \
--flavor a10g-small \
--timeout 30m \
--secrets HF_TOKEN \
-- \
https://raw.githubusercontent.com/huggingface/trl/refs/heads/main/trl/scripts/sft.py \
--model_name_or_path Qwen/Qwen2-0.5B-Instruct \
--dataset_name trl-lib/Capybara \
--max_steps 100 \
--output_dir Qwen2-0.5B-SFT \
--push_to_hubfrom huggingface_hub import run_uv_job
run_uv_job(
"https://raw.githubusercontent.com/huggingface/trl/refs/heads/main/trl/scripts/sft.py",
flavor="a10g-small",
timeout="30m",
secrets={"HF_TOKEN": "hf_..."},
script_args=[
"--model_name_or_path", "Qwen/Qwen2-0.5B-Instruct",
"--dataset_name", "trl-lib/Capybara",
"--max_steps", "100",
"--output_dir", "Qwen2-0.5B-SFT",
"--push_to_hub",
],
)İşlem birkaç dakika sürer ve a10g-small üzerinde maliyeti 1 doların çok altındadır. -- işaretinden önceki seçenekler Jobs’a aittir: donanım, süre sınırı ve modelin gönderilmesinde kullanılan jeton. --secrets HF_TOKEN, oturum açarken kullandığınız jetonu iletir. Python’da jetonun kendisini iletin. Betik URL’sinden sonraki argümanlar betiğe gider. hf jobs uv run, Python betiğini uv ile çalıştırır. sft.py, bağımlılıklarını dosyanın başındaki bir başlıkta listeler, bu sayede Jobs betik başlamadan önce TRL’yi yükler. Betik çıktığında Job durur ve faturalandırma da onunla birlikte sona erer.
--max_steps 100 bu ilk çalışmayı kısa tutar. Tam çalıştırmada bunu kaldırın: üç epoch, yani betiğin varsayılanı, a10g-small üzerinde birkaç saat sürer; bu nedenle --timeout değerini buna göre artırın, örneğin --timeout 3h. Jobs, zaman aşımına ulaşıldığında çalışmayı durdurur; bu süre varsayılan olarak 30 dakikadır. a100-large gibi daha büyük bir GPU daha kısa sürede tamamlar. Lezzetler ve fiyatları için Donanım bölümüne bakın.
Çalışmayı takip edin
hf jobs uv run komutu, çalıştırma bitene kadar günlükleri (log) akış olarak gösterir ve terminalinizi açık tutar. Ctrl+C yalnızca günlük akışını durdurur; Job çalışmaya devam eder. Job ID’sini hemen almak için --detach ekleyin, ardından:
hf jobs logs -f <job_id> # stream the logs
hf jobs ps # list your running Jobs
hf jobs inspect <job_id> # status, and the error message if it failed
hf jobs cancel <job_id> # stop itDaha fazla bilgi için İşleri Yönet bölümüne bakın.
Kayıp eğrileri için TRL, Trackio üzerinden kayıt yapar. Panoya bir Space adı vermek için --env TRACKIO_SPACE_ID=<your-username>/trackio ifadesini -- öncesine, --report_to trackio ifadesini ise betik URL'si sonrasında ekleyin. Trackio, Space ve metrikler için bir varlık kovası yoksa bunları oluşturur. Her ikisi de varsayılan olarak herkese açıktır. Transformers'ın desteklediği diğer izleyiciler de çalışır. Weights & Biases için --with wandb --secrets WANDB_API_KEY ifadesini -- öncesine ve --report_to wandb ifadesini betik URL'si sonrasında ekleyin. --secrets WANDB_API_KEY, değeri yerel ortamınızdaki WANDB_API_KEY değişkeninden okur. Bunları iletmenin diğer yolları için ortam değişkenleri ve gizli anahtarlar bölümüne bakın.
Kendi betiğinizi çalıştırın
Eğitim kodunuzu bir Python dosyasına (örneğin, train.py) yazın. Bağımlılıklarını, TRL betiklerinin yaptığı gibi, dosyanın başındaki betik başlığına listeleyin. İşler, betik başlamadan önce bunları yükler:
# /// script
# dependencies = [
# "trl",
# "peft",
# ]
# ///
from datasets import load_dataset
from peft import LoraConfig
from trl import SFTConfig, SFTTrainer
dataset = load_dataset("trl-lib/Capybara", split="train")
trainer = SFTTrainer(
model="Qwen/Qwen2.5-0.5B",
train_dataset=dataset,
peft_config=LoraConfig(),
args=SFTConfig(output_dir="Qwen2.5-0.5B-SFT", max_steps=100),
)
trainer.train()
trainer.push_to_hub()Ardından hf jobs CLI veya Python API'si ile başlatın:
hf jobs uv run \
--flavor a10g-small \
--timeout 30m \
--secrets HF_TOKEN \
train.pyfrom huggingface_hub import run_uv_job
run_uv_job(
"train.py",
flavor="a10g-small",
timeout="30m",
secrets={"HF_TOKEN": "hf_..."},
)Başlık içermeyen bir betik için, bağımlılıkları başlatma sırasında --with ile, paket başına bir kez listelemelisiniz: --with trl --with peft (Python'da dependencies=["trl", "peft"]). Betik ayrıca bir URL de olabilir; örneğin bir GitHub raw bağlantısı, bir Gist veya herkese açık bir Hub deposundaki dosya.
Başlatma ayarları betiğin içinde de tutulabilir. Başlıktaki [tool.hf-jobs] tablosu donanımı, zaman aşımını ve gizli bilgileri belirler:
# /// script
# dependencies = [
# "trl",
# "peft",
# ]
#
# [tool.hf-jobs]
# flavor = "a10g-small"
# timeout = "30m"
# secrets = ["HF_TOKEN"]
# ///hf jobs uv run train.py artık seçenek gerektirmez ve geçirdiğiniz bir seçenek yine de betiği devre dışı bırakır. Betik, çalışması için gereken her şeyi içerdiğinden, hangi GPU ve zaman aşımına ihtiyaç duyduğunuzu hatırlamadan onu paylaşabilir veya daha sonra geri dönebilirsiniz. hf jobs uv run --dry-run train.py çözümlenen ayarları gösterir ve betikten gelen değerleri işaretler. Tablo yalnızca hf CLI tarafından okunur: run_uv_job() bunu yok sayar. Başlatma yapılandırmasını betikte tanımlayın bölümüne bakın.
Herhangi bir TRL betiğini çalıştırın
Aynı desen, TRL eğitimci betiklerinin (SFT, DPO, GRPO, ödül modelleme ve diğerleri) tümünde ve Örnekler Dizinindeki bağımsız .py örneklerinde uygulanır. Her biri bağımlılıklarını bir betik başlığında bildirir. Yanındaki diğer dosyaları okuyan bir örneğin, klasörünün İşe (Job) bağlanması gerekir. Yerel dizinler bölümüne bakın. Sadece defter (notebook) olan örnekler bu şekilde gönderilemez. Betik argümanları, betiği yerel olarak çalıştırdığınızda kullandığınız argümanlarla aynıdır.
Kontrol noktalarını koru
Bir Job sona erdiğinde, zaman aşımına uğradığında veya başarısız olduğunda Job'un diski silinir. Uzun süreli çalıştırmalarda, checkpoint'leri Job'un dışında kaydedin ki Job sona erdiğinde de korunabilsinler.
En basit yöntem, her kontrol noktası kaydedildikçe çıktı model deposuna göndermektir:
hf jobs uv run \
--flavor a10g-small \
--timeout 3h \
--secrets HF_TOKEN \
-- \
https://raw.githubusercontent.com/huggingface/trl/refs/heads/main/trl/scripts/sft.py \
--model_name_or_path Qwen/Qwen2-0.5B-Instruct \
--dataset_name trl-lib/Capybara \
--output_dir Qwen2-0.5B-SFT \
--push_to_hub \
--save_steps 500 \
--hub_strategy checkpointfrom huggingface_hub import run_uv_job
run_uv_job(
"https://raw.githubusercontent.com/huggingface/trl/refs/heads/main/trl/scripts/sft.py",
flavor="a10g-small",
timeout="3h",
secrets={"HF_TOKEN": "hf_..."},
script_args=[
"--model_name_or_path", "Qwen/Qwen2-0.5B-Instruct",
"--dataset_name", "trl-lib/Capybara",
"--output_dir", "Qwen2-0.5B-SFT",
"--push_to_hub",
"--save_steps", "500",
"--hub_strategy", "checkpoint",
],
)--hub_strategy checkpoint ile, optimizör durumu dahil en son checkpoint, repodaki last-checkpoint klasöründe tutulur. Kesintiye uğrayan bir çalıştırmayı sürdürmek için repoyu yeni bir Job'a bağlayın ve o klasörden devam edin: komutu, -- öncesine --volume hf://<your-username>/Qwen2-0.5B-SFT:/previous ve script URL'si sonrasına --resume_from_checkpoint /previous/last-checkpoint ekleyerek başlatın.
Model deposunun dışında birkaç kontrol noktası tutmak için bunları bir Storage Bucket'a yazın. hf buckets create <your-username>/checkpoints --private ile bir tane oluşturun, Job'a bağlayın ve --output_dir parametresini buna yönlendirin:
hf jobs uv run \
--flavor a10g-small \
--timeout 3h \
--secrets HF_TOKEN \
--volume hf://buckets/<your-username>/checkpoints:/checkpoints \
-- \
https://raw.githubusercontent.com/huggingface/trl/refs/heads/main/trl/scripts/sft.py \
--model_name_or_path Qwen/Qwen2-0.5B-Instruct \
--dataset_name trl-lib/Capybara \
--output_dir /checkpoints/Qwen2-0.5B-SFT \
--save_steps 500from huggingface_hub import Volume, run_uv_job
run_uv_job(
"https://raw.githubusercontent.com/huggingface/trl/refs/heads/main/trl/scripts/sft.py",
flavor="a10g-small",
timeout="3h",
secrets={"HF_TOKEN": "hf_..."},
volumes=[Volume(type="bucket", source="<your-username>/checkpoints", mount_path="/checkpoints")],
script_args=[
"--model_name_or_path", "Qwen/Qwen2-0.5B-Instruct",
"--dataset_name", "trl-lib/Capybara",
"--output_dir", "/checkpoints/Qwen2-0.5B-SFT",
"--save_steps", "500",
],
)Yarıda kalan bir çalıştırmayı sürdürmek için, aynı komutu --resume_from_checkpoint /checkpoints/Qwen2-0.5B-SFT/checkpoint-<step> ile tekrar başlatın. Daha fazla bilgi için İlerledikçe bir kovaya yazma ve bağlama seçenekleri için Volume'lar bölümüne bakın.
Her checkpoint, model ve optimizator durumunu, model boyutunun birkaç katı kadar alan tutar. Sadece en son olanları tutmak için
--save_total_limit 2ekleyin. Ayrıca--push_to_hubgeçirirseniz,--hub_model_idayarlayın veya depo, çıktı yolunun son kısmıyla adlandırılır.
Birden fazla GPU
Birden fazla GPU içeren bir flavor, çalışmayı kısaltır. Bunun için, TRL ve Accelerate kurulu huggingface/trl görüntüsüyle, bir betik yerine bir Docker görüntüsünde komut çalıştıran hf jobs run komutunu kullanın. Ardından GPU başına bir süreç başlatın. Bu, TRL betikleri ve kendi eğitim kodunuz için geçerlidir.
Bir TRL betiğini hızlandırma
Bu kılavuzun başlangıcındaki SFT çalıştırması, dört GPU üzerinde:
hf jobs run \
--flavor l4x4 \
--timeout 30m \
--secrets HF_TOKEN \
huggingface/trl \
-- \
trl sft --nproc_per_node 4 \
--model_name_or_path Qwen/Qwen2-0.5B-Instruct \
--dataset_name trl-lib/Capybara \
--max_steps 100 \
--output_dir Qwen2-0.5B-SFT \
--push_to_hubfrom huggingface_hub import run_job
run_job(
image="huggingface/trl",
command=[
"trl", "sft", "--nproc_per_node", "4",
"--model_name_or_path", "Qwen/Qwen2-0.5B-Instruct",
"--dataset_name", "trl-lib/Capybara",
"--max_steps", "100",
"--output_dir", "Qwen2-0.5B-SFT",
"--push_to_hub",
],
flavor="l4x4",
timeout="30m",
secrets={"HF_TOKEN": "hf_..."},
)trl CLI, --nproc_per_node parametresini torchrun komutuna iletir. Bu değeri, flavor'daki GPU sayısına, burada dört L4'e, ayarlayın. Her süreç kendi batch'ini alır, bu nedenle etkin batch boyutu, tek GPU'lu bir çalıştırmanın dört katıdır. Bu çalıştırma birkaç dakika sürer. --max_steps kullanılmadığında, tam üç epoch yaklaşık bir saat sürer; bu yüzden --timeout değerini, örneğin 2h olarak artırın.
Kendi betiğiniz
TRL betikleriyle sınırlı değilsiniz. Yerel olarak torchrun ile çalışan eğitim kodu, imajın ihtiyaç duyduğu paketlere sahip olduğu sürece Jobs üzerinde aynı şekilde çalışır. Örneğin, kendi ödül fonksiyonunuza sahip bir GRPO betiğini bir klasörde train_grpo.py olarak kaydedin ve bu klasörü Job'a bağlayın. Jobs, klasörü özel bir kovaya yükler ve salt okunur olarak bağlar:
hf jobs run \
--flavor l4x4 \
--timeout 30m \
--secrets HF_TOKEN \
--volume ./my-project:/code \
huggingface/trl \
-- \
torchrun --nproc_per_node 4 /code/train_grpo.pyfrom huggingface_hub import run_job, sync_job_volume
code = sync_job_volume("./my-project", "/code")
run_job(
image="huggingface/trl",
command=["torchrun", "--nproc_per_node", "4", "/code/train_grpo.py"],
flavor="l4x4",
timeout="30m",
secrets={"HF_TOKEN": "hf_..."},
volumes=[code],
)Betik, imajda TRL yüklü olduğu için çalışır, bu nedenle betik başlığına gerek yoktur. GRPOTrainer varsayılan olarak tamamlamaları transformers ile üretir, bu yüzden bu işlem vLLM sunucusu olmadan tek bir Job içinde çalışır. Daha hızlı üretim için vLLM Entegrasyonu bölümüne bakın. Bir sonraki bölüm, hf jobs run'un imajı nasıl kullandığını açıklar.
Docker Görselleri
Jobs, uv ile betiğinizi çalıştırır; bu araç, betiğin # /// script başlığında belirtilen bağımlılıkları taze bir ortama yükler. Bu nedenle betiğinizin içe aktardığı TRL, imajdan değil, o başlıktan gelir ve yukarıdaki hf jobs uv run örnekleri için --image parametresine hiç gerek yoktur.
TRL önceden yüklü bir Docker görüntüsü huggingface/trl adresinde mevcuttur. Bu görüntüyü hf jobs uv run komutuna iletirseniz, işe CUDA araç zinciri gibi görüntünün sistem katmanı sağlanır; bu, bu zincire karşı derlenen bağımlılıklar için önemlidir:
hf jobs uv run \
--flavor a100-large \
--secrets HF_TOKEN \
--image huggingface/trl \
train.pyfrom huggingface_hub import run_uv_job
run_uv_job(
"train.py",
flavor="a100-large",
secrets={"HF_TOKEN": "hf_..."},
image="huggingface/trl",
)Görselde yüklü olan TRL’yi çalıştırmak için bunun yerine hf jobs run kullanın. Bu komut, çözümlenmesi gereken bir betik başlığı olmadan doğrudan görselde bir komut çalıştırır; bu nedenle yürütülen, görselin kendi TRL’sidir. --, komutu Jobs seçeneklerinden ayırır; komutun kendisi seçenekler aldığında bu gereklidir:
hf jobs run \
--flavor a100-large \
--secrets HF_TOKEN \
huggingface/trl \
-- \
trl sft --model_name_or_path Qwen/Qwen2-0.5B-Instruct --dataset_name trl-lib/Capybara --output_dir Qwen2-0.5B-SFTfrom huggingface_hub import run_job
run_job(
image="huggingface/trl",
command=[
"trl", "sft",
"--model_name_or_path", "Qwen/Qwen2-0.5B-Instruct",
"--dataset_name", "trl-lib/Capybara",
"--output_dir", "Qwen2-0.5B-SFT",
],
flavor="a100-large",
secrets={"HF_TOKEN": "hf_..."},
)Görsel üç tür etiket altında yayınlanır:
| Etiket | İçindekiler |
|---|---|
X.Y.Z | O sürümün yayınlandığı anda derlenen TRL sürümü |
latest | En son sürüm |
dev | Her birleşimde yeniden oluşturulan main dalı |
dev kullanılarak, main üzerinde mevcut olup henüz yayınlanmamış bir düzeltmeyi denemek için geliştirme sürümü çalıştırılabilir:
hf jobs run \
--flavor a100-large \
--secrets HF_TOKEN \
huggingface/trl:dev \
-- \
trl sft --model_name_or_path Qwen/Qwen2-0.5B-Instruct --dataset_name trl-lib/Capybara --output_dir Qwen2-0.5B-SFTfrom huggingface_hub import run_job
run_job(
image="huggingface/trl:dev",
command=[
"trl", "sft",
"--model_name_or_path", "Qwen/Qwen2-0.5B-Instruct",
"--dataset_name", "trl-lib/Capybara",
"--output_dir", "Qwen2-0.5B-SFT",
],
flavor="a100-large",
secrets={"HF_TOKEN": "hf_..."},
)Etiketler yalnızca imajda kurulu olanı seçer, bu nedenle hf jobs run için önemlidir. hf jobs uv run ile sürüm, script başlığından gelir ve etiket, hangi TRL'in içe aktarıldığı konusunda fark yaratmaz.
İkisini birleştirerek uv'un betik başlığını çözerken bazı importların hâlâ imgeden gelmesini sağlamak için ek bayraklar gerekir. Bu biçim ve gerektirdiği yollar için İmgelerin paketlerini yeniden kullanın ve bağımlılıkları UV ile ekleyin bölümüne bakın.
Jobs, Hugging Face Spaces veya Docker Hub'dan bir Docker görüntüsü üzerinde çalışır, bu nedenle herhangi bir özel görüntüyü de belirtebilirsiniz:
hf jobs uv run \
--flavor a100-large \
--secrets HF_TOKEN \
--image <docker-image> \
train.pyfrom huggingface_hub import run_uv_job
run_uv_job(
"train.py",
flavor="a100-large",
secrets={"HF_TOKEN": "hf_..."},
image="<docker-image>",
)Update on GitHubTRL Jobs sarmalayıcısı, bazı modeller için önceden ayarlanmış yapılandırmalarla TRL betiklerini Jobs üzerinde başlatır; örneğin
trl-jobs sft --model_name Qwen/Qwen3-0.6B --dataset_name trl-lib/Capybara.