AI Core cho lập trình viên/Train vs inference — hai pha, hai loại hoá đơn
5/54
Bài 5 / 54~13 phútBản đồ AI & học từ dữ liệuMiễn phí lượt xem

Train vs inference — hai pha, hai loại hoá đơn

Train là lúc trọng số còn đổi; inference là lúc chúng đóng băng và bạn trả tiền mỗi request. Nhầm hai pha này là gốc của hầu hết hiểu lầm về chi phí AI.

TL;DR: Một model có đúng hai pha sống, tách biệt hoàn toàn. Train là lúc trọng số còn đổi — chạy theo đợt, hoá đơn tính bằng giờ thuê GPU. Inference là lúc trọng số đã đóng băng — chạy mỗi lần có request, hoá đơn tính theo từng lượt gọi. Điểm dễ nhầm nhất: trong pha inference, không có gì được ghi lại — model không "học" từ prompt hay cuộc trò chuyện, dù chatbot trông như đang nhớ bạn. Trí nhớ đó là ứng dụng tự gửi lại lịch sử vào mỗi request, chứ bản thân model không đổi một trọng số nào. Muốn hành vi đổi lâu dài, có hai đường: train lại, hoặc gửi kèm thông tin đó vào mọi request về sau.

Đội bạn build một chatbot tra cứu tài liệu nội bộ, ước lượng ngân sách bằng cách gộp chung: "model tốn X giờ GPU để train, cứ thế mà tính chi phí vận hành." Tháng đầu production, hoá đơn không khớp — train chỉ trả một lần, còn inference tăng theo số người hỏi bot mỗi ngày, hai đường chi phí chẳng liên quan nhau. Cùng lúc, một nhân viên phàn nàn: hôm qua đã gõ hẳn hoi "tôi là kỹ sư team Payments", hôm nay hỏi lại bot không biết mình là ai.

Hai sự cố — một về tiền, một về "trí nhớ" — chung một gốc: đội bạn coi train và inference như một pha liên tục. Bài này vạch ranh giới cứng giữa hai pha đó, và giải thích vì sao nhầm ranh giới này là lỗi tốn tiền nhất của người mới học AI.

1. Analogy — ôn thi và ngồi phòng thi

Bạn ôn thi trong nhiều tuần: đọc tài liệu, luyện đề, sai chỗ nào thì sửa lại cách hiểu chỗ đó. Kiến thức trong đầu còn đổi suốt quá trình này. Nhưng khi bước vào phòng thi, luật chơi đổi hẳn: bạn làm bài chỉ với những gì đã có sẵn trong đầu tại thời điểm bước vào phòng. Giám thị nói gì, đề bài viết gì trong giờ thi cũng không "dạy" bạn thêm kiến thức mới cho môn đó — bạn chỉ đang áp dụng thứ đã học, không học thêm.

Đời thườngTrain vs inference
Ôn thi — đọc, luyện, sửa cách hiểuTrain — trọng số còn đổi theo dữ liệu
Ngồi phòng thi — làm bài bằng kiến thức đã có, không nạp thêmInference — trọng số đóng băng, chỉ input/output đổi theo lượt
Ôn thi diễn ra một đợt dài, trước kỳ thiTrain chạy theo đợt, trước khi model được đưa vào dùng
Mỗi buổi thi tính riêng — thi lại thì đóng lệ phí lạiMỗi request tính tiền riêng, theo lượt gọi
Trong phòng thi, mọi thứ giám thị hay đề bài nói không sửa được kiến thức bạn mang vàoTrong một request, prompt không sửa được trọng số model
💡 Cách nhớ

Ôn thi là lúc bạn còn "sai và sửa". Phòng thi là lúc bạn chỉ còn "dùng thứ đã có". Train và inference lệch nhau đúng ở chỗ đó.

2. Hai pha, ranh giới cứng

Một model là một hàm số khổng lồ với hàng triệu tới hàng tỷ con số bên trong — gọi là trọng số (weights). Toàn bộ thứ model "biết" nằm ở các con số này, không phải ở một database tra cứu được đâu đó bên cạnh.

Train là quá trình chỉnh dần các con số đó theo dữ liệu huấn luyện, để hàm số dự đoán ngày càng khớp kết quả mong muốn hơn (cơ chế chỉnh dần cụ thể — module sau của khoá này sẽ mở). Quá trình chạy theo đợt, lặp tới khi đạt tiêu chí dừng thì thôi. Kết thúc đợt train, trọng số được đóng băng, xuất ra thành một tệp.

Inference là chạy hàm số đó — với đúng bộ trọng số đã đóng băng — trên một input mới để lấy output. Mỗi request là một lần chạy hàm số, và trọng số không đổi giữa các lần chạy.

Hai khung tách rời: khung train chạy theo đợt với trọng số còn đổi, khung inference chạy mỗi request với trọng số cố định; nối hai khung là file trọng số đã đóng băng

Nhìn bằng pseudocode, ranh giới còn rõ hơn — chỉ hàm train có bước chỉnh trọng số, hàm inference thì không có bước đó ở đâu cả:

function train(du_lieu, trong_so_ban_dau):
    trong_so <- trong_so_ban_dau
    while not converged:
        sai_so <- tinh_sai_so(model(trong_so), du_lieu)   -- trọng số CÒN đổi ở mỗi vòng lặp
        trong_so <- chinh(trong_so, sai_so)
    return trong_so                                        -- đóng băng tại đây, xuất ra file trọng số

function inference(trong_so_dong_bang, input):
    output <- model(trong_so_dong_bang, input)             -- trọng số KHÔNG đổi
    return output                                          -- không có bước "chỉnh trọng số" nào trong hàm này

Chú ý: hàm inference nhận trong_so_dong_bang làm tham số đầu vào cố định — nó đọc, không bao giờ ghi lại. Đây chính là ranh giới cứng: qua dấu return cuối hàm train, không dòng code inference nào được phép sửa lại giá trị đó.

3. Vì sao chatbot "nhớ" bạn dù model không học gì mới?

Tự điền trước khi đọc tiếp

Hôm qua bạn gõ vào chatbot: "Tôi là kỹ sư team Payments." Hôm nay bạn mở lại đúng ứng dụng đó, hỏi "Tôi làm ở team nào?" — bot trả lời không biết.

Điền vào chỗ trống trước khi đọc tiếp: "Bot không nhớ vì ___." Viết ra câu trả lời của riêng bạn — thử áp đúng khái niệm "trọng số đóng băng" ở mục 2 vào tình huống này trước khi xem đáp án bên dưới.

Đáp án: bot không nhớ vì không có chỗ nào để nhớ. Trọng số đã đóng băng từ lúc train kết thúc; request của bạn hôm qua chỉ là một lần chạy hàm inference rồi kết thúc, không để lại dấu vết nào bên trong model.

Vậy vì sao chatbot vẫn "nhớ" bạn vừa nói gì hai phút trước, trong cùng một cuộc trò chuyện? Vì phía ứng dụng — không phải model — lưu lại lịch sử hội thoại rồi gửi lại toàn bộ lịch sử đó làm một phần input mỗi lần bạn gõ thêm câu mới. Với model, đây vẫn là một lần chạy inference độc lập, chỉ khác input dài hơn. Sang phiên mới, ứng dụng ngừng gửi lịch sử, model coi như chưa từng thấy nó.

Nói "tôi đã dạy nó rồi" ở đây là gán sai cơ chế: bot chỉ đang nhắc lại, còn "dạy" đúng nghĩa — sửa trọng số — chỉ xảy ra ở train.

Bài 01 chỉ ra: luật ứng xử của chương trình không viết tay bằng if-else — nó được học từ dữ liệu trong pha train. Bài này thêm vế còn thiếu: luật đó, học xong, bị đóng băng vào trọng số ngay khi train kết thúc. Sang pha inference, chương trình không còn "học luật mới" từ bất cứ input nào — kể cả một cuộc trò chuyện dài chứa toàn thông tin bạn vừa cho nó biết.

4. Hệ quả vận hành: artifact bạn deploy là gì?

Vì trọng số đóng băng ngay khi train xong, thứ bạn thật sự đem triển khai là hai thứ cụ thể: tệp trọng sốcode chạy inference, đóng gói và version hoá y hệt một bản build phần mềm thông thường. Hệ quả kéo theo, đều từ đúng một sự thật — trọng số không đổi khi đang chạy:

  • Version hoá + rollback được: phiên bản model là một mốc cụ thể (tệp trọng số nào). Hành vi sai lệch thì đổi lại đúng tệp trọng số phiên bản cũ, giống rollback một bản build binary.
  • Không có đường tắt sửa hành vi: đổi cách trả lời bền vững chỉ có hai lựa chọn — (a) train lại (tốn kém, đổi trọng số thật), hoặc (b) đổi input mỗi lần gọi (rẻ hơn, nhưng lặp lại ở mọi request). Không có đường thứ ba đi tắt qua inference.

5. So sánh bốn trục: train và inference đổi gì, chạy khi nào, tốn bao lâu, ai trả tiền

TrụcTrainInference
Thứ gì thay đổiTrọng số — được chỉnh dần theo dữ liệu huấn luyệnKhông gì trong model đổi — trọng số đóng băng; chỉ input/output đổi theo từng lượt
Tần suất chạyTheo đợt — một lần (hoặc vài lần, khi ra bản cập nhật), trước khi model được đưa vào dùngMỗi lần có request — có thể hàng nghìn tới hàng triệu lượt một ngày với hệ production
Độ trễ mỗi lần chạyTừ giờ tới ngày, cho cả đợtTừ mili-giây tới giây, mỗi request
Ai trả tiền, trả theo cái gìĐội huấn luyện trả, tính theo thời gian thuê tài nguyên tính toán (GPU) cho cả đợt — chi phí cố định của một lần chạyNgười gọi API trả, tính theo mỗi lượt gọi (thường theo khối lượng input/output) — chi phí biến đổi, cộng dồn theo lưu lượng thật

Cả bốn dòng đều là hệ quả của một sự thật — trọng số còn đổi hay đã đóng băng.

6. Pitfall tổng hợp

Nhầm 1 — coi hội thoại dài là "đang dạy" model:

✅ Cuộc trò chuyện dài chỉ là input dài đưa vào một (hoặc nhiều) lần chạy inference — không trọng số nào bị sửa. Đóng ứng dụng, mất lịch sử, model quay về đúng trạng thái trọng số ban đầu.

Nhầm 2 — gộp chung chi phí train và inference khi lập ngân sách:

✅ Hai mô hình chi phí độc lập (mục 5): train trả một lần cho một phiên bản; inference tỉ lệ với lưu lượng. Ngân sách vận hành dựa trên dự phóng lưu lượng inference, không phải chi phí train.

Nhầm 3 — nghĩ có cách "chỉnh nhẹ" model ngay trong lúc inference mà không cần train lại:

✅ Không có API hay tham số nào ở pha inference sửa được trọng số — mọi cách "làm model cư xử khác" lúc chạy chỉ tác động tới input của lần gọi đó, không tồn tại sau khi request kết thúc.

7. 📚 Deep Dive

📚 Nguồn gốc — đọc khi muốn xuống tầng sâu hơn

Tài liệu chính chủ:

8. Liên hệ các bài khác

9. Tóm tắt

  • Ranh giới hai pha là cứng: hàm inference chỉ đọc trọng số, không bao giờ ghi lại — không có đường tắt nào từ inference làm thay đổi trọng số.
  • Chatbot "nhớ" là vì ứng dụng gửi lại lịch sử mỗi request — không phải vì model đổi trọng số.
  • Artifact đem deploy là tệp trọng số + code inference — version hoá được, rollback được, giống một bản build binary.
  • Đổi hành vi lâu dài chỉ có hai đường: train lại, hoặc đổi input mỗi lần gọi.

10. Tự kiểm tra

Tự kiểm tra
Q1
Vì sao chatbot trả lời đúng ngữ cảnh bạn vừa nói hai phút trước trong cùng một cuộc trò chuyện, nhưng đó không phải bằng chứng model đã 'học' được điều gì?

Ứng dụng phía trước lưu lại lịch sử hội thoại và gửi kèm toàn bộ lịch sử đó làm input mỗi lần bạn gõ thêm — với model, đây vẫn chỉ là một lần chạy inference với input dài hơn, không phải một lần trọng số bị sửa.

Bằng chứng: đóng ứng dụng rồi mở lại (hoặc lịch sử bị cắt), model không còn "nhớ" gì — vì thứ đang mất đi là dữ liệu phía ứng dụng, không phải trạng thái bên trong model.

Q2
Sau khi trọng số đã đóng băng ở cuối pha train, bạn muốn model thực sự đổi hành vi lâu dài. Có bao nhiêu con đường, và đó là (những) con đường nào?

Đúng hai con đường: train lại model (tốn kém, thay đổi trọng số thật) hoặc đổi thứ đưa vào input mỗi lần gọi (rẻ hơn, nhưng phải lặp lại ở mọi request). Không có con đường thứ ba đi tắt qua inference — pha đó theo định nghĩa chỉ đọc, không ghi.

Q3
Vì sao artifact thật sự đem deploy production chỉ là 'tệp trọng số + code inference', và điều này có ý nghĩa gì với việc rollback một phiên bản model lỗi?

Vì mọi thứ model "biết" nằm trong trọng số, và trọng số đã đóng băng ngay khi train xong — phần code train không cần có mặt lúc chạy production. Nhờ vậy version model là một mốc cụ thể (tệp trọng số nào), nên rollback chỉ là đổi lại đúng tệp trọng số phiên bản cũ — giống rollback một bản build binary.

Q4
Team bạn thấy hoá đơn inference tăng đều theo số người dùng mỗi tháng, trong khi hoá đơn train không đổi suốt quý đó dù model vẫn được dùng liên tục. Giải thích hiện tượng này bằng mô hình chi phí hai pha.

Train là khoản chi trả một lần cho một phiên bản model — không liên quan tới việc model được gọi bao nhiêu lần sau đó, nên nó đứng yên khi không có bản train mới. Inference là khoản chi biến đổi, tính theo từng lượt gọi — tăng đều theo lưu lượng thật. Hai đường chi phí độc lập, gộp chung là ước lượng sai.

Q5
Một đồng nghiệp nói: 'Tôi đã dạy con bot nhớ tên khách hàng rồi, từ giờ nó sẽ nhớ mãi.' Bạn sửa lại phát biểu này thế nào cho đúng cơ chế?

Phát biểu sai ở chữ "dạy" và "nhớ mãi": "dạy" theo đúng nghĩa sửa trọng số chỉ xảy ra ở pha train, không xảy ra khi trò chuyện với bot. Điều đồng nghiệp thật sự làm là đưa tên khách hàng vào input của request đó — sửa lại: "bot trả lời đúng cho lần này vì input có tên khách hàng; muốn nó luôn biết, phải gửi kèm thông tin đó ở mọi request về sau, hoặc train lại model."

Bài tiếp theo: Overfitting — khi model học vẹt

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên

Bài tiếp theo

Overfitting & data leakage: demo đẹp mà production hỏng