💻 Modül 6 · Yazılım Yığını · Bölüm 6.6 · 9 dk okuma

PyTorch Backend Yazmak

PyTorch'un SIDRA'yı native tanıması — model.to('sidra:0').

Bu bölümde öğreneceklerin

  • PyTorch'un custom backend mekanizmasını ve register_backend API'sini yaz
  • Dispatch mekanizmasını (ATen op'lar SIDRA op'larına nasıl eşlenir) açıkla
  • MVM, softmax, activation op'larının SIDRA implementasyonunu özetle
  • Performance profiling ve benchmark stratejilerini söyle
  • Diğer framework'lerle (TF, JAX) karşılaştır

Açılış: model.to('sidra:0')

PyTorch AI’nın %70+ piyasası. SIDRA için PyTorch destek zorunlu.

Hedef: model.to("sidra:0") → model otomatik SIDRA’da çalışır. CUDA backend gibi.

Bu bölüm PyTorch custom backend API’sini ve SIDRA’nın nasıl entegre edildiğini anlatır.

Sezgi: Dispatcher + Op Registration

PyTorch tensor işlemleri dispatcher üzerinden gider:

torch.matmul(a, b)

ATen dispatcher
    ↓ (cihaz bazlı)
CPU: native C impl
CUDA: cuda_matmul
SIDRA: sidra_matmul  ← yeni!

Her op için cihaz-specific implementasyon. SIDRA MVM’i crossbar’a yönlendirir.

Formalizm: Custom Backend Register

L1 · Başlangıç

PrivateUse1 backend (PyTorch 2.0+):

# SIDRA backend initialize
import torch
from sidra_pytorch import SidraDevice

# Register
torch.register_privateuse1_backend("sidra")
torch._register_device_module("sidra", SidraDevice())

# Kullan
device = torch.device("sidra:0")
tensor = torch.randn(10, 10, device=device)  # SIDRA bellekte

Dispatch override:

# MVM için custom kernel
@torch.library.impl("aten::matmul", "PrivateUse1")
def sidra_matmul(a, b):
    # SIDRA SDK ile crossbar MVM
    return sidra.crossbar_mvm(a, b)

PyTorch aten::matmul çağrısı geldiğinde SIDRA backend’iyse bu fonksiyon çalışır.

Desteklenen op’lar (öncelik sırası):

  1. matmul, linear, conv → SIDRA crossbar.
  2. relu, gelu, softmax → SIDRA compute engine.
  3. layernorm, batchnorm → compute engine.
  4. add, mul, reshape → genelde CPU veya fallback.

Tüm op’ları SIDRA’da yapmak şart değil. “Hotspot” op’lar yeter, geri kalan CPU’da.

L2 · Tam

Graph mode:

PyTorch 2.0 torch.compile model graph’ını optimize:

@torch.compile(backend="sidra")
def model_fn(x):
    return model(x)

Compile time:

  1. Model graph çıkar.
  2. SIDRA backend pass’leri uygula (operator fusion, quantization).
  3. Crossbar mapping.
  4. Optimized code emit.

Runtime: direk crossbar’da inference.

Quantization-aware:

# INT8 quantize
quantized_model = torch.quantization.quantize_dynamic(
    model, {torch.nn.Linear}, dtype=torch.qint8
)

# SIDRA'ya yükle
quantized_model.to("sidra:0")

SIDRA INT8 native. FP32 modeli INT8’e quantize etmek doğruluk kaybı %0.5.

Fallback:

Unsupported op (exotic) → CPU’ya fallback. Driver otomatik veri taşır.

# Hybrid execution
def forward(x):
    x = layer1(x)  # SIDRA
    x = custom_op(x)  # CPU fallback (auto)
    x = layer2(x)  # SIDRA
    return x
L3 · Derin

Benchmark:

import torch
import time

model = load_model("bert-base").to("sidra:0")
x = torch.randn(1, 512, 768).to("sidra:0")

# Warmup
for _ in range(10):
    y = model(x)
torch.sidra.synchronize()

# Benchmark
t0 = time.time()
for _ in range(1000):
    y = model(x)
torch.sidra.synchronize()
t1 = time.time()

print(f"Latency: {(t1-t0)/1000*1000:.2f} ms/inference")

Typical: BERT-base Y1 ~5 ms/inference. H100 ~2 ms. SIDRA 2.5× yavaş ama 50× az enerji.

Profiler:

with torch.profiler.profile(
    activities=[torch.profiler.ProfilerActivity.SIDRA]
) as prof:
    y = model(x)

print(prof.key_averages().table())
# Output: matmul 2.1 ms, softmax 0.3 ms, ...

Hotspot’ları bulmak için.

Eğitim (sınırlı Y1):

# Fine-tune son katman (Y1 hybrid)
for param in model.parameters():
    param.requires_grad = False
model.classifier.requires_grad = True

optimizer = torch.optim.Adam(model.classifier.parameters())

for epoch in range(5):
    for batch in loader:
        y = model(batch.x.to("sidra:0"))
        loss = criterion(y, batch.y)
        loss.backward()  # CPU'da gradient hesap
        optimizer.step()  # SIDRA son katmanı ISPP ile güncelle

Y1 sadece son katman eğitimi. Y10+ tam training.

TensorFlow + JAX:

  • TensorFlow: XLA backend. SIDRA plugin. Sınırlı, geliştirme.
  • JAX: XLA tabanlı. SIDRA JAX backend Y10+ hedef.

PyTorch öncelik çünkü %70 piyasa.

Deney: PyTorch → SIDRA 30 Saniyede

# 1. Import
import torch
import sidra_pytorch

# 2. Backend register
torch.register_privateuse1_backend("sidra")

# 3. Model yükle
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")

# 4. SIDRA'ya geçir
model = model.to("sidra:0")

# 5. Inference
inputs = tokenizer("Hello SIDRA", return_tensors="pt").to("sidra:0")
outputs = model(**inputs)
print(outputs.logits)

Standart HuggingFace kodu. SIDRA sadece .to("sidra:0") ekler. Transparent.

Kısa Sınav

1/6PyTorch SIDRA backend hangi API'yi kullanır?

Laboratuvar Görevi

Tipik workflow: HuggingFace transformer → SIDRA inference.

from transformers import pipeline
import sidra_pytorch

# Backend register (bir kere)
sidra.register_pytorch_backend()

# Pipeline'a sidra parametre geçir
translator = pipeline(
    "translation_en_to_tr",
    model="Helsinki-NLP/opus-mt-en-tr",
    device="sidra:0"
)

result = translator("Hello, how are you?")
print(result)  # [{'translation_text': 'Merhaba, nasılsın?'}]

5 satırlık kod. Model indir, SIDRA’ya yükle, kullan. Arka planda: INT8 quantize, crossbar program, inference.

Süre: Model indirme 1 dakika. İlk inference 2 saniye. Sonraki her biri 10 ms.

Enerji: ~30 mJ/cümle (100 token). GPU 1 J (30× fazla).

Özet Kart

  • PyTorch 2.0+ PrivateUse1 backend.
  • Dispatch: ATen op’ları SIDRA kernel’e map.
  • torch.compile: graph-level optimizasyon.
  • Quantization: INT8 auto.
  • Fallback: CPU unsupported op’lar için.
  • Benchmark: Y1 BERT ~5 ms.
  • Eğitim: Y1 son katman; tam Y10+.

Vizyon: SIDRA + PyTorch Ekosistemi

  • Y1: PyTorch inference standart.
  • Y3: HuggingFace ✓, Stable Diffusion ✓, Whisper ✓.
  • Y10: Training + PyTorch Lightning.
  • Y100: Native PyTorch primitive’leri (attention, transformer blocks).
  • Y1000: PyTorch alternative — SIDRA-native framework.

Türkiye için: HuggingFace’de Türkçe modellere SIDRA backend = Türk NLP topluluğu doğal kullanıcı.

Daha İleri