Büyük Dil Modellerinin (LLM) yükselişi, altyapı gereksinimlerini temelden değiştirdi. Geleneksel mikro hizmetlerin aksine, LLM çıkarım iş yükleri kaynak yoğun ve donanım yeteneklerine karşı son derece hassastır. Kuruluşlar geliştirmeden üretime geçtikçe, parçalı bir donanım manzarasıyla karşılaşırlar: eğitim ve yüksek verimli çıkarım için GPU kümeleri, kenar veya maliyet-optimizasyonlu dağıtımlar için yalnızca CPU'lu örnekler ve bulut sağlayıcıları arasında değişen CPU mimarileri (amd64 ve arm64). LLM çıkarım konteynerlerinizin bu yelpaze boyunca güvenilir bir şekilde çalışmasını sağlamak, gelişmiş derleme stratejileri gerektirir.
Heterojen Donanımın Zorluğu
NVIDIA GPU'lu bir geliştirme dizüstü bilgisayarında derlenen standart bir Docker görüntüsü, yalnızca CPU'lu bir üretim düğümünde başarısız olur ve bunun tersi de geçerlidir. Ayrıca, hedef makinede NVIDIA sürücüleri yoksa CUDA kütüphanelerini bir temel görüntüye dahil etmek şişkinliğe ve bağımlılık çakışmalarına neden olur. LLMOps'ta endişeleri ayırmalıyız: uygulama mantığı, model ağırlıkları ve çalışma zamanı bağımlılıkları (CUDA/CPU) modüler olmalıdır.
Strateji 1: Mimariye Göre Ayrı Temel Görüntüler
Monolitik tek bir "evrensel" görüntü yerine, farklı donanım hedefleri için ayrı temel görüntüler sürdürün.
- GPU Görüntüsü:
nvidia/cuda:11.8-runtime-ubuntu22.04tabanlıdır. CUDA araç setlerini veflash-attngibi GPU'ya özgü kütüphaneleri içerir. - CPU Görüntüsü:
python:3.10-slimtabanlıdır. Optimize edilmiş CPU matematiği için MKL veya OpenBLAS içerir, ancak tüm CUDA bağımlılıklarını hariç tutar.
Strateji 2: Modüler Bağımlılık Yönetimi
Paketleri yalnızca ilgili donanım algılandığında yüklemek için Python'ın koşullu bağımlılık mekanizmasını kullanın. Bu, uyumsuz düğümlerde ImportError sorunlarını önler.
# requirements-gpu.txt
torch==2.0.1+cu118
transformers==4.36.0
flash-attn==2.3.6 # Yalnızca GPU
# requirements-cpu.txt
torch==2.0.1
transformers==4.36.0
Dockerfile'ınızda, doğru gereksinimler dosyasını seçmek için derleme argümanlarını kullanın:
ARG BUILD_VARIANT=cpu
RUN if [ "$BUILD_VARIANT" = "gpu" ]; then \
pip install -r requirements-gpu.txt; \
else \
pip install -r requirements-cpu.txt; \
fi
Strateji 3: Çoklu Mimari Derlemeler İçin BuildX'i Kullanma
CPU hedefleri için hem amd64 hem de arm64 (AWS Graviton ve Apple Silicon'da yaygın) desteği sunmanız gerekir. Her mimari için gerçek donanıma ihtiyaç duymadan çoklu mimari manifestler oluşturmak için Docker Buildx'i kullanın.
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 \
--build-arg BUILD_VARIANT=cpu \
-t my-llm-app:cpu-mixed .
Strateji 4: Model Ağırlıklarının Ayrılması
Büyük model ağırlıklarını (7B-13B parametre) asla Docker görüntünüze gömün. Görüntüler çoklu GB boyutuna ulaşır, bu da CI/CD hatlarını ve kayıt defteri çekme işlemlerini yavaşlatır. Bunun yerine, hacim bağlamalarını kullanın veya ağırlıkları konteyner başlatma sırasında bir kayıt defterinden (ör. Hugging Face Hub) çekin. Bu, görüntünüzün hafif ve sürümleyebilir kalmasını sağlarken, modellerin bağımsız olarak güncellenebilmesine olanak tanır.
CI/CD Uygulama En İyi Uygulamaları
1. Katmanları Agresif Önbelleğe Alın: Çekirdek bağımlılıklar için pip install işlemlerini erken katmanlarda tutun. Uygulama kodunu yalnızca sonraki katmanlarda kopyalayın.
2. Sağlık Kontrolleri: Hizmetin hazır olduğunu bildirmeden önce GPU kullanılabilirliğini (nvidia-smi kullanarak) veya CPU çekirdek sayısını doğrulayan bir CMD HEALTHCHECK uygulayın.
3. Etiketleme Kuralları: Kaza sonucu dağıtım uyumsuzluklarını önlemek için my-llm:v1.0-gpu ve my-llm:v1.0-cpu gibi etiketler kullanın.
Sonuç
LLM çıkarımını konteynerleştirmek, tek boy her bedene uyan bir görüntü oluşturmaktan ziyade, optimize edilmiş, donanıma özgü bir artefakt portföyü inşa etmektir. Çalışma zamanı bağımlılıklarını ayırarak, derleme argümanlarından yararlanarak ve model ağırlıklarını uygulama kodundan ayırarak, herhangi bir donanım topolojisi üzerinde güvenilir, ölçeklenebilir ve maliyet-etkin LLM dağıtımları elde edebilirsiniz. Altyapınız ölçeklendikçe teknik borçtan kaçınmak için LLMOps hattınızın başlangıcında modüler Dockerfile'larla başlayın.