Chuẩn bị Môi trường Triển khai
Trước khi triển khai mô hình Baichuan 2-13B-Chat 4bit, cần kiểm tra kỹ cấu hình phần cứng và phần mềm. Mô hình sau lượng tử hóa 4bit tiêu thụ khoảng 10GB VRAM, cho phép chạy trên card đồ họa tầm trung nhưng đòi hỏi cấu hình tối ưu.
Kiểm tra phần cứng
Yêu cầu tối thiểu:
- GPU: NVIDIA với VRAM ≥12GB (RTX 3060 12GB/4060 Ti 16GB)
- Bộ nhớ hệ thống: ≥16GB
- Dung lượng trống: ≥50GB (tệp mô hình ~8GB)
Các lệnh kiểm tra:
# Xem thông tin GPU
nvidia-smi
# Kiểm tra bộ nhớ hệ thống
free -h
# Dung lượng ổ đĩa
df -h /
Cấu hình phần mềm
Sử dụng Python 3.9 và CUDA 11.7/11.8:
conda create -n baichuan2 python=3.9
conda activate baichuan2
# Cài đặt PyTorch cho CUDA 11.8
pip install torch==2.0.1 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
Giải quyết Vấn đề Thường gặp
1. Lỗi kết nối cổng 7860
Biểu hiện: Dịch vụ chạy nhưng không truy cập được qua trình duyệt.
Nguyên nhân chính:
- Gradio bind sai địa chỉ
- Tường lửa chặn cổng
Khắc phục:
# Sửa file app.py
import gradio as gr
# Thay đổi server_name thành 0.0.0.0
giao_dien = gr.ChatInterface(
fn=tra_loi,
server_name="0.0.0.0", # Không dùng 127.0.0.1
server_port=7860
)
giao_dien.launch()
Mở cổng trong tường lửa:
sudo ufw allow 7860
sudo ufw reload
2. Thiếu bộ nhớ GPU (CUDA OOM)
Biểu hiện: Lỗi "CUDA out of memory" khi sinh văn bản dài.
Giải pháp tối ưu:
tai_mohinh = AutoModelForCausalLM.from_pretrained(
duong_dan_mohinh,
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
device_map="auto"
)
# Giới hạn tỷ lệ sử dụng VRAM
torch.cuda.set_per_process_memory_fraction(0.85)
Thêm cơ chế giải phóng bộ nhớ tự động:
def xu_ly_van_ban_dai(van_ban, do_dai_toi_da=512):
doan_van = [van_ban[i:i+do_dai_toi_da] for i in range(0, len(van_ban), do_dai_toi_da)]
ket_qua = []
for doan in doan_van:
torch.cuda.empty_cache() # Giải phóng trước mỗi lần xử lý
ket_qua.append(mo_hinh.generate(doan))
return " ".join(ket_qua)
3. Ngắt quãng phản hồi
Nguyên nhân: Thông số sinh văn bản không tối ưu hoặc timeout.
Cấu hình sinh văn bản ổn định:
tham_so_sinh = {
"max_new_tokens": 1024,
"temperature": 0.75,
"top_p": 0.92,
"repetition_penalty": 1.15,
"length_penalty": 0.8
}
def sinh_phan_hoi(input_ids):
return mo_hinh.generate(
input_ids,
**tham_so_sinh,
eos_token_id=bo_tach_tu.eos_token_id,
pad_token_id=bo_tach_tu.pad_token_id
)
Thiết lập timeout trong Gradio:
giao_dien.launch(
server_timeout=120, # Tăng thời gian timeout
max_threads=8
)
4. Tối ưu hiệu năng
Giảm thời gian khởi động:
- Đặt mô hình trên ổ NVMe
- Thiết lập preload trước khi chạy dịch vụ
Tệp cấu hình supervisor (/etc/supervisor/conf.d/baichuan.conf):
[program:baichuan]
command=python /opt/baichuan/app.py --port 7860 --host 0.0.0.0
directory=/opt/baichuan
autorestart=true
stopwaitsecs=45
stdout_logfile=/var/log/baichuan.log
environment=PYTORCH_CUDA_ALLOC_CONF="max_split_size_mb:128"
5. Xử lý tải cao
Giới hạn đồng thời:
# Trong file app.py
giao_dien.queue(
api_open=False,
max_size=15, # Hàng đợi tối đa 15 yêu cầu
default_concurrency_limit=3 # Xử lý song song tối đa 3
)
Kiểm soát tài nguyên:
def kiem_soat_tai_nguyen():
if torch.cuda.memory_allocated() / torch.cuda.get_device_properties(0).total_memory > 0.8:
torch.cuda.empty_cache()
logging.warning("VRAM vượt ngưỡng 80% - Dọn dẹp bộ nhớ")
Giám sát và Bảo trì
Tạo script kiểm tra định kỳ (monitor.sh):
#!/bin/bash
echo "=== Báo cáo trạng thái Baichuan ==="
echo "GPU:" $(nvidia-smi --query-gpu=memory.used --format=csv | tail -1)
echo "CPU:" $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
echo "Dịch vụ:" $(supervisorctl status baichuan | awk '{print $2}')
echo "Cổng 7860:" $(ss -tulpn | grep 7860 | wc -l)
Thiết lập tự động khởi động lại khi lỗi:
supervisorctl reread
supervisorctl update
supervisorctl start baichuan