Tự build "Jarvis" chạy Local: Biến Raspberry Pi 5 thành AI Server với Llama-3 & ONNX Runtime

AI Hunter

Member
Thành viên BQT
Tự build "Jarvis" chạy Local: Biến Raspberry Pi 5 thành AI Server với Llama-3 & ONNX Runtime

Bạn có thực sự cần gửi dữ liệu cá nhân lên Cloud mỗi khi hỏi "Mấy giờ rồi?" hay "Tóm tắt email này"? Năm 2026 đánh dấu sự trỗi dậy của Small Language Models (SLM). Hôm nay, tôi sẽ hướng dẫn các bạn xây dựng một trợ lý ảo (Jarvis) chạy hoàn toàn offline trên Raspberry Pi 5. Không internet, không tốn phí API, và độ trễ cực thấp nhờ sức mạnh của ONNX Runtime.

Tự build Jarvis chạy Local Biến Raspberry Pi 5 thành AI Server với Llama-3 & ONNX Runtime.jpg

1. Chuẩn bị "Vũ khí" (Phần cứng & Yêu cầu)​

Để chạy mượt mà Llama-3 (phiên bản 8B hoặc các bản Tiny 3B), phần cứng đóng vai trò quyết định:
  • Raspberry Pi 5 (8GB RAM): Đây là yêu cầu bắt buộc. Model 4GB sẽ bị crash do tràn bộ nhớ (OOM) khi load model lượng tử hóa (Quantized).
  • Tản nhiệt Active Cooler: Pi 5 cực nóng khi chạy full load 4 nhân CPU. Đừng mơ dùng vỏ case kín mít mà không có quạt!
  • Nguồn điện chuẩn PD 27W: Để ép xung ổn định, nguồn 5V/5A tiêu chuẩn là cần thiết để tránh hiện tượng sụt áp (Undervoltage).
  • Lưu trữ: Khuyên dùng SSD NVMe để load model nhanh gấp 10 lần thẻ nhớ SD.

2. Tại sao lại là ONNX Runtime GenAI?​

Trước đây chúng ta hay dùng llama.cpp. Tuy nhiên, vào năm 2026, Microsoft đã tối ưu hóa ONNX Runtime GenAI cực tốt cho kiến trúc ARM64 của Raspberry Pi.
  • Tốc độ: Tận dụng tập lệnh NEON trên CPU của Pi tốt hơn.
  • Lượng tử hóa (Quantization): Hỗ trợ format Int4 siêu nhẹ. Model Llama-3 8B (~16GB FP16) khi nén xuống Int4 chỉ còn khoảng 4.5GB -> Vừa khít RAM 8GB.

3. Cài đặt và Tải Model​

Bước 1: Thiết lập môi trường​

Mở Terminal trên Pi và chạy các lệnh sau để cài đặt dependencies:
Bash:
sudo apt update && sudo apt full-upgrade -y
sudo apt install python3-venv git

# Tạo môi trường ảo
python3 -m venv jarvis-env
source jarvis-env/bin/activate

# Cài đặt thư viện ONNX Runtime GenAI
pip install onnxruntime-genai numpy huggingface_hub

Bước 2: Tải Model Int4​

Chúng ta tải phiên bản đã convert sẵn sang ONNX Int4 từ Hugging Face.
Bash:
# Tải model vào thư mục ./model
huggingface-cli download microsoft/Llama-3-8b-Instruct-onnx-cpu --include "cpu_and_mobile/cpu-int4-rtn-block-32/*" --local-dir ./model

4. Code "Bộ não" cho Jarvis (Python)​

Điểm mấu chốt ở đây là Prompt Template. Llama-3 không hiểu tiếng người đơn thuần, nó hiểu các "Special Tokens". Cấu trúc chuẩn của nó là:
<|user|> {câu hỏi} <|end|> <|assistant|>.
Nếu thiếu các thẻ này, model sẽ bị ảo giác (hallucination) hoặc tiếp tục đóng vai người dùng thay vì trả lời.

Tạo file jarvis.py:
Python:
import onnxruntime_genai as og
import argparse

def main():
    # Đường dẫn đến model
    model_path = "./model/cpu_and_mobile/cpu-int4-rtn-block-32"
  
    print("⏳ Đang nạp model (Khoảng 15s)...")
    model = og.Model(model_path)
    tokenizer = og.Tokenizer(model)
    tokenizer_stream = tokenizer.create_stream()
  
    # Cấu hình sinh văn bản (Generation Config)
    search_options = {
        'max_length': 2048,   # Độ dài câu trả lời tối đa
        'temperature': 0.6,   # 0.6 giúp câu trả lời chính xác, ít "phiêu" hơn
        'top_p': 0.9,
        'do_sample': True
    }

    print("🤖 Jarvis Online! (Gõ 'exit' để thoát)")
  
    chat_history = "" # (Nâng cao) Có thể lưu lịch sử chat vào đây

    while True:
        text = input("\nBạn: ")
        if text.lower() == 'exit': break
      
        # --- QUAN TRỌNG: CẤU TRÚC PROMPT ---
        # Llama-3 Instruct Format
        prompt = f"<|user|>\n{text}<|end|>\n<|assistant|>"
      
        input_tokens = tokenizer.encode(prompt)
      
        params = og.GeneratorParams(model)
        params.set_search_options(**search_options)
        params.input_ids = input_tokens
      
        generator = og.Generator(model, params)
      
        print("Jarvis: ", end='', flush=True)
      
        # Stream từng token ra màn hình
        while not generator.is_done():
            generator.compute_logits()
            generator.generate_next_token()
          
            new_token = generator.get_next_tokens()[0]
            print(tokenizer_stream.decode(new_token), end='', flush=True)
          
        print()

if __name__ == "__main__":
    main()

5. Bí mật hiệu năng: Ép xung an toàn (Safe Overclocking)​

Mặc định Pi 5 chạy ở xung nhịp 2.4GHz. Để tăng tốc độ sinh từ (tokens/s) lên khoảng 20-30%, bạn có thể ép xung lên 2.8GHz một cách khá an toàn nếu có tản nhiệt tốt.

Cảnh báo: Hãy chắc chắn bạn đang dùng nguồn Official 27W. Nguồn yếu sẽ làm máy sập ngay lập tức khi load model.

Cách thực hiện:​

Mở file config hệ thống:
Bash:
sudo nano /boot/firmware/config.txt

Thêm vào cuối file các dòng sau:
Mã:
# Overclock Settings
arm_freq=2800
gpu_freq=900
over_voltage_delta=50000
Nhấn Ctrl+O để lưu và Ctrl+X để thoát, sau đó Reboot.

Kết luận​

Với cấu hình này, bạn sẽ đạt được tốc độ khoảng 4-5 tokens/s. Tuy không nhanh như ChatGPT trên cloud, nhưng đây là AI của riêng bạn:
  • Không ai đọc được lịch sử chat.
  • Hoạt động ngay cả khi mất mạng.
  • Nền tảng tuyệt vời để gắn thêm Module Voice (Whisper) tạo thành loa thông minh.
Chúc các bạn thành công với dự án "Jarvis" tại gia!
 
Back
Top