Bỏ qua đến nội dung chính
AI Local
Logo vLLM bên cạnh cửa sổ terminal trên nền xanh đậm

vLLM là gì? Phục vụ LLM nhanh trên GPU riêng

AIDev TeamTham vấn chuyên môn: Nguyễn Việt Chung

Đăng 16 phút đọc2 lượt xem

Mục lục · 24

Bài này trả lời vLLM là gì và khi nào nên dùng nó thay Ollama. vLLM là server mã nguồn mở chạy LLM trên GPU, trả lời nhiều người cùng lúc qua API tương thích OpenAI. Mình đo vLLM 0.32.0 và Ollama với Qwen3.5-9B trên RTX 3090: một người hỏi thì tốc độ không chênh nhiều, 16 người hỏi cùng lúc thì vLLM sinh 1.003 token/giây, Ollama bản 8 bit chỉ 61.

vLLM là phần mềm mã nguồn mở (giấy phép Apache 2.0) dùng để chạy LLM (mô hình ngôn ngữ lớn) trên GPU và phục vụ nhiều người hỏi cùng lúc qua một API tương thích với API của OpenAI. Nó ra đời ở Sky Computing Lab của UC Berkeley năm 2023, và theo repo GitHub hiện có hơn 95.000 sao. Ngày 23/10/2026, mình thuê một RTX 3090 24GB trên AIDev Cloud, cài bản 0.32.0 (bản mới nhất trên PyPI, phát hành 18/10/2026) và chạy Qwen3.5-9B. Cùng model đó, mình chạy Ollama 0.40.9 để so sánh.

Những điều cần nắm trước khi chọn giữa vLLM và Ollama:

  • Khi chỉ một người hỏi, tốc độ hai bên không chênh nhiều: vLLM sinh 76,7 token/giây, Ollama 58,5 token/giây với bản 8 bit và 74,4 với bản 4 bit.

  • Khi 16 người hỏi cùng lúc, vLLM sinh tổng cộng 1.003 token/giây và ai cũng thấy chữ đầu tiên sau khoảng 0,2 giây. Ollama bản 8 bit vẫn chỉ sinh 61 token/giây, người xếp cuối hàng chờ 62,7 giây mới thấy chữ đầu tiên.

  • vLLM giữ trước phần lớn VRAM ngay lúc khởi động (22.418MiB trên card 24GB), Ollama chỉ chiếm phần model cần (10.836MiB).

  • vLLM khởi động lâu hơn nhiều: 233 giây lần đầu, 83 giây các lần sau. Ollama nạp lại model trong 5 giây.

  • Bản cài mặc định từ PyPI đi kèm PyTorch build cho CUDA 13, chỉ chạy trên GPU từ đời Turing trở lên (RTX 20, 30, 40…). Tesla P40 và V100 không dùng được bản này.

vLLM là gì và khác Ollama ở chỗ nào?

Ollama được làm cho một người dùng trên một máy: gõ ollama run, có ngay model để chat, nạp model nhanh, model không dùng thì tự nhả VRAM. vLLM được làm cho server: một máy GPU, một API, rất nhiều request (lượt gọi API) đến cùng lúc từ app, chatbot hay hệ thống RAG của bạn. Mục tiêu của nó là tổng số token sinh ra mỗi giây của cả máy (throughput), vì đó là thứ quyết định một GPU phục vụ được bao nhiêu người.

Ollama

vLLM

Hợp với

một người dùng, laptop, máy cá nhân

server phục vụ app, nhiều người dùng

Định dạng model

GGUF đã nén sẵn (Q4_K_M, Q8_0…)

trọng số gốc trên Hugging Face, nén FP8, AWQ, GPTQ…

Nhiều request cùng lúc

tùy kiến trúc model; Qwen3.5 chạy lần lượt từng request

gộp request vào cùng lô, xem phần đo bên dưới

VRAM

chiếm đúng phần model cần

mặc định giữ trước 92% VRAM cho model và KV cache

Cài đặt

một lệnh, chạy cả Windows, macOS

package Python trên Linux, chủ yếu cho GPU NVIDIA và AMD

API

API riêng và API tương thích OpenAI

API tương thích OpenAI, có cả Anthropic Messages API

Nếu bạn chưa dùng Ollama bao giờ, bài Ollama là gì giải thích từ đầu. Bài này giả định bạn đã quen gọi model qua API.

PagedAttention và KV cache là gì?

Khi sinh từng token, model cần nhớ "key" và "value" của mọi token đã đọc để không phải tính lại cả câu. Vùng nhớ đó trên GPU gọi là KV cache. Câu hỏi càng dài và càng nhiều người hỏi cùng lúc thì KV cache càng lớn.

Các hệ thống cũ cấp cho mỗi request một khối liền nhau đủ cho độ dài tối đa, nên phần lớn khối đó bị bỏ trống. PagedAttention, ý tưởng chính trong bài báo gốc của vLLM (SOSP 2023), chia KV cache thành các trang nhỏ, giống cách hệ điều hành chia RAM. Request dài bao nhiêu thì lấy bấy nhiêu trang. Theo bài báo, cách này gần như không lãng phí KV cache và tăng throughput 2 đến 4 lần so với FasterTransformer và Orca ở cùng độ trễ.

Ý tưởng thứ hai của vLLM là continuous batching (gộp lô liên tục). Mỗi bước, GPU sinh thêm một token cho mọi request đang chạy; request nào xong thì rời lô, request mới vào ngay ở bước sau. Lúc sinh token, GPU chủ yếu chờ đọc trọng số từ VRAM, nên đọc trọng số một lần để sinh token cho 16 request tốn thời gian gần bằng cho 1 request. Vì vậy ở phần đo bên dưới, số token/giây của cả máy tăng gần tỷ lệ thuận với số người hỏi.

Log khởi động ghi rõ dung lượng KV cache: trên RTX 3090, sau khi nạp model đã nén trọng số xuống 8 bit (FP8, 10,27GiB), phần còn lại cho KV cache là 10,32GiB, chứa được 303.935 token, tức khoảng 9 request dài 32.768 token chạy cùng lúc. Request ngắn thì chạy cùng lúc được nhiều hơn.

Cài vLLM trên GPU thế nào?

Theo hướng dẫn cài đặt chính thức, cách cài được khuyên dùng là qua uv. Mình cài trên Ubuntu 24.04 của máy thuê, Python 3.12 có sẵn:

bash
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv -p 3.12 ~/venv
source ~/venv/bin/activate
uv pip install vllm==0.32.0

Lệnh cài kéo 198 package, trong đó có torch 2.13.0 và transformers 5.19.0. Cả bước cài mất 108 giây trên máy thuê. Bản torch đi kèm là 2.13.0+cu130, tức build cho CUDA 13.

Terminal cài vLLM 0.32.0 bằng uv trên RTX 3090: 198 package, torch 2.13.0+cu130

Chuyện CUDA 13 quan trọng nếu bạn định dùng card cũ. Theo ghi chú phát hành CUDA Toolkit, CUDA 13 bỏ hỗ trợ GPU Maxwell, Pascal và Volta. Trang cài đặt cho GPU của vLLM cũng ghi GPU NVIDIA cần compute capability từ 7.5 (T4, RTX 20 trở lên). Tesla P40 (Pascal) và V100 (Volta) vẫn chạy Ollama tốt, như bài chạy DeepSeek local đã đo, nhưng không chạy được bản PyTorch mà vLLM 0.32 kéo về. Vì vậy mình chọn RTX 3090 (đời Ampere) cho bài này.

Trước khi chạy model, bạn cần cài thêm hai thứ. Mình chỉ phát hiện ra chúng khi gặp lỗi (kể ở mục lỗi cuối bài):

bash
sudo apt-get install -y python3.12-dev
uv pip install pip && vllm download-kernels

Chạy model Qwen bằng vllm serve

Mình chọn Qwen/Qwen3.5-9B vì Ollama cũng có model này, và bộ trọng số gốc trên Hugging Face nặng 19,3GB, đủ lớn để thấy giới hạn VRAM của card 24GB. Lệnh mình dùng:

bash
vllm serve Qwen/Qwen3.5-9B --served-model-name qwen3.5-9b \
  --quantization fp8 --max-model-len 32768 \
  --limit-mm-per-prompt '{"image":0,"video":0}' --reasoning-parser qwen3

Mình đặt từng cờ vì những lý do sau:

  • --quantization fp8 nén trọng số từ 16 bit xuống 8 bit lúc nạp. Chạy bản gốc 16 bit không kèm cờ nào thì báo hết VRAM, mình kể ở mục lỗi.

  • --max-model-len 32768 giới hạn độ dài context. Nếu không đặt cờ này, vLLM lấy 262.144 token theo model card.

  • --limit-mm-per-prompt tắt đầu vào ảnh và video, vì Qwen3.5 là model đa phương thức (nhận cả ảnh, video) còn mình chỉ cần chữ.

  • --reasoning-parser qwen3 tách phần "suy nghĩ" của model ra một trường riêng trong kết quả trả về.

Log khởi động vllm serve trên RTX 3090: Model loading took 10.27 GiB, GPU KV cache size 303,935 tokens, Application startup complete

Server mở ở cổng 8000. Lần đầu khởi động mất 233 giây, phần lớn là bước biên dịch torch.compile (37 giây) và lượt chạy thử để đo bộ nhớ (92 giây). Các lần sau, kết quả biên dịch nằm sẵn trong ~/.cache/vllm nên chỉ còn 83 đến 87 giây.

Gọi vLLM bằng API tương thích OpenAI

Server có các endpoint /v1/models, /v1/chat/completions như OpenAI, nên curl hay bất kỳ thư viện nào gọi được API của OpenAI đều dùng được. Gọi bằng curl:

bash
curl -s localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
  "model": "qwen3.5-9b",
  "messages": [{"role": "user", "content": "vLLM là gì? Trả lời một câu."}],
  "max_tokens": 100, "temperature": 0,
  "chat_template_kwargs": {"enable_thinking": false}}'
Kết quả curl tới /v1/chat/completions: model qwen3.5-9b trả lời một câu tiếng Việt, 23 token vào, 53 token ra

Qwen3.5 mặc định "suy nghĩ" trước khi trả lời. Trường chat_template_kwargs tắt bước suy nghĩ này để câu trả lời ngắn và nhanh.

Trong Python, mình dùng thư viện openai, chỉ cần đổi base_url sang server vLLM:

python
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="khong-can")
r = client.chat.completions.create(
    model="qwen3.5-9b",
    messages=[{"role": "user", "content": "Tiệm bánh nên lưu đơn hàng bằng gì? Trả lời 2 câu."}],
    max_tokens=200,
    temperature=0,
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)
print(r.choices[0].message.content)
print(r.usage)

Đoạn code này cũng chạy với Ollama: đổi base_url sang cổng 11434, đổi tên model thành qwen3.5:9b-q8_0 và thay dòng extra_body bằng reasoning_effort="none". Nhờ vậy bạn thử app trên laptop bằng Ollama, lúc lên server thì đổi sang vLLM mà không viết lại code.

Cùng một đoạn Python gọi server vLLM cổng 8000 và Ollama cổng 11434, cả hai trả lời câu hỏi về tiệm bánh

vLLM nhanh hơn Ollama bao nhiêu?

Mình viết một script Python (chỉ dùng thư viện chuẩn) gửi N request cùng lúc vào API tương thích OpenAI của mỗi server, N bằng 1, 4 và 16. Mỗi request yêu cầu model viết một bài khoảng 500 chữ về một chủ đề khác nhau, cắt ở 256 token, temperature 0, tắt suy nghĩ. Mỗi mức chạy ba lượt, lượt đầu để làm nóng, số trong bảng là trung bình hai lượt sau. Script đọc nvidia-smi mỗi nửa giây để lấy VRAM cao nhất.

Hai bên dùng cùng Qwen3.5-9B ở mức nén gần nhau nhất: vLLM nén FP8 (8 bit) và Ollama dùng qwen3.5:9b-q8_0 (8 bit). Mình đo thêm bản Ollama mặc định qwen3.5:9b (4 bit, Q4_K_M) vì đa số người dùng Ollama chạy bản này.

Server

Người hỏi cùng lúc

Token/giây cả máy

Chờ chữ đầu, trung bình

Người chờ lâu nhất

Xong cả lượt

vLLM FP8

1

76,7

0,06 giây

0,06 giây

3,3 giây

vLLM FP8

4

293,6

0,12 giây

0,12 giây

3,5 giây

vLLM FP8

16

1.003,2

0,21 giây

0,22 giây

4,1 giây

Ollama q8_0

1

58,5

0,11 giây

0,15 giây

4,4 giây

Ollama q8_0

4

60,2

6,5 giây

13,0 giây

17,0 giây

Ollama q8_0

16

61,4

31,3 giây

62,7 giây

66,7 giây

Ollama q4 (mặc định)

1

74,4

0,12 giây

0,17 giây

3,4 giây

Ollama q4 (mặc định)

16

79,3

24,2 giây

48,5 giây

51,7 giây

Biểu đồ token/giây của cả máy: vLLM 76,7 với 1 người, 293,6 với 4 người, 1.003,2 với 16 người; Ollama 58,5, 60,2 và 61,4

Với một người, vLLM nhanh hơn Ollama bản 8 bit khoảng 31%, ngang Ollama bản 4 bit. Chênh lệch lớn nằm ở cột người chờ lâu nhất. Ở 16 người, Ollama xử lý lần lượt từng request, mỗi request mất khoảng 4 giây, nên người thứ 16 phải chờ hơn một phút mới thấy chữ đầu tiên. vLLM gộp cả 16 request vào một lô: mỗi người nhận chữ chậm đi một chút (66 token/giây thay vì 78) nhưng cả 16 người xong trong 4,1 giây.

Bật OLLAMA_NUM_PARALLEL cho Ollama có nhanh hơn không?

Mình thử bật OLLAMA_NUM_PARALLEL=16 cho Ollama và đo lại bản 8 bit ở cả ba mức: kết quả gần như không đổi (61,4 token/giây ở 16 người). Log của Ollama 0.40.9 ghi rõ lý do: kiến trúc Qwen3.5 chưa hỗ trợ request song song. Theo FAQ của Ollama, biến này mặc định là 1 và áp cho các model hỗ trợ chạy song song; mình chưa đo Ollama song song với model kiến trúc khác.

Phép đo trên dùng prompt ngắn và câu trả lời 256 token, tức trường hợp dễ cho GPU. Trong sách Xây ứng dụng AI với LLM và AI Agent của AIDev, mình đo cùng card và cùng Qwen3.5-9B FP8 trên vLLM 0.31 với prompt dài 1.500 token như một câu hỏi RAG: ở 16 request đồng thời, cả máy sinh 371 token/giây và 95% người dùng thấy chữ đầu tiên trong 4,7 giây. Prompt càng dài thì mỗi request càng tốn GPU, nên một card phục vụ được ít người hơn.

Quy ra tiền thuê máy

Gói RTX 3090 trên AIDev Cloud giá 15.000đ/giờ. Nếu máy luôn có 16 request chạy cùng lúc như phép đo trên, vLLM sinh khoảng 3,6 triệu token mỗi giờ, tức khoảng 4đ cho 1.000 token. Ollama bản 8 bit với Qwen3.5 tối đa chỉ khoảng 221.000 token mỗi giờ (61,4 token/giây), tức khoảng 68đ cho 1.000 token. Đây là trần lý thuyết khi máy chạy kín: app ít người dùng thì GPU để không nhiều và giá mỗi token cao hơn. Bảng giá các gói có ở bài giá thuê GPU theo giờ.

vLLM cần bao nhiêu VRAM?

Con số VRAM của vLLM phải đọc khác với Ollama. vLLM giữ trước một tỷ lệ cố định của VRAM ngay lúc khởi động, mặc định 0,92 ở bản 0.32 (log ghi --gpu-memory-utilization=0.9200). Trên RTX 3090, nvidia-smi báo 22.418MiB khi chạy Qwen3.5-9B FP8, dù trọng số chỉ chiếm 10,27GiB. Phần lớn chỗ còn lại (10,32GiB) là KV cache, dành cho các request song song.

Ollama với qwen3.5:9b-q8_0 thì nvidia-smi báo 10.836MiB, và bản 4 bit mặc định chiếm 6,7GB theo ollama ps. Phần VRAM còn trống dùng được cho việc khác, chẳng hạn một model embedding.

nvidia-smi khi vLLM chạy Qwen3.5-9B FP8 báo 22418 MiB, khi Ollama chạy qwen3.5:9b-q8_0 báo 10836 MiB trên RTX 3090 24GB

Nếu muốn vLLM chừa VRAM cho việc khác, bạn hạ cờ --gpu-memory-utilization, ví dụ 0.70. Đổi lại KV cache nhỏ đi và số request chạy cùng lúc giảm. Bản 16 bit của model 9B không khởi động được trên card 24GB với cấu hình mặc định (xem mục lỗi), nên mình chạy model cỡ 9B ở FP8 như trong bài. Model lớn hơn thì cần bản đã nén sẵn 4 bit (AWQ, GPTQ), mình chưa đo trường hợp này. Bảng VRAM chi tiết của từng model khi chạy Ollama có ở bài chọn model Ollama theo VRAM.

vLLM khởi động mất bao lâu?

Biểu đồ thời gian khởi động: vLLM lần đầu 233,2 giây, lần sau 83,2 giây, Ollama nạp lần đầu 90,3 giây, nạp lại 5,0 giây

Ollama nạp qwen3.5:9b-q8_0 lần đầu (ngay sau khi tải model về) mất 90 giây, các lần sau chỉ 5 giây. vLLM lần đầu mất 233 giây, các lần sau 83 giây, vì lần nào khởi động nó cũng chạy thử model để đo bộ nhớ và ghi lại CUDA graph (chuỗi lệnh GPU ghi sẵn để chạy lại nhanh), lần đầu còn thêm bước biên dịch. Với server chạy liên tục thì 83 giây không đáng kể. Với máy cá nhân, bật tắt nhiều lần trong ngày, Ollama dễ chịu hơn hẳn.

Khi nào nên dùng vLLM, khi nào Ollama là đủ?

Sau khi biết vLLM là gì và xem số đo ở trên, bạn nên chọn nó khi:

  • App, chatbot hay hệ thống RAG có nhiều người dùng cùng lúc, hoặc một agent gửi nhiều request song song.

  • Model chạy liên tục trên server Linux có GPU NVIDIA từ đời Turing trở lên.

  • Bạn muốn chi phí mỗi token thấp khi máy chạy kín, như phép tính ở trên.

Khi nào không nên dùng vLLM:

  • Bạn chỉ chat một mình hoặc thử model. Ollama cài trong một lệnh, khởi động trong vài giây, và bản 4 bit mặc định nhanh ngang vLLM khi chỉ một người dùng.

  • Máy của bạn chạy Windows hoặc macOS (vLLM cần Linux hoặc WSL), hoặc dùng card đời cũ như P40, V100 mà bản PyTorch CUDA 13 đi kèm vLLM 0.32 không hỗ trợ.

  • Bạn cần một card chạy nhiều thứ cùng lúc, chẳng hạn LLM và Stable Diffusion. vLLM mặc định giữ trước 92% VRAM, bạn phải tự hạ tỷ lệ này.

  • Bạn đổi model liên tục. Mỗi lần đổi, vLLM mất hơn một phút khởi động lại.

Lỗi mình đã gặp khi cài vLLM

Python.h: No such file or directory

Lần chạy vllm serve đầu tiên dừng ngay ở bước đọc kiến trúc model:

text
/tmp/tmpd5p_sxul/cuda_utils.c:9:10: fatal error: Python.h: No such file or directory
pydantic_core._pydantic_core.ValidationError: 1 validation error for ModelConfig
  Value error, Model architectures ['Qwen3_5ForConditionalGeneration'] failed to be inspected.

Dòng cuối dễ làm bạn tưởng model không được hỗ trợ. Nguyên nhân thật ở dòng đầu: Triton (trình biên dịch kernel GPU mà PyTorch và vLLM dùng) biên dịch một đoạn C nhỏ và cần header của Python, mà image Ubuntu 24.04 trên máy thuê chưa cài. Cách sửa là sudo apt-get install -y python3.12-dev (đúng phiên bản Python của venv).

CUDA out of memory khi chạy bản 16 bit

Chạy vllm serve Qwen/Qwen3.5-9B không có cờ nào, vLLM nạp trọng số 17,57GiB rồi báo hết VRAM ở bước chạy thử:

text
torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 512.00 MiB. GPU 0 has a total capacity of 23.56 GiB of which 400.31 MiB is free.
RuntimeError: Engine core initialization failed. See root cause above. Failed core proc(s): {}

Trọng số 17,57GiB trông như vừa card 24GB, nhưng vLLM còn cần bộ nhớ cho lượt chạy thử, CUDA graph và KV cache. Lần sau mình thêm --quantization fp8 (cùng --max-model-len 32768 và cờ tắt đầu vào ảnh) thì trọng số còn 10,27GiB và server lên bình thường. Mình chưa thử lại bản 16 bit với context ngắn hơn.

No such file or directory: 'ninja'

Với cờ FP8, server qua được bước nạp model nhưng dừng ở bước làm nóng:

text
FileNotFoundError: [Errno 2] No such file or directory: 'ninja'

FlashInfer (thư viện kernel vLLM dùng để lấy mẫu token) muốn biên dịch kernel lúc chạy nhưng máy không có ninja (công cụ build) và CUDA Toolkit. Log có gợi ý chạy vllm download-kernels để tải kernel dựng sẵn. Lệnh này lại báo No module named pip, vì venv tạo bằng uv không có pip. Sau khi mình chạy uv pip install pip và vllm download-kernels (mất 106 giây), server khởi động được.

Câu hỏi thường gặp

vLLM có miễn phí không?

Có. vLLM là mã nguồn mở theo giấy phép Apache 2.0, dùng cho cả mục đích thương mại. Bạn chỉ trả tiền GPU, máy của bạn hoặc máy thuê.

vLLM có chạy trên Windows hay Mac không?

Theo tài liệu cài đặt, vLLM không chạy trực tiếp trên Windows; bạn dùng WSL (Windows Subsystem for Linux). Với Mac Apple Silicon có nhánh vLLM-Metal do cộng đồng duy trì, mình chưa thử. Với máy cá nhân, Ollama vẫn là lựa chọn dễ hơn.

Card 8GB hay 12GB chạy vLLM được không?

Mình chưa đo trên card 8GB hay 12GB nên không đưa con số. Từ cách vLLM chia VRAM ở trên, card nhỏ chỉ hợp với model nhỏ (cỡ 4B) hoặc model đã nén sẵn 4 bit, và phần còn lại cho KV cache ít nên số người dùng cùng lúc cũng thấp.

vLLM có dùng được model GGUF của Ollama không?

Theo README, vLLM có hỗ trợ GGUF, nhưng hướng chính của nó là trọng số trên Hugging Face và các kiểu nén FP8, AWQ, GPTQ. Mình dùng trọng số gốc của Qwen và để vLLM tự nén FP8 lúc nạp.

Chatbot nội bộ vài người dùng có cần vLLM không?

Tùy số người hỏi cùng một lúc chứ không tùy tổng số người dùng. Với 4 người hỏi cùng lúc, Ollama bản 8 bit để người cuối chờ 13 giây mới thấy chữ đầu, vLLM chỉ 0,12 giây. Nếu hiếm khi có hai người hỏi cùng lúc, Ollama đủ dùng và để trống được nhiều VRAM hơn.

Đọc tiếp

Muốn biết app của bạn chịu được bao nhiêu người trên một GPU? Bạn có thể thuê RTX 3090 trên AIDev Cloud, chạy vllm serve với model của bạn và đo bằng chính câu hỏi của người dùng. Đo xong thì trả máy.

Đo ngày 23/10/2026 trên máy AIDev Cloud RTX 3090 24GB gói Standard (25 vCPU Xeon E5-2680 v4, 53GB RAM, Ubuntu 24.04, driver 610.43.02, CUDA 13.3). vLLM 0.32.0 (torch 2.13.0+cu130, Python 3.12.3), Ollama 0.40.9, model Qwen/Qwen3.5-9B và qwen3.5:9b, qwen3.5:9b-q8_0.

Tham vấn chuyên môn

Nguyễn Việt Chung

Nhà sáng lập AIDev và VietPlatform · Thạc sĩ AI MSE

  • Tốt nghiệp thủ khoa xuất sắc Thạc sĩ AI MSE.
  • Đồng sáng lập, CTO E-University, SVOnline: số hóa 10+ đại học, 40.000+ sinh viên.
  • Xây hệ thống AI cho doanh nghiệp tại VietPlatform.
Biên soạn: AIDev Team · Rà soát · Quy trình biên tập