# Distillation cho FDE: dùng model lớn gán nhãn, đưa model nhỏ vào hạ tầng của khách

> Bản demo trên model lớn đã thuyết phục được khách, nhưng đội hạ tầng chỉ đồng ý khi bạn trả lời được ba câu hỏi về chi phí, độ trễ và chỗ dữ liệu được phép đi qua.

Bản gốc: https://fdetimes.net/vi/bach-khoa/distillation-model-lon-sinh-nhan-model-nho-chay-trong-ha-tang-khach/

Bản demo chạy trên model lớn nhất mà khách tin dùng, và nó làm tốt: đọc email của khách hàng, gán đúng loại yêu cầu, giải thích lý do gọn gàng. Rồi đến buổi họp với đội hạ tầng. Họ hỏi mỗi tháng tốn bao nhiêu, mỗi request chờ bao lâu, và vì sao dữ liệu khách hàng phải đi ra ngoài.

Câu trả lời trung thực thường là: model lớn quá đắt và quá nặng cho một tác vụ hẹp đến vậy. Nhóm nghiên cứu của Google và Snorkel viết rằng yêu cầu tính toán của LLM vượt xa mức mà phần lớn đội sản phẩm có thể chi trả. Ở một khách hàng có hạ tầng riêng và quy định dữ liệu chặt, vấn đề càng gắt hơn.

Distillation là cách FDE thoát khỏi thế kẹt đó. Bạn giữ model lớn làm "thầy", dùng nó tạo dữ liệu, rồi huấn luyện một model nhỏ chạy được trên máy của khách. Kỹ năng này nằm giữa applied AI và deployment, và nó quyết định bản demo có trở thành hệ thống production hay không.

## Ý tưởng có từ trước làn sóng LLM

Năm 2015, Geoffrey Hinton, Oriol Vinyals và Jeff Dean mô tả đúng vấn đề này với các ensemble model. Họ thừa nhận rằng dự đoán bằng cả một ensemble thì cồng kềnh, và chứng minh có thể nén tri thức của ensemble vào một model duy nhất. Đó là gốc của distillation hiện đại.

Điểm tinh tế của bài báo nằm ở "soft targets": student không chỉ học nhãn đúng mà học cả phân phối xác suất teacher đưa ra. Thử hình dung teacher chấm một email 0,7 là "yêu cầu bồi thường" và 0,25 là "khiếu nại phí". Con số 0,25 đó dạy student rằng hai loại này gần nhau, điều mà nhãn cứng không nói được.

Với LLM, còn có thêm một tín hiệu khác: lời giải thích. Bài "Distilling Step-by-Step" (2023) lấy lý do do LLM sinh ra làm tín hiệu giám sát bổ sung, huấn luyện model nhỏ theo kiểu đa nhiệm: vừa dự đoán nhãn, vừa sinh lý do.

## Model nhỏ có thể thắng model lớn không?

Trên benchmark của bài báo, câu trả lời là có. Một model T5 770 triệu tham số sau fine-tune vượt PaLM 540 tỷ tham số được prompt few-shot, mà chỉ dùng 80% dữ liệu có sẵn. Tính trung bình, các model của họ đạt kết quả tốt hơn với ít hơn 50% số ví dụ huấn luyện.

Đừng mang con số đó vào buổi họp với khách như một lời hứa. Đó là benchmark, không phải email của khách hàng bạn. AWS cũng nói model student trên Bedrock cho tốc độ phản hồi nhanh hơn hẳn và chi phí vận hành thấp hơn, nhưng đó là lời của nhà cung cấp. Điều duy nhất bạn được hứa là: bạn sẽ đo, trên dữ liệu của chính khách.

Vì thế, tài liệu chính thức của OpenAI về distillation đặt mục tiêu rất khiêm tốn: huấn luyện model nhỏ làm gần bằng model lớn, đắt hơn, trên một tác vụ cụ thể. Và họ chốt một nguyên tắc: chỉ đầu tư vào fine-tuning sau khi đã có eval.

**Điểm mấu chốt:** Model nhỏ chỉ đáng tin bằng bộ đề bạn dùng để chấm nó.

## Thử hình dung: 6 loại email ở một công ty bảo hiểm

Giả sử khách là một công ty bảo hiểm cần phân loại email vào 6 nhóm, trong đó có "hỏi tiến độ hồ sơ" và "nghi gian lận". Họ có 20.000 email chưa gán nhãn và muốn model chạy trong cụm máy nội bộ.

Bước một không phải là gọi model lớn. Bạn nhờ chuyên viên của khách gán nhãn 600 email rồi chia làm hai: 200 email làm dev set để chỉnh prompt, 400 email làm holdout. Holdout được cất riêng, không dùng để huấn luyện và cũng không dùng để chỉnh prompt.

Nếu 60% holdout là "hỏi tiến độ hồ sơ", một model luôn trả lời nhãn đó đạt 60% accuracy mà không bắt được email gian lận nào. Vì vậy bạn phải đo recall theo từng lớp, nhất là lớp mà khách sợ bỏ sót.

Bước hai, chỉnh prompt cho teacher và chấm trên dev set, cho đến khi nó đạt ngưỡng eval mà bạn và khách đã thống nhất. Đây đúng là quy trình OpenAI khuyến nghị: làm prompt cho model lớn đạt eval, thu output, lọc thành dataset, rồi fine-tune model nhỏ hơn như gpt-4.1-mini. Nếu chính teacher còn không đạt ngưỡng, student không có gì để học.

Bước ba, cho teacher gán nhãn 20.000 email kèm lý do, theo một định dạng cố định:

```python
def label_with_teacher(email, teacher):
    out = teacher.generate(PROMPT, email)        # PROMPT đã chỉnh trên DEV_HUMAN
    rec = parse_json(out)                        # {"label": ..., "rationale": ...}
    if rec is None or rec["label"] not in LABELS:
        return None                              # loại bản ghi sai định dạng
    return {"input": email, "label": rec["label"], "rationale": rec["rationale"]}

raw = [label_with_teacher(e, teacher) for e in emails]
```

Bước bốn, lọc dữ liệu rồi fine-tune student:

```python
dataset = [r for r in raw if r]                                  # bỏ bản ghi hỏng
dataset = [r for r in dataset if agrees_on_rerun(r, teacher)]    # gọi lại, giữ mẫu nhất quán
train, val = split(dataset, 0.9)
student = finetune(base_small_model, train, targets=["label", "rationale"])
```

Hai dòng lọc là chỗ nhiều người bỏ qua. Bản ghi sai định dạng, nhãn ngoài danh sách, hay mẫu mà teacher trả lời khác nhau giữa hai lần gọi đều là nhiễu. Student sẽ học thuộc nhiễu một cách rất chăm chỉ.

Bước năm, so trên holdout rồi mới triển khai. Lúc này holdout 400 email mới được mở ra, và bạn đặt ba cột cạnh nhau: teacher, model nhỏ chưa fine-tune và student.

OpenAI nhấn mạnh rằng bạn cần một cách đáng tin để biết model đã fine-tune có tốt hơn base model, tức model nhỏ chưa fine-tune, hay không. Nếu student không vượt rõ model nhỏ chưa fine-tune, chi phí huấn luyện là phí hoài.

Chỉ khi student thắng, bạn mới đo độ trễ và tài nguyên trên phần cứng thật của khách, rồi giữ lại một luồng nhỏ gửi lên teacher để phát hiện khi dữ liệu thay đổi.

Khi đội hạ tầng hỏi về chi phí, hãy đặt hai con số cạnh nhau trên cùng một lượng request: chi phí mỗi request nếu tiếp tục gọi teacher, và chi phí mỗi request của student trên máy của khách, cộng thêm khoản một lần cho việc gán nhãn và huấn luyện.

Cách trình bày này cho khách thấy sau bao nhiêu request thì distillation bắt đầu có lợi, thay vì một lời hứa "rẻ hơn" chung chung.

## Những lỗi khiến distillation thất bại âm thầm

Lỗi nặng nhất là chấm student bằng nhãn của teacher. Khi đó bạn chỉ đo mức student bắt chước thầy, kể cả những lỗi của thầy. Holdout phải do người am hiểu nghiệp vụ gán nhãn.

Một biến thể kín đáo hơn là chỉnh prompt trên chính holdout. Sau vài chục vòng sửa, prompt đã khớp với đúng 400 email đó, và con số cuối cùng đẹp hơn thực tế. Dev set tồn tại để holdout giữ được vai trò đối chứng.

Lỗi thứ ba là quên rằng bước gán nhãn cũng đẩy dữ liệu đi đâu đó. Nếu email không được phép rời khỏi hạ tầng của khách, teacher phải chạy ở nơi đã được phê duyệt, hoặc bạn chỉ dùng một tập đã ẩn danh.

Hãy chốt điều này với đội bảo mật trước khi gọi API đầu tiên, và đọc kỹ điều khoản của nhà cung cấp về việc dùng output để huấn luyện model khác.

Lỗi cuối là bỏ phần lý do để tiết kiệm token. Kết quả của "Distilling Step-by-Step" cho thấy lý do chính là thứ giúp model nhỏ học hiệu quả với ít dữ liệu hơn. Ở phía khách, lý do còn giúp chuyên viên kiểm tra vì sao model gắn cờ một email.

## Biến kỹ năng này thành lợi thế khi đi xin việc

Khi đọc JD của các vị trí FDE hay applied AI, hãy để ý cụm "fine-tuning", "evals", "on-prem" hoặc "cost optimization" đứng cạnh nhau. Đó là dấu hiệu công ty cần người làm được đúng quy trình này. Trên CV, một dòng tốt nêu tác vụ, kích thước student, chỉ số trên holdout do người gán nhãn và mức giảm độ trễ đo được.

Bài tập cho tuần này: lấy một tập dữ liệu phân loại công khai, giả vờ chỉ có 200 nhãn của người, chia một phần làm dev set và phần còn lại làm holdout.

Dùng một model lớn gán nhãn phần dữ liệu còn lại kèm lý do, fine-tune một model nhỏ, rồi viết một trang so sánh ba cột như trên, thêm một đoạn về lớp mà student làm kém nhất.

Bản demo trên model lớn chứng minh bài toán giải được. Distillation chứng minh khách có thể sống chung với lời giải đó mỗi ngày, trên chính máy của họ.

**Thử ngay tuần này:**

- Chọn một tác vụ phân loại đang chạy trên model lớn trong dự án của bạn, rồi nhờ người trong nghề gán nhãn 200 mẫu làm holdout trước khi làm bất cứ việc gì khác.
- Đếm tỷ lệ của lớp phổ biến nhất trong holdout đó: đây là mức accuracy mà một model 'lười' đạt được, và student phải vượt xa mức này.
- Đọc phần 'Distilling from a larger model' trong tài liệu fine-tuning của OpenAI, rồi viết lại quy trình của nó thành checklist cho hạ tầng của khách hàng bạn đang phục vụ.

## Nguồn

- [Distilling the Knowledge in a Neural Network](https://ar5iv.arxiv.org/html/1503.02531)

- [Distilling Step-by-Step! Outperforming Larger Language Models with Less Training Data and Smaller Model Sizes](https://arxiv.org/abs/2305.02301)

- [Distilling Step-by-Step! Outperforming Larger Language Models](https://arxiv.org/html/2305.02301v2)

- [Supervised fine-tuning (Distilling from a larger model) - OpenAI API docs](https://developers.openai.com/api/docs/guides/supervised-fine-tuning)

- [Amazon Bedrock Model Distillation: Boost function calling accuracy while reducing cost and latency](https://aws.amazon.com/blogs/machine-learning/amazon-bedrock-model-distillation-boost-function-calling-accuracy-while-reducing-cost-and-latency/)
