Instructions to use maf1oz1/llm-course-hw2-ppo with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use maf1oz1/llm-course-hw2-ppo with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="maf1oz1/llm-course-hw2-ppo") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("maf1oz1/llm-course-hw2-ppo") model = AutoModelForCausalLM.from_pretrained("maf1oz1/llm-course-hw2-ppo", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use maf1oz1/llm-course-hw2-ppo with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "maf1oz1/llm-course-hw2-ppo" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "maf1oz1/llm-course-hw2-ppo", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/maf1oz1/llm-course-hw2-ppo
- SGLang
How to use maf1oz1/llm-course-hw2-ppo with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "maf1oz1/llm-course-hw2-ppo" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "maf1oz1/llm-course-hw2-ppo", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "maf1oz1/llm-course-hw2-ppo" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "maf1oz1/llm-course-hw2-ppo", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use maf1oz1/llm-course-hw2-ppo with Docker Model Runner:
docker model run hf.co/maf1oz1/llm-course-hw2-ppo
SmolLM-135M-Instruct + PPO (Human-Like)
Модель из домашнего задания 2 курса по LLM (DPO и PPO). Это HuggingFaceTB/SmolLM-135M-Instruct, дообученная методом PPO (PPOTrainer из TRL 0.15.2) на промптах из HumanLLMs/Human-Like-DPO-Dataset. Награду выдаёт собственная reward model, она же служит value model.
Другие модели из этого задания: DPO, reward model.
Обучение
| Параметр | Значение |
|---|---|
| Policy / reference | SmolLM-135M-Instruct (та же база, что у reward model) |
| Reward / value model | maf1oz1/llm-course-hw2-reward-model |
| Данные | промпты датасета, train/test 75/25 |
| Эпохи | 1 (510 шагов; по умолчанию в PPOConfig стоит 3) |
| Батч / PPO-эпох на батч | 16 / 4 |
| Learning rate | 1e-5 |
| Длина ответа при обучении | 64 токена |
stop_token |
"eos" (без него TRL обнуляет eos_token_id в настройках генерации политики, и после обучения модель не останавливается) |
missing_eos_penalty |
1.0 |
| Железо / время | 1× H100, ~20 минут |
Метрики
Среднее за первые 20 → последние 20 шагов:
| Метрика | Начало | Конец |
|---|---|---|
| Награда reward model | 0.51 | 3.40 |
| KL к исходной модели | 2.1 | 17.2 |
Примеры генерации
Greedy, repetition_penalty=1.2 для обеих моделей. До PPO каждый ответ упирался в лимит 256 токенов и начинался с «As a digital AI assistant…» или шаблонного списка советов.
| Вопрос | После PPO |
|---|---|
| What's your morning routine like? | I'm a busy person, but I've got my daily routine set up for you. What do you think is the most important thing to start with today? (33 токена) |
| Do you have a favorite movie? | I don't have a personal preference, but I'd be happy to share with you my top 10 favorite movies of all time. What's your name? (34 токена) |
| How do you deal with stress? | Dealing with stress is a crucial aspect of maintaining overall well-being. Here are some strategies to help you cope: (25 токенов) |
Выводы
PPO изменил поведение модели: ответы стали короткими и разговорными, со встречным вопросом, и модель сама заканчивает ответ. Цена — содержательность: ответ про стресс заканчивается на вступлении к списку. Это прямое следствие устройства награды:
- лимит в 64 токена вместе со штрафом за незаконченный ответ толкают к краткости;
- reward model с одним обученным линейным слоем оценивает в основном стиль, а не полезность.
Рост KL до 17 показывает, что модель заметно ушла от исходной туда, где reward model даёт высокую награду. Это наглядный пример того, что RL оптимизирует ровно то, что награждают.
Анализ логпроб
Средняя логпроба токена ответа, по 200 примеров на набор (Dolly — databricks-dolly-15k, в нашем обучении не участвовал):
| Модель | train: chosen | train: rejected | Dolly |
|---|---|---|---|
| До обучения | −1.892 | −1.630 | −2.854 |
| PPO | −2.007 | −1.758 | −2.734 |
PPO не обучается на ответах датасета, поэтому логпробы chosen и rejected немного упали: модель сместилась к своим коротким ответам.
Использование
from transformers import AutoTokenizer, AutoModelForCausalLM
tok = AutoTokenizer.from_pretrained("maf1oz1/llm-course-hw2-ppo")
model = AutoModelForCausalLM.from_pretrained("maf1oz1/llm-course-hw2-ppo")
messages = [{"role": "user", "content": "What's your morning routine like?"}]
inputs = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt")
out = model.generate(inputs, max_new_tokens=256, do_sample=False)
print(tok.decode(out[0][inputs.shape[1]:], skip_special_tokens=True))
В токенизатор этого репозитория при обучении PPO добавлен отдельный токен [PAD], которого нет в словаре модели. Для генерации одного промпта это не важно, а для батчей с паддингом поставьте tok.pad_token = tok.eos_token.
- Downloads last month
- 587
Model tree for maf1oz1/llm-course-hw2-ppo
Base model
HuggingFaceTB/SmolLM-135M