MLX
Apple Silicon için yerel framework
Genel bakış
MLX, Apple'ın 2023'te yayınladığı, Apple Silicon için sıfırdan tasarlanmış array framework'ü. PyTorch/JAX'a benzeyen Python API + Swift API. Unified memory'yi sömürür: CPU/GPU arasında veri kopyalamaz, çekirdekler doğrudan aynı belleği görür.
İki katman: düşük seviye `mlx` (numpy benzeri), üst seviye `mlx-lm` (LLM çalıştırma + fine-tune). Mac'te Llama, Mistral, Qwen vs. çalıştırmak için en hızlı yol — llama.cpp'den genelde %20-40 daha hızlı.
Kurulum
# Python 3.9+, sadece Apple Silicon
pip install mlx mlx-lm
# Veya tüm ekosistem
pip install mlx mlx-lm mlx-vlm mlx-data
# Doğrula
python -c "import mlx.core as mx; print(mx.metal.is_available())"
# True dönmeliYapılandırma
# mlx-community HF organizasyonu MLX'e dönüştürülmüş
# 200+ model barındırır
# Tek komutla generate
mlx_lm.generate \
--model mlx-community/Llama-3.1-8B-Instruct-4bit \
--prompt "Selam, kendini tanıt" \
--max-tokens 256 \
--temp 0.3
# OpenAI uyumlu sunucu (port 8080)
mlx_lm.server \
--model mlx-community/Llama-3.1-8B-Instruct-4bit \
--port 8080from mlx_lm import load, generate
model, tokenizer = load("mlx-community/Llama-3.1-8B-Instruct-4bit")
response = generate(
model, tokenizer,
prompt="Selam!",
max_tokens=256,
temp=0.3,
verbose=True, # tps yazar
)
print(response)# JSONL veriyi hazırla (data/train.jsonl, data/valid.jsonl)
mlx_lm.lora \
--model mlx-community/Llama-3.1-8B-Instruct-4bit \
--train \
--data ./data \
--batch-size 2 \
--num-layers 16 \
--iters 600 \
--lora-rank 8
# Sonra adapter ile inference
mlx_lm.generate \
--model mlx-community/Llama-3.1-8B-Instruct-4bit \
--adapter-path ./adapters \
--prompt "..."Donanım hızlandırma
MLX yalnız Apple Silicon'da çalışır — Intel Mac, NVIDIA, AMD desteği yok. Ama burada eşi yok: tüm Apple Silicon GPU çekirdeklerini ve Neural Engine'i tek API üzerinden kullanır. Unified memory sayesinde KV cache CPU/GPU arasında taşınmaz.
| Apple Silicon (M1/M2/M3/M4) | Native — Metal Performance Shaders + ANE |
| Intel Mac | — |
| NVIDIA / AMD | — |
| iOS / iPadOS | Var (Swift API) |
| Unified memory | Tüm RAM'i model + KV cache için kullan |
| Eğitim (training) | Var — LoRA, QLoRA fine-tune Mac'te çalışır |
Model formatları & quantization
Format: MLX'in kendi safetensors varyantı. mlx-community organizasyonu (Hugging Face) 200+ popüler modeli MLX formatına dönüştürdü. Quantization: INT4, INT8, FP16.
# HF safetensors → MLX (FP16)
mlx_lm.convert \
--hf-path meta-llama/Llama-3.1-8B-Instruct \
--mlx-path ./Llama-3.1-8B-Instruct-mlx
# 4-bit quantize ederek dönüştür
mlx_lm.convert \
--hf-path meta-llama/Llama-3.1-8B-Instruct \
--mlx-path ./Llama-3.1-8B-Instruct-4bit \
-q --q-bits 4 --q-group-size 64
# Hub'a yükle
mlx_lm.convert \
--hf-path meta-llama/Llama-3.1-8B-Instruct \
--upload-repo your-username/Llama-3.1-8B-mlx| FP16 | Kayıpsız, en kaliteli |
| INT8 | Kalite ile boyut arasında iyi denge |
| INT4 (group size 64) | Standart 'Q4' karşılığı, en yaygın |
| INT4 (group size 32) | Biraz daha kaliteli, biraz daha büyük |
| GGUF | — |
API
# mlx_lm.server'ı başlattıktan sonra
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="sk-no-key")
resp = client.chat.completions.create(
model="mlx-community/Llama-3.1-8B-Instruct-4bit",
messages=[{"role": "user", "content": "Selam"}],
stream=True,
)
for c in resp:
print(c.choices[0].delta.content or "", end="", flush=True)import mlx.core as mx
a = mx.array([1, 2, 3, 4])
b = mx.array([10, 20, 30, 40])
c = a * b + a.mean()
mx.eval(c) # lazy → tetikle
print(c) # array([12.5, 22.5, ...])
# GPU/CPU device manuel:
mx.set_default_device(mx.gpu)Performans
| M2 Max, Llama-3.1-8B 4bit | ~75 tok/s |
| M3 Max, Llama-3.1-8B 4bit | ~95 tok/s |
| M3 Ultra, Llama-3.1-70B 4bit | ~18 tok/s |
| llama.cpp'ye karşı (aynı donanım) | %20-40 daha hızlı |
| Eğitim (LoRA, 8B 4bit) | M2 Max'te ~4 saatte 600 iter |
| RAM tavanı | Unified memory'nin ~%75'i (sistem ihtiyacı için pay) |
Sık yapılan hatalar
- Sadece Apple SiliconIntel Mac, NVIDIA, Linux — hiçbiri yok. Multi-platform desteği gerekiyorsa llama.cpp veya vLLM.
- GGUF yüklemiyorMLX kendi safetensors formatını kullanır. llama.cpp/Ollama'dan kalan GGUF'ları çalıştıramazsın — mlx_lm.convert ile yeniden dönüştürmek gerek.
- Unified memory tavanı16 GB Mac'te 8B Q4 (~5 GB) rahat ama 70B sığmaz. macOS varsayılan olarak GPU'ya RAM'in %66'sını verir; sudo sysctl iogpu.wired_limit_mb=N ile artırabilirsin.
- Lazy evaluation kafa karıştırıcıMLX hesaplamaları lazy yapar — mx.eval() ya da yazdırma tetiklemezse hiçbir şey çalışmaz. PyTorch'tan geçenler için ilk gün şaşırtıcı.