Learn how to tune Qwen models in Alibaba Cloud Model Studio using the API (HTTP) and the command line (shell). Model tuning involves three methods: supervised fine-tuning (SFT), continual pre-training (CPT), and direct preference optimization (DPO).
This topic is applicable only to the China (Beijing) region.
Prerequisites
Review Introduction to model fine-tuning to understand its concepts, process, and data requirements.
Activate the service and obtain an API key. For instructions, see Get an API key.
Grant the RAM user (RAM user) the necessary invocation, training, and deployment permissions.
The API supports only token-based billing for training jobs. To use model training units (prepaid or postpaid), create the job in the console.
Tuning file upload
Preparing fine-tuning files
SFT training set
The SFT training set uses the ChatML (Chat Markup Language) format, which supports multi-turn conversations and various role settings.
The OpenAI parametersnameandweightare not supported. Allassistantoutputs are used for training.
# A typical line of expanded JSON training data:
{"messages": [
{"role": "system", "content": "System input 1"},
{"role": "user", "content": "User input 1"},
{"role": "assistant", "content": "Desired model output 1"},
{"role": "user", "content": "User input 2"},
{"role": "assistant", "content": "Desired model output 2"}
...
]}
For details on the system, user, and assistant roles, see Overview. For training dataset samples, see SFT-ChatML Format Sample.jsonl and SFT-ChatML Format Sample.xlsx. Note that the XLS and XLSX formats support only single-turn conversations.
In a single training example, all assistant messages support the "loss_weight" parameter. This parameter sets the message's relative importance during training. The value ranges from 0.0 to 1.0, where a higher value indicates greater importance.
This is a beta parameter. To use it, please contact your account manager.
{"role": "assistant", "content": "Desired model output 1", "loss_weight": 1.0},
{"role": "assistant", "content": "Desired model output 2", "loss_weight": 0.5}
SFT thinking model
The training data supports multi-turn conversations and various role settings, but the model trains only on the last assistant output. Each expanded line of training data has the following structure:
The newline characters\nbefore and after thetag must be preserved.
# A single line of training data (JSON format) has the following typical structure when expanded:
{"messages": [
{"role": "system", "content": "System input 1"},
{"role": "user", "content": "User input 1"},
{"role": "assistant", "content": "Model output 1"}, --Intermediate assistant outputs must not include <think> tags.
...
{"role": "user", "content": "User input 2"},
{"role": "assistant", "content": "<think>\nDesired thinking content 2\n</think>\n\nDesired output 2"} --Include thinking content only in the final assistant output.
]}
For details on the system, user, and assistant roles, see Overview. For a training dataset sample, see SFT-Deep Thinking Content Sample.jsonl.
You can also provide training examples without the <think> tag. If you use this method, we do not recommend enabling thinking mode for inference after training.
{"role": "assistant", "content": "Desired model output 2"} --Instructs the model not to enable thinking.
In a single training example, the final assistant message supports the "loss_weight" parameter. This parameter sets the message's relative importance during training. The value ranges from 0.0 to 1.0, where a higher value indicates greater importance.
This is a beta parameter. To use it, please contact your account manager.
{"role": "assistant", "content": "<think>\nDesired thinking content 2\n</think>\n\nDesired output 2", "loss_weight": 1.0}
SFT for visual understanding
The OpenAI parametersnameandweightare not supported. Allassistantoutputs are used for training.
For the differences between system, user, and assistant, see Overview. The following is an example of training data in the ChatML format:
If you pass asystemmessage, itscontentmust use the array format[{"text":"..."}]. The string format"content":"string"is not supported.
# A typical line of expanded JSON training data:
{"messages": [
{"role": "system", "content": [{"text": "System input"}]},
{"role": "user", "content": [{"text": "User input 1"}, {"image": "image_filename_1.jpg", "resized_width": 200, "resized_height": 200}]},
{"role": "assistant", "content": [{"text": "Desired model output 1"}]},
{"role": "user", "content": [{"text": "User input 2"}, {"video": "video_filename_1.mp4", "fps": 3.0, "resized_width": 200, "resized_height": 200, "video_start": 0.0, "video_end": 3.0}]},
{"role": "assistant", "content": [{"text": "Desired model output 2"}]},
{"role": "user", "content": [{"text": "User input 2"}, {"video": ["0.jpg", "1.jpg", "2.jpg", "3.jpg"], "sample_fps": 5.0, "resized_width": 200, "resized_height": 200}]},
{"role": "assistant", "content": [{"text": "Desired model output 2"}]},
...
]}
When training a thinking model, also follow the data format requirements for the SFT thinking model.
ZIP file requirements
-
The ZIP file must be 2 GB or smaller. Folder and file names within it must contain only ASCII letters (a-z, A-Z), digits (0-9), underscores (_), and hyphens (-).
-
Place the training text file, named
data.jsonl, in the root directory of the ZIP file. -
Each image must be 10 MB or smaller, with dimensions no greater than 1024x1024 pixels. Supported formats include
.bmp,.jpeg/.jpg,.png,.tif/.tiff, or.webp. -
Image file names must be unique within the ZIP file, even if they are in different folders.
-
ZIP file directory structure:
Single-level directory (recommended)
Place image and video files in the root directory with the
data.jsonlfile.Trainingdata_vl.zip |--- data.jsonl # Note: Do not place this file inside another folder. |--- image1.png |--- video1.mp4Multi-level directory
-
The data.jsonl file must be in the root directory.
-
In
data.jsonl, you only need to declare the image or video filename, not the file path. For example:Correct:
image1.jpg; Incorrect:jpg_folder/image1.jpg. -
Image and video filenames must be unique across the entire ZIP file.
Trainingdata_vl.zip |--- data.jsonl # Note: Do not place this file inside another folder. |--- jpg_folder | └── image1.jpg |--- mp4_folder └── video.mp4 -
DPO dataset
The DPO dataset uses the ChatML format. Each expanded line of training data has the following structure:
For details on the system, user, and assistant roles, see Overview. For a training dataset sample, see DPO ChatML Format Sample.jsonl.
# A typical line of expanded JSON training data:
{"messages": [
{"role": "system", "content": "System input"},
{"role": "user", "content": "User input 1"},
{"role": "assistant", "content": "Model output 1"},
{"role": "user", "content": "User input 2"},
{"role": "assistant", "content": "Model output 2"},
{"role": "user", "content": "User input 3"}
],
"chosen":
{"role": "assistant", "content": "The chosen model output for Input 3"},
"rejected":
{"role": "assistant", "content": "The rejected model output for Input 3"}}
The model uses all content within messages as input. DPO then trains the model to prefer the chosen response over the rejected response for the final user input.
To include thinking content, wrap it with the <think> tag:
{"role": "assistant", "content": "<think>Desired model thinking content</think>Desired model output"}
The "chosen" module of a single training data sample supports the "loss_weight" parameter, which sets the relative importance of that sample during training. (The valid range is 0.0 to 1.0, where a larger value indicates higher importance.)
This is a beta parameter. To use it, please contact your account manager.
"chosen":
{"role": "assistant", "content": "The chosen model output for Input 3", "loss_weight": 1.0},
CPT training set
The CPT training set uses the plain text format. Each line of training data has the following structure:
{"text":"Text content"}
For a training dataset sample, see CPT-Text Generation Training Set Sample.jsonl.
You can also download a data template from the Model Studio console. |
|
Upload fine-tuning file to Model Studio
DashScope API
For Windows CMD, replace${DASHSCOPE_API_KEY}with%DASHSCOPE_API_KEY%. For PowerShell, replace it with$env:DASHSCOPE_API_KEY.
curl --request POST \
'https://dashscope.aliyuncs.com/api/v1/files' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--form 'files=@"/path/to/your/file.jsonl"' \
--form 'purpose="fine-tune"' \
--form 'descriptions="a sample fine-tune data file for qwen"'Limitations:
The maximum size of a single file is 300 MB.
The total size of all non-deleted files is limited to 5 GB.
You can store a maximum of 100 non-deleted files.
Files are stored indefinitely.
For more details, see model fine-tuning file management service.
Sample response:
{
"request_id":"xx",
"data":{
"uploaded_files":[{
"file_id":"976bd01a-f30b-4414-86fd-50c54486e3ef",
"name":"qwen-fine-tune-sample.jsonl"}],
"failed_uploads":[]}
}Model fine-tuning
Create a fine-tuning job
HTTP
For Windows CMD, replace${DASHSCOPE_API_KEY}with%DASHSCOPE_API_KEY%. For PowerShell, use$env:DASHSCOPE_API_KEY.
curl --location "https://dashscope.aliyuncs.com/api/v1/fine-tunes" \
--header "Authorization: Bearer ${DASHSCOPE_API_KEY}" \
--header 'Content-Type: application/json' \
--data '{
"model":"qwen3-8b",
"training_file_ids":[
"<your_training_file_id_1>",
"<your_training_file_id_2>"
],
"hyper_parameters":
{
"n_epochs": 3,
"batch_size": 16,
"max_length": 8192,
"learning_rate": "1.6e-5",
"lr_scheduler_type": "linear",
"split": 0.9,
"warmup_ratio": 0.05,
"eval_steps": 50,
"data_augmentation": true,
"augmentation_ratio": "0.1,0.05,0.15",
"augmentation_types": "dialogue_CN,general_purpose_CN,NLP",
"save_strategy": "epoch",
"save_total_limit": 10
},
"training_type":"sft"
}'Parameters
Parameter | Required | Type | Location | Description |
training_file_ids | Yes | Array | Body | A list of file IDs for the training set. |
validation_file_ids | No | Array | Body | A list of file IDs for the validation set. |
model | Yes | String | Body | The ID of the base model for fine-tuning, or the ID of a previously fine-tuned model. |
hyper_parameters | No | Map | Body | Hyperparameters for the fine-tuning job. Supported parameters and their default values vary by model. To view the default values, go to the console and select the same model and fine-tuning method. The following parameters are required because they affect the training cost: |
training_type | No | String | Body | Specifies the fine-tuning method. Valid values are:
|
job_name | No | String | Body | Specifies the name of the fine-tuning job. |
model_name | No | String | Body | Specifies the name of the fine-tuned model. This is not the model ID, which is generated by the system. |
Response
{
"request_id": "635f7047-003e-4be3-b1db-6f98e239f57b",
"output":
{
"job_id": "ft-202511272033-8ae7",
"job_name": "ft-202511272033-8ae7",
"status": "PENDING",
"finetuned_output": "qwen3-8b-ft-202511272033-8ae7",
"model": "qwen3-8b",
"base_model": "qwen3-8b",
"training_file_ids":
[
"9e9ffdfa-c3bf-436e-9613-6f053c66aa6e"
],
"validation_file_ids":
[],
"hyper_parameters":
{
"n_epochs": 3,
"batch_size": 16,
"max_length": 8192,
"learning_rate": "1.6e-5",
"lr_scheduler_type": "linear",
"split": 0.9,
"warmup_ratio": 0.05,
"eval_steps": 50,
"data_augmentation": true,
"augmentation_ratio": "0.1,0.05,0.15",
"augmentation_types": "dialogue_CN,general_purpose_CN,NLP",
"save_strategy": "epoch",
"save_total_limit": 10
},
"training_type": "sft",
"create_time": "2025-11-27 20:33:15",
"workspace_id": "llm-8v53etv3hwb8orx1",
"user_identity": "1654290265984853",
"modifier": "1654290265984853",
"creator": "1654290265984853",
"group": "llm",
"max_output_cnt": 10
}
}Base models (model) and training types (training_type)
hyper_parameters: Supported settings
Retrieve a fine-tuning job
To retrieve the details of a fine-tuning job, use the job_id returned when you create the job.
HTTP
curl 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<job_id>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'Request parameters
Parameter | Type | Location | Required | Description |
job_id | String | Path | Yes | The ID of the fine-tuning job. |
Successful response
{
"request_id": "d100cddb-ac85-4c82-bd5c-9b5421c5e94d",
"output":
{
"job_id": "ft-202511272033-8ae7",
"job_name": "ft-202511272033-8ae7",
"status": "RUNNING",
"finetuned_output": "qwen3-8b-ft-202511272033-8ae7",
"model": "qwen3-8b",
"base_model": "qwen3-8b",
"training_file_ids":
[
"9e9ffdfa-c3bf-436e-9613-6f053c66aa6e"
],
"validation_file_ids":
[],
"hyper_parameters":
{
"n_epochs": 3,
"batch_size": 16,
"max_length": 8192,
"learning_rate": "1.6e-5",
"lr_scheduler_type": "linear",
"split": 0.9,
"warmup_ratio": 0.05,
"eval_steps": 50,
"data_augmentation": true,
"augmentation_ratio": "0.1,0.05,0.15",
"augmentation_types": "dialogue_CN,general_purpose_CN,NLP",
"save_strategy": "epoch",
"save_total_limit": 10
},
"training_type": "sft",
"create_time": "2025-11-27 20:33:15",
"workspace_id": "llm-8v53etv3hwb8orx1",
"user_identity": "1654290265984853",
"modifier": "1654290265984853",
"creator": "1654290265984853",
"group": "llm",
"max_output_cnt": 10
}
}Job status | Description |
PENDING | The job is waiting to start. |
QUEUING | The job is queued. Only one fine-tuning job runs at a time. |
RUNNING | The job is running. |
CANCELING | The job is being canceled. |
SUCCEEDED | The job succeeded. |
FAILED | The job failed. |
CANCELED | The job was canceled. |
After a fine-tuning job succeeds, the finetuned_output field provides the resulting model ID. Use this ID for model deployment.
Get fine-tuning job logs
HTTP
curl 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<job_id>/logs?offset=0&line=1000' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' Use theoffsetandlineparameters to retrieve a range of log lines. Theoffsetparameter specifies the starting line, and thelineparameter specifies the maximum number of lines to return.
Sample response:
{
"request_id":"1100d073-4673-47df-aed8-c35b3108e968",
"output":{
"total":57,
"logs":[
"{Fine-tuning log 1}",
"{Fine-tuning log 2}",
...
...
...
]
}
}Query and publish model checkpoints
Only SFT fine-tuning (efficient_sftandsft) supports saving and publishing checkpoints from intermediate training states.
List checkpoints for a fine-tuning job
curl 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<job_id>/checkpoints' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'Request parameters
Parameter | Type | Parameter location | Required | Description |
job_id | String | Path Parameter | Yes | The ID of the fine-tuning job. |
Sample response
The checkpoint field contains the checkpoint ID, which specifies the checkpoint to publish in the Model publishing (optional) API. The model_name field contains the model ID used for model deployment. The finetuned_output field in the original fine-tuning job response is the model_name of the final checkpoint.
{
"request_id": "c11939b5-efa6-4639-97ae-ed4597984647",
"output":
[
{
"create_time": "2025-11-11T16:25:42",
"full_name": "ft-202511272033-8ae7-checkpoint-20",
"job_id": "ft-202511272033-8ae7",
"checkpoint": "checkpoint-20",
"model_name": "qwen3-8b-instruct-ft-202511272033-8ae7",
"status": "SUCCEEDED"
}
]
}Status | Description |
PENDING | The checkpoint is pending publication. You must publish it using the Model publishing API before you can use it for model deployment and invocation. |
PROCESSING | The checkpoint is being published. |
SUCCEEDED | The checkpoint has been published successfully. You can now use it for model deployment and invocation. |
FAILED | The checkpoint failed to publish. |
Model publishing (optional)
In Model Studio, after a fine-tuning job completes, you must export a checkpoint before you can deploy the model.
Exported checkpoints are stored in cloud storage. You cannot access or download them at this time.
curl --request GET 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<job_id>/export/<checkpoint_id>?model_name=<model_name>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'Request parameters
Parameter | Type | Parameter location | Required | Description |
job_id | String | Path Parameter | Yes | The ID of the fine-tuning job. |
checkpoint_id | String | Path Parameter | Yes | The ID of the checkpoint to publish. |
model_name | String | Path Parameter | Yes | The custom model ID to assign to the published model. |
Sample response
{
"request_id": "ed3faa41-6be3-4271-9b83-941b23680537",
"output": true
}The publishing task is asynchronous. Use the List checkpoints for a fine-tuning job API to monitor the publishing status of the checkpoint.
More fine-tuning operations
List fine-tuning jobs
curl 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' Cancel a fine-tuning job
Cancels a running fine-tuning job.
curl --request POST 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<job_id>/cancel' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' Delete a fine-tuning job
You cannot delete a running fine-tuning job.
curl --request DELETE 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<job_id>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' API reference
This topic provides a reference for DashScope command-line calls. For details on API calls, see API details.
Model deployment and invocation
Model deployment
For other deployment methods, see Deploy a model by using the API.
By token
curl "https://dashscope.aliyuncs.com/api/v1/deployments" \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model_name": "qwen3-8b-ft-202511132025-0260",
"plan": "lora",
"capacity": 1,
"name": "qwen3-8b-ft"
}'By model unit
curl "https://dashscope.aliyuncs.com/api/v1/deployments" \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"name": "my_qwen_plus",
"model_name": "qwen-plus-2025-12-01",
"plan": "mu",
"deploy_spec": "MU1",
"enable_thinking": true,
"capacity": 4,
"max_context_length": 10000,
"rpm_limit": 500,
"tpm_limit": 1000
}'Query deployment status
Once the deployment status is RUNNING, you can invoke the model.
curl 'https://dashscope.aliyuncs.com/api/v1/deployments/<your_model_instance_id>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' For other deployment operations, such as scaling and deprovisioning, see Model Deployment - API Details.
Model invocation
Once the model deployment status is RUNNING, you can invoke the fine-tuned model just like any other model.
You can also get the Model Code from the model deployment console.
For details on usage and parameters, see the DashScope API Reference.
curl 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' \
--data '{
"model": "<your_model_instance_id>",
"input":{
"messages":[
{
"role": "user",
"content": "Who are you?"
}
]
},
"parameters": {
"result_format": "message"
}
}'Model evaluation
The model evaluation feature is exclusive to the Alibaba Cloud Model Studio console. Go to the Model Evaluation page to evaluate model performance.
For more information, see Model Evaluation.
