في هذا البرنامج التعليمي، نقوم ببناء نهاية إلى نهاية نفيديا نيمو أوتوموديل سير العمل في Google Colab واستخدم وحدة معالجة رسومات واحدة لاستكشاف نفس بنية التدريب المعتمدة على التكوين والتي تتوسع لتشمل بيئات موزعة متعددة وحدات معالجة الرسومات. نحن نتحقق من أجهزة CUDA المتوفرة ودعم الدقة، ونثبت NeMo AutoModel مباشرة من مستودع المصدر الخاص به، ونحمل وصفة الضبط الدقيق Qwen3-0.6B LoRA الرسمية، ونكيف برمجيًا إعدادات الدقة وحجم الدُفعة ونقاط التفتيش والجدولة لوقت تشغيل Colab المقيد. نقوم بعد ذلك بتشغيل الضبط الدقيق بكفاءة المعلمات من خلال واجهة سطر أوامر النموذج التلقائي، وتحديد موقع نقطة تفتيش LoRA التي تم إنشاؤها وإعادة تحميلها، ومقارنة المخرجات من النماذج الأصلية والمضبوطة بدقة. أخيرًا، نستخدم NeMoAutoModelForCausalLM من خلال واجهة برمجة تطبيقات Python لتوضيح كيفية قيام NeMo AutoModel بدمج مسارات التنفيذ المحسنة لـ NVIDIA مع الحفاظ على واجهة نموذج Hugging Face المألوفة.
إعداد مساحة عمل Colab ومساعد Shell
import os, sys, glob, json, subprocess, shutil, textwrap
REPO_DIR = "/content/Automodel"
WORK_DIR = "/content/automodel_demo"
CKPT_DIR = os.path.join(WORK_DIR, "checkpoints")
os.makedirs(WORK_DIR, exist_ok=True)
def sh(cmd, check=True):
print(f"\n$ {cmd}\n" + "-" * 78)
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, text=True, bufsize=1)
for line in p.stdout:
print(line, end="")
p.wait()
if check and p.returncode != 0:
raise RuntimeError(f"Command failed ({p.returncode}): {cmd}")
return p.returncode
نقوم باستيراد مكتبات Python الأساسية المطلوبة لمعالجة الملفات وتنفيذ العمليات وإدارة المسار والمخرجات المنسقة. نحن نحدد أدلة المستودع والعمل ونقاط التفتيش المستخدمة خلال سير العمل. نقوم أيضًا بإنشاء وظيفة أوامر shell قابلة لإعادة الاستخدام تعمل على دفق مخرجات الأوامر وإثارة الأخطاء عند فشل التنفيذ.
التحقق من وحدة معالجة الرسومات وتثبيت NeMo AutoModel
print("=" * 78)
print("STEP 0 — Checking GPU runtime")
print("=" * 78)
import torch
assert torch.cuda.is_available(), (
"No GPU found! In Colab: Runtime -> Change runtime type -> select a GPU."
)
GPU_NAME = torch.cuda.get_device_name(0)
BF16_OK = torch.cuda.is_bf16_supported()
VRAM_GB = torch.cuda.get_device_properties(0).total_memory / 1e9
print(f"GPU: {GPU_NAME} | VRAM: {VRAM_GB:.1f} GB | bf16 supported: {BF16_OK}")
print("\n" + "=" * 78)
print("STEP 1 — Installing NeMo AutoModel (takes a few minutes)")
print("=" * 78)
if not os.path.isdir(REPO_DIR):
sh(f"git clone --depth 1 https://github.com/NVIDIA-NeMo/Automodel.git {REPO_DIR}")
sh(f"pip -q install -e {REPO_DIR}")
sh("pip -q install pyyaml peft")
sh('python -c "import nemo_automodel; print(\'NeMo AutoModel version:\', '
'getattr(nemo_automodel, \'__version__\', \'source\'))"')
نحن نتحقق من أن وقت تشغيل Colab يوفر وحدة معالجة رسومات تدعم CUDA ونفحص اسمها وسعة الذاكرة ودعم bfloat16. نقوم باستنساخ مستودع NVIDIA NeMo AutoModel عندما لا يكون متاحًا بالفعل ونقوم بتثبيت الحزمة مباشرة من المصدر. نقوم بعد ذلك بتثبيت مكتبات YAML وPEFT الداعمة والتأكد من استيراد حزمة NeMo AutoModel بشكل صحيح.
تحميل وتصحيح وصفة Qwen3 LoRA
print("\n" + "=" * 78)
print("STEP 2 — Preparing the recipe")
print("=" * 78)
import yaml
candidates = sorted(glob.glob(
os.path.join(REPO_DIR, "examples", "llm_finetune", "qwen", "*0p6b*peft*.yaml")
)) or sorted(glob.glob(
os.path.join(REPO_DIR, "examples", "llm_finetune", "**", "*peft*.yaml"),
recursive=True,
))
assert candidates, "Could not find a PEFT recipe in the cloned repo."
BASE_RECIPE = candidates[0]
print(f"Base recipe: {os.path.relpath(BASE_RECIPE, REPO_DIR)}")
with open(BASE_RECIPE) as f:
cfg = yaml.safe_load(f)
print("\n--- Original recipe (as shipped) ---")
print(yaml.dump(cfg, sort_keys=False)[:2500])
def patch(node):
if isinstance(node, dict):
for k, v in list(node.items()):
if isinstance(v, str) and not BF16_OK and v.lower() in (
"bf16", "bfloat16", "torch.bfloat16"):
node[k] = "float32"
elif k in ("batch_size", "local_batch_size") and isinstance(v, int):
node[k] = min(v, 4)
elif k == "global_batch_size" and isinstance(v, int):
node[k] = min(v, 8)
else:
patch(v)
elif isinstance(node, list):
for item in node:
patch(item)
patch(cfg)
cfg.setdefault("step_scheduler", {})
cfg["step_scheduler"]["max_steps"] = 40
cfg["step_scheduler"]["ckpt_every_steps"] = 40
cfg["step_scheduler"]["num_epochs"] = 1
if isinstance(cfg.get("checkpoint"), dict):
cfg["checkpoint"]["enabled"] = True
cfg["checkpoint"]["checkpoint_dir"] = CKPT_DIR
DEMO_RECIPE = os.path.join(WORK_DIR, "qwen3_0p6b_colab_lora.yaml")
with open(DEMO_RECIPE, "w") as f:
yaml.dump(cfg, f, sort_keys=False)
print("\n--- Patched recipe (what we will actually run) ---")
print(yaml.dump(cfg, sort_keys=False)[:2500])
MODEL_ID = "Qwen/Qwen3-0.6B"
try:
MODEL_ID = cfg["model"]["pretrained_model_name_or_path"]
except Exception:
pass
print(f"\nBase model: {MODEL_ID}")
نقوم بتحديد موقع وصفة PEFT الرسمية، وتحميل تكوين YAML الخاص بها، وفحص إعدادات التدريب الأصلية. نحن نقوم بتكييف معلمات الدقة وحجم الدفعة بشكل متكرر لتناسب الوصفة على وحدة معالجة رسومات Colab واحدة مع الحفاظ على بنيتها الأصلية. نقوم أيضًا بتحديد مدة التدريب، وتكوين مخرجات نقطة التفتيش، وحفظ الوصفة المصححة، واستخراج معرف نموذج Hugging Face.
تشغيل LoRA Fine-Tuning على HellaSwag
print("\n" + "=" * 78)
print("STEP 3 — Training (LoRA fine-tune of Qwen3-0.6B on HellaSwag)")
print("=" * 78)
env_prefix = "HF_HUB_ENABLE_HF_TRANSFER=0 TOKENIZERS_PARALLELISM=false"
rc = sh(f"cd {WORK_DIR} && {env_prefix} automodel {DEMO_RECIPE}", check=False)
if rc != 0:
print("\nRetrying with legacy CLI syntax...")
sh(f"cd {WORK_DIR} && {env_prefix} automodel finetune llm -c {DEMO_RECIPE}")
أطلقنا الضبط الدقيق لـ Qwen3-0.6B LoRA على مجموعة بيانات HellaSwag من خلال واجهة سطر أوامر NeMo AutoModel. نقوم بإيقاف تشغيل ميزات النقل غير الضرورية لـ Hugging Face وتوازي الرمز المميز للحفاظ على تشغيل Colab بشكل أكثر قابلية للتنبؤ به. نقوم أيضًا بتضمين أمر احتياطي يدعم بناء جملة NeMo AutoModel CLI الأقدم عند فشل الاستدعاء الأساسي.
مقارنة مخرجات النموذج الأساسي والمضبوط بدقة
print("\n" + "=" * 78)
print("STEP 4 — Evaluating: base model vs LoRA fine-tuned model")
print("=" * 78)
from transformers import AutoModelForCausalLM, AutoTokenizer
DTYPE = torch.bfloat16 if BF16_OK else torch.float32
PROMPT = ("A man is sitting on a roof. He starts pulling up roofing shingles. "
"What happens next?")
def generate(model, tok, prompt, max_new_tokens=60):
inputs = tok(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
out = model.generate(**inputs, max_new_tokens=max_new_tokens,
do_sample=False, temperature=None, top_p=None,
pad_token_id=tok.eos_token_id)
return tok.decode(out[0][inputs["input_ids"].shape[1]:],
skip_special_tokens=True)
tok = AutoTokenizer.from_pretrained(MODEL_ID)
base = AutoModelForCausalLM.from_pretrained(
MODEL_ID, torch_dtype=DTYPE, device_map="cuda")
print("\n[BASE MODEL]")
print(textwrap.fill(generate(base, tok, PROMPT), 90))
ckpt_glob = sorted(glob.glob(os.path.join(CKPT_DIR, "**", "model"),
recursive=True))
if not ckpt_glob:
ckpt_glob = sorted(glob.glob(os.path.join(WORK_DIR, "**",
"adapter_model.safetensors"),
recursive=True))
ckpt_glob = [os.path.dirname(p) for p in ckpt_glob]
if ckpt_glob:
ADAPTER_DIR = ckpt_glob[-1]
print(f"\nFound checkpoint: {ADAPTER_DIR}")
try:
from peft import PeftModel
tuned = PeftModel.from_pretrained(base, ADAPTER_DIR)
print("\n[FINE-TUNED MODEL (base + LoRA adapter)]")
print(textwrap.fill(generate(tuned, tok, PROMPT), 90))
except Exception as e:
print(f"\nCould not auto-load the adapter with peft ({e}).")
print("Inspect the checkpoint contents manually:")
for p in glob.glob(os.path.join(ADAPTER_DIR, "*"))[:20]:
print(" ", p)
else:
print("\nNo checkpoint found — check the training logs above.")
del base
torch.cuda.empty_cache()
نقوم بتحميل الرمز المميز ونموذج اللغة السببية الأساسي، ونولد استجابة حتمية، وننشئ خط أساس للمقارنة. نحن نبحث في أدلة مخرجات التدريب عن أحدث نقاط تفتيش LoRA أو ملفات المحول التي تم إنشاؤها أثناء الضبط الدقيق. نقوم بعد ذلك بتوصيل المحول بـ PEFT، وإنشاء الاستجابة المضبوطة بدقة، وتحرير ذاكرة GPU بعد التقييم.
باستخدام NeMo AutoModel Python API
print("\n" + "=" * 78)
print("STEP 5 — Bonus: drop-in Python API")
print("=" * 78)
try:
from nemo_automodel import NeMoAutoModelForCausalLM
nm = NeMoAutoModelForCausalLM.from_pretrained(
MODEL_ID, torch_dtype=DTYPE).to("cuda")
print("[NeMoAutoModelForCausalLM]")
print(textwrap.fill(generate(nm, tok, "The key idea of LoRA is"), 90))
del nm
torch.cuda.empty_cache()
except Exception as e:
print(f"Python-API demo skipped on this version/GPU: {e}")
print("\n" + "=" * 78)
print("DONE! Where to go next:")
print("=" * 78)
print(f"""
1. Recipes to explore (in {REPO_DIR}/examples/):
llm_finetune/ — SFT + LoRA for Llama, Qwen, Gemma, Phi, GPT-OSS, ...
llm_pretrain/ — e.g. nanoGPT on FineWeb, DeepSeek-V3 pre-training
vlm_finetune/ — Qwen-VL, Gemma-3-VL, and other vision-language models
diffusion/ — FLUX / Wan / Qwen-Image LoRA fine-tuning
2. Swap the model: override one field —
automodel recipe.yaml --model.pretrained_model_name_or_path <any-HF-LM>
3. Scale out: the SAME recipe runs on 8 GPUs with `--nproc-per-node 8`,
or multi-node via the shipped slurm.sub / SkyPilot / Kubernetes launchers.
4. Docs: https://docs.nvidia.com/nemo/automodel/latest/index.html
""")
نعرض واجهة Python المباشرة عن طريق تحميل النموذج من خلال NeMoAutoModelForCausalLM وتشغيل مثال توليد إضافي. نحن نتعامل مع حالات الفشل الخاصة بالإصدار أو الخاصة بالأجهزة بأمان حتى يظل الكمبيوتر الدفتري مكتملًا بنجاح. نختتم بتقديم فئات الوصفات المتاحة، وبناء جملة تجاوز النموذج، وخيارات القياس الموزعة، ومسار التوثيق الرسمي.
خاتمة
في الختام، أنشأنا خط أنابيب NeMo AutoModel العملي الذي يغطي التحقق من البيئة، وتثبيت المصدر، وفحص الوصفة، وتصحيح التكوين، وتدريب LoRA، واسترداد نقطة التفتيش، وتقييم النموذج، واستدلال Python API المباشر. لقد رأينا كيف يقوم NeMo AutoModel بفصل استراتيجية التدريب الموزعة عن كود التطبيق عن طريق تحديد النموذج ومجموعة البيانات والمحسن والدقة والتوازي وسلوك نقطة التفتيش من خلال وصفات YAML القابلة لإعادة الاستخدام. على الرغم من أننا قمنا بتشغيل سير العمل على وحدة معالجة رسوميات Colab واحدة، إلا أننا احتفظنا بنفس البنية الموجهة نحو SPMD المستخدمة في عمليات نشر FSDP2 الأكبر حجمًا، ومتوازي الموتر، ومتوازي السياق، ومتوازي التسلسل، ومتوازي خطوط الأنابيب. إنه يمنحنا نقطة انطلاق ذات أساس تقني لتكييف نموذج اللغة الإضافي ولغة الرؤية والتدريب المسبق ووصفات النشر مع توسيع نطاق سير العمل نفسه من التجريب إلى البنية التحتية لـ NVIDIA متعددة العقد.
تحقق من الكود الكامل هنا . أيضا، لا تتردد في متابعتنا على تغريد ولا تنسى الانضمام إلينا 150 ألف + مل والاشتراك في النشرة الإخبارية لدينا. انتظر! هل أنت على برقية؟ الآن يمكنك الانضمام إلينا على التليجرام أيضًا.
هل تحتاج إلى الشراكة معنا للترويج لصفحة GitHub Repo أو صفحة الوجه المعانقة أو إصدار المنتج أو الندوة عبر الويب وما إلى ذلك؟ تواصل معنا
سناء حسن، مستشارة متدربة في Marktechpost وطالبة بدرجة مزدوجة في IIT Madras، شغوفة بتطبيق التكنولوجيا والذكاء الاصطناعي لمواجهة تحديات العالم الحقيقي. ومع اهتمامه الشديد بحل المشكلات العملية، فهو يقدم منظورًا جديدًا للتقاطع بين الذكاء الاصطناعي وحلول الحياة الواقعية.
اكتشاف المزيد من كحيل | أخبار التقنية
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.
