GCP پر HashiCorp Packer کا استعمال کرتے ہوئے GPU سے بہتر مشین کی تصویر کیسے بنائی جائے۔

جب بھی آپ اپنے GPU انفراسٹرکچر کو گھماؤ گے تو آپ وہی کام کریں گے۔ اس کا مطلب ہے CUDA ڈرائیورز، DCGM انسٹال کرنا، OS-level GPU ٹیوننگ لگانا، اور انحصار کے مسائل کو حل کرنا۔ ہر بار وہی پرانی رسومات، مہنگے کلاؤڈ کریڈٹ کو ضائع کرنا اور حقیقی کام شروع ہونے سے پہلے ہی مایوسی محسوس کرنا۔

اس آرٹیکل میں، ہم پیکر کا استعمال کرتے ہوئے دوبارہ قابل استعمال GPU-آپٹمائزڈ مشین امیج بناتے ہیں، جو NVIDIA ڈرائیورز، CUDA ٹول کٹ، NVIDIA کنٹینر ٹول کٹ، اور سسٹم لیول GPU ٹیوننگ جیسے DCGM اور پرسسٹینس موڈ کے ساتھ پہلے سے لوڈ ہوتی ہے۔

انڈیکس

شرطیں

  • HashiCorp Packer >= 1.9

  • گوگل کمپیوٹ پیکر پلگ ان (بذریعہ انسٹال) packer init)

  • آپ اپنی EC2 بلڈز میں استعمال کرنے کے لیے اختیاری طور پر AWS Packer پلگ ان شامل کر سکتے ہیں۔ amazon-ebs چٹنی node.pkr.hcl

  • کمپیوٹ انجن API کے ساتھ ایک GCP پروجیکٹ (یا EC2 رسائی والا AWS اکاؤنٹ)

  • جی سی پی سرٹیفیکیشن (gcloud auth application-default login) یا AWS اسناد

  • NVIDIA GPU مثال کی اقسام تک رسائی (جیسے A100, H100, L4 GCP پر, p4d, p5, G6 AWS پر)

پروجیکٹ کی ترتیبات

مرحلہ 1: پیکر انسٹال کریں۔

شروع کرنے کے لیے، اگر آپ macOS استعمال کر رہے ہیں تو پیکر انسٹال کرنے کے لیے نیچے دیے گئے مراحل پر عمل کریں (یا آپ ہمارے لینکس اور ونڈوز انسٹالیشن گائیڈز میں موجود آفیشل دستاویزات کی پیروی بھی کر سکتے ہیں)۔

سب سے پہلے، اپنے ٹرمینل سے آفیشل پیکر آفیشل انسٹال کریں۔

HashiCorp ٹیب کو انسٹال کریں، جو کہ تمام Hashicorp پیکجوں کا ذخیرہ ہے۔

$ brew tap hashicorp/tap

اب پیکر انسٹال کریں۔ hashicorp/tap/packer.

$ brew install hashicorp/tap/packer

مرحلہ 2: پروجیکٹ ڈائرکٹری ترتیب دیں۔

پیکر انسٹال ہونے کے بعد، یہ ایک پروجیکٹ ڈائرکٹری بنائے گا۔ کلین کوڈ اور خدشات کو الگ کرنے کے لیے، آپ کی پروجیکٹ ڈائرکٹری اس طرح نظر آنی چاہیے: درج ذیل فائلیں بنانا جاری رکھیں: packer_demo نیچے دی گئی کمانڈ کا استعمال کرتے ہوئے ایک فولڈر بنائیں۔

mkdir -p packer_demo/script && touch packer_demo/{build.pkr.hcl,source.pkr.hcl,variable.pkr.hcl,local.pkr.hcl,plugins.pkr.hcl,values.pkrvars.hcl} packer_demo/script/base.sh

فائل ڈائرکٹری ہونا چاہئے:

packer_demo
├── build.pkr.hcl                 # Build pipeline — provisioner ordering
├── source.pkr.hcl                # GCP source definition (googlecompute)
├── variable.pkr.hcl              # Variable definitions with defaults
├── local.pkr.hcl                 # Local values
├── plugins.pkr.hcl                # Packer plugin requirements
├── values.pkrvars.hcl             # variable values (copy and customize)
├── script/
│   ├── base.sh                  # requirement script 

مرحلہ 3: پیکر پلگ ان انسٹال کریں۔

آپ کا plugins.pkr.hcl file,اپنے پلگ ان کی وضاحت کریں۔ packer block. کہ packer {} بلاک میں پیکر کی ترتیبات شامل ہیں، بشمول مطلوبہ پلگ ان ورژن کی وضاحت کرنا۔ آپ تلاش کر سکتے ہیں required_plugins پیکر بلاکس کا ایک بلاک جو تصویر بنانے کے لیے ٹیمپلیٹ کے لیے درکار تمام پلگ ان کی وضاحت کرتا ہے۔ اگر آپ Azure یا AWS استعمال کر رہے ہیں، تو آپ یہاں تازہ ترین پلگ ان تلاش کر سکتے ہیں۔

packer {
  required_plugins {
    googlecompute = {
      source  = "github.com/hashicorp/googlecompute"
      version = "~> 1"
    }
  }
}

پھر نیچے دی گئی کمانڈ کا استعمال کرتے ہوئے پیکر پلگ ان کو شروع کریں:

packer init .

مرحلہ 4: ذرائع کی وضاحت کریں۔

پلگ ان شروع ہونے کے بعد، اب آپ سورس بلاکس کی وضاحت کر سکتے ہیں۔ سورس بلاک ایک مخصوص بلڈر پلگ ان کو تشکیل دیتا ہے اور پھر اسے بلڈ بلاک کے ذریعہ بلایا جاتا ہے۔ سورس بلاک میں project IDوہ علاقہ جہاں مشین بنائی جائے گی، source_image_family (اس کو بنیادی تصویر کے طور پر سوچیں جیسے ڈیبین، اوبنٹو، وغیرہ) source_image_project_id.

GCP ہر ایک کی تصویری پروجیکٹ ID ہے، جیسے Ubuntu کے لیے ‘ubuntu-os-Cloud’۔ تم ہو machine type چونکہ ہم ایک GPU مشین کے لیے ایک بنیادی تصویر بنا رہے ہیں، اس لیے ہم اسے GPU مشین کی قسم میں شامل کر رہے ہیں، لہذا ہمیں اس مشین پر کمانڈ چلانے کے قابل ہونے کی ضرورت ہے جس پر ہم اسے بنا رہے ہیں۔

source "googlecompute" "gpu-node" {
  project_id              = var.project_id
  zone                    = var.zone
  source_image_family     = var.image_family
  source_image_project_id = var.image_project_id
  ssh_username            = var.ssh_username
  machine_type            = var.machine_type



  image_name        = var.image_name
  image_description = var.image_description

  disk_size           = var.disk_size
  on_host_maintenance = "TERMINATE"

  tags = ["gpu-node"]

}

ماحول on_host_maintenance = "TERMINATE" Google Cloud Compute Engine لائیو منتقلی کے بجائے بنیادی ڈھانچے کی دیکھ بھال کے دوران VM مثالوں کو روکنے کی اجازت دیتا ہے۔ یہ اس وقت اہم ہے جب GPUs یا خصوصی ہارڈ ویئر استعمال کرتے ہیں جنہیں ڈیٹا کی بدعنوانی کو روکنے کے لیے منتقل نہیں کیا جا سکتا۔

تمام متغیرات ہیں۔ variable.pkr.hcl فائل میں ویلیو سیٹ کریں۔ values.pkrvars.hcl. ہمیشہ شامل کرنا یاد رکھیں values.pkrvars.hcl فائل Gitignore کو بھیجیں۔

variable "image_name" {
  type        = string
  description = "The name of the resulting image"
}

variable "image_description" {
  type        = string
  description = "Description of the image"
}

variable "project_id" {
  type        = string
  description = "The GCP project ID where the image will be created"
}

variable "image_family" {
  type        = string
  description = "The image family to which the resulting image belongs"
}

variable "image_project_id" {
  type        = list(string)
  description = "The project ID(s) to search for the source image"
}

variable "zone" {
  type        = string
  description = "The GCP zone where the build instance will be created"
}

variable "ssh_username" {
  type        = string
  description = "The SSH username to use for connecting to the instance"
}
variable "machine_type" {
  type        = string
  description = "The machine type to use for the build instance"
}

variable "cuda_version" {
  type        = string
  description = "CUDA toolkit version"
  default     = "13.1"
}

variable "driver_version" {
  type        = string
  description = "NVIDIA driver version"
  default     = "590.48.01"
}

variable "disk_size" {
  type        = number
  description = "Boot disk size in GB"
  default     = 50
}

values.pkrvars.hcl

image_name        = "base-gpu-image-{{timestamp}}"
image_description = "Ubuntu 24.04 LTS with gpu drivers and health checks"
project_id        = "your gcp project id"
image_family      = "ubuntu-2404-lts-amd64"
image_project_id  = ["ubuntu-os-cloud"]
zone              = "us-central1-a"
ssh_username      = "packer"
machine_type      = "g2-standard-4"
disk_size        = 50
driver_version   = "590.48.01"
cuda_version      = "13.1" 

مرحلہ 5: ایک بلڈ ٹیمپلیٹ بنائیں

بنانا build.pkr.hcl. کہ build بلاکس عارضی مثالیں بناتے ہیں، پروویژنرز چلاتے ہیں، اور تصاویر بناتے ہیں۔

اس سانچے میں فراہم کنندہ کو اس طرح ترتیب دیا گیا ہے:

  • پہلا کمیشن سسٹم اپڈیٹس اور اپ گریڈز چلائیں۔

  • دوسرا کمیشن مثال کو دوبارہ شروع کریں (expect_disconnect = true

  • تھرڈ پارٹی فیس مثال کے واپس آنے کا انتظار کریں (pause_before) اور پھر چلتا ہے: script/base.sh. یہ فراہم کنندہ ترتیب دیتا ہے: max_retries عارضی SSH ٹائم آؤٹ کو ہینڈل کرتا ہے اور ماحولیاتی متغیرات کو پاس کرتا ہے۔ DRIVER_VERSION اور CUDA_VERSION.

آخر میں، ایک پوسٹ پروسیسر ہے جو تصویر کی شناخت اور تکمیل کی حیثیت فراہم کرتا ہے۔

build {
  sources = ["source.googlecompute.gpu-node"]

  provisioner "shell" {
    inline = [
      "set -e",
      "sudo apt update",
      "sudo apt -y dist-upgrade"
    ]
  }

  provisioner "shell" {
    expect_disconnect = true
    inline            = ["sudo reboot"]
  }

  # Base: NVIDIA drivers, CUDA, DCGM
  provisioner "shell" {
    pause_before = "60s"
    script       = "script/base.sh"
    max_retries  = 2
    environment_vars = [
      "DRIVER_VERSION=${var.driver_version}",
      "CUDA_VERSION=${var.cuda_version}"
    ]
  }

  post-processor "shell-local" {
    inline = [
      "echo '=== Image Build Complete ==='",
      "echo 'Image ID: ${build.ID}'",
      "date"
    ]
  }
}

مرحلہ 6: GPU پروویژننگ اسکرپٹ لکھیں۔

اب آئیے بنیادی رسم الخط پر ایک نظر ڈالتے ہیں اور اس کے کچھ حصوں کا تجزیہ کرتے ہیں۔

NVIDIA ڈرائیوروں کو انسٹال کرنے سے پہلے، آپ کے سسٹم کو کرنل ہیڈرز اور بلٹ ٹولز کی ضرورت ہوگی۔ NVIDIA ڈرائیور انسٹالیشن کے دوران DKMS کے ذریعے کرنل ماڈیولز مرتب کرتے ہیں، لہذا اگر چلانے والے کرنل کے ہیڈرز غائب ہیں، تو تعمیر خاموشی سے ناکام ہو جائے گی اور ڈرائیور بوٹ پر لوڈ نہیں ہو گا۔

log "Installing kernel headers and build tools..."
sudo apt-get install -qq -y 
  "linux-headers-$(uname -r)" 
  build-essential 
  dkms 
  curl 
  wget

سیکشن 2: NVIDIA کا Apt ذخیرہ انسٹال کریں۔

یہ کوڈ کا ٹکڑا آپ کے OS لینکس کی تقسیم کی بنیاد پر NVIDIA کے آفیشل کیرنگ پیکج کو ڈاؤن لوڈ اور انسٹال کرتا ہے۔ یہ پیکج CUDA پیکجوں کی تصدیق کے لیے سسٹم کو درکار قابل اعتماد دستخطی کلیدوں کو شامل کرتا ہے۔

log "Adding NVIDIA CUDA apt repository (${DISTRO})..."
wget -q "https://developer.download.nvidia.com/compute/cuda/repos/({DISTRO}/){ARCH}/cuda-keyring_1.1-1_all.deb" 
  -O /tmp/cuda-keyring.deb
sudo dpkg -i /tmp/cuda-keyring.deb
rm /tmp/cuda-keyring.deb
sudo apt-get update -qq

سیکشن 3: NVIDIA ڈرائیور ورژن فکسڈ

NVIDIA ڈرائیور کو کسی مخصوص ورژن میں پن کرنا یقینی بناتا ہے کہ سسٹم ہمیشہ اس درست ڈرائیور ورژن کو انسٹال اور استعمال کرتا رہے گا، چاہے ایک نیا ڈرائیور ریپوزٹری میں ظاہر ہو۔

NVIDIA ڈرائیوروں کو CUDA ٹول کٹ ورژن، کرنل ورژن، اور کنٹینر رن ٹائمز جیسے Docker یا NVIDIA کنٹینر ٹول کٹ کے ساتھ مضبوطی سے جوڑا جاتا ہے۔

تضادات، جیسے کہ جب کوئی سسٹم خود بخود جدید ترین ڈرائیور میں اپ گریڈ ہو جاتا ہے، تو CUDA کے کام کرنا بند کر سکتا ہے، GPU ایکسلریشن کام کرنا بند کر سکتا ہے، یا مشین کی تصویریں تعیناتیوں میں متضاد ہو سکتی ہیں۔

log "Pinning driver to version ${DRIVER_VERSION}..."
sudo apt-get install -qq -y "nvidia-driver-pinning-${DRIVER_VERSION}"

سیکشن 4: ڈرائیور کی تنصیب

کہ libnvidia-compute صرف کمپیوٹ مخصوص یوزر اسپیس لائبریریز (CUDA ڈرائیور اجزاء) انسٹال کرتا ہے، لیکن nvidia-dkms-open; انسٹال کریں اوپن سورس NVIDIA کرنل ماڈیولDKMS کے ذریعے مقامی طور پر تعینات۔

یہ دونوں پیکجز ایک مکمل خصوصیات والا CUDA ڈرائیور ماحول فراہم کرتے ہیں جس میں کوئی GUI یا گرافکس انحصار نہیں ہے۔

یہاں ہم اوپن سورس کرنل ماڈیولز کا استعمال کرتے ہوئے NVIDIA کا کمپیوٹ مخصوص ڈرائیور اسٹیکاس کی وجہ یہ ہے کہ ہم جان بوجھ کر ڈسپلے سے متعلقہ اجزاء کو انسٹال کرنے سے گریز کرتے ہیں جن کی ضرورت نہیں ہے۔

یہ طریقہ ہلکا پھلکا اور کمپیوٹ کرنے والا ہے، اس لیے یہ DKMS پر مبنی انسٹالیشن ماڈیولز فراہم کرتا ہے جو لینکس کی تقسیم کے لیے زیادہ موزوں ہیں۔

log "Installing NVIDIA compute-only driver (open kernel modules)..."
sudo apt-get -V install -y 
  libnvidia-compute 
  nvidia-dkms-open

سیکشن 5: CUDA ٹول کٹ انسٹال کرنا

اسکرپٹ کا یہ حصہ CUDA ٹول کٹ اس بات کو یقینی بناتا ہے کہ دیئے گئے ورژن کے لیے CUDA کے ایگزیکیوٹیبل اور لائبریریاں تمام صارفین اور تمام شیل سیشنز کے لیے پورے نظام میں دستیاب ہیں۔

یہ آپ کے PATH میں CUDA بائنری کو شامل کرتا ہے، لہذا اس طرح کی کمانڈ چلے گی: nvcc، cuda-gdbاور cuda-memcheck مکمل راستہ بتائے بغیر کام کرتا ہے۔ یہ LD_LIBRARY_PATH میں CUDA لائبریریوں کو بھی شامل کرتا ہے، تاکہ ایپلیکیشن رن ٹائم پر CUDA کی مشترکہ لائبریریوں کو تلاش کر سکے۔

log "Installing CUDA Toolkit ${CUDA_VERSION}..."
sudo apt-get install -qq -y "cuda-toolkit-${CUDA_VERSION}"

# Persist CUDA paths for all users and sessions
cat <<'EOF' | sudo tee /etc/profile.d/cuda.sh
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:-}
EOF
echo "/usr/local/cuda/lib64" | sudo tee /etc/ld.so.conf.d/cuda.conf
sudo ldconfig

سیکشن 6: NVIDIA کنٹینر ٹول کٹ

یہ بلاک NVIDIA کنٹینر ٹول کٹ کو انسٹال کرتا ہے اور GPUs تک محفوظ اور صحیح طریقے سے رسائی کے لیے کنٹینرز (Docker یا Containerd) کو ترتیب دیتا ہے۔ یہ Kubernetes GPU نوڈس، Docker GPU کام کے بوجھ، اور کسی بھی سسٹم کے لیے ایک اہم قدم ہے جس کے لیے کنٹینرز کے اندر GPU ایکسلریشن کی ضرورت ہوتی ہے۔

log "Installing NVIDIA Container Toolkit..."
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey 
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list 
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' 
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update -qq
sudo apt-get install -qq -y nvidia-container-toolkit

# Configure for containerd (primary Kubernetes runtime)
sudo nvidia-ctk runtime configure --runtime=containerd

# Configure for Docker if present on this image
if systemctl list-unit-files | grep -q "^docker.service"; then
  sudo nvidia-ctk runtime configure --runtime=docker
fi

سیکشن 7: ڈیٹا سینٹر GPU مینیجر (DCGM) انسٹال کریں

یہ سیکشن NVIDIA ڈیٹا سینٹر GPU مینیجر (DCGM)، NVIDIA کے آفیشل مینجمنٹ اور ڈیٹا سینٹر GPUs کے لیے ٹیلی میٹری فریم ورک کی تنصیب اور تصدیق کا احاطہ کرتا ہے۔

صحت کی نگرانی اور تشخیص، ٹیلی میٹری (بشمول درجہ حرارت، گھڑی، طاقت، اور استعمال)، غلطی کی اطلاع دہندگی، اور Kubernetes، Prometheus، اور مانیٹرنگ ایجنٹس کے ساتھ انضمام فراہم کرتا ہے۔ GPU مانیٹرنگ اسٹیک اس پر انحصار کرتا ہے۔

اسکرپٹ انسٹال شدہ ورژن نکالتا ہے اور چیک کرتا ہے کہ آیا ورژن پورے ہوئے ہیں۔ کم از کم مطلوبہ ورژن NVIDIA ڈرائیور 590+ کے لیے۔ پھر ورژن کی ضروریات کا اطلاق کریں۔ یہ GPU ڈرائیوروں اور DCGM کے درمیان مماثلت کی وجہ سے نگرانی اور صحت کی جانچ کو روکتا ہے۔ مزید برآں، اگر آپ ملٹی GPU ٹوپولوجی جیسے A100/H100 DGX یا ملٹی-GPU سرورز استعمال کر رہے ہیں، تو NVLink/NVSwitch کے لیے فیبرک مینیجر کو فعال کریں۔

log "Installing DCGM..."
sudo apt-get install -qq -y datacenter-gpu-manager

DCGM_VER=((dpkg -s datacenter-gpu-manager 2>/dev/null | awk '/^Version:/{print )2}' | sed 's/^[0-9]*://')
DCGM_MAJOR=((echo "){DCGM_VER}" | cut -d. -f1)
DCGM_MINOR=((echo "){DCGM_VER}" | cut -d. -f2)
if [[ "({DCGM_MAJOR}" -lt 4 ]] || { [[ "){DCGM_MAJOR}" -eq 4 ]] && [[ "${DCGM_MINOR}" -lt 3 ]]; }; then
  error "DCGM ${DCGM_VER} is below the 4.3 minimum required for driver 590+. Check your CUDA repo."
fi
log "DCGM installed: ${DCGM_VER}"

sudo systemctl enable nvidia-dcgm
sudo systemctl start  nvidia-dcgm

# Fabric Manager — only needed for NVLink/NVSwitch GPUs (A100/H100 multi-GPU nodes)
if systemctl list-unit-files | grep -q "^nvidia-fabricmanager.service"; then
  log "Enabling nvidia-fabricmanager for NVLink GPUs..."
  sudo systemctl enable nvidia-fabricmanager
  sudo systemctl start  nvidia-fabricmanager
fi

سیکشن 8: پرسسٹینس موڈ کو فعال کرنا

NVIDIA ڈرائیور عام طور پر خود کو اتارتے ہیں جب GPU بیکار ہوتا ہے۔ جب ایک نیا کام کا بوجھ شروع ہوتا ہے، ڈرائیوروں کو دوبارہ لوڈ کرنا، GPU کو دوبارہ شروع کرنا، اور میموری میپنگ کو ترتیب دینا چاہیے۔ آپ کے GPU اور سسٹم پر منحصر ہے، یہ چند سو ملی سیکنڈ سے لے کر چند سیکنڈ کی تاخیر تک کہیں بھی اضافہ کر دیتا ہے۔

NVIDIA-Presistenced کو فعال کرنا اس بات کو یقینی بناتا ہے کہ NVIDIA ڈرائیورز میموری میں لوڈ رہتے ہیں یہاں تک کہ جب GPU ورک بوجھ نہیں چل رہا ہے۔

log "Enabling nvidia-persistenced..."
sudo systemctl enable nvidia-persistenced
sudo systemctl start  nvidia-persistenced

سیکشن 9: GPU کمپیوٹ ورک بوجھ کے لیے سسٹم ٹیوننگ

یہ بلاک درج ذیل سیٹوں پر لاگو ہوتا ہے: سسٹم کی سطح کی کارکردگی اور استحکام ٹیوننگ اعلی کارکردگی والے GPU سرورز، Kubernetes GPU نوڈس، اور ML/AI ورک بوجھ کے لیے معیاری۔

ہر لائن ایک مخصوص رکاوٹ یا عدم استحکام کے پیٹرن کو نشانہ بناتی ہے جو حقیقی GPU پروڈکشن ماحول میں نظر آتی ہے۔

  • تبادلہ اور میموری کا برتاؤ: تبادلہ اور ترتیبات کو غیر فعال کریں۔ vm.swappiness=0 دانا کو GPU کے پابند عمل کو تبدیل کرنے سے روکتا ہے۔ GPU کام کا بوجھ تاخیر کے لیے بہت حساس ہوتا ہے، اور تبادلہ CUDA سیاق و سباق کو دوبارہ ترتیب دینے اور GPU ڈرائیور کے ٹائم آؤٹ کا سبب بن سکتا ہے۔

  • بڑی میموری مختص کرنے کے لیے بڑے صفحات: ترتیبات vm.nr_hugepages=2048 ایک بہت بڑا صفحہ پول مختص کرتا ہے، بڑی مربوط میموری مختص کرنے کے لیے TLB دباؤ کو کم کرتا ہے۔

    CUDA، NCCL، اور ڈیپ لرننگ فریم ورک کثرت سے بڑے بفرز کو مختص کرتے ہیں، اور ہیج پیجز پیج ٹیبل اوور ہیڈ کو کم کرتے ہیں، میموری بینڈوڈتھ کو بہتر بناتے ہیں اور بڑے ٹینسر آپریشنز کے لیے تاخیر کو کم کرتے ہیں۔ یہ خاص طور پر ملٹی جی پی یو سرورز پر مفید ہے۔

  • سی پی یو فریکوئنسی گورنر: انسٹال کرنا cpupower CPU گورنر کو مجبور کریں۔ performance اس بات کو یقینی بناتا ہے کہ CPU اسکیل کرنے کے بجائے زیادہ سے زیادہ فریکوئنسی کو برقرار رکھتا ہے۔

    ڈیٹا پری پروسیسنگ، کرنل اسٹارٹ اپ، اور NCCL کمیونیکیشن کے دوران GPU ورک بوجھ اکثر CPU کے پابند ہوتے ہیں۔ اپنے CPU کو پوری رفتار پر رکھنے سے گھماؤ کم ہوتا ہے اور تھرو پٹ بہتر ہوتا ہے۔

  • NUMA اور ٹوپولوجی ٹولز: انسٹالیشن numactl، libnuma-devاور hwloc NUMA نوڈس پر عمل کو پن کرنے، CPU-GPU وابستگی کو سمجھنے، اور ملٹی-GPU پلیسمنٹ کو بہتر بنانے کے لیے ٹولز فراہم کرتا ہے۔

  • irqbalance کو غیر فعال کریں: روکیں اور غیر فعال کریں۔ irqbalance یہ NVIDIA ڈرائیور کو مداخلت کے تعلق کو منظم کرنے کی اجازت دیتا ہے۔ GPU سرورز کے لیے، irqbalance غلط طریقے سے GPU interrupts کو غیر بہترین CPU میں منتقل کر سکتا ہے، جس کے نتیجے میں زیادہ تاخیر اور کم تھرو پٹ ہوتا ہے۔

log "Applying system tuning..."

# Disable swap (critical for Kubernetes scheduler and ML stability)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
echo "vm.swappiness=0"     | sudo tee /etc/sysctl.d/99-gpu-swappiness.conf

# Hugepages — reduces TLB pressure for large memory allocations
echo "vm.nr_hugepages=2048" | sudo tee /etc/sysctl.d/99-gpu-hugepages.conf

# CPU performance governor
sudo apt-get install -qq -y linux-tools-common "linux-tools-$(uname -r)" || true
sudo cpupower frequency-set -g performance || true

# NUMA and topology tools for GPU affinity tuning
sudo apt-get install -qq -y numactl libnuma-dev hwloc

# Disable irqbalance — let NVIDIA driver manage interrupt affinity
sudo systemctl disable irqbalance || true
sudo systemctl stop    irqbalance || true

# Apply all sysctl settings now
sudo sysctl --system

مکمل base.sh اسکرپٹ مندرجہ ذیل ہے:

#!/bin/bash
set -euo pipefail

log()   { echo "[BASE] $1"; }
error() { echo "[BASE][ERROR] $1" >&2; exit 1; }

###############################################################
###############################################################
[[ -z "${DRIVER_VERSION:-}" ]] && error "DRIVER_VERSION is not set."
[[ -z "${CUDA_VERSION:-}"   ]] && error "CUDA_VERSION is not set."

log "DRIVER_VERSION : ${DRIVER_VERSION}"
log "CUDA_VERSION   : ${CUDA_VERSION}"

DISTRO=((. /etc/os-release && echo "){ID}${VERSION_ID}" | tr -d '.')
ARCH="x86_64"

export DEBIAN_FRONTEND=noninteractive

###############################################################
# 1. System update
###############################################################
log "Updating system packages..."
sudo apt-get update -qq
sudo apt-get upgrade -qq -y

###############################################################
# 2. Pre-installation — kernel headers
#    Source: https://docs.nvidia.com/datacenter/tesla/driver-installation-guide/ubuntu.html
###############################################################
log "Installing kernel headers and build tools..."
sudo apt-get install -qq -y 
  "linux-headers-$(uname -r)" 
  build-essential 
  dkms 
  curl 
  wget

###############################################################
# 3. NVIDIA CUDA Network Repository
###############################################################
log "Adding NVIDIA CUDA apt repository (${DISTRO})..."
wget -q "https://developer.download.nvidia.com/compute/cuda/repos/({DISTRO}/){ARCH}/cuda-keyring_1.1-1_all.deb" 
  -O /tmp/cuda-keyring.deb
sudo dpkg -i /tmp/cuda-keyring.deb
rm /tmp/cuda-keyring.deb
sudo apt-get update -qq

###############################################################
# 4. Pin driver version BEFORE installation (590+ requirement)
###############################################################
log "Pinning driver to version ${DRIVER_VERSION}..."
sudo apt-get install -qq -y "nvidia-driver-pinning-${DRIVER_VERSION}"

###############################################################
# 5. Compute-only (headless) driver — Open Kernel Modules
#    Source: NVIDIA Driver Installation Guide — Compute-only System (Open Kernel Modules)
#
#    libnvidia-compute  = compute libraries only (no GL/Vulkan/display)
#    nvidia-dkms-open   = open-source kernel module built via DKMS
#
#    Open kernel modules are the NVIDIA-recommended choice for
#    Ampere, Hopper, and Blackwell data centre GPUs (A100, H100, etc.)
###############################################################
log "Installing NVIDIA compute-only driver (open kernel modules)..."
sudo apt-get -V install -y 
  libnvidia-compute 
  nvidia-dkms-open

###############################################################
# 6. CUDA Toolkit
###############################################################
log "Installing CUDA Toolkit ${CUDA_VERSION}..."
sudo apt-get install -qq -y "cuda-toolkit-${CUDA_VERSION}"

# Persist CUDA paths for all users and sessions
cat <<'EOF' | sudo tee /etc/profile.d/cuda.sh
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:-}
EOF
echo "/usr/local/cuda/lib64" | sudo tee /etc/ld.so.conf.d/cuda.conf
sudo ldconfig

###############################################################
# 7. NVIDIA Container Toolkit
#    Required for GPU workloads in Docker / containerd / Kubernetes
###############################################################
log "Installing NVIDIA Container Toolkit..."
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey 
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list 
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' 
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update -qq
sudo apt-get install -qq -y nvidia-container-toolkit

# Configure for containerd (primary Kubernetes runtime)
sudo nvidia-ctk runtime configure --runtime=containerd

# Configure for Docker if present on this image
if systemctl list-unit-files | grep -q "^docker.service"; then
  sudo nvidia-ctk runtime configure --runtime=docker
fi

###############################################################
# 8. DCGM — DataCenter GPU Manager
###############################################################
log "Installing DCGM..."
sudo apt-get install -qq -y datacenter-gpu-manager
 
DCGM_VER=((dpkg -s datacenter-gpu-manager 2>/dev/null | awk '/^Version:/{print )2}' | sed 's/^[0-9]*://')
DCGM_MAJOR=((echo "){DCGM_VER}" | cut -d. -f1)
DCGM_MINOR=((echo "){DCGM_VER}" | cut -d. -f2)
if [[ "({DCGM_MAJOR}" -lt 4 ]] || { [[ "){DCGM_MAJOR}" -eq 4 ]] && [[ "${DCGM_MINOR}" -lt 3 ]]; }; then
  error "DCGM ${DCGM_VER} is below the 4.3 minimum required for driver 590+. Check your CUDA repo."
fi
log "DCGM installed: ${DCGM_VER}"

sudo systemctl enable nvidia-dcgm
sudo systemctl start  nvidia-dcgm

# Fabric Manager — only needed for NVLink/NVSwitch GPUs (A100/H100 multi-GPU nodes)
if systemctl list-unit-files | grep -q "^nvidia-fabricmanager.service"; then
  log "Enabling nvidia-fabricmanager for NVLink GPUs..."
  sudo systemctl enable nvidia-fabricmanager
  sudo systemctl start  nvidia-fabricmanager
fi

###############################################################
# 9. NVIDIA Persistence Daemon
#    Keeps the driver loaded between jobs — reduces cold-start
#    latency on the first CUDA call in each new workload
###############################################################
log "Enabling nvidia-persistenced..."
sudo systemctl enable nvidia-persistenced
sudo systemctl start  nvidia-persistenced

###############################################################
# 10. System tuning for GPU compute workloads
###############################################################
log "Applying system tuning..."

# Disable swap (critical for Kubernetes scheduler and ML stability)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
echo "vm.swappiness=0"     | sudo tee /etc/sysctl.d/99-gpu-swappiness.conf

# Hugepages — reduces TLB pressure for large memory allocations
echo "vm.nr_hugepages=2048" | sudo tee /etc/sysctl.d/99-gpu-hugepages.conf

# CPU performance governor
sudo apt-get install -qq -y linux-tools-common "linux-tools-$(uname -r)" || true
sudo cpupower frequency-set -g performance || true

# NUMA and topology tools for GPU affinity tuning
sudo apt-get install -qq -y numactl libnuma-dev hwloc

# Disable irqbalance — let NVIDIA driver manage interrupt affinity
sudo systemctl disable irqbalance || true
sudo systemctl stop    irqbalance || true

# Apply all sysctl settings now
sudo sysctl --system

###############################################################
# Done
###############################################################
log "============================================"
log "Base layer provisioning complete."
log "  OS      : ${DISTRO}"
log "  Driver  : ${DRIVER_VERSION} (open kernel modules, compute-only)"
log "  CUDA    : cuda-toolkit-${CUDA_VERSION}"
log "  DCGM    : ${DCGM_VER}"
log "============================================"

مرحلہ 7: تعمیر کو جمع اور چلائیں۔

پہلے ٹیمپلیٹ کی تصدیق کریں اور پھر بلڈ کو چلائیں۔ توثیق نحو یا متغیر کی خرابیوں کو جلد پکڑ لیتی ہے، لہذا تعمیرات ٹوٹی ہوئی ترتیب سے شروع نہیں ہوتی ہیں۔

packer validate -var-file=values.pkrvars.hcl .

اگر توثیق کامیاب ہو جاتی ہے، تو آپ کو ایک مختصر تصدیقی پیغام اس طرح نظر آئے گا: The configuration is valid.. اس کے بعد، ہم تعمیر شروع کرتے ہیں. آپ کو عارضی VMs بنانے، پروویژنرز چلانے اور تصاویر بنانے کے عمل کی توقع کرنی چاہیے۔

packer build -var-file=values.pkrvars.hcl .

تعمیرات میں عام طور پر وقت لگتا ہے۔ 15-20 منٹ، یہ آپ کے نیٹ ورک کی رفتار اور پیکیج کی تنصیب پر منحصر ہے۔ تین اہم چوکیوں کے لیے پیکر لاگ کو چیک کریں:

  • مثال بنائیں - تصدیق کریں کہ عارضی VM فراہم کیا گیا ہے۔

  • کمیشن کی پیداوار - اسکرپٹ کا ہر مرحلہ (اپ ڈیٹ، ریبوٹ، script/base.sh) اور غلطیاں ہیں۔

  • تصویر بنائیں — اشارہ کرتا ہے کہ تعمیر مکمل ہو گئی ہے اور تصویری نمونے بنائے گئے ہیں۔

اگر تعمیر ناکام ہوجاتی ہے تو، ناکام فراہم کنندہ سے لاگ لائن کاپی کریں، اسکرپٹ یا متغیر میں ترمیم کریں، اور تعمیر کو دوبارہ چلائیں۔ تیز تر ٹربل شوٹنگ کے لیے، مماثل ٹیسٹ VMs پر مقامی طور پر ناکام پروویژنرز کو دوبارہ چلا کر تیزی سے اعادہ کریں۔

googlecompute.gpu-node: output will be in this color.

==> googlecompute.gpu-node: Checking image does not exist...
==> googlecompute.gpu-node: Creating temporary RSA SSH key for instance...
==> googlecompute.gpu-node: no persistent disk to create
==> googlecompute.gpu-node: Using image: ubuntu-2404-noble-amd64-v20260225
==> googlecompute.gpu-node: Creating instance...
==> googlecompute.gpu-node: Loading zone: us-central1-a
==> googlecompute.gpu-node: Loading machine type: g2-standard-4
==> googlecompute.gpu-node: Requesting instance creation...
==> googlecompute.gpu-node: Waiting for creation operation to complete...
==> googlecompute.gpu-node: Instance has been created!
==> googlecompute.gpu-node: Waiting for the instance to become running...
==> googlecompute.gpu-node: IP: 34.58.58.214
==> googlecompute.gpu-node: Using SSH communicator to connect: 34.58.58.214
==> googlecompute.gpu-node: Waiting for SSH to become available...
systemd-logind.service
==> googlecompute.gpu-node:  systemctl restart unattended-upgrades.service
==> googlecompute.gpu-node:
==> googlecompute.gpu-node: No containers need to be restarted.
==> googlecompute.gpu-node:
==> googlecompute.gpu-node: User sessions running outdated binaries:
==> googlecompute.gpu-node:  packer @ session #1: sshd[1535]
==> googlecompute.gpu-node:  packer @ user manager service: systemd[1540]
==> googlecompute.gpu-node: Pausing 1m0s before the next provisioner...
==> googlecompute.gpu-node: Provisioning with shell script: script/base.sh
==> googlecompute.gpu-node: [BASE] DRIVER_VERSION : 590.48.01
==> googlecompute.gpu-node: [BASE] CUDA_VERSION   : 13.1
==> googlecompute.gpu-node: [BASE] Updating system packages...
==> googlecompute.gpu-node: [BASE] Installing kernel headers and build tools...
==> googlecompute.gpu-node: [BASE] Installing CUDA Toolkit 13.1...
==> googlecompute.gpu-node: [BASE] Installing DCGM...
==> googlecompute.gpu-node: [BASE] Enabling nvidia-persistenced...
==> googlecompute.gpu-node: [BASE] Applying system tuning...
==> googlecompute.gpu-node: vm.swappiness=0
==> googlecompute.gpu-node: vm.nr_hugepages=2048
==> googlecompute.gpu-node: Setting cpu: 0
==> googlecompute.gpu-node: Error setting new values. Common errors:
==> googlecompute.gpu-node: [BASE] ============================================
==> googlecompute.gpu-node: [BASE] Base layer provisioning complete.
==> googlecompute.gpu-node: [BASE]   OS      : ubuntu2404
==> googlecompute.gpu-node: [BASE]   Driver  : 590.48.01 (open kernel modules, compute-only)
==> googlecompute.gpu-node: [BASE]   CUDA    : cuda-toolkit-13.1
==> googlecompute.gpu-node: [BASE]   DCGM    : 1:3.3.9
==> googlecompute.gpu-node: [BASE] ============================================
==> googlecompute.gpu-node: Deleting instance...
==> googlecompute.gpu-node: Instance has been deleted!
==> googlecompute.gpu-node: Creating image...
==> googlecompute.gpu-node: Deleting disk...
==> googlecompute.gpu-node: Disk has been deleted!
==> googlecompute.gpu-node: Running post-processor:  (type shell-local)
==> googlecompute.gpu-node (shell-local): Running local shell script: 
==> googlecompute.gpu-node (shell-local): === Image Build Complete ===
==> googlecompute.gpu-node (shell-local): Image ID: packer-69b6c2ee-883a-3602-7bb5-059f1ba27c8b
==> googlecompute.gpu-node (shell-local): Sun Mar 15 15:50:09 WAT 2026
Build 'googlecompute.gpu-node' finished after 17 minutes 55 seconds.

==> Wait completed after 17 minutes 55 seconds

==> Builds finished. The artifacts of successful builds are:
--> googlecompute.gpu-node: A disk image was created in the 'my_project-00000' project: base-gpu-image-1773585134

مرحلہ 8: امیج کی جانچ کریں اور GPU اسٹیک کی تصدیق کریں۔

تصدیق کریں کہ تصویر GCP کنسول میں موجود ہے۔ کمپیوٹ → اسٹوریج → تصویر نئی تخلیق کردہ OS تصویر تلاش کریں۔

تصویر سے ایک ٹیسٹ VM بنائیں۔

gcloud compute instances create my-gpu-vm 
  --machine-type=g2-standard-4 
  --accelerator=count=1,type=nvidia-l4 
  --image=base-gpu-image-1772718104 
  --image-project=YOUR_PROJECT_ID 
  --boot-disk-size=50GB 
  --maintenance-policy=TERMINATE 
  --restart-on-failure 
  --zone=us-central1-a

Created [https://www.googleapis.com/compute/v1/projects/my-project-000/zones/us-central1-a/instances/my-gpu-vm].
NAME       ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP    EXTERNAL_IP      STATUS
my-gpu-vm  us-central1-a  g2-standard-4               10.128.15.227  104.154.184.217  RUNNING

سب سے پہلے، مثال RUNNINGتصدیق کریں کہ NVIDIA ڈرائیورز اور GPU درج ہیں۔

Nvidia-SMI کمانڈ کا آؤٹ پٹ ڈرائیور اور CUDA ورژن دکھا رہا ہے۔

اس بات کی تصدیق کرنے والی تصویر کہ ثابت قدمی موڈ فعال ہے۔

کہ nvidia-smi آؤٹ پٹ تصدیق کرتا ہے:

یہ ایک عام ڈیفالٹ تصویر کی طرح دکھائی دیتی ہے۔ نوٹس Disp.A: Off? یہ تصدیق کرتا ہے کہ کمپیوٹ کے لیے مخصوص ڈرائیور کا انتخاب کام کر رہا ہے۔ ڈسپلے اڈاپٹر چالو نہیں ہے۔

انسٹال شدہ CUDA ٹول کٹ کو چلا کر چیک کریں: nvcc --version. آپ دیکھ سکتے ہیں کہ ورژن 13.1 مخصوص کے مطابق انسٹال ہے۔

NVCC -Version کمانڈ کا آؤٹ پٹ

آئیے چل کر DCGM انسٹالیشن کی تصدیق کریں: dcgmi discovery -l. کامیاب آؤٹ پٹ اشارہ کرتا ہے کہ DCGM چل رہا ہے اور ڈرائیور کے ساتھ بات چیت کر رہا ہے۔

DCGMI دریافت -l کمانڈ کا آؤٹ پٹ آلہ کی معلومات دکھا رہا ہے۔

نتیجہ

ہمارے پاس اب ایک پروڈکشن گریڈ، GPU-آپٹمائزڈ بیس امیج ہے جس میں اوپن کرنل ماڈیولز، مانیٹرنگ کے لیے DCGM، اور CUDA ٹول کٹ کے ساتھ بنائے گئے NVIDIA کمپیوٹ کے لیے مخصوص ڈرائیور شامل ہیں۔ ہم نے GPU کمپیوٹنگ ورک بوجھ کے مطابق OS کی سطح کی ٹیوننگ بھی لاگو کی، جو دستی سیٹ اپ کے بغیر ایک مستقل اور دوبارہ پیدا کرنے کے قابل تجربہ فراہم کرتی ہے۔

یہاں سے، آپ PyTorch، TensorFlow، یا vLLM جیسے فریم ورک کو انسٹال کر کے اپنی تعمیر کو بڑھانے کے لیے ایپلیکیشن لیئر اسکرپٹس شامل کر سکتے ہیں، یا اپنے GPU انفراسٹرکچر کو بڑھانے کے لیے مثالی ٹیمپلیٹس بنانے کے لیے اس تصویر کا استعمال کر سکتے ہیں۔

مکمل پیکر پروجیکٹ میں ٹریننگ اور انفرنس ورک بوجھ کے لیے اضافی اسکرپٹس شامل ہیں جن کا استعمال تصاویر کو بڑھانے کے لیے کیا جا سکتا ہے۔

حوالہ جات

اوپر تک سکرول کریں۔