AI Agents · Ders

Hafif Aracıların Uçta Dağıtımı

Düşük gecikmeli yanıt için Raspberry Pi ve uç cihazlarda küçük modeller çalıştırma.

4. ders / 413 adım

Hafif Aracıların Uçta Dağıtımı, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

Kenar Yapay Zekâ Ajanları

Bir kenar ajanı, bulut yerine doğrudan IoT cihazında veya yerel ağ geçidinde — Raspberry Pi, Jetson Nano ya da endüstriyel bir PC'de — çalışır. Faydaları şunlardır: daha düşük gecikme (gidiş-dönüş gerekmez), çevrimdışı çalışma ve daha düşük bant genişliği maliyeti. Ödünleşim ise sınırlı işlem gücü ve RAM nedeniyle daha küçük, daha verimli modellerin gerekmesidir.

Kenar Dağıtımı için Model Seçme

Kenar cihazları GPT-4o veya Claude Opus çalıştıramaz. Raspberry Pi 5'e (8 GB RAM) sığan küçük modeller şunlardır: Phi-3-mini (3,8 milyar parametre), Gemma-2B, TinyLlama-1.1B. 4 bit olarak nicemlendiğinde bu modeller 1–3 GB RAM gerektirir ve CPU üzerinde saniyede 5–15 belirteç hızında çalışır.

# Model size reference for edge selection:
EDGE_MODELS = {
    'tinyllama-1.1b-q4': {
        'params': '1.1B', 'quantization': 'Q4_K_M',
        'ram_gb': 0.8, 'tokens_per_sec_cpu': 15,
        'use_case': 'simple classification, keyword detection'
    },
    'phi-3-mini-q4': {
        'params': '3.8B', 'quantization': 'Q4_K_M',
        'ram_gb': 2.5, 'tokens_per_sec_cpu': 8,
        'use_case': 'reasoning, multi-step decisions'
    },
    'gemma-2b-q4': {
        'params': '2B', 'quantization': 'Q4_K_M',
        'ram_gb': 1.5, 'tokens_per_sec_cpu': 10,
        'use_case': 'general assistant tasks'
    }
}

for name, info in EDGE_MODELS.items():
    print(f'{name}: {info["ram_gb"]}GB RAM, '
          f'{info["tokens_per_sec_cpu"]} tok/s — {info["use_case"]}')

Raspberry Pi'ye Ollama Kurma

Ollama, küçük LLM'leri yerel donanımda çalıştırmanın en kolay yoludur. Model indirmelerini, nicemlemeyi ve OpenAI SDK ile uyumlu yerel bir REST API'sini yönetir. Tek bir komutla kurulur; başka bir komut da modeli indirip başlatır.

# Install Ollama (run on the Raspberry Pi terminal):
# curl -fsSL https://ollama.ai/install.sh | sh

# Pull and run a model:
# ollama pull phi3:mini
# ollama serve  (starts API on localhost:11434)

# Python client — uses the OpenAI-compatible endpoint:
from openai import OpenAI

local_client = OpenAI(
    base_url='http://localhost:11434/v1',
    api_key='ollama'  # Ollama ignores this but it is required by the SDK
)

def local_inference(prompt: str, model: str = 'phi3:mini') -> str:
    response = local_client.chat.completions.create(
        model=model,
        messages=[{'role': 'user', 'content': prompt}],
        max_tokens=256,
        temperature=0.1
    )
    return response.choices[0].message.content

result = local_inference('Is temperature 45C dangerous for a server room?')
print(result)

4 Bitlik GGUF Nicemleme

GGUF (GPT-Generated Unified Format), nicemlenmiş modeller için llama.cpp ve Ollama tarafından kullanılan dosya biçimidir. Q4_K_M, 4 bitlik karma nicemleme anlamına gelir — fp32'den yaklaşık %75 daha küçüktür ve kenar akıl yürütme görevlerinde kalite kaybı minimumdur.

# Understanding quantisation quality levels:
QUANTISATION_GUIDE = {
    'Q2_K': {'size_multiplier': 0.25, 'quality': 'poor', 'ram': 'minimal'},
    'Q4_K_M': {'size_multiplier': 0.45, 'quality': 'good', 'ram': 'low'},
    'Q5_K_M': {'size_multiplier': 0.55, 'quality': 'better', 'ram': 'medium'},
    'Q8_0': {'size_multiplier': 0.75, 'quality': 'near-original', 'ram': 'high'},
    'F16': {'size_multiplier': 1.0, 'quality': 'original', 'ram': 'full'}
}

# For edge: Q4_K_M is the sweet spot
# 7B model: 7B * 4bit/8 = 3.5 GB in Q4 vs 14 GB in F16

def estimate_vram_gb(param_billions: float, quant: str) -> float:
    multiplier = QUANT_GUIDE = {
        'Q4_K_M': 0.45, 'Q8_0': 0.75, 'F16': 1.0
    }
    return round(param_billions * multiplier.get(quant, 0.5), 2)

print(f'Phi-3-mini Q4_K_M: {estimate_vram_gb(3.8, "Q4_K_M")} GB')
print(f'Phi-3-mini F16: {estimate_vram_gb(3.8, "F16")} GB')

CPU'da Çıkarım Hızını Artırma

Yalnızca CPU kullanan kenar cihazlarında çıkarım hızı, iş parçacığı sayısına ve istem önbelleğe almaya bağlıdır. İş parçacığı sayısını CPU çekirdekleriyle eşleşecek şekilde ayarlayın, sistem istemini kısa tutun (önbelleğe alınmamışsa her çağrıda yeniden işlenir) ve mümkün olduğunda yinelenen sorguları toplu olarak işleyin.

import os
import time

# Ollama environment variables for performance tuning
# Set before starting the Ollama service:
# OLLAMA_NUM_PARALLEL=1  (single request at a time on small devices)
# OLLAMA_MAX_LOADED_MODELS=1  (only keep one model in RAM)

def timed_inference(prompt: str, client, model: str = 'phi3:mini') -> dict:
    start = time.time()
    response = client.chat.completions.create(
        model=model,
        messages=[{'role': 'user', 'content': prompt}],
        max_tokens=128
    )
    elapsed = time.time() - start
    text = response.choices[0].message.content
    tokens = len(text.split())  # approximate
    return {
        'text': text,
        'elapsed_s': round(elapsed, 2),
        'approx_tps': round(tokens / elapsed, 1)
    }

result = timed_inference('Classify: temperature=45C, normal range 18-30C. Action?',
                         local_client)
print(result)

Hibrit Uç-Bulut Mimarisi

En uygun mimari, hızlı ve riskin düşük olduğu kararlar (sınıflandırma, eşik mantığı) için uç modelini kullanır; karmaşık, nadir görülen veya yüksek riskli kararlar için bulut modeliyle eşitler. Uç ajanı, karmaşık sorguları kuyruğa alır ve bağlantı elverdiğinde gönderir.

import anthropic
import time

class HybridAgent:
    def __init__(self, edge_client, cloud_api_key: str):
        self.edge = edge_client  # Ollama local client
        self.cloud = anthropic.Anthropic(api_key=cloud_api_key)
        self.pending_cloud_queries = []

    def decide(self, context: dict) -> str:
        # Fast path: edge model for simple binary decisions
        simple_prompt = (
            f'Sensor: {context}. '
            'Respond with exactly one word: NORMAL or ALERT.'
        )
        edge_result = self.edge.chat.completions.create(
            model='phi3:mini',
            messages=[{'role': 'user', 'content': simple_prompt}],
            max_tokens=5
        ).choices[0].message.content.strip()

        if edge_result == 'ALERT':
            # Queue complex analysis for cloud
            self.pending_cloud_queries.append(context)

        return edge_result

    def sync_to_cloud(self):
        """Call when online connectivity is available."""
        for ctx in self.pending_cloud_queries:
            result = self.cloud.messages.create(
                model='claude-opus-4-5', max_tokens=512,
                messages=[{'role': 'user', 'content':
                    f'Full analysis of: {ctx}'}]
            )
            print('Cloud analysis:', result.content[0].text[:100])
        self.pending_cloud_queries.clear()

Bulut Eşitlemesi için Çevrim Dışı Kuyruk

Uç ajanları çoğunlukla bağlantının kesintili olduğu ortamlarda çalışır. Sorguları, sensör okumalarını ve eylem günlüklerini yerel olarak arabelleğe alın; ardından bağlantı yeniden kurulduğunda buluta gönderin. Yerel arabellek olarak bir SQLite veritabanı kullanın.

import sqlite3
import json
from datetime import datetime

DB_PATH = '/home/pi/agent_buffer.db'

def init_buffer_db():
    conn = sqlite3.connect(DB_PATH)
    conn.execute("""
        CREATE TABLE IF NOT EXISTS sync_queue (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            type TEXT NOT NULL,
            payload TEXT NOT NULL,
            created_at TEXT NOT NULL,
            synced INTEGER DEFAULT 0
        )
    """)
    conn.commit()
    conn.close()

def buffer_for_sync(record_type: str, payload: dict):
    conn = sqlite3.connect(DB_PATH)
    conn.execute(
        'INSERT INTO sync_queue (type, payload, created_at) VALUES (?, ?, ?)',
        (record_type, json.dumps(payload), datetime.utcnow().isoformat())
    )
    conn.commit()
    conn.close()

def flush_to_cloud(cloud_fn):
    conn = sqlite3.connect(DB_PATH)
    rows = conn.execute(
        'SELECT id, type, payload FROM sync_queue WHERE synced=0 LIMIT 100'
    ).fetchall()
    for row_id, r_type, payload in rows:
        cloud_fn(r_type, json.loads(payload))
        conn.execute('UPDATE sync_queue SET synced=1 WHERE id=?', (row_id,))
    conn.commit()
    conn.close()
    print(f'Synced {len(rows)} records to cloud')

if __name__ == '__main__':
    import os, tempfile
    DB_PATH = os.path.join(tempfile.gettempdir(), 'agent_buffer_demo.db')
    init_buffer_db()
    buffer_for_sync('sensor_reading', {'temp': 22.5})
    flush_to_cloud(lambda t, p: print(f'Synced to cloud: {t} -> {p}'))

Uç Ajanının Durumunu İzleme

Uç cihazları aşırı ısınabilir, RAM'i azalabilir veya model çıkarımı takılabilir. CPU sıcaklığını, boş RAM miktarını ve çıkarım gecikmesini denetleyen, ardından durum ölçümlerini buluta yayımlayan bir durum izleyicisi uygulayın.

import subprocess
import psutil  # pip install psutil

def get_edge_health() -> dict:
    cpu_percent = psutil.cpu_percent(interval=1)
    ram = psutil.virtual_memory()
    disk = psutil.disk_usage('/')

    # Read CPU temperature (Raspberry Pi specific)
    try:
        temp_output = subprocess.check_output(
            ['vcgencmd', 'measure_temp'], text=True
        )
        cpu_temp = float(temp_output.strip().replace("temp=", "").replace("'C", ""))
    except Exception:
        cpu_temp = -1.0  # not available on non-Pi hardware

    return {
        'cpu_percent': cpu_percent,
        'cpu_temp_c': cpu_temp,
        'ram_used_pct': ram.percent,
        'ram_available_mb': round(ram.available / 1024 / 1024),
        'disk_used_pct': disk.percent,
        'timestamp': datetime.utcnow().isoformat()
    }

health = get_edge_health()
print('Edge health:', health)

Uç Ajanları için Çıkarım Önbelleği

Uç modelleri yavaştır; aynı girdiler için verilen yanıtları önbelleğe alın. Sensör sınıflandırma görevlerinde aynı istem (örneğin, "temperature=23.5, classify") çoğunlukla tekrarlanır. TTL içeren basit bir sözlük önbelleği, gereksiz çıkarım çağrılarını önler.

from datetime import datetime, timedelta
import hashlib

class InferenceCache:
    def __init__(self, ttl_seconds: int = 60):
        self.ttl = timedelta(seconds=ttl_seconds)
        self._cache: dict = {}  # hash -> {'result', 'expires'}

    def _key(self, prompt: str) -> str:
        return hashlib.md5(prompt.encode()).hexdigest()

    def get(self, prompt: str):
        key = self._key(prompt)
        entry = self._cache.get(key)
        if entry and datetime.utcnow() < entry['expires']:
            return entry['result']
        return None

    def set(self, prompt: str, result: str):
        key = self._key(prompt)
        self._cache[key] = {
            'result': result,
            'expires': datetime.utcnow() + self.ttl
        }

cache = InferenceCache(ttl_seconds=60)

def cached_edge_inference(prompt: str, client) -> str:
    cached = cache.get(prompt)
    if cached:
        print('Cache hit')
        return cached
    result = local_inference(prompt, client)
    cache.set(prompt, result)
    return result

Dağıtım Kontrol Listesi

Bir uç ajanını üretim ortamına dağıtmadan önce şunları doğrulayın: model, %20 güvenlik payıyla kullanılabilir RAM'e sığıyor; çıkarım gecikmesi olay yanıtı gereksinimini karşılıyor; çevrim dışı arabellek test edildi; durum izleme yayımlama yapıyor ve çökme durumunda otomatik yeniden başlatma yapılandırıldı.

# systemd service file for auto-restart (save as /etc/systemd/system/edge-agent.service)

SYSTEMD_SERVICE = '''
[Unit]
Description=IoT Edge Agent
After=network.target ollama.service
Requires=ollama.service

[Service]
User=pi
WorkingDirectory=/home/pi/edge-agent
ExecStart=/usr/bin/python3 /home/pi/edge-agent/agent.py
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
'''

# Enable:
# sudo systemctl enable edge-agent
# sudo systemctl start edge-agent
# sudo journalctl -u edge-agent -f  (follow logs)

print('Deployment checklist:')
checklist = [
    'Model RAM fits with 20% headroom',
    'Inference latency < response time requirement',
    'Offline SQLite buffer tested',
    'Health metrics publishing to cloud',
    'systemd auto-restart configured'
]
for item in checklist:
    print(f'  [ ] {item}')

Raspberry Pi Donanım Kurulumu

Yazılımı dağıtmadan önce donanımı hazırlayın. Phi-3-mini çalıştırmak için 8 GB RAM'e sahip bir Raspberry Pi 5, önerilen en düşük donanımdır. GPU belleği bölüştürmesini etkinleştirin, takas alanını devre dışı bırakın (bu, flaş depolamanın ömrünü ve performansını düşürür) ve güvenilir uzaktan erişim için statik bir IP yapılandırın.

# Raspberry Pi setup notes (run manually over SSH):
# sudo raspi-config -> System -> GPU Memory -> 256
# Disable swap to protect SD card:
# sudo dphys-swapfile swapoff && sudo dphys-swapfile uninstall

def check_available_ram_mb():
    try:
        with open('/proc/meminfo') as f:
            for line in f:
                if line.startswith('MemAvailable'):
                    return int(line.split()[1]) // 1024
    except FileNotFoundError:
        return None

ram_mb = check_available_ram_mb()
if ram_mb is None:
    print('Could not read /proc/meminfo on this OS — simulated Pi reading: MemAvailable ~ 850 MB')
else:
    print(f'Available RAM: {ram_mb} MB')

Bilgi Kontrolü

Bir dil modeli için Q4_K_M nicemlemesi ne anlama gelir?

Özet: Hafif Ajanların Uç Ortamına Dağıtılması

Bu derste ele aldıklarınız:

  • Model seçimi: Uç ortamı için Phi-3-mini, Gemma-2B ve TinyLlama; Q4_K_M nicemlemesi
  • Ollama: 11434 bağlantı noktasında OpenAI uyumlu API sunan yerel LLM sunucusu
  • Hibrit mimari: Hızlı kararlar için uç modeli, karmaşık analiz için bulut
  • Çevrim dışı arabellek: Yeniden bağlantıda buluta gönderilen SQLite kuyruğu
  • Çıkarım önbelleği: Aynı istemler için tekrarlanan çıkarımı önleyen TTL önbelleği
  • Dağıtım: Çökme durumunda otomatik yeniden başlatma için systemd hizmeti

Sonraki kurs: Ajan Pazaryeri ve Eklenti Sistemleri.

Başlamak ücretsiz

Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
60
Dersler
239

Sıkça Sorulan Sorular

“Hafif Aracıların Uçta Dağıtımı” dersi ücretsiz mi?

Evet — “Hafif Aracıların Uçta Dağıtımı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“Hafif Aracıların Uçta Dağıtımı” dersinde ne öğreneceğim?

Düşük gecikmeli yanıt için Raspberry Pi ve uç cihazlarda küçük modeller çalıştırma. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Hafif Aracıların Uçta Dağıtımı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Aracı Entegrasyonu İçin MQTT Protokolü
  2. Aracılarda Zaman Serisi Verisi İşleme
  3. Sensör Olaylarına Otomatik Yanıt
  4. Hafif Aracıların Uçta Dağıtımı
← AI Agents Sayfasına Dön