Chạy VLM của bạn trong 3 bước đơn giản trên CPU Intel
Chạy VLM của bạn trong 3 bước đơn giản trên CPU Intel
- 9 min read
Chạy VLM của bạn trong 3 bước đơn giản trên CPU Intel
Với khả năng ngày càng tăng của các mô hình ngôn ngữ lớn (LLM), một lớp mô hình mới đã nổi lên: Vision Language Models (VLM). Những mô hình này có thể phân tích hình ảnh và video để mô tả các cảnh, tạo chú thích và trả lời các câu hỏi về nội dung trực quan.
Mặc dù việc chạy các mô hình AI trên thiết bị của riêng bạn có thể khó khăn vì các mô hình này thường đòi hỏi nhiều tính toán, nhưng nó cũng mang lại những lợi ích đáng kể: bao gồm cải thiện quyền riêng tư vì dữ liệu của bạn vẫn ở trên máy của bạn và tăng cường tốc độ và độ tin cậy vì bạn không phụ thuộc vào kết nối internet hoặc máy chủ bên ngoài. Đây là nơi các công cụ như Optimum Intel và OpenVINO xuất hiện, cùng với một mô hình nhỏ, hiệu quả như SmolVLM. Trong bài đăng trên blog này, chúng tôi sẽ hướng dẫn bạn ba bước dễ dàng để chạy VLM cục bộ mà không cần phần cứng hoặc GPU đắt tiền (mặc dù bạn có thể chạy tất cả các mẫu mã từ bài đăng trên blog này trên GPU Intel).
Triển khai mô hình của bạn với Optimum
Các mô hình nhỏ như SmolVLM được xây dựng để tiêu thụ ít tài nguyên, nhưng chúng có thể được tối ưu hóa hơn nữa. Trong bài đăng trên blog này, chúng ta sẽ xem cách tối ưu hóa mô hình của bạn, để giảm mức sử dụng bộ nhớ và tăng tốc suy luận, làm cho nó hiệu quả hơn để triển khai trên các thiết bị có tài nguyên hạn chế.
Để làm theo hướng dẫn này, bạn cần cài đặt optimum và openvino, bạn có thể thực hiện bằng:
bash pip install optimum-intel[openvino] transformers==4.52.*
Bước 1: Chuyển đổi mô hình của bạn
Đầu tiên, bạn sẽ cần chuyển đổi mô hình của mình sang OpenVINO IR. Có nhiều tùy chọn để thực hiện việc này:
- Bạn có thể sử dụng Optimum CLI
bash optimum-cli export openvino -m HuggingFaceTB/SmolVLM2-256M-Video-Instruct smolvlm_ov/
- Hoặc bạn có thể chuyển đổi nó ngay lập tức khi tải mô hình của bạn:
python from optimum.intel import OVModelForVisualCausalLM
model_id = “HuggingFaceTB/SmolVLM2-256M-Video-Instruct” model = OVModelForVisualCausalLM.from_pretrained(model_id) model.save_pretrained(“smolvlm_ov”)
Bước 2: Lượng tử hóa
Bây giờ là lúc để tối ưu hóa mô hình của bạn. Lượng tử hóa làm giảm độ chính xác của trọng số và/hoặc kích hoạt của mô hình, dẫn đến các mô hình nhỏ hơn, nhanh hơn. Về cơ bản, đó là một cách để ánh xạ các giá trị từ một kiểu dữ liệu có độ chính xác cao, chẳng hạn như số dấu phẩy động 32 bit (FP32), sang định dạng có độ chính xác thấp hơn, thường là số nguyên 8 bit (INT8). Mặc dù quá trình này mang lại một số lợi ích chính, nhưng nó cũng có thể ảnh hưởng đến sự mất độ chính xác tiềm ẩn.

Optimum hỗ trợ hai phương pháp lượng tử hóa sau đào tạo chính:
Hãy khám phá từng phương pháp.
Tùy chọn 1: Weight Only Quantization
Lượng tử hóa chỉ trọng số có nghĩa là chỉ các trọng số được lượng tử hóa, nhưng các kích hoạt vẫn ở độ chính xác ban đầu của chúng. Do đó, mô hình trở nên nhỏ hơn và hiệu quả hơn về bộ nhớ, cải thiện thời gian tải. Nhưng vì các kích hoạt không được lượng tử hóa, nên tốc độ suy luận đạt được bị hạn chế. Lượng tử hóa chỉ trọng số là một bước đầu tiên đơn giản vì nó thường không dẫn đến sự suy giảm độ chính xác đáng kể.
Kể từ OpenVINO 2024.3, nếu trọng số của mô hình đã được lượng tử hóa, các kích hoạt tương ứng cũng sẽ được lượng tử hóa tại thời gian chạy, dẫn đến tăng tốc bổ sung tùy thuộc vào thiết bị.
Để chạy nó, bạn sẽ cần tạo cấu hình lượng tử hóa OVWeightQuantizationConfig như sau:
python from optimum.intel import OVModelForVisualCausalLM, OVWeightQuantizationConfig
q_config = OVWeightQuantizationConfig(bits=8) q_model = OVModelForVisualCausalLM.from_pretrained(model_id, quantization_config=q_config) q_model.save_pretrained(“smolvlm_int8”)
hoặc tương đương bằng cách sử dụng CLI:
bash optimum-cli export openvino -m HuggingFaceTB/SmolVLM2-256M-Video-Instruct –weight-format int8 smolvlm_int8/
Tùy chọn 2: Static Quantization
Với Static Quantization, cả trọng số và kích hoạt đều được lượng tử hóa trước khi suy luận. Để đạt được ước tính tốt nhất cho các tham số lượng tử hóa kích hoạt, chúng ta thực hiện một bước hiệu chỉnh. Trong bước này, một tập dữ liệu đại diện nhỏ được đưa qua mô hình. Trong trường hợp của chúng tôi, chúng tôi sẽ sử dụng 50 mẫu của tập dữ liệu theo ngữ cảnh và sẽ áp dụng lượng tử hóa tĩnh trên bộ mã hóa tầm nhìn trong khi lượng tử hóa chỉ trọng số sẽ được áp dụng trên phần còn lại của mô hình. Các thử nghiệm cho thấy rằng việc áp dụng lượng tử hóa tĩnh trên bộ mã hóa tầm nhìn mang lại cải thiện hiệu suất đáng chú ý mà không làm giảm đáng kể độ chính xác. Vì bộ mã hóa tầm nhìn chỉ được gọi một lần cho mỗi thế hệ, nên hiệu suất tổng thể đạt được từ việc áp dụng lượng tử hóa tĩnh trên thành phần này thấp hơn so với hiệu suất đạt được bằng cách tối ưu hóa các thành phần được sử dụng thường xuyên hơn như mô hình ngôn ngữ. Tuy nhiên, phương pháp này có thể có lợi trong một số trường hợp nhất định. Ví dụ: khi cần câu trả lời ngắn, đặc biệt với nhiều hình ảnh làm đầu vào.
python from optimum.intel import OVModelForVisualCausalLM, OVPipelineQuantizationConfig, OVQuantizationConfig, OVWeightQuantizationConfig
q_config = OVPipelineQuantizationConfig( quantization_configs={ “lm_model”: OVWeightQuantizationConfig(bits=8), “text_embeddings_model”: OVWeightQuantizationConfig(bits=8), “vision_embeddings_model”: OVQuantizationConfig(bits=8), }, dataset=dataset, num_samples=num_samples, ) q_model = OVModelForVisualCausalLM.from_pretrained(model_id, quantization_config=q_config) q_model.save_pretrained(“smolvlm_static_int8”)
Lượng tử hóa kích hoạt thêm các lỗi nhỏ có thể tích tụ và ảnh hưởng đến độ chính xác, vì vậy việc kiểm tra cẩn thận sau đó là rất quan trọng. Thông tin và ví dụ khác có thể được tìm thấy trong tài liệu của chúng tôi.
Bước 3: Chạy suy luận
Bây giờ bạn có thể chạy suy luận với mô hình đã lượng tử hóa của mình:
python generated_ids = q_model.generate(**inputs, max_new_tokens=100) generated_texts = processor.batch_decode(generated_ids, skip_special_tokens=True) print(generated_texts[0])
Nếu bạn có máy tính xách tay Intel gần đây, Intel AI PC hoặc GPU rời Intel, bạn có thể tải mô hình trên GPU bằng cách thêm device="gpu" khi tải mô hình của bạn:
python model = OVModelForVisualCausalLM.from_pretrained(model_id, device=“gpu”)
Chúng tôi cũng đã tạo một space để bạn có thể chơi với mô hình gốc và các biến thể lượng tử hóa của nó thu được bằng cách áp dụng lượng tử hóa chỉ trọng số và lượng tử hóa hỗn hợp tương ứng. Bản demo này chạy trên bộ xử lý Intel Xeon thế hệ thứ 4 (Sapphire Rapids).

Để tái tạo kết quả của chúng tôi, hãy xem notebook của chúng tôi.
Đánh giá và Kết luận
Chúng tôi đã chạy một điểm chuẩn để so sánh hiệu suất của các phiên bản PyTorch, OpenVINO và OpenVINO 8-bit WOQ của mô hình gốc. Mục tiêu là đánh giá tác động của lượng tử hóa chỉ trọng số đối với độ trễ và thông lượng trên phần cứng Intel CPU. Đối với thử nghiệm này, chúng tôi đã sử dụng một hình ảnh duy nhất làm đầu vào.
Chúng tôi đã đo các chỉ số sau để đánh giá hiệu suất của mô hình:
- Time To First Token (TTFT): Thời gian cần thiết để tạo ra token đầu tiên.
- Time Per Output Token (TPOT): Thời gian cần thiết để tạo ra mỗi token đầu ra tiếp theo.
- End-to-End Latency: Tổng thời gian cần thiết để tạo ra tất cả các token đầu ra.
- Decoding Throughput: Số lượng token mỗi giây mà mô hình tạo ra trong giai đoạn giải mã.
Dưới đây là kết quả trên Intel CPU:
| Configuration | Time To First Token (TTFT) | Time Per Output Token (TPOT) | End-to-End Latency | Decoding Throughput |
|---|---|---|---|---|
| pytorch | 5.150 | 1.385 | 25.927 | 0.722 |
| openvino | 0.420 | 0.021 | 0.738 | 47.237 |
| openvino-8bit-woq | 0.247 | 0.016 | 0.482 | 63.928 |
Điểm chuẩn này chứng minh cách các mô hình đa phương thức nhỏ, được tối ưu hóa, như SmolVLM2-256M, hoạt động trên CPU Intel trên các cấu hình khác nhau. Theo các thử nghiệm, phiên bản PyTorch cho thấy độ trễ cao, với thời gian đến token đầu tiên (TTFT) hơn 5 giây với thông lượng giải mã là 0.7 token/giây. Đơn giản chỉ cần chuyển đổi mô hình bằng Optimum và chạy nó trên OpenVINO làm giảm đáng kể thời gian đến token đầu tiên (TTFT) xuống 0.42 giây (tăng tốc x12) và tăng thông lượng lên 47 token/giây (x65). Áp dụng lượng tử hóa chỉ trọng số 8 bit làm giảm thêm TTFT (x1.7) và tăng thông lượng (x1.4), đồng thời giảm kích thước mô hình và cải thiện hiệu quả.
Cấu hình nền tảng
Cấu hình nền tảng cho các yêu cầu hiệu suất ở trên:
System Board: MSI B860M GAMING PLUS WIFI (MS-7E42)
CPU: Intel® Core™ Ultra 7 265K
Sockets/Physical Cores: 1/20 (20 threads)
HyperThreading/Turbo Settings: Disabled
Memory: 64 GB DDR5 @ 6400 MHz
TDP: 665W
BIOS: American Megatrends International, LLC. 2.A10
BIOS Release Date: 28.11.2024
OS: Ubuntu 24.10
Kernel: 6.11.0–25-generic
OpenVINO Version: 2025.2.0
torch: 2.8.0
torchvision: 0.23.0+cpu
optimum-intel: 1.25.2
transformers: 4.53.3
Benchmark Date: 15.05.2025
Benchmarked by: Intel Corporation
Hiệu suất có thể khác nhau tùy theo mục đích sử dụng, cấu hình và các yếu tố khác. Xem cấu hình nền tảng bên dưới.
Liên kết và Tài nguyên hữu ích
Hiệu suất thay đổi theo cách sử dụng, cấu hình và các yếu tố khác. Tìm hiểu thêm trên trang Performance Index.
Kết quả hiệu suất dựa trên thử nghiệm tính đến ngày hiển thị trong cấu hình và có thể không phản ánh tất cả các bản cập nhật có sẵn công khai. Xem sao lưu để biết chi tiết cấu hình. Không có sản phẩm hoặc thành phần nào có thể hoàn toàn an toàn. Chi phí và kết quả của bạn có thể khác nhau. Công nghệ Intel có thể yêu cầu phần cứng, phần mềm hoặc kích hoạt dịch vụ được bật.
© Intel Corporation. Intel, logo Intel và các nhãn hiệu Intel khác là nhãn hiệu của Intel Corporation hoặc các công ty con của nó.
Link bài viết gốc
- Tags:
- Ai
- October 15, 2025
- Huggingface.co