Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions autotest/config-npu.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,10 @@ case:
parameters:
config: autotest/config/npu_rl_qwen3_30B_grpo_vllm.py
infer_backend: vllm
acceleator: NPU
accelerator: NPU
output_path: /mnt/hwfile/llmrazor/qa-llm-cic/qa-llm-cicd/test_output
resource:
image: ccr-hw/910c:rl_s1_vllm
pip_package: ls
envs:
- MODEL_PATH=/mnt/hwfile/llmrazor/qa-llm-cicd/qa_test_models/Qwen3-30B-A3B
- DATA_PATH=/mnt/hwfile/llmrazor/qa-llm-cicd/xtuner_resource/datasets/gsm8k/train-mini.jsonl
Expand Down
183 changes: 183 additions & 0 deletions autotest/config/npu_rl_qwen3_30B_grpo_vllm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
import os
from copy import deepcopy
from pathlib import Path

from xtuner.v1.config import AdamWConfig, FSDPConfig, LRConfig
from xtuner.v1.data_proto.rl_data import SampleParams
from xtuner.v1.datasets.config import DataloaderConfig, DatasetConfig
from xtuner.v1.datasets.rl_tokenize_fn import RLTextTokenizeFnConfig
from xtuner.v1.model import get_model_config_from_hf
from xtuner.v1.rl.advantage import GRPOAdvantageConfig
from xtuner.v1.rl.agent_loop import SingleTurnAgentLoopConfig
from xtuner.v1.rl.agent_loop_manager import AgentLoopManagerConfig, SamplerConfig, SyncProduceStrategyConfig, TaskSpecConfig
from xtuner.v1.rl.evaluator import EvaluatorConfig
from xtuner.v1.rl.judger import GSM8KJudgerConfig
from xtuner.v1.rl.loss import GRPOLossConfig
from xtuner.v1.rl.replay_buffer import SyncReplayBufferConfig
from xtuner.v1.rl.rollout.worker import RolloutConfig
from xtuner.v1.rl.trainer import WorkerConfig
from xtuner.v1.rl.utils import AcceleratorResourcesConfig
from xtuner.v1.train.rl_trainer import RLColocateTrainerConfig


work_dir = os.environ["WORK_DIR"]
model_path = os.environ["MODEL_PATH"]
data_path = os.environ["DATA_PATH"]
eval_data_path = os.environ["EVAL_DATA_PATH"]
enable_return_routed_experts = os.environ.get("ENABLE_RETURN_ROUTED_EXPERTS", "0")
enable_evaluate = eval_data_path != ""

# basic settings
experimental_name = "grpo_gsm8k"
total_epochs = 2
global_batch_size = 64
prompt_repeat_k = 5
rollout_tp_size = 4
rollout_dp_size = 4
rollout_ep_size = 1
max_prompt_length = 512
max_response_length = 1024
pack_max_length = 32768
train_optimizer_steps = 1
hf_interval = 100
enable_initial_evaluate = True
evaluate_step = 10

# 1. resources
resources = AcceleratorResourcesConfig(
accelerator="NPU",
num_workers=16,
num_cpus_per_worker=6,
cpu_memory_per_worker=16 * 1024**3,
)

# 2. rollout
rollout_config = RolloutConfig(
env=experimental_name,
device=resources.accelerator,
model_path=model_path,
dtype="bfloat16",
tensor_parallel_size=rollout_tp_size,
data_parallel_size=rollout_dp_size,
expert_parallel_size=rollout_ep_size,
gpu_memory_utilization=0.85,
context_length=max_response_length + max_prompt_length,
enable_return_routed_experts=enable_return_routed_experts == "1",
)

# sampling params
training_sample_params = SampleParams(max_tokens=max_response_length)
evaluation_sample_params = deepcopy(training_sample_params)
evaluation_sample_params.top_p = 1.0
evaluation_sample_params.temperature = 0.0
evaluation_sample_params.top_k = 1

# 3. datasets
tokenizer_config = RLTextTokenizeFnConfig(max_length=max_prompt_length)
train_dataset_cfg = [
{
"dataset": DatasetConfig(name=experimental_name, anno_path=data_path),
"tokenize_fn": tokenizer_config,
}
]
eval_dataset_cfg = [
{
"dataset": DatasetConfig(name=experimental_name, anno_path=eval_data_path if enable_evaluate else data_path),
"tokenize_fn": tokenizer_config,
}
]
dataloader_cfg = DataloaderConfig(
dataset_config_list=train_dataset_cfg,
pack_max_length=pack_max_length,
collator="fake_collator",
pack_level="none",
)
eval_dataloader_cfg = DataloaderConfig(
dataset_config_list=eval_dataset_cfg,
pack_max_length=pack_max_length,
collator="fake_collator",
pack_level="none",
)

# 4. judger
judger_config = GSM8KJudgerConfig(judger_name="openai/gsm8k")

# 5. train worker
model_cfg = get_model_config_from_hf(Path(model_path))
optim_cfg = AdamWConfig(lr=1e-6, foreach=False)
loss_cfg = GRPOLossConfig(
policy_loss_cfg=dict(
cliprange_high=0.2,
cliprange_low=0.2,
loss_type="vanilla",
),
ignore_idx=-100,
use_kl_loss=False,
kl_loss_coef=0.001,
kl_loss_type="low_var_kl",
mode="chunk",
chunk_size=512,
)
lr_cfg = LRConfig(lr_type="constant", warmup_ratio=0, lr_min=1e-6)
fsdp_cfg = FSDPConfig(torch_compile=False, cpu_offload=False, ep_size=1)
train_worker_cfg = WorkerConfig(
model_cfg=model_cfg,
load_from=model_path,
optim_cfg=optim_cfg,
loss_cfg=loss_cfg,
lr_cfg=lr_cfg,
fsdp_cfg=fsdp_cfg,
sp_size=1,
optimizer_steps=train_optimizer_steps,
pack_max_length=pack_max_length,
)

# 6. agent loop managers
agent_loop_config = SingleTurnAgentLoopConfig(
hf_checkpoint=model_path,
sample_params=training_sample_params,
)
agent_loop_manager_cfg = AgentLoopManagerConfig(
tasks=TaskSpecConfig(
task_name="train_task",
agent_loop_config=agent_loop_config,
judger_config=judger_config,
produce_strategy_config=SyncProduceStrategyConfig(),
sampler_config=SamplerConfig(dataloader_cfg=dataloader_cfg, prompt_repeat_k=prompt_repeat_k),
),
)

eval_agent_loop_config = SingleTurnAgentLoopConfig(
hf_checkpoint=model_path,
sample_params=evaluation_sample_params,
)
eval_agent_loop_manager_cfg = AgentLoopManagerConfig(
tasks=TaskSpecConfig(
task_name="eval_task",
agent_loop_config=eval_agent_loop_config,
judger_config=judger_config,
sampler_config=SamplerConfig(dataloader_cfg=eval_dataloader_cfg, prompt_repeat_k=1),
),
)

# 7. trainer
trainer = RLColocateTrainerConfig(
resources=resources,
train_worker_cfg=train_worker_cfg,
rollout_config=rollout_config,
tokenizer_path=model_path,
replay_buffer_config=SyncReplayBufferConfig(),
agent_loop_manager_cfg=agent_loop_manager_cfg,
eval_agent_loop_manager_cfg=eval_agent_loop_manager_cfg,
evaluator_config=EvaluatorConfig(compute_metric_func=None),
load_from=model_path,
total_epochs=total_epochs,
train_batch_size=global_batch_size,
advantage_estimator_config=GRPOAdvantageConfig(eps=1e-8),
enable_evaluate=enable_evaluate,
enable_initial_evaluate=enable_evaluate and enable_initial_evaluate,
evaluate_step=evaluate_step,
work_dir=work_dir,
hf_interval=hf_interval,
exp_tracker="jsonl",
)
2 changes: 1 addition & 1 deletion autotest/module/train.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def get_cmd(config):
config["work_dir"] = work_dir

# Print runtime image package list before training for version diagnosis.
image_version_check = 'echo "===== runtime pip list ====="; pip list; '
image_version_check = "echo '===== runtime pip list ====='; pip list; "

# this patch is for torch 2.9.1 Conv3d memory issue fix
cudnn_patch = (
Expand Down
2 changes: 1 addition & 1 deletion autotest/utils/ci_run_rl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ elif [ "$ACCELERATOR" = "NPU" ]; then
--dashboard-host=0.0.0.0 \
--dashboard-port=$RAY_DASHBOARD_PORT \
--include-dashboard=true \
--disable-usage-stats \
--disable-usage-stats
else
RAY_RESOLVED_IP=$(nslookup $MASTER_ADDR | awk '/^Address: / { addr=$2 } END { print addr }')
if [ -z "$RAY_RESOLVED_IP" ]; then
Expand Down
Loading