{"kind":"task","effective_mode":"full","benchmark":{"kind":"benchmark","effective_mode":"full","slug":"longbench-v2","formal_name":"LongBench v2","introduction":"LongBench v2 evaluates deep understanding and reasoning over long contexts through multiple-choice questions. Its official description lists 503 questions spanning tasks such as single-document and multi-document QA and code-repository understanding.","introduction_ja":"","introduction_en":"","category":"Category not supplied","task_count":null,"acquisition_status":"Acquisition status not supplied","official_url":"https://huggingface.co/datasets/zai-org/LongBench-v2","indexing_mode":"noindex","profile":{"resources":[],"task_format":"","scoring":"","metric":"","size":"","answer_access":"","license":"","citation":"","maintainer":"","released":"","why_hard":"","related":[]}},"task_id":"925b33df-31e8-50f9-9269-fba6d11e7a27","task_key":"train--66fa3843bb02136c067c655d","task_revision_id":"3","upstream_id":"66fa3843bb02136c067c655d","short_description":"I plan to use this framework to train the glm-4v-9b model. Which of the follwing…","config":"","split":"train","body":"{\"choice_A\":\"I need to fine-tune the model using my own dataset, so I convert my dataset into the format of {\\\"query\\\": X, \\\"response\\\": Y, \\\"images\\\": [PATH]} and specify it directly using --dataset when starting fine-tuning\",\"choice_B\":\"I want to customize the training rounds and learning rate during fine-tuning, so I directly add the parameters num_train_epochs and learning_rate in swift sft\",\"choice_C\":\"I want to use multi-machine and multi-card training, so I need to specify the CUDA_VISIBLE_DEVICES, NNODES, NODE_RANK, MASTER_ADDR and NPROC_PER_NODE parameters\",\"choice_D\":\"After fine-tuning, I want to deploy the model service. I need to use swift infer --model_type glm4v-9b-chat \\\\ --infer_backend vllm for efficient deployment and inference\",\"context\":\"# SWIFT (Scalable lightWeight Infrastructure for Fine-Tuning)\\n\\n<p align=\\\"center\\\">\\n    <br>\\n    <img src=\\\"resources/banner.png\\\"/>\\n    <br>\\n<p>\\n<p align=\\\"center\\\">\\n<a href=\\\"https://modelscope.cn/home\\\">ModelScope Community Website</a>\\n<br>\\n        <a href=\\\"README_CN.md\\\">中文</a> &nbsp ｜ &nbsp English &nbsp\\n</p>\\n\\n<p align=\\\"center\\\">\\n<img src=\\\"https://img.shields.io/badge/python-%E2%89%A53.8-5be.svg\\\">\\n<img src=\\\"https://img.shields.io/badge/pytorch-%E2%89%A51.12%20%7C%20%E2%89%A52.0-orange.svg\\\">\\n<a href=\\\"https://github.com/modelscope/modelscope/\\\"><img src=\\\"https://img.shields.io/badge/modelscope-%E2%89%A51.17-5D91D4.svg\\\"></a>\\n<a href=\\\"https://pypi.org/project/ms-swift/\\\"><img src=\\\"https://badge.fury.io/py/ms-swift.svg\\\"></a>\\n<a href=\\\"https://github.com/modelscope/swift/blob/main/LICENSE\\\"><img src=\\\"https://img.shields.io/github/license/modelscope/swift\\\"></a>\\n<a href=\\\"https://pepy.tech/project/ms-swift\\\"><img src=\\\"https://pepy.tech/badge/ms-swift\\\"></a>\\n<a href=\\\"https://github.com/modelscope/swift/pulls\\\"><img src=\\\"https://img.shields.io/badge/PR-welcome-55EB99.svg\\\"></a>\\n</p>\\n\\n<p align=\\\"center\\\">\\n<a href=\\\"https://trendshift.io/repositories/6427\\\" target=\\\"_blank\\\"><img src=\\\"https://trendshift.io/api/badge/repositories/6427\\\" alt=\\\"modelscope%2Fswift | Trendshift\\\" style=\\\"width: 250px; height: 55px;\\\" width=\\\"250\\\" height=\\\"55\\\"/></a>\\n</p>\\n\\n## 📖 Table of Contents\\n- [Introduction](#-introduction)\\n- [Groups](#-Groups)\\n- [News](#-news)\\n- [Installation](#%EF%B8%8F-installation)\\n- [Getting Started](#-getting-started)\\n- [Classroom](#-Classroom)\\n- [License](#-License)\\n- [Citation](#-citation)\\n\\n## 📝 Introduction\\nSWIFT supports training(PreTraining/Fine-tuning/RLHF), inference, evaluation and deployment of **350+ LLMs and 90+ MLLMs** (multimodal large models). Developers can directly apply our framework to their own research and production environments to realize the complete workflow from model training and evaluation to application. In addition to supporting the lightweight training solutions provided by [PEFT](https://github.com/huggingface/peft), we also provide a complete **Adapters library** to support the latest training techniques such as NEFTune, LoRA+, LLaMA-PRO, etc. This adapter library can be used directly in your own custom workflow without our training scripts.\\n\\nTo facilitate use by users unfamiliar with deep learning, we provide a Gradio web-ui for controlling training and inference, as well as accompanying deep learning courses and best practices for beginners. SWIFT web-ui is available both on [Huggingface space](https://huggingface.co/spaces/tastelikefeet/swift) and [ModelScope studio](https://www.modelscope.cn/studios/iic/Scalable-lightWeight-Infrastructure-for-Fine-Tuning/summary), please feel free to try!\\n\\nSWIFT has rich documentations for users, please feel free to check our documentation website:\\n<p align=\\\"center\\\">\\n        <a href=\\\"https://arxiv.org/abs/2408.05517\\\">Paper</a> &nbsp ｜ <a href=\\\"https://swift.readthedocs.io/en/latest/\\\">English Documentation</a> &nbsp ｜ &nbsp <a href=\\\"https://swift.readthedocs.io/zh-cn/latest/\\\">中文文档</a> &nbsp\\n</p>\\n\\n## ☎ Groups\\n\\nYou can contact us and communicate with us by adding our group:\\n\\n\\n[Discord Group](https://discord.com/invite/D27yfEFVz5)              |  微信群\\n:-------------------------:|:-------------------------:\\n<img src=\\\"asset/discord_qr.jpg\\\" width=\\\"200\\\" height=\\\"200\\\">  |  <img src=\\\"asset/wechat.png\\\" width=\\\"200\\\" height=\\\"200\\\">\\n\\n## 🎉 News\\n- 2024.09.26: Support for training and deploying llama3.2-vision series models. Experience it using `swift infer --model_type llama3_2-11b-vision-instruct`.\\n- 2024.09.26: Support for training and deploying llama3.2 series models. Experience it using `swift infer --model_type llama3_2-1b-instruct`.\\n- 2024.09.25: Support for training to deployment with got-ocr2. Best practices can be found [here](https://github.com/modelscope/ms-swift/issues/2122).\\n- 2024.09.24: Support for training and deploying llama3_1-8b-omni. Experience it using `swift infer --model_type llama3_1-8b-omni`.\\n- 2024.09.23: Support for training and deploying pixtral-12b. Experience it using `swift infer --model_type pixtral-12b --dtype fp16`.\\n- 🔥2024.09.19: Supports the qwen2.5, qwen2.5-math, and qwen2.5-coder series models. Supports the qwen2-vl-72b series models. Best practices can be found [here](https://github.com/modelscope/ms-swift/issues/2064).\\n- 2024.09.07: Support the `Reflection-llama3-70b` model, use by `swift sft/infer --model_type reflection-llama_3_1-70b`.\\n- 2024.09.06: Support fine-tuning and inference for mplug-owl3. Best practices can be found [here](https://github.com/modelscope/ms-swift/issues/1969).\\n- 2024.09.05: Support for the minicpm3-4b model. Experience it using `swift infer --model_type minicpm3-4b`.\\n- 2024.09.05: Support for the yi-coder series models. Experience it using `swift infer --model_type yi-coder-1_5b-chat`.\\n- 🔥2024.08.30: Support for inference and fine-tuning of the qwen2-vl series models: qwen2-vl-2b-instruct, qwen2-vl-7b-instruct. The best practices can be found [here](docs/source_en/Multi-Modal/qwen2-vl-best-practice.md).\\n- 🔥2024.08.26: Support [Liger](https://github.com/linkedin/Liger-Kernel), which supports models like LLaMA、Qwen、Mistral and so on, and reduce memory usage by 10%~60%, use `--use_liger true` to begin.\\n- 🔥2024.08.22: Support `reft` tuner from [ReFT](https://github.com/stanfordnlp/pyreft) to achieve 15×–65× more parameter-efficient than LoRA, use `--sft_type reft` to begin!\\n- 🔥2024.08.21: Support for phi3_5-mini-instruct, phi3_5-moe-instruct, and phi3_5-vision-instruct. The best practices for fine-tuning Latex OCR using phi3_5-vision-instruct can be found [here](https://github.com/modelscope/ms-swift/issues/1809).\\n- 2024.08.21: Support for idefics3-8b-llama3, llava-onevision-qwen2-0_5b-ov, llava-onevision-qwen2-7b-ov, and llava-onevision-qwen2-72b-ov.\\n- 🔥2024.08.20: Support fine-tuning of multimodal large models using DeepSpeed-Zero3.\\n- 2024.08.20: Supported models: longwriter-glm4-9b, longwriter-llama3_1-8b. Supported dataset: longwriter-6k.\\n- 🔥2024.08.12: 🎉 SWIFT paper has been published to arXiv. Check [this link](https://arxiv.org/abs/2408.05517) to read.\\n- 🔥2024.08.12: Support packing with flash-attention without the contamination of attention_mask, use `--packing` to begin. Check[PR](https://github.com/huggingface/transformers/pull/31629/files).\\n- 🔥2024.08.09: Support for inference and fine-tuning of the qwen2-audio model. Best practice can be found [here](https://github.com/modelscope/ms-swift/issues/1653).\\n- 🔥2024.08.08: Supports the qwen2-math series models: 1.5B, 7B, 72B. Use `swift infer --model_type qwen2-math-1_5b-instruct` for an experience.\\n- 🔥2024.08.07: Support for using vLLM for accelerating inference and deployment of multimodal large models such as the llava series and phi3-vision models. You can refer to the [Multimodal & vLLM Inference Acceleration Documentation](docs/source_en/Multi-Modal/vllm-inference-acceleration.md) for more information.\\n- 2024.08.06: Support for minicpm-v-v2_6-chat is available. You can use `swift infer --model_type minicpm-v-v2_6-chat` for inference experience. Best practices can be found [here](https://github.com/modelscope/swift/issues/1613).\\n- 2024.08.06: Supports internlm2.5 series of 1.8b and 20b. Experience it using `swift infer --model_type internlm2_5-1_8b-chat`.\\n- 🔥2024.08.05: Support evaluation for multi-modal models! Same command with [new datasets](https://swift.readthedocs.io/en/latest/Instruction/LLM-eval.html#introduction).\\n- 🔥2024.08.02: Support Fourier Ft. Use `--sft_type fourierft` to begin, Check parameter documentation [here](https://swift.readthedocs.io/en/latest/Instruction/Command-line-parameters.html).\\n- 🔥2024.07.29: Support the use of lmdeploy for inference acceleration of LLM and VLM models. Documentation can be found [here](docs/source_en/Multi-Modal/LmDeploy-inference-acceleration.md).\\n- 🔥2024.07.24: Support DPO/ORPO/SimPO/CPO alignment algorithm for vision MLLM, training scripts can be find in [Document](docs/source_en/Multi-Modal/human-preference-alignment-training-documentation.md). support RLAIF-V dataset.\\n- 🔥2024.07.24: Support using Megatron for CPT and SFT on the Qwen2 series. You can refer to the [Megatron training documentation](docs/source_en/LLM/Megatron-training.md).\\n- 🔥2024.07.24: Support for the llama3.1 series models, including 8b, 70b, and 405b. Support for openbuddy-llama3_1-8b-chat.\\n<details><summary>More</summary>\\n\\n- 2024.07.20: Support mistral-nemo series models. Use `--model_type mistral-nemo-base-2407` and `--model_type mistral-nemo-instruct-2407` to begin.\\n- 2024.07.19: Support [Q-Galore](https://arxiv.org/abs/2407.08296), this algorithm can reduce the training memory cost by 60% (qwen-7b-chat, full, 80G -> 35G), use `swift sft --model_type xxx --use_galore true --galore_quantization true` to begin!\\n- 2024.07.17: Support newly released InternVL2 models: `model_type` are internvl2-1b, internvl2-40b, internvl2-llama3-76b. For best practices, refer to [here](docs/source_en/Multi-Modal/internvl-best-practice.md).\\n- 2024.07.17: Support the training and inference of [NuminaMath-7B-TIR](https://huggingface.co/AI-MO/NuminaMath-7B-TIR). Use with model_type `numina-math-7b`.\\n- 🔥2024.07.16: Support exporting for ollama and bitsandbytes. Use `swift export --model_type xxx --to_ollama true` or `swift export --model_type xxx --quant_method bnb --quant_bits 4`\\n- 2024.07.08: Support cogvlm2-video-13b-chat. You can check the best practice [here](docs/source_en/Multi-Modal/cogvlm2-video-best-practice.md).\\n- 2024.07.08: Support internlm-xcomposer2_5-7b-chat. You can check the best practice [here](docs/source_en/Multi-Modal/internlm-xcomposer2-best-practice.md).\\n- 🔥2024.07.06: Support for the llava-next-video series models: llava-next-video-7b-instruct, llava-next-video-7b-32k-instruct, llava-next-video-7b-dpo-instruct, llava-next-video-34b-instruct. You can refer to [llava-video best practice](docs/source_en/Multi-Modal/llava-video-best-practice.md) for more information.\\n- 🔥2024.07.06: Support InternVL2 series: internvl2-2b, internvl2-4b, internvl2-8b, internvl2-26b.\\n- 2024.07.06: Support codegeex4-9b-chat.\\n- 2024.07.04: Support internlm2_5-7b series: internlm2_5-7b, internlm2_5-7b-chat, internlm2_5-7b-chat-1m.\\n- 2024.07.02: Support for `llava1_6-vicuna-7b-instruct`, `llava1_6-vicuna-13b-instruct` and other llava-hf models. For best practices, refer to [here](docs/source_en/Multi-Modal/llava-best-practice.md).\\n- 🔥2024.06.29: Support [eval-scope](https://github.com/modelscope/eval-scope)&[open-compass](https://github.com/open-compass/opencompass) for evaluation! Now we have supported over 50 eval datasets like `BoolQ, ocnli, humaneval, math, ceval, mmlu, gsk8k, ARC_e`, please check our [Eval Doc](https://github.com/modelscope/swift/blob/main/docs/source_en/Instruction/LLM-eval.md) to begin! Next sprint we will support Multi-modal and Agent evaluation, remember to follow us : )\\n\\n- 🔥2024.06.28: Support for **Florence** series model! See [document](docs/source_en/Multi-Modal/florence-best-pratice.md)\\n- 🔥2024.06.28: Support for Gemma2 series models: gemma2-9b, gemma2-9b-instruct, gemma2-27b, gemma2-27b-instruct.\\n- 🔥2024.06.18: Supports **DeepSeek-Coder-v2** series model! Use model_type `deepseek-coder-v2-instruct` and `deepseek-coder-v2-lite-instruct` to begin.\\n- 🔥2024.06.16: Supports **KTO** and **CPO** training! See [document](https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/Human-Preference-Alignment-Training-Documentation.md) to start training!\\n- 2024.06.11: Support for tool-calling agent deployment that conform to the OpenAI interface.You can refer to [Agent deployment best practice](https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/Agent-deployment-best-practice.md)\\n- 🔥2024.06.07: Support **Qwen2** series LLM, including Base and Instruct models of 0.5B, 1.5B, 7B, and 72B, as well as corresponding quantized versions gptq-int4, gptq-int8, and awq-int4. The best practice for self-cognition fine-tuning, inference and deployment of Qwen2-72B-Instruct using dual-card 80GiB A100 can be found [here](https://github.com/modelscope/swift/issues/1092).\\n- 🔥2024.06.05: Support for **glm4** series LLM and glm4v-9b-chat MLLM. You can refer to [glm4v best practice](docs/source_en/Multi-Modal/glm4v-best-practice.md).\\n- 🔥2024.06.01: Supports **SimPO** training! See [document](https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/SimPO.md) to start training!\\n- 🔥2024.06.01: Support for deploying large multimodal models, please refer to the [Multimodal Deployment Documentation](docs/source_en/Multi-Modal/mutlimodal-deployment.md) for more information.\\n- 2024.05.31: Supports Mini-Internvl model, Use model_type `mini-internvl-chat-2b-v1_5` and `mini-internvl-chat-4b-v1_5`to train.\\n- 2024.05.24: Supports Phi3-vision model, Use model_type `phi3-vision-128k-instruct` to train.\\n- 2024.05.22: Supports DeepSeek-V2-Lite series models, model_type are `deepseek-v2-lite` and `deepseek-v2-lite-chat`\\n- 2024.05.22: Supports TeleChat-12B-v2 model with quantized version, model_type are `telechat-12b-v2` and `telechat-12b-v2-gptq-int4`\\n- 🔥2024.05.21: Inference and fine-tuning support for MiniCPM-Llama3-V-2_5 are now available. For more details, please refer to [minicpm-v-2.5 Best Practice](docs/source/Multi-Modal/minicpm-v-2.5最佳实践.md).\\n- 🔥2024.05.20: Support for inferencing and fine-tuning cogvlm2-llama3-chinese-chat-19B, cogvlm2-llama3-chat-19B. you can refer to [cogvlm2 Best Practice](docs/source_en/Multi-Modal/cogvlm2-best-practice.md).\\n- 🔥2024.05.17: Support peft=0.11.0. Meanwhile support 3 new tuners: `BOFT`, `Vera` and `Pissa`. use `--sft_type boft/vera` to use BOFT or Vera, use `--init_lora_weights pissa` with `--sft_type lora` to use Pissa.\\n- 2024.05.16: Supports Llava-Next (Stronger) series models. For best practice, you can refer to [here](https://github.com/modelscope/swift/tree/main/docs/source_en/Multi-Modal/llava-best-practice.md).\\n- 🔥2024.05.13: Support Yi-1.5 series models，use `--model_type yi-1_5-9b-chat` to begin!\\n- 2024.05.11: Support for qlora training and quantized inference using [hqq](https://github.com/mobiusml/hqq) and [eetq](https://github.com/NetEase-FuXi/EETQ). For more information, see the [LLM Quantization Documentation](https://github.com/modelscope/swift/tree/main/docs/source_en/Instruction/LLM-quantization-and-export.md).\\n- 2024.05.10: Support split a sequence to multiple GPUs to reduce memory usage. Use this feature by `pip install .[seq_parallel]`, then add `--sequence_parallel_size n` to your DDP script to begin!\\n- 2024.05.08: Support DeepSeek-V2-Chat model, you can refer to [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/deepseek-v2-chat/lora_ddp_ds3/sft.sh).Support InternVL-Chat-V1.5-Int8 model, for best practice, you can refer to [here](https://github.com/modelscope/swift/tree/main/docs/source_en/Multi-Modal/internvl-best-practice.md).\\n- 🔥2024.05.07: Supoprts **ORPO** training! See [document](https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/ORPO.md) to start training!\\n- 2024.05.07: Supports Llava-Llama3 model from xtuner，model_type is `llava-llama-3-8b-v1_1`.\\n- 2024.04.29: Supports inference and fine-tuning of InternVL-Chat-V1.5 model. For best practice, you can refer to [here](https://github.com/modelscope/swift/tree/main/docs/source_en/Multi-Modal/internvl-best-practice.md).\\n- 🔥2024.04.26: Support **LISA** and **unsloth** training! Specify `--lisa_activated_layers=2` to use LISA(to reduce the memory cost to 30 percent!), specify `--tuner_backend unsloth` to use unsloth to train a huge model(full or lora) with lesser memory(30 percent or lesser) and faster speed(5x)!\\n- 🔥2024.04.26: Support the fine-tuning and inference of Qwen1.5-110B and Qwen1.5-110B-Chat model, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half_110b_chat/lora_ddp_ds/sft.sh) to start training!\\n- 2024.04.24: Support for inference and fine-tuning of Phi3 series models. Including: [phi3-4b-4k-instruct](examples/pytorch/llm/scripts/phi3_4b_4k_instruct/lora), phi3-4b-128k-instruct.\\n- 2024.04.22: Support for inference, fine-tuning, and deployment of **chinese-llama-alpaca-2** series models. This includes：chinese-llama-2-1.3b, chinese-llama-2-7b, chinese-llama-2-13b, chinese-alpaca-2-1.3b, chinese-alpaca-2-7b and chinese-alpaca-2-13b along with their corresponding 16k and 64k long text versions.\\n- 2024.04.22: Support for inference and fine-tuning of Llama3 GPTQ-Int4, GPTQ-Int8, and AWQ series models. Support for inference and fine-tuning of chatglm3-6b-128k, Openbuddy-Llama3.\\n- 2024.04.20: Support for inference, fine-tuning, and deployment of **Atom** series models. This includes: Atom-7B and Atom-7B-Chat. use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/atom_7b_chat/lora/sft.sh) to train.\\n- 2024.04.19: Support for single-card, DDP, ZeRO2, and ZeRO3 training and inference with NPU, please refer to [NPU Inference and Fine-tuning Best Practice](docs/source_en/LLM/NPU-best-practice.md).\\n- 2024.04.19: Support for inference, fine-tuning, and deployment of **Llama3** series models. This includes: Llama-3-8B, Llama-3-8B-Instruct, Llama-3-70B, and Llama-3-70B-Instruct. use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/llama3_8b_instruct/lora/sft.sh) to train.\\n- 2024.04.18: Supported models: wizardlm2-7b-awq, wizardlm2-8x22b, yi-6b-chat-awq, yi-6b-chat-int8, yi-34b-chat-awq, yi-34b-chat-int8. Supported `--deepspeed zero3-offload` and provided default zero3-offload configuration file for zero3+cpu offload usage.\\n- 2024.04.18: Supported compatibility with HuggingFace ecosystem using the environment variable `USE_HF`, switching to use models and datasets from HF. Please refer to the [HuggingFace ecosystem compatibility documentation](https://github.com/modelscope/swift/tree/main/docs/source_en/LLM/Compat-HF.md).\\n- 2024.04.17: Support the evaluation for OpenAI standard interfaces. Check the [parameter documentation](docs/source_en/Instruction/Command-line-parameters.md#eval-parameters) for details.\\n- 🔥2024.04.17: Support **CodeQwen1.5-7B** series: CodeQwen1.5-7B, CodeQwen1.5-7B-Chat,CodeQwen1.5-7B-Chat-AWQ, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/codeqwen1half_7b_chat/lora/sft.sh) to train.\\n- 2024.04.16: Supports inference and fine-tuning of llava-v1.6-34b model. For best practice, you can refer to [here](https://github.com/modelscope/swift/tree/main/docs/source_en/Multi-Modal/llava-best-practice.md).\\n- 2024.04.13: Support the fine-tuning and inference of Mixtral-8x22B-v0.1 model, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/mixtral_moe_8x22b_v1/lora_ddp_ds/sft.sh) to start training!\\n- 2024.04.13: Support the newly launched **MiniCPM** series: MiniCPM-V-2.0、MiniCPM-2B-128k、MiniCPM-MoE-8x2B and MiniCPM-1B.use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/minicpm_moe_8x2b/lora_ddp/sft.sh) to start training!\\n- 🔥2024.04.11: Support Model Evaluation with MMLU/ARC/CEval datasets(also user custom eval datasets) with one command! Check [this documentation](docs/source_en/Instruction/LLM-eval.md) for details. Meanwhile, we support a trick way to do multiple ablation experiments, check [this documentation](docs/source_en/Instruction/LLM-exp.md) to use.\\n- 🔥2024.04.11: Support **c4ai-command-r** series: c4ai-command-r-plus, c4ai-command-r-v01, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/c4ai_command_r_plus/lora_mp/sft.sh) to train.\\n- 2024.04.10: Use SWIFT to fine-tune the qwen-7b-chat model to enhance its function call capabilities, and combine it with [Modelscope-Agent](https://github.com/modelscope/modelscope-agent) for best practices, which can be found [here](https://github.com/modelscope/swift/tree/main/docs/source_en/LLM/Agent-best-practice.md#Usage-with-Modelscope_Agent).\\n- 🔥2024.04.09: Support ruozhiba dataset. Search `ruozhiba` in [this documentation](docs/source_en/Instruction/Supported-models-datasets.md) to begin training!\\n- 2024.04.08: Support the fine-tuning and inference of XVERSE-MoE-A4.2B model, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/xverse_moe_a4_2b/lora/sft.sh) to start training!\\n- 2024.04.04: Support **QLoRA+FSDP** to train a 70B model with two 24G memory GPUs, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/llama2_70b_chat/qlora_fsdp/sft.sh) to train.\\n- 🔥2024.04.03: Support **Qwen1.5-32B** series: Qwen1.5-32B, Qwen1.5-32B-Chat, Qwen1.5-32B-Chat-GPTQ-Int4.use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half_32b_chat/lora_mp/sft.sh) to start training!\\n- 🔥2024.04.02: Support the fine-tuning and inference of Mengzi3-13B-Base model, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/mengzi3_13b_base/lora_ddp_ds/sft.sh) to start training!\\n- 🔥2024.04.01: Support **dbrx** series: dbrx-base and dbrx-instruct, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/dbrx-instruct/lora_mp/sft.sh) to start training!\\n- 🔥2024.03.29: Support **Qwen1.5-MoE** series: Qwen1.5-MoE-A2.7B, Qwen1.5-MoE-A2.7B-Chat, Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4.\\n- 🔥2024.03.29: Support the fine-tuning and inference of **Grok-1** 300B MoE, please view details [here](https://github.com/modelscope/swift/tree/main/docs/source_en/LLM/Grok-1-best-practice.md).\\n- 🔥2024.03.25: Supports inference and fine-tuning of TeleChat-7b and TeleChat-12b model, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/telechat_12b/lora/sft.sh) to start training!\\n- 🔥2024.03.20: Supports inference and fine-tuning for the **llava** series. For best practice, you can refer to [here](https://github.com/modelscope/swift/tree/main/docs/source_en/Multi-Modal/llava-best-practice.md).\\n- 🔥2024.03.12: Support inference and fine-tuning for **deepseek-vl** series. Best practices can be found [here](docs/source_en/Multi-Modal/deepseek-vl-best-practice.md).\\n- 🔥2024.03.11: Support [GaLore](https://arxiv.org/abs/2403.03507) for effectively reducing memory usage to 1/2 of the original in full-parameter training.\\n- 🔥2024.03.10: [End-to-end best practices](docs/source_en/LLM/Qwen1.5-best-practice.md) from fine-tuning to deployment for Qwen1.5-7B-Chat and Qwen1.5-72B-Chat.\\n- 🔥2024.03.09: Support training and inference of MAMBA model, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/mamba-1.4b/lora/sft.sh) to start training!\\n- 2024.03.09: Support training and inference of AQLM quantized model, use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/llama2_7b_aqlm_2bit_1x16/lora/sft.sh) to start training!\\n- 2024.03.06: Support training and inference of AWQ quantized model, use [this Qwen1.5-AWQ model script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half_7b_chat_awq/lora/sft.sh) to start training, and support training and inference of [yi-9b](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/yi_9b/lora_zero3).\\n- 🔥2024.02.29: Support [LLaMA PRO](https://arxiv.org/pdf/2401.02415.pdf), simply use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/yi_6b_chat/llamapro/sft.sh) to start training.\\n- 🔥2024.02.29: Support [LoRA+](https://arxiv.org/pdf/2402.12354.pdf), simply use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/yi_6b_chat/lorap/sft.sh) to start training.\\n- 2024.02.25: Support `swift export` to quantize models using **AWQ/GPTQ** and push to ModelScope Hub. See documentation: [LLM Quantization](docs/source_en/Instruction/LLM-quantization-and-export.md).\\n- 2024.02.22: Support gemma series: gemma-2b, [gemma-2b-instruct](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/gemma_2b_instruct), gemma-7b, gemma-7b-instruct.\\n- 2024.02.16: Support deepseek-math series: deepseek-math-7b, deepseek-math-7b-instruct, deepseek-math-7b-chat.\\n- 🔥2024.02.05: Support **Qwen1.5** series models, see [model list](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/%E6%94%AF%E6%8C%81%E7%9A%84%E6%A8%A1%E5%9E%8B%E5%92%8C%E6%95%B0%E6%8D%AE%E9%9B%86.md#%E6%A8%A1%E5%9E%8B) for all supported Qwen1.5 models. Provide fine-tuning scripts for [qwen1half-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat), [qwen1half-7b-chat-int8](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat_int8).\\n- 2024.02.05: Support training of diffusion models such as **SDXL**, **SD**, **ControlNet**, as well as **DreamBooth** training. See corresponding [training scripts](https://github.com/modelscope/swift/tree/main/examples/pytorch/sdxl/scripts) for details.\\n- 2024.02.01: Support minicpm series: [minicpm-2b-sft-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/minicpm_2b_sft_chat), minicpm-2b-chat.\\n- 🔥2024.02.01: Support dataset mixing to reduce **catastrophic forgetting**. Use `--train_dataset_mix_ratio 2.0` to enable training! We also open sourced the general knowledge dataset [ms-bench](https://www.modelscope.cn/datasets/iic/ms_bench/summary).\\n- 🔥2024.02.01: Support Agent training! Agent training algorithm is derived from this [paper](https://arxiv.org/pdf/2309.00986.pdf). We also added [ms-agent](https://www.modelscope.cn/datasets/iic/ms_agent/summary), a high-quality agent dataset. Use [this script](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen_7b_chat/lora/sft.sh) to start Agent training!\\n- 🔥2024.02.01: Support adding SFT loss in DPO training to reduce repetitive generation caused by KL divergence loss.\\n- 2024.02.01: Support using AdaLoRA and IA3 adapters in training.\\n- 2024.02.01: Support `--merge_lora` parameter in AnimateDiff training.\\n- 2024.01.30: Support [internlm-xcomposer2-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/internlm_xcomposer2_7b_chat).\\n- 🔥2024.01.30: Support [ZeRO-3](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/full_ddp_zero3/), simply specify `--deepspeed default-zero3`.\\n- 2024.01.29: Support internlm2-math series: internlm2-math-7b, internlm2-math-7b-chat, internlm2-math-20b, internlm2-math-20b-chat.\\n- 🔥2024.01.26: Support [yi-vl-6b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_vl_6b_chat), yi-vl-34b-chat.\\n- 2024.01.24: Support codefuse-codegeex2-6b-chat, codefuse-qwen-14b-chat.\\n- 2024.01.23: Support orion series: orion-14b, [orion-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/orion_14b_chat).\\n- 2024.01.20: Support [xverse-13b-256k](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/xverse_13b_256k), xverse-65b-v2, xverse-65b-chat.\\n- 🔥2024.01.17: Support internlm2 series: internlm2-7b-base, internlm2-7b, [internlm2-7b-sft-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/internlm2_7b_sft_chat), internlm2-7b-chat, internlm2-20b-base, internlm2-20b, internlm2-20b-sft-chat, internlm2-20b-chat.\\n- 2024.01.15: Support yuan series: yuan2-2b-instruct, [yuan2-2b-janus-instruct](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yuan2_2b_janus_instruct), yuan2-51b-instruct, yuan2-102b-instruct.\\n- 🔥2024.01.12: Support **deepseek-moe** series: deepseek-moe-16b, [deepseek-moe-16b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/deepseek_moe_16b_chat).\\n- 🔥2024.01.04: Support **VLLM deployment**, compatible with **OpenAI API** style, see [VLLM Inference Acceleration and Deployment](https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/VLLM-inference-acceleration-and-deployment.md#Deployment) for details.\\n- 2024.01.04: Update [Benchmark](https://github.com/modelscope/swift/blob/main/docs/source/LLM/Benchmark.md) for convenient viewing of training speed and memory usage of different models.\\n- 🔥2023.12.29: Support web-ui for sft training and inference, use `swift web-ui` after installing ms-swift to start.\\n- 🔥2023.12.29: Support DPO RLHF (Reinforcement Learning from Human Feedback) and three datasets for this task: AI-ModelScope/stack-exchange-paired, AI-ModelScope/hh-rlhf and AI-ModelScope/hh_rlhf_cn. See [documentation](https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/DPO.md) to start training!\\n- 🔥2023.12.28: Support SCEdit! This tuner can significantly reduce memory usage in U-Net and support low-memory controllable image generation (replacing ControlNet), read the section below to learn more.\\n- 2023.12.23: Support [codegeex2-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/codegeex2_6b).\\n- 2023.12.19: Support [phi2-3b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/phi2_3b).\\n- 2023.12.18: Support VLLM for inference acceleration.\\n- 2023.12.15: Support deepseek, deepseek-coder series: deepseek-7b, deepseek-7b-chat, deepseek-67b, deepseek-67b-chat, openbuddy-deepseek-67b-chat, deepseek-coder-1_3b, deepseek-coder-1_3b-instruct, deepseek-coder-6_7b, deepseek-coder-6_7b-instruct, deepseek-coder-33b, deepseek-coder-33b-instruct.\\n- 2023.12.13: Support mistral-7b-instruct-v2, [mixtral-moe-7b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/mixtral_7b_moe), [mixtral-moe-7b-instruct](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/mixtral_7b_moe_instruct).\\n- 2023.12.09: Support `freeze_parameters_ratio` parameter as a compromise between lora and full-parameter training. Corresponding sh can be found in [full_freeze_ddp](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_freeze_ddp). Support `disable_tqdm`, `lazy_tokenize`, `preprocess_num_proc` parameters, see [command line arguments](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.md) for details.\\n- 2023.12.08: Support [sus-34b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/sus_34b_chat), support yi-6b-200k, yi-34b-200k.\\n- 2023.12.07: Support [Multi-Node DDP training](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/LLM%E5%BE%AE%E8%B0%83%E6%96%87%E6%A1%A3.md#%E4%BD%BF%E7%94%A8cli).\\n- 2023.12.05: Support models: zephyr-7b-beta-chat, openbuddy-zephyr-7b-chat. Support datasets: hc3-zh, hc3-en.\\n- 🔥2023.12.02: [Self-cognition fine-tuning best practices](docs/source_en/LLM/Self-cognition-best-practice.md), **10 minutes to fine-tune a large model for self-cognition**, create your own unique large model.\\n- 🔥2023.11.30: Support training and inference of **qwen-1_8b**, **qwen-72b**, **qwen-audio** series models. Corresponding sh scripts can be found in [qwen_1_8b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_1_8b_chat), [qwen_72b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat), [qwen_audio_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_audio_chat)\\n- 🔥2023.11.29: Support training and inference of **AnimateDiff**\\n- 🔥2023.11.24: Support **yi-34b-chat**, **codefuse-codellama-34b-chat** models. Corresponding sh scripts can be found in [yi_34b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b_chat), [codefuse_codellama_34b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/codefuse_codellama_34b_chat).\\n- 🔥2023.11.18: Support **tongyi-finance-14b** series models: tongyi-finance-14b, tongyi-finance-14b-chat, tongyi-finance-14b-chat-int4. Corresponding sh scripts can be found in [tongyi_finance_14b_chat_int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/tongyi_finance_14b_chat_int4).\\n- 2023.11.16: Support **flash attn** for more models: qwen series, qwen-vl series, llama series, openbuddy series, mistral series, yi series, ziya series. Please use `use_flash_attn` parameter.\\n- 🔥2023.11.11: Support **NEFTune**, simply use `Swift.prepare_model(model, NEFTuneConfig())` to enable.\\n- 🔥2023.11.11: Support training and inference by **command line** and inference by **Web-UI**, see `Usage with Swift CLI` section below for details.\\n- 🔥2023.11.10: Support **bluelm** series models: bluelm-7b, bluelm-7b-chat, bluelm-7b-32k, bluelm-7b-chat-32k. Corresponding sh scripts can be found in [bluelm_7b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/bluelm_7b_chat).\\n- 🔥2023.11.08: Support training and inference of **xverse-65b** model, script at [xverse_65b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/xverse_65b).\\n- 🔥2023.11.07: Support training and inference of **yi-6b**, **yi-34b** models, scripts at [yi_6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_6b), [yi_34b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b).\\n- 🔥2023.10.30: Support two new tuners: **QA-LoRA** and **LongLoRA**.\\n- 🔥2023.10.30: Support editing models using **ROME** (Rank One Model Editing) to infuse new knowledge into models without training!\\n- 2023.10.30: Support **skywork-13b** series models: skywork-13b, skywork-13b-chat. Corresponding sh scripts can be found in [skywork_13b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/skywork_13b).\\n- 🔥2023.10.27: Support **chatglm3** series models: chatglm3-6b-base, chatglm3-6b, chatglm3-6b-32k. Corresponding sh scripts can be found in [chatglm3_6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b).\\n- 🔥2023.10.17: Support SFT of **int4**, **int8** models: qwen-7b-chat-int4, qwen-14b-chat-int4, qwen-vl-chat-int4, baichuan2-7b-chat-int4, baichuan2-13b-chat-int4, qwen-7b-chat-int8, qwen-14b-chat-int8.\\n- 2023.10.15: Support **ziya2-13b** series models: ziya2-13b, ziya2-13b-chat.\\n- 2023.10.12: Support **mistral-7b** series models: openbuddy-mistral-7b-chat, mistral-7b, mistral-7b-instruct.\\n- 🔥2023.10.07: Support **DeepSpeed ZeRO-2**, enabling lora (not just qlora) to run DDP on dual A10 cards.\\n- 2023.10.04: Support more math, law, SQL, code domain datasets: blossom-math-zh, school-math-zh, text2sql-en, sql-create-context-en, lawyer-llama-zh, tigerbot-law-zh, leetcode-python-en.\\n- 🔥2023.09.25: Support **qwen-14b** series: qwen-14b, qwen-14b-chat.\\n- 2023.09.18: Support **internlm-20b** series: internlm-20b, internlm-20b-chat.\\n- 2023.09.12: Support **MP+DDP** to accelerate full-parameter training.\\n- 2023.09.05: Support **openbuddy-llama2-70b-chat**.\\n- 2023.09.03: Support **baichuan2** series: baichuan2-7b, baichuan2-7b-chat, baichuan2-13b, baichuan2-13b-chat.\\n</details>\\n\\n## 🛠️ Installation\\n\\nSWIFT runs in the Python environment. Please ensure your Python version is higher than 3.8.\\n\\n- Method 1: Install SWIFT using pip command:\\n\\n```shell\\n# Full capabilities\\npip install 'ms-swift[all]' -U\\n# LLM only\\npip install 'ms-swift[llm]' -U\\n# AIGC only\\npip install 'ms-swift[aigc]' -U\\n# Adapters only\\npip install ms-swift -U\\n```\\n\\n- Method 2: Install SWIFT through source code (convenient for running training and inference scripts), please run the following commands:\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nSWIFT depends on torch>=1.13, recommend torch>=2.0.0.\\n\\n- Method 3: Use SWIFT in our [Docker image](https://www.modelscope.cn/docs/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85)\\n\\n## 🚀 Getting Started\\n\\nThis section introduces basic usage, see the [Documentation](https://swift.readthedocs.io/en/latest/) section for more ways to use.\\n\\n### Web-UI\\n\\nWeb-UI is a gradio-based interface for **zero-threshold** training and deployment. It is easy to use and perfectly supports multi-GPU training and deployment:\\n\\n```shell\\nSWIFT_UI_LANG=en swift web-ui\\n```\\n\\n![image.png](./docs/resources/web-ui-en.jpg)\\n\\n### Training\\n\\n#### Training Scripts\\nYou can refer to the following scripts to customize your own training script.\\n\\n- full: [qwen1half-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat/full) (A100), [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_mp) (2\\\\*A100)\\n- full+ddp+zero2: [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_ddp_zero2) (4\\\\*A100)\\n- full+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/full_ddp_zero3) (4\\\\*A100)\\n- lora: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora) (3090), [baichuan2-13b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/baichuan2_13b_chat/lora_mp) (2\\\\*3090), [yi-34b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b_chat/lora) (A100), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_mp) (2\\\\*A100)\\n- lora+ddp: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora_ddp) (2\\\\*3090)\\n- lora+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/lora_ddp_zero3) (4\\\\*3090), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_ddp_zero3) (4\\\\*A100)\\n- qlora(gptq-int4): [qwen-7b-chat-int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat_int4/qlora) (3090)\\n- qlora(gptq-int8): [qwen1half-7b-chat-int8](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat_int8/qlora) (3090)\\n- qlora(bnb-int4): [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/qlora) (3090)\\n\\n\\n#### Supported Training Processes\\n\\n| Training Process | Training Method                                                               |\\n|------------------|-------------------------------------------------------------------------------|\\n| Pretraining      | Text Generation                                                               |\\n| Fine-tuning      | Single-turn/Multi-turn<br>Agent Training/Self-cognition<br>Multi-modal Vision/Multi-modal Speech|\\n| Human Alignment  | DPO<br>ORPO<br>SimPO<br>CPO<br>KTO                                            |\\n| Text-to-Image    | DreamBooth, etc.                                                              |\\n| Text-to-Video    | -                                                                             |\\n\\n#### Single GPU Training\\n\\nStart single GPU fine-tuning with the following command:\\n\\nLoRA:\\n```shell\\n# Experimental Environment: A100\\n# GPU Memory Requirement: 20GB\\n# Runtime: 3.1 hours\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --eval_steps 200 \\\\\\n```\\n\\nFull-parameter:\\n```shell\\n# Experimental Environment: A100\\n# GPU Memory Requirement: 80GB\\n# Runtime: 2.5 hours\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --eval_steps 500 \\\\\\n```\\n\\n\\n#### Model Parallel Training\\n\\n\\n```shell\\n# Experimental Environment: 2 * A100\\n# GPU Memory Requirement: 10GB + 13GB\\n# Runtime: 3.4 hours\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n#### Data Parallel Training\\n\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 4 * 30GB\\n# Runtime: 0.8 hours\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\nCombining Model Parallelism and Data Parallelism:\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 2*14GB + 2*18GB\\n# Runtime: 1.7 hours\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n#### Deepspeed Training\\nDeepspeed supports training of quantized GPTQ and AWQ models.\\n\\nZeRO2:\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 4 * 21GB\\n# Runtime: 0.9 hours\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero2 \\\\\\n```\\n\\nZeRO3:\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 4 * 19GB\\n# Runtime: 3.2 hours\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\nZeRO3-Offload:\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 4 * 12GB\\n# Runtime: 60 hours\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_id_or_path AI-ModelScope/WizardLM-2-8x22B \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed zero3-offload \\\\\\n```\\n\\n\\n#### Multi-node Multi-GPU\\n```shell\\n# If the disk is not shared, please additionally specify `--save_on_each_node true` in the shell scripts on each machine.\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-32b-chat \\\\\\n    --sft_type full \\\\\\n    --dataset blossom-math-zh \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-32b-chat \\\\\\n    --sft_type full \\\\\\n    --dataset blossom-math-zh \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\n##### AliYun-DLC multi-node training\\nIn DLC product, WORLD_SIZE is the node number, RANK is the node index, this is different from the definition of torchrun.\\n\\n```shell\\nNNODES=$WORLD_SIZE \\\\\\nNODE_RANK=$RANK \\\\\\nswift sft \\\\\\n    --model_type qwen1half-32b-chat \\\\\\n    --sft_type full \\\\\\n    --dataset blossom-math-zh \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3\\n```\\n\\n#### Pretraining\\n\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 4 * 30GB\\n# Runtime: 0.8 hours\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift pt \\\\\\n    --model_type qwen1half-7b \\\\\\n    --dataset chinese-c4#100000 \\\\\\n    --num_train_epochs 1 \\\\\\n    --sft_type full \\\\\\n    --deepspeed default-zero3 \\\\\\n    --output_dir output \\\\\\n    --lazy_tokenize true\\n```\\n\\n\\n#### RLHF\\n\\n```shell\\n# We support rlhf_type dpo/cpo/simpo/orpo/kto\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n\\n### Inference\\nOriginal model:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n# use VLLM\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\nLoRA fine-tuned:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true\\n# use VLLM\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true \\\\\\n    --merge_lora true --infer_backend vllm --max_model_len 8192\\n```\\n\\n### Evaluation\\n\\nOriginal model:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift eval --model_type qwen1half-7b-chat \\\\\\n    --eval_dataset ARC_c --infer_backend vllm\\n```\\n\\nLoRA fine-tuned:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift eval --ckpt_dir xxx/checkpoint-xxx \\\\\\n    --eval_dataset ARC_c --infer_backend vllm \\\\\\n    --merge_lora true \\\\\\n```\\n\\n### Quantization\\n\\nOriginal model:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export --model_type qwen1half-7b-chat \\\\\\n    --quant_bits 4 --quant_method awq\\n```\\n\\nLoRA fine-tuned:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true \\\\\\n    --quant_method awq --quant_bits 4 \\\\\\n    --merge_lora true \\\\\\n```\\n\\n### Deployment\\nThe client uses the OpenAI API for invocation, for details refer to the [LLM deployment documentation](https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/VLLM-inference-acceleration-and-deployment.md).\\n\\nOriginal model:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen1half-7b-chat\\n# 使用VLLM加速\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen1half-7b-chat \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\nLoRA fine-tuned:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir xxx/checkpoint-xxx\\n# 使用VLLM加速\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir xxx/checkpoint-xxx --merge_lora true \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\n### Supported Models\\nThe complete list of supported models and datasets can be found at [Supported Models and Datasets List](docs/source_en/Instruction/Supported-models-datasets.md).\\n\\n#### LLMs\\n\\n| Model Type                                                                                      | Model Introduction                                                                                                                             | Language           | Model Size                                | Model Type                                                        |\\n|-------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|-------------------------------------------|-------------------------------------------------------------------|\\n| Qwen<br>Qwen1.5<br>Qwen2<br>Qwen2.5                                                  | [Tongyi Qwen series models](https://github.com/QwenLM)                                                                             | Chinese<br>English | 0.5B-110B<br>including quantized versions | base model<br>chat model<br>MoE model<br>code model               |\\n| ChatGLM2<br>ChatGLM3<br>Codegeex2<br>GLM4<br>Codegeex4                                          | [Zhipu ChatGLM series models](https://github.com/THUDM)                                                                                        | Chinese<br>English | 6B-9B                                     | base model<br>chat model<br>code model<br>long text model         |\\n| Baichuan<br>Baichuan2                                                                           | [Baichuan 1 and Baichuan 2](https://github.com/baichuan-inc)                                                                                   | Chinese<br>English | 7B-13B<br>including quantized versions    | base model<br>chat model                                          |\\n| Yuan2                                                                                           | [Langchao Yuan series models](https://github.com/IEIT-Yuan)                                                                                    | Chinese<br>English | 2B-102B                                   | instruct model                                                    |\\n| XVerse                                                                                          | [XVerse series models](https://github.com/xverse-ai)                                                                                           | Chinese<br>English | 7B-65B                                    | base model<br>chat model<br>long text model<br>MoE model          |\\n| LLaMA2                                                                                          | [LLaMA2 series models](https://github.com/facebookresearch/llama)                                                                              | English            | 7B-70B<br>including quantized versions    | base model<br>chat model                                          |\\n| LLaMA3<br>LLaMA3.1<br>Llama3.2              | [LLaMA3 series models](https://github.com/meta-llama/llama3)                                                                                   | English            | 1B-70B<br>including quantized versions    | base model<br>chat model                                          |\\n| Mistral<br>Mixtral                                                                              | [Mistral series models](https://github.com/mistralai/mistral-src)                                                                              | English            | 7B-22B                                    | base model<br>instruct model<br>MoE model                         |\\n| Yi<br>Yi1.5<br>Yi-Coder                                                                | [01AI's YI series models](https://github.com/01-ai)                                   | Chinese<br>English | 1.5B-34B<br>including quantized             | base model<br>chat model<br>long text model                      |\\n| InternLM<br>InternLM2<br>InternLM2-Math<br>InternLM2.5                                          | [Pujiang AI Lab InternLM series models](https://github.com/InternLM/InternLM)                                                                  | Chinese<br>English | 1.8B-20B                                  | base model<br>chat model<br>math model                            |\\n| DeepSeek<br>DeepSeek-MoE<br>DeepSeek-Coder<br>DeepSeek-Math<br>DeepSeek-V2<br>DeepSeek-Coder-V2 | [DeepSeek series models](https://github.com/deepseek-ai)                                                                                       | Chinese<br>English | 1.3B-236B                                 | base model<br>chat model<br>MoE model<br>code model<br>math model |\\n| MAMBA                                                                                           | [MAMBA temporal convolution model](https://github.com/state-spaces/mamba)                                                                      | English            | 130M-2.8B                                 | base model                                                        |\\n| Gemma<br>Gemma2                                                                                 | [Google Gemma series models](https://github.com/google/gemma_pytorch)                                                                          | English            | 2B-27B                                    | base model<br>instruct model                                      |\\n| MiniCPM<br>MiniCPM3                                                                      | [OpenBmB MiniCPM series models](https://github.com/OpenBMB/MiniCPM)                                                                            | Chinese<br>English | 2B-3B                                     | chat model<br>MoE model                                           |\\n| OpenBuddy                                                                                       | [OpenBuddy series models](https://github.com/OpenBuddy/OpenBuddy)                                                                              | Chinese<br>English | 7B-70B                                    | base model<br>chat model                                          |\\n| Orion                                                                                           | [OrionStar AI series models](https://github.com/OrionStarAI)                                                                                   | Chinese<br>English | 14B                                       | base model<br>chat model                                          |\\n| BlueLM                                                                                          | [VIVO BlueLM large model](https://github.com/vivo-ai-lab/BlueLM)                                                                               | Chinese<br>English | 7B                                        | base model<br>chat model                                          |\\n| Ziya2                                                                                           | [Fengshenbang series models](https://github.com/IDEA-CCNL/Fengshenbang-LM)                                                                     | Chinese<br>English | 13B                                       | base model<br>chat model                                          |\\n| Skywork                                                                                         | [Skywork series models](https://github.com/SkyworkAI/Skywork)                                                                                  | Chinese<br>English | 13B                                       | base model<br>chat model                                          |\\n| Zephyr                                                                                          | Zephyr series models based on Mistral                                                                                                          | English            | 7B                                        | chat model                                                        |\\n| PolyLM                                                                                          | [Tongyi Lab self-developed PolyLM series models](https://github.com/DAMO-NLP-MT/PolyLM)                                                        | Multilingual       | 13B                                       | base model                                                        |\\n| SeqGPT                                                                                          | [Tongyi Lab self-developed text understanding model for information extraction and text classification](https://github.com/Alibaba-NLP/SeqGPT) | Chinese            | 560M                                      | semantic understanding model                                      |\\n| SUS                                                                                             | [Southern University of Science and Technology model fine-tuned on YI](https://github.com/SUSTech-IDEA/SUS-Chat)                               | Chinese<br>English | 34B                                       | chat model                                                        |\\n| Tongyi-Finance                                                                                  | [Tongyi finance series models](https://github.com/QwenLM/Qwen)                                                                                 | Chinese<br>English | 14B                                       | base model<br>chat model<br>financial model                       |\\n| CodeFuse-CodeLLaMA<br>CodeFuse-Codegeex2<br>CodeFuse-Qwen                                       | [Ant CodeFuse series models](https://github.com/codefuse-ai)                                                                                   | Chinese<br>English | 6B-34B                                    | chat model<br>code model                                          |\\n| phi2/phi3                                                                                       | Microsoft's PHI series models                                                                                                                  | English            | 3B/4B                                     | base model<br>instruct model<br>code model                        |\\n| Grok                                                                                            | [X-ai](https://github.com/xai-org/grok-1)                                                                                                      | English            | 300B                                      | base model                                                        |\\n| TeleChat                                                                                        | [Tele-AI](https://github.com/Tele-AI/Telechat)                                                                                                 | Chinese<br>English | 7B-12B                                    | chat model                                                        |\\n| dbrx                                                                                            | [databricks](https://github.com/databricks/dbrx)                                                                                               | English            | 132B                                      | base model<br>chat model                                          |\\n| mengzi3                                                                                         | [Langboat](https://github.com/Langboat/Mengzi3)                                                                                                | Chinese<br>English | 13B                                       | base model                                                        |\\n| c4ai-command-r                                                                                  | [c4ai](https://cohere.com/command)                                                                                                             | Multilingual       | 35B-104B                                  | chat model                                                        |\\n| WizardLM2                                                                                       | [WizardLM2 series models](https://github.com/nlpxucan/WizardLM)                                                                                | English            | 7B-8x22B<br>including quantized versions  | chat model<br>MoE model                                           |\\n| Atom                                                                                            | [Atom](https://github.com/LlamaFamily/Llama-Chinese)                                                                                           | Chinese            | 7B                                        | base model<br>chat model                                          |\\n| Chinese-LLaMA-Alpaca-2                                                                          | [Chinese-LLaMA-Alpaca-2](https://github.com/ymcui/Chinese-LLaMA-Alpaca-2)                                                                      | Chinese            | 1.3B-13B                                  | base model<br>chat model<br>long text model                       |\\n| Chinese-LLaMA-Alpaca-3                                                                          | [Chinese-LLaMA-Alpaca-3](https://github.com/ymcui/Chinese-LLaMA-Alpaca-3)                                                                      | Chinese            | 8B                                        | base model<br>chat model                                          |\\n| ModelScope-Agent                                                                                | [ModelScope Agent series models](https://github.com/modelscope/modelscope-agent)                                                               | Chinese            | 7B-14B                                    | agent model                                                       |\\n| Numina                                                                                          | [AI-MO](https://huggingface.co/AI-MO)                                                                                                          | English            | 7B                                        | Math                                                              |\\n\\n#### MLLMs\\n\\n| Model Type                                                 | Model Introduction                                                                     | Language           | Model Size                            | Model Type               |\\n|------------------------------------------------------------|----------------------------------------------------------------------------------------|--------------------|---------------------------------------|--------------------------|\\n| Qwen-VL<br>Qwen2-VL                       | [Tongyi Qwen vision model](https://github.com/QwenLM)                                  | Chinese<br>English | 2B-72B<br>including quantized versions    | base model<br>chat model |\\n| Qwen-Audio<br>Qwen2-Audio                                  | [Tongyi Qwen speech model](https://github.com/QwenLM)                                  | Chinese<br>English | 7B                                    | base model<br>chat model |\\n| Llama3.2-Vision              | [Llama3.2](https://huggingface.co/collections/meta-llama/llama-32-66f448ffc8c32f949b04c8cf)                | English       | 11B-90B      | base model<br>chat model       |\\n| YI-VL                                                      | [01AI's YI series vision models](https://github.com/01-ai)                             | Chinese<br>English | 6B-34B                                | chat model               |\\n| XComposer2<br>XComposer2.5                                 | [Pujiang AI Lab InternLM vision model](https://github.com/InternLM/InternLM-XComposer) | Chinese<br>English | 7B                                    | chat model               |\\n| DeepSeek-VL                                                | [DeepSeek series vision models](https://github.com/deepseek-ai)                        | Chinese<br>English | 1.3B-7B                               | chat model               |\\n| MiniCPM-V<br>MiniCPM-V-2<br>MiniCPM-V-2.5<br>MiniCPM-V-2.6 | [OpenBmB MiniCPM vision model](https://github.com/OpenBMB/MiniCPM)                     | Chinese<br>English | 3B-9B                                 | chat model               |\\n| CogVLM<br>CogAgent<br>CogVLM2<br>CogVLM2-Video<br>GLM4V    | [Zhipu ChatGLM visual QA and Agent model](https://github.com/THUDM/)                   | Chinese<br>English | 9B-19B                                | chat model               |\\n| Llava-HF                                                   | [Llava-HF series models](https://huggingface.co/llava-hf)                          | English       | 0.5B-110B           | chat model           |\\n| Llava1.5<br>Llava1.6                                       | [Llava series models](https://github.com/haotian-liu/LLaVA)                            | English            | 7B-34B                                | chat model               |\\n| Llava-Next<br>Llava-Next-Video                             | [Llava-Next series models](https://github.com/LLaVA-VL/LLaVA-NeXT)                     | Chinese<br>English | 7B-110B                               | chat model               |\\n| mPLUG-Owl2<br>mPLUG-Owl2.1<br>mPLUG-Owl3                | [mPLUG-Owl series models](https://github.com/X-PLUG/mPLUG-Owl)                         | English            | 11B                                   | chat model               |\\n| InternVL<br>Mini-InternVL<br>InternVL2                     | [InternVL](https://github.com/OpenGVLab/InternVL)                                      | Chinese<br>English | 1B-40B<br>including quantized version | chat model               |\\n| Llava-llama3                                               | [xtuner](https://huggingface.co/xtuner/llava-llama-3-8b-v1_1-transformers)             | English            | 8B                                    | chat model               |\\n| Phi3-Vision                                                | Microsoft                                                                              | English            | 4B                                    | chat model               |\\n| PaliGemma                                                  | Google                                                                                 | English            | 3B                                    | chat model               |\\n| Florence                                                   | Microsoft                                                                              | English            | 0.23B-0.77B                           | chat model               |\\n| Idefics3                                                   | [HuggingFaceM4](https://huggingface.co/HuggingFaceM4)                               | English       | 8B      | chat model       |\\n| Pixtral                                | [mistralai](https://huggingface.co/mistralai)                     | English       | 12B      | chat model       |\\n| Llama3.1-Omni              | [LLaMA-Omni](https://github.com/ictnlp/LLaMA-Omni)                | English       | 8B      | chat model       |\\n\\n\\n#### Diffusion Models\\n\\n| Model Type          | Model Introduction                                                    | Language | Model Type        |\\n|---------------------|----------------------------------------------------------------------|----------|------------------ |\\n| AnimateDiff         | [AnimateDiff animation model](https://github.com/guoyww/AnimateDiff) | English  | text-to-video     |\\n| SD1.5/SD2.0/SDXL    | [StabilityAI series diffusion models](https://github.com/Stability-AI) | English | text-to-image    |\\n\\n### Supported Open Source Datasets\\n\\n| Dataset Type        | Training Task   | Documentation                                                                                                                                                                                                                                |\\n|---------------------|:----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\\n| General             | Fine-tuning     | 🔥ruozhiba, 🔥ms-bench, 🔥alpaca-en(gpt4), 🔥alpaca-zh(gpt4), multi-alpaca, instinwild, cot-en, cot-zh, firefly-zh, instruct-en, gpt4all-en, sharegpt, tulu-v2-sft-mixture, wikipedia-zh, open-orca, sharegpt-gpt4, deepctrl-sft, coig-cqia. |\\n| Agent               | Fine-tuning     | 🔥ms-agent, 🔥ms-agent-for-agentfabric, ms-agent-multirole, 🔥toolbench-for-alpha-umi, damo-agent-zh, damo-agent-zh-mini, agent-instruct-all-en.                                                                                             |\\n| General             | Human Alignment | hh-rlhf, 🔥hh-rlhf-cn, stack-exchange-paired.                                                                                                                                                                                                |\\n| Code                | Fine-tuning     | code-alpaca-en, 🔥leetcode-python-en, 🔥codefuse-python-en, 🔥codefuse-evol-instruction-zh.                                                                                                                                                  |\\n| Medical             | Fine-tuning     | medical-en, medical-zh, 🔥disc-med-sft-zh.                                                                                                                                                                                                   |\\n| Legal               | Fine-tuning     | lawyer-llama-zh, tigerbot-law-zh, 🔥disc-law-sft-zh.                                                                                                                                                                                         |\\n| Math                | Fine-tuning     | 🔥blossom-math-zh, school-math-zh, open-platypus-en.                                                                                                                                                                                         |\\n| SQL                 | Fine-tuning     | text2sql-en, 🔥sql-create-context-en.                                                                                                                                                                                                        |\\n| Text Generation     | Fine-tuning     | 🔥advertise-gen-zh, 🔥dureader-robust-zh.                                                                                                                                                                                                    |\\n| Classification      | Fine-tuning     | cmnli-zh, 🔥jd-sentiment-zh, 🔥hc3-zh, 🔥hc3-en.                                                                                                                                                                                             |\\n| Quantization Assist | Quantization    | pileval.                                                                                                                                                                                                                                     |\\n| Other               | Fine-tuning     | finance-en, poetry-zh, webnovel-zh, generated-chat-zh, cls-fudan-news-zh, ner-jave-zh.                                                                                                                                                       |\\n| Vision              | Fine-tuning     | coco-en, 🔥coco-en-mini, coco-en-2, coco-en-2-mini, capcha-images.                                                                                                                                                                           |\\n| Audio               | Fine-tuning     | aishell1-zh, 🔥aishell1-zh-mini.                                                                                                                                                                                                             |\\n\\n### Supported Technologies\\n\\n| Technology Name                                                                                                                                                                         |\\n|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\\n| 🔥LoRA: [LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS](https://arxiv.org/abs/2106.09685)                                                                                          |\\n| 🔥LoRA+: [LoRA+: Efficient Low Rank Adaptation of Large Models](https://arxiv.org/pdf/2402.12354.pdf)                                                                                   |\\n| 🔥GaLore:[GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection](https://arxiv.org/abs/2403.03507)                                                                      |\\n| 🔥LISA: [LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning](https://arxiv.org/abs/2403.17919)                                                   |\\n| 🔥UnSloth: https://github.com/unslothai/unsloth                                                                                                                                         |\\n| 🔥LLaMA PRO: [LLAMA PRO: Progressive LLaMA with Block Expansion](https://arxiv.org/pdf/2401.02415.pdf)                                                                                  |\\n| 🔥SCEdit: [SCEdit: Efficient and Controllable Image Diffusion Generation via Skip Connection Editing](https://arxiv.org/abs/2312.11392)  < [arXiv](https://arxiv.org/abs/2312.11392)  \\\\ |\\n| 🔥NEFTune: [Noisy Embeddings Improve Instruction Finetuning](https://arxiv.org/abs/2310.05914)                                                                                          |\\n| LongLoRA: [Efficient Fine-tuning of Long-Context Large Language Models](https://arxiv.org/abs/2309.12307)                                                                               |\\n| Adapter: [Parameter-Efficient Transfer Learning for NLP](http://arxiv.org/abs/1902.00751)                                                                                               |\\n| Vision Prompt Tuning: [Visual Prompt Tuning](https://arxiv.org/abs/2203.12119)                                                                                                          |\\n| Side: [Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks](https://arxiv.org/abs/1912.13503)                                                                     |\\n| Res-Tuning: [Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone](https://arxiv.org/abs/2310.19859)  < [arXiv](https://arxiv.org/abs/2310.19859)  \\\\  |\\n| Tuners provided by [PEFT](https://github.com/huggingface/peft), such as IA3, AdaLoRA, etc.                                                                                              |\\n\\n### Supported Hardware\\n\\n| Hardware Environment           | Notes                                           |\\n|--------------------------------|-------------------------------------------------|\\n| CPU                            |                                                 |\\n| RTX 20/30/40 series, etc.      | After 30 series, BF16 and FlashAttn can be used |\\n| Computing cards T4/V100, etc.  | BF16 and FlashAttn not supported                |\\n| Computing cards A10/A100, etc. | Support BF16 and FlashAttn                      |\\n| Huawei Ascend NPU              |                                                 |\\n\\n### Environment variables\\n\\n- DATASET_ENABLE_CACHE: Enable cache when preprocess dataset, you can use `1/True` or `0/False`, default `False`\\n- WEBUI_SHARE: Share your web-ui, you can use `1/True` or `0/False`, default `False`\\n- SWIFT_UI_LANG: web-ui language, you can use `en` or `zh`, default `zh`\\n- WEBUI_SERVER: web-ui host ip，`0.0.0.0` for all routes，`127.0.0.1` for local network only. Default `127.0.0.1`\\n- WEBUI_PORT: web-ui port\\n- USE_HF: Use huggingface endpoint or ModelScope endpoint to download models and datasets. you can use `1/True` or `0/False`, default `False`\\n- FORCE_REDOWNLOAD: Force to re-download the dataset\\n\\nOther variables like `CUDA_VISIBLE_DEVICES` are also supported, which are not listed here.\\n\\n\\n## 📚 Classroom\\n\\n| Tutorial Name                                                                                                                                                                                                                           |\\n|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\\n| [Introduction to Deep Learning](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/A.%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%85%A5%E9%97%A8%E4%BB%8B%E7%BB%8D.md)                                                |\\n| [Large Model Basics](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/B.%E9%AD%94%E6%90%AD%E7%A4%BE%E5%8C%BA%E5%92%8CLLM%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md)                    |\\n| [Prompt Engineering](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/C.%E6%8F%90%E7%A4%BA%E8%AF%8D%E5%B7%A5%E7%A8%8B-prompt%20engineering.md)                                                                 |\\n| [Transformer Architecture Introduction](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/D.Transformer%E7%BB%93%E6%9E%84.md)                                                                                   |\\n| [Training Technique Selection](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/E.%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B.md)                                                                                     |\\n| [Data Preprocessing](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/F.%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86.md)                                                                                      |\\n| [Quantization](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/G.%E9%87%8F%E5%8C%96.md)                                                                                                                       |\\n| [Training](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/H.%E8%AE%AD%E7%BB%83.md)                                                                                                                           |\\n| [Inference](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/I.LLM%E5%92%8C%E5%A4%9A%E6%A8%A1%E6%80%81%E6%A8%A1%E5%9E%8B%E9%AB%98%E6%95%88%E6%8E%A8%E7%90%86%E5%AE%9E%E8%B7%B5.md)                             |\\n| [Deployment](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/J.%E9%83%A8%E7%BD%B2.md)                                                                                                                         |\\n| [Evaluation](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/K.%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%87%AA%E5%8A%A8%E8%AF%84%E4%BC%B0%E7%90%86%E8%AE%BA%E5%92%8C%E5%AE%9E%E6%88%98--LLM%20Automatic%20Evaluation.md) |\\n\\n## 🏛 License\\n\\nThis framework is licensed under the [Apache License (Version 2.0)](https://github.com/modelscope/modelscope/blob/master/LICENSE). For models and datasets, please refer to the original resource page and follow the corresponding License.\\n\\n## 📎 Citation\\n\\n```bibtex\\n@misc{zhao2024swiftascalablelightweightinfrastructure,\\n      title={SWIFT:A Scalable lightWeight Infrastructure for Fine-Tuning},\\n      author={Yuze Zhao and Jintao Huang and Jinghan Hu and Xingjun Wang and Yunlin Mao and Daoze Zhang and Zeyinzi Jiang and Zhikai Wu and Baole Ai and Ang Wang and Wenmeng Zhou and Yingda Chen},\\n      year={2024},\\n      eprint={2408.05517},\\n      archivePrefix={arXiv},\\n      primaryClass={cs.CL},\\n      url={https://arxiv.org/abs/2408.05517},\\n}\\n```\\n\\n## Star History\\n\\n[![Star History Chart](https://api.star-history.com/svg?repos=modelscope/swift&type=Date)](https://star-history.com/#modelscope/ms-swift&Date)\\n\\n\\n# Contributor Guide\\n\\n_Welcome to offer PRs, bug reports, documentation supplements or other types of contributions to SWIFT!_\\n\\n## Table of Contents\\n- [Code of Conduct](#-code-of-conduct)\\n- [Contribution Process](#-contribution-process)\\n- [Hardware support](#-Hardware-support)\\n\\n## 📖 Code of Conduct\\nPlease refer to our [Code of Conduct documentation](./CODE_OF_CONDUCT.md).\\n\\n## 🔁 Contribution Process\\n### What We Need\\n- ROADMAP: We provide a [ROADMAP](./ROADMAP.md) for each iteration of SWIFT, contributors can check our ROADMAP to understand our development progress and plans. Features in **To be Assigned** is available for all developers.\\n- New Technologies and New Models: SWIFT needs to support more open-source models and datasets, or new technologies that we have not paid attention to. If you are interested please submit a PR to us.\\n- Technical Propagation: If you are interested in technical propagation, you are welcome to help us write tutorials, documents or videos on any website, and send us the link.\\n- Community Contribution: You can write technical articles related to SWIFT, and submit them to us. After review and approval, we will publish them on the official ModelScope accounts (Zhihu, WeChat, etc.), with your name assigned.\\n\\n### Incentives\\n- we will issue electronic certificates to contributors on behalf of the ModelScope community, to encourage your selfless contributions.\\n- We will offer small souvenirs related to the ModelScope Community.\\n- We will provide free A10 computing power during the development period. For more details, please refer to [Hardware-support](#-Hardware-support) section.\\n\\n### Submitting PR (Pull Requests)\\n\\nAny feature development is carried out in the form of Fork and then PR on GitHub.\\n1. Fork: Go to the [SWIFT](https://github.com/modelscope/swift) page and click the **Fork button**. After completion, a SWIFT code repository will be cloned under your personal organization.\\n2. Clone: Clone the code repository generated in the first step to your local machine and **create a new branch** for development. During development, please click the **Sync Fork button** in time to synchronize with the `main` branch to prevent code expiration and conflicts.\\n3. Submit PR: After development and testing, push the code to the remote branch. On GitHub, go to the **Pull Requests page**, create a new PR, select your code branch as the source branch, and the `modelscope/swift:main` branch as the target branch.\\n\\n4. Write Description: It is necessary to provide a good feature description in the PR, so that the reviewers know the content of your modification.\\n5. Review: We hope that the code to be merged is concise and efficient, so we may raise some questions and discuss them. Please note that any issues raised in the review are aimed at the code itself, not at you personally. Once all issues are discussed and resolved, your code will be approved.\\n\\n### Code Standards and Development Approach\\nSWIFT has conventional variable naming conventions and development approaches. Please follow these approaches as much as possible during development.\\n1. Variable names are separated by underscores, and class names are named with the first letter of each word capitalized.\\n2. All Python indentation uses four spaces instead of a tab.\\n3. Choose well-known open-source libraries, avoid using closed-source libraries or unstable open-source libraries, and avoid repeating the existing code.\\n\\nAfter the PR is submitted, SWIFT will perform two types of tests:\\n- Code Lint Test: A static code compliance check test. please make sure that you have performed code lint locally in advance.\\n```shell\\npip install pre-commit # In the swift folder\\npre-commit run --all-files # Fix the errors reported by pre-commit until all checks are successful\\n```\\n- CI Tests: Smoke tests and unit tests, please refer to the next section.\\n\\n### Running CI Tests\\nBefore submitting the PR, please ensure that your development code is protected by test cases, such as smoke tests for new features, or unit tests for various edge cases. Reviewers will also pay attention to this during code review. At the same time, there will be dedicated services running CI Tests, running all test cases, and the code can only be merged after the test cases pass.\\n\\nAdditionally, since some important tests have been skipped due to long running time, to ensure that your logic is correct, you can run the test locally:\\n```shell\\npython tests/llm/test_run.py\\n```\\nPlease make sure this test can pass normally.\\n\\n## ✅ Hardware support\\n\\nSWIFT will provide hardware support for developers, including free GPUs. If needed, please email us ([contact@modelscope.cn](mailto:contact@modelscope.cn)) or join our WeChat group:\\n\\n<p align=\\\"left\\\">\\n<img src=\\\"asset/wechat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n</p>\\n\\n\\n# SWIFT (Scalable lightWeight Infrastructure for Fine-Tuning)\\n\\n<p align=\\\"center\\\">\\n    <br>\\n    <img src=\\\"resources/banner.png\\\"/>\\n    <br>\\n<p>\\n<p align=\\\"center\\\">\\n<a href=\\\"https://modelscope.cn/home\\\">魔搭社区官网</a>\\n<br>\\n        中文&nbsp ｜ &nbsp<a href=\\\"README.md\\\">English</a>&nbsp\\n</p>\\n\\n\\n<p align=\\\"center\\\">\\n<img src=\\\"https://img.shields.io/badge/python-%E2%89%A53.8-5be.svg\\\">\\n<img src=\\\"https://img.shields.io/badge/pytorch-%E2%89%A51.12%20%7C%20%E2%89%A52.0-orange.svg\\\">\\n<a href=\\\"https://github.com/modelscope/modelscope/\\\"><img src=\\\"https://img.shields.io/badge/modelscope-%E2%89%A51.17-5D91D4.svg\\\"></a>\\n<a href=\\\"https://pypi.org/project/ms-swift/\\\"><img src=\\\"https://badge.fury.io/py/ms-swift.svg\\\"></a>\\n<a href=\\\"https://github.com/modelscope/swift/blob/main/LICENSE\\\"><img src=\\\"https://img.shields.io/github/license/modelscope/swift\\\"></a>\\n<a href=\\\"https://pepy.tech/project/ms-swift\\\"><img src=\\\"https://pepy.tech/badge/ms-swift\\\"></a>\\n<a href=\\\"https://github.com/modelscope/swift/pulls\\\"><img src=\\\"https://img.shields.io/badge/PR-welcome-55EB99.svg\\\"></a>\\n</p>\\n\\n<p align=\\\"center\\\">\\n<a href=\\\"https://trendshift.io/repositories/6427\\\" target=\\\"_blank\\\"><img src=\\\"https://trendshift.io/api/badge/repositories/6427\\\" alt=\\\"modelscope%2Fswift | Trendshift\\\" style=\\\"width: 250px; height: 55px;\\\" width=\\\"250\\\" height=\\\"55\\\"/></a>\\n</p>\\n\\n##  📖 目录\\n- [简介](#-简介)\\n- [用户群](#-用户群)\\n- [新闻](#-新闻)\\n- [安装](#-%EF%B8%8F-安装)\\n- [快速开始](#-快速开始)\\n- [教程](#-教程)\\n- [License](#-license)\\n- [引用](#-引用)\\n\\n## 📝 简介\\nSWIFT支持**350+ LLM和90+ MLLM**（多模态大模型）的训练(预训练、微调、对齐)、推理、评测和部署。开发者可以直接将我们的框架应用到自己的Research和生产环境中，实现模型训练评测到应用的完整链路。我们除支持了[PEFT](https://github.com/huggingface/peft)提供的轻量训练方案外，也提供了一个完整的**Adapters库**以支持最新的训练技术，如NEFTune、LoRA+、LLaMA-PRO等，这个适配器库可以脱离训练脚本直接使用在自己的自定流程中。\\n\\n为方便不熟悉深度学习的用户使用，我们提供了一个Gradio的web-ui用于控制训练和推理，并提供了配套的深度学习课程和最佳实践供新手入门。 可以在[Huggingface space](https://huggingface.co/spaces/tastelikefeet/swift) 和 [ModelScope创空间](https://www.modelscope.cn/studios/iic/Scalable-lightWeight-Infrastructure-for-Fine-Tuning/summary) 中体验SWIFT web-ui功能了。\\n\\nSWIFT具有丰富全面的文档，请查看我们的文档网站:\\n<p align=\\\"center\\\">\\n        <a href=\\\"https://arxiv.org/abs/2408.05517\\\">论文</a> &nbsp ｜ <a href=\\\"https://swift.readthedocs.io/en/latest/\\\">English Documentation</a> &nbsp ｜ &nbsp <a href=\\\"https://swift.readthedocs.io/zh-cn/latest/\\\">中文文档</a> &nbsp\\n</p>\\n\\n## ☎ 用户群\\n\\n请扫描下面的二维码来加入我们的交流群：\\n\\n[Discord Group](https://discord.com/invite/D27yfEFVz5)              |  微信群\\n:-------------------------:|:-------------------------:\\n<img src=\\\"asset/discord_qr.jpg\\\" width=\\\"200\\\" height=\\\"200\\\">  |  <img src=\\\"asset/wechat.png\\\" width=\\\"200\\\" height=\\\"200\\\">\\n\\n\\n## 🎉 新闻\\n- 2024.09.26: 支持llama3.2-vision系列模型的训练到部署. 使用`swift infer --model_type llama3_2-11b-vision-instruct`进行体验.\\n- 2024.09.26: 支持llama3.2系列模型的训练到部署. 使用`swift infer --model_type llama3_2-1b-instruct`进行体验.\\n- 2024.09.25: 支持got-ocr2的训练到部署. 最佳实践可以查看[这里](https://github.com/modelscope/ms-swift/issues/2122).\\n- 2024.09.24: 支持llama3_1-8b-omni的训练与部署. 使用`swift infer --model_type llama3_1-8b-omni`进行体验.\\n- 2024.09.23: 支持pixtral-12b的训练与部署. 使用`swift infer --model_type pixtral-12b --dtype fp16`进行体验.\\n- 🔥2024.09.19: 支持qwen2.5、qwen2.5-math、qwen2.5-coder系列模型. 支持qwen2-vl-72b系列模型. 最佳实践可以查看[这里](https://github.com/modelscope/ms-swift/issues/2064).\\n- 2024.09.07: 支持`Reflection-llama3-70b`模型， 使用`swift sft/infer --model_type reflection-llama_3_1-70b`命令即可训练和推理.\\n- 2024.09.06: 支持mplug-owl3的微调和推理, 最佳实践可以查看[这里](https://github.com/modelscope/ms-swift/issues/1969).\\n- 2024.09.05: 支持minicpm3-4b模型. 使用`swift infer --model_type minicpm3-4b`进行体验.\\n- 2024.09.05: 支持yi-coder系列模型. 使用`swift infer --model_type yi-coder-1_5b-chat`进行体验.\\n- 🔥2024.08.30: 支持qwen2-vl系列模型的推理与微调: qwen2-vl-2b-instruct, qwen2-vl-7b-instruct. 最佳实践可以查看[这里](docs/source/Multi-Modal/qwen2-vl最佳实践.md).\\n- 🔥2024.08.26: 支持[Liger](https://github.com/linkedin/Liger-Kernel), 该内核支持LLaMA、Qwen、Mistral等模型, 并大幅减少显存使用(10%~60%), 使用`--use_liger true`开启训练.\\n- 🔥2024.08.22: 支持[ReFT](https://github.com/stanfordnlp/pyreft), 该tuner可以以LoRA的1/15~1/65的参数量达到和LoRA匹配或更好的效果, 使用`--sft_type reft`开始训练!\\n- 🔥2024.08.21: 支持phi3_5-mini-instruct, phi3_5-moe-instruct, phi3_5-vision-instruct. 使用phi3_5-vision-instruct进行Latex OCR微调的最佳实践可以查看[这里](https://github.com/modelscope/ms-swift/issues/1809).\\n- 2024.08.21: 支持idefics3-8b-llama3, llava-onevision-qwen2-0_5b-ov, llava-onevision-qwen2-7b-ov, llava-onevision-qwen2-72b-ov.\\n- 🔥2024.08.20: 支持使用deepspeed-zero3对多模态大模型进行微调.\\n- 2024.08.20: 支持模型: longwriter-glm4-9b, longwriter-llama3_1-8b. 支持数据集: longwriter-6k.\\n- 🔥2024.08.12: 🎉 SWIFT论文已经发布到arXiv上，可以点击[这个链接](https://arxiv.org/abs/2408.05517)阅读.\\n- 🔥2024.08.12: 支持packing和flash-attention时不污染attention_mask, 使用`--packing`开启。详情见[PR](https://github.com/huggingface/transformers/pull/31629/files).\\n- 🔥2024.08.09: 支持qwen2-audio模型的推理与微调. 最佳实践可以查看[这里](https://github.com/modelscope/ms-swift/issues/1653).\\n- 🔥2024.08.08: 支持qwen2-math系列模型, 1.5B, 7B, 72B. 使用`swift infer --model_type qwen2-math-1_5b-instruct`进行体验.\\n- 🔥2024.08.07: 支持使用vllm对多模态大模型: llava系列, internvl2系列, phi3-vision, minicpm-v2.5进行推理加速和部署. 可以查看[多模态&vLLM推理加速文档](docs/source/Multi-Modal/vLLM推理加速文档.md)获取更多信息.\\n- 2024.08.06: 支持minicpm-v-v2_6-chat, 使用`swift infer --model_type minicpm-v-v2_6-chat`进行推理体验, 最佳实践可以查看[这里](https://github.com/modelscope/swift/issues/1613).\\n- 2024.08.06: 支持internlm2.5的1.8b和20b系列. 使用`swift infer --model_type internlm2_5-1_8b-chat`进行体验.\\n- 🔥2024.08.05: 支持多模态数据集的评测！命令行完全一致，新增了许多[多模态数据集](https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E8%AF%84%E6%B5%8B%E6%96%87%E6%A1%A3.html#id2).\\n- 🔥2024.08.02: 支持Fourier Ft训练. 使用方式为`--sft_type fourierft`, 参数可以参考[这里](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html).\\n- 🔥2024.07.29: 支持使用lmdeploy对LLM和VLM模型进行推理加速. 文档可以查看[这里](docs/source/Multi-Modal/LmDeploy推理加速文档.md).\\n- 🔥2024.07.24: 人类偏好对齐算法支持视觉多模态大模型, 包括DPO/ORPO/SimPO/CPO, 训练参考[文档](docs/source/Multi-Modal/人类偏好对齐训练文档.md). 支持数据集RLAIF-V.\\n- 🔥2024.07.24: 支持使用megatron对qwen2系列进行CPT和SFT. 可以查看[megatron训练文档](docs/source/LLM/Megatron训练文档.md).\\n- 🔥2024.07.24: 支持llama3.1系列模型. 包含8b, 70b, 405b. 支持openbuddy-llama3_1-8b-chat.\\n<details><summary>More</summary>\\n\\n- 2024.07.20: 支持mistral-nemo系列模型. 使用`--model_type mistral-nemo-base-2407`以及`--model_type mistral-nemo-instruct-2407`开始训练和推理.\\n- 🔥2024.07.19: 支持[Q-Galore](https://arxiv.org/abs/2407.08296)算法, 该算法可以减少显存使用约60% (qwen-7b-chat, full, 80G -> 35G), 使用命令行:`swift sft --model_type xxx --use_galore true --galore_quantization true`来开始训练!\\n- 2024.07.17: 支持InternVL2系列新模型: `model_type`分别为internvl2-1b, internvl2-40b, internvl2-llama3-76b. 最佳实践可以查看[这里](docs/source/Multi-Modal/internvl最佳实践.md).\\n- 2024.07.17: 支持[NuminaMath-7B-TIR](https://www.modelscope.cn/models/AI-ModelScope/NuminaMath-7B-TIR)的训练和推理. model_type可以使用`numina-math-7b`.\\n- 🔥2024.07.16: 支持ollama和bitsandbytes导出. 可以使用命令: `swift export --model_type xxx --to_ollama true`或者`swift export --model_type xxx --quant_method bnb --quant_bits 4`.\\n- 2024.07.08: 支持cogvlm2-video-13b-chat. 最佳实践可以查看[这里](docs/source/Multi-Modal/cogvlm2-video最佳实践.md).\\n- 2024.07.08: 支持internlm-xcomposer2_5-7b-chat. 最佳实践可以查看[这里](docs/source/Multi-Modal/internlm-xcomposer2最佳实践.md).\\n- 🔥2024.07.06: 支持llava-next-video系列模型: llava-next-video-7b-instruct, llava-next-video-7b-32k-instruct, llava-next-video-7b-dpo-instruct, llava-next-video-34b-instruct. 可以查看[llava-video最佳实践](docs/source/Multi-Modal/llava-video最佳实践.md)了解更多.\\n- 🔥2024.07.06: 支持InternVL-2系列: internvl2-2b, internvl2-4b, internvl2-8b, internvl2-26b.\\n- 2024.07.06: 支持codegeex4-9b-chat.\\n- 2024.07.04: 支持internlm2_5-7b系列: internlm2_5-7b, internlm2_5-7b-chat, internlm2_5-7b-chat-1m.\\n- 2024.07.02: 支持`llava1_6-vicuna-7b-instruct`, `llava1_6-vicuna-13b-instruct`等llava-hf模型. 最佳实践可以查看[这里](docs/source/Multi-Modal/llava最佳实践.md).\\n- 🔥2024.06.29: 支持[eval-scope](https://github.com/modelscope/eval-scope)&[open-compass](https://github.com/open-compass/opencompass)评测! 我们支持了包含`BoolQ, ocnli, humaneval, math, ceval, mmlu, gsk8k, ARC_e`等50+标准数据集在内的评测流程, 请查看我们的[评测文档](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/LLM评测文档.md)来使用。下个迭代我们会支持多模态评测和Agent评测，记得持续关注我们: )\\n- 🔥2024.06.28: 支持**Florence**系列模型: 可以查看[Florence最佳实践](docs/source/Multi-Modal/florence最佳实践.md).\\n- 🔥2024.06.28: 支持**Gemma2**系列模型: gemma2-9b, gemma2-9b-instruct, gemma2-27b, gemma2-27b-instruct.\\n- 🔥2024.06.18: 支持**DeepSeek-Coder-v2**系列模型! 使用model_type`deepseek-coder-v2-instruct`和`deepseek-coder-v2-lite-instruct`来开启训练和推理.\\n- 🔥2024.06.16: 支持**KTO**和**CPO**训练，使用`swift rlhf --rlhf_type kto`和`swift rlhf --rlhf_type cpo`来开始训练，可以参考[文档](./docs/source/LLM/人类偏好对齐训练文档.md).\\n- 2024.06.11: 支持符合OpenAI接口的工具调用Agent部署, 可以查看[Agent部署最佳实践](docs/source/LLM/Agent部署最佳实践.md).\\n- 🔥2024.06.07: 支持**Qwen2**系列LLM, 包括0.5B、1.5B、7B、72B的Base和Instruct模型, 以及对应的gptq-int4、gptq-int8、awq-int4量化版本. 使用双卡80GiB A100对Qwen2-72B-Instruct进行自我认知微调并推理部署的最佳实践可以查看[这里](https://github.com/modelscope/swift/issues/1092).\\n- 🔥2024.06.05: 支持glm4系列大模型和glm4v-9b-chat多模态大模型, 可以查看[glm4v最佳实践](docs/source/Multi-Modal/glm4v最佳实践.md).\\n- 🔥2024.06.01: 支持**SimPO**训练，使用`swift simpo`来开始训练，最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/LLM/SimPO算法最佳实践.md)\\n- 🔥2024.06.01: 支持多模态大模型部署, 可以查看[多模态部署文档](docs/source/Multi-Modal/MLLM部署文档.md).\\n- 2024.05.31: 支持Mini-Internvl多模态模型, 使用model_type `mini-internvl-chat-2b-v1_5`和`mini-internvl-chat-4b-v1_5`来训练.\\n- 2024.05.24: 支持Phi3多模态模型, 使用model_type `phi3-vision-128k-instruct`来训练.\\n- 2024.05.22: 支持DeepSeek-V2-lite系列模型, model_type为 `deepseek-v2-lite`和`deekseek-v2-lite-chat`\\n- 2024.05.22: 支持TeleChat-12b-v2模型和量化版本, model_type为 `telechat-12b-v2`和`telechat-12b-v2-gptq-int4`\\n- 🔥2024.05.21: 支持 MiniCPM-Llama3-V-2_5 的推理与微调, 可以查看[minicpm-v-2.5最佳实践](docs/source/Multi-Modal/minicpm-v-2.5最佳实践.md).\\n- 🔥2024.05.20: 支持 cogvlm2-llama3-chinese-chat-19B, cogvlm2-llama3-chat-19B 的推理与微调, 可以查看[cogvlm2最佳实践](docs/source/Multi-Modal/cogvlm2最佳实践.md).\\n- 🔥2024.05.17: 支持peft=0.11.0. 同时支持了三个新的tuner方法： `BOFT`, `Vera` 和 `Pissa`. 使用 `--sft_type boft/vera` 开启BOFT或者Vera, 使用 `--init_lora_weights pissa` 以及 `--sft_type lora` 来使用 Pissa.\\n- 2024.05.16: 支持Llava-Next (Stronger)系列模型，最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/Multi-Modal/llava最佳实践.md).\\n- 🔥2024.05.13: 支持Yi-1.5系列模型，使用`--model_type yi-1_5-9b-chat`等开始体验\\n- 2024.05.11: 支持使用[hqq](https://github.com/mobiusml/hqq)和[eetq](https://github.com/NetEase-FuXi/EETQ)进行qlora训练和量化推理，可以查看[LLM量化与导出文档](https://github.com/modelscope/swift/tree/main/docs/source/Instruction/LLM量化与导出文档.md)\\n- 2024.05.10: 支持序列并行. 先安装`pip install .[seq_parallel]`, 之后在DDP环境中添加`--sequence_parallel_size n`即可使用!\\n- 2024.05.08: 支持DeepSeek-V2-Chat模型, 训练参考[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/deepseek-v2-chat/lora_ddp_ds3/sft.sh)。支持InternVL-Chat-V1.5-Int8模型，最佳实践参考[这里](https://github.com/modelscope/swift/tree/main/docs/source/Multi-Modal/internvl最佳实践.md).\\n- 🔥2024.05.07: 支持**ORPO**训练，使用`swift orpo`来开始训练， 最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/LLM/ORPO算法最佳实践.md)\\n- 2024.05.07: 支持来自xtuner的Llava-Llama3模型，model_type为`llava-llama-3-8b-v1_1`.\\n- 2024.04.29: 支持InternVL-Chat-V1.5的推理与微调, 最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/Multi-Modal/internvl最佳实践.md).\\n- 🔥2024.04.26: 支持**LISA** 和 **unsloth**训练！指定 `--lisa_activated_layers=2` 来开启LISA（显存使用降低至全参训练的30%），指定 `--tuner_backend unsloth` 来使用unsloth，用更少的显存（30%或更少）更快的速度（5x）训练一个超大模型！\\n- 🔥2024.04.26: 支持Qwen1.5-110B和Qwen1.5-110B-Chat模型的推理与微调, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half_110b_chat/lora_ddp_ds/sft.sh)来开始训练！\\n- 2024.04.24: 支持Phi3系列模型的推理与微调. 包括: [phi3-4b-4k-instruct](examples/pytorch/llm/scripts/phi3_4b_4k_instruct/lora), phi3-4b-128k-instruct.\\n- 2024.04.22: 支持**chinese-llama-alpaca-2**系列模型的推理与微调和部署等. 包括：chinese-llama-2-1.3b, chinese-llama-2-7b, chinese-llama-2-13b, chinese-alpaca-2-1.3b, chinese-alpaca-2-7b和chinese-alpaca-2-13b以及对应的16k和64k长文本模型.\\n- 2024.04.22: 支持Llama3 GPTQ-Int4, GPTQ-Int8, AWQ系列模型的推理与微调. 支持chatglm3-6b-128k, Openbuddy-llama3的推理与微调.\\n- 2024.04.20: 支持**Atom**系列模型的推理, 微调和部署等. 包括: Atom-7B and Atom-7B-Chat. 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/atom_7b_chat/lora/sft.sh)来开始训练！\\n- 2024.04.19: 支持NPU的单卡、DDP、ZeRO2和ZeRO3的训练与推理, 可以查看[NPU推理与微调最佳实践](docs/source/LLM/NPU推理与微调最佳实践.md).\\n- 2024.04.19: 支持**Llama3**系列模型的推理, 微调和部署等. 包括: Llama-3-8B, Llama-3-8B-Instruct, Llama-3-70B, Llama-3-70B-Instruct. 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/llama3_8b_instruct/lora/sft.sh)开始训练叭！\\n- 2024.04.18: 支持模型: wizardlm2-7b-awq, wizardlm2-8x22b, yi-6b-chat-awq, yi-6b-chat-int8, yi-34b-chat-awq, yi-34b-chat-int8. 支持`--deepspeed zero3-offload`, 提供了默认zero3-offload配置文件来使用zero3+cpu offload.\\n- 2024.04.18: 支持使用环境变量`USE_HF`兼容HuggingFace生态, 切换成使用HF中的模型和数据集, 可以查看[HuggingFace生态兼容文档](https://github.com/modelscope/swift/tree/main/docs/source/LLM/HuggingFace生态兼容.md).\\n- 2024.04.17: 支持OpenAI样式的接口评测, 可以查看[评测参数接口文档](docs/source/Instruction/命令行参数.md#eval参数)来查看使用方法.\\n- 🔥2024.04.17: 支持 **CodeQwen1.5-7B**系列: CodeQwen1.5-7B, CodeQwen1.5-7B-Chat, CodeQwen1.5-7B-Chat-AWQ, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/codeqwen1half_7b_chat/lora/sft.sh)来开始训练！\\n- 2024.04.16: 支持llava-v1.6-34b的推理与微调, 最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/Multi-Modal/llava最佳实践.md).\\n- 2024.04.13: 支持Mixtral-8x22B-v0.1模型的推理与微调, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/mixtral_moe_8x22b_v1/lora_ddp_ds/sft.sh)来开始训练！\\n- 2024.04.13: 支持新推出的**MiniCPM**系列: MiniCPM-V-2.0、MiniCPM-2B-128k、MiniCPM-MoE-8x2B和MiniCPM-1B。使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/minicpm_moe_8x2b/lora_ddp/sft.sh)来开始训练！\\n- 🔥2024.04.11: 支持一键式模型评测能力! 首批数据集包含MMLU、CEval、ARC等，也支持用户自定义数据集，具体可以[这个文档](docs/source/Instruction/LLM评测文档.md)。同时, 我们支持了一个比较trick的方法来做多个消融实验的管理，查看[这个文档](docs/source/Instruction/LLM实验文档.md)来使用。\\n- 🔥2024.04.11: 支持**c4ai-command-r**系列: c4ai-command-r-plus, c4ai-command-r-v01。使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/c4ai_command_r_plus/lora_mp/sft.sh)来开始训练！\\n- 2024.04.10: 使用swift微调qwen-7b-chat模型增强模型function call能力，并结合[Modelscope-Agent](https://github.com/modelscope/modelscope-agent)使用，最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/LLM/Agent微调最佳实践.md#搭配Modelscope-Agent使用)。\\n- 🔥2024.04.09: 支持`弱智吧`系列数据集. 在[支持的模型和数据集文档](docs/source/Instruction/支持的模型和数据集.md)中搜索`ruozhiba`来找到数据集并开始训练！\\n- 2024.04.08: 支持XVERSE-MoE-A4.2B模型的推理与微调, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/xverse_moe_a4_2b/lora/sft.sh)来开始训练！\\n- 2024.04.04: 支持使用**QLoRA+FSDP**来使用两张24G显卡训练70B模型, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/llama2_70b_chat/qlora_fsdp/sft.sh)开始训练.\\n- 🔥2024.04.03: 支持**Qwen1.5-32B**系列: Qwen1.5-32B, Qwen1.5-32B-Chat, Qwen1.5-32B-Chat-GPTQ-Int4。使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half_32b_chat/lora_mp/sft.sh)来开始训练！\\n- 🔥2024.04.02: 支持Mengzi3-13B-Base模型的推理与微调, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/mengzi3_13b_base/lora_ddp_ds/sft.sh)来开始训练！\\n- 🔥2024.04.01: 支持**dbrx**系列, dbrx-base和dbrx-instruct, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/dbrx-instruct/lora_mp/sft.sh)来开始训练！.\\n- 🔥2024.03.29: 支持**Qwen1.5-MoE**系列: Qwen1.5-MoE-A2.7B, Qwen1.5-MoE-A2.7B-Chat, Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4.\\n- 🔥2024.03.29: 支持**Grok-1** 300B MoE模型的推理与微调, 最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/LLM/Grok训练和推理.md).\\n- 🔥2024.03.25: 支持TeleChat-7b和TeleChat-12b模型的训练和推理, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/telechat_12b/lora/sft.sh)来开始训练！.\\n- 🔥2024.03.20: 支持**llava**系列的推理与微调, 最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/Multi-Modal/llava最佳实践.md).\\n- 🔥2024.03.12: 支持**deepseek-vl**系列推理和微调, 最佳实践可以查看[这里](https://github.com/modelscope/swift/tree/main/docs/source/Multi-Modal/deepseek-vl最佳实践.md).\\n- 🔥2024.03.11: 支持[GaLore](https://arxiv.org/abs/2403.03507), 用于在全参数训练中有效减小显存占用至原来的1/2.\\n- 🔥2024.03.10: Qwen1.5-7B-Chat与Qwen1.5-72B-Chat从微调到部署[全流程最佳实践](https://github.com/modelscope/swift/blob/main/docs/source/LLM/Qwen1.5%E5%85%A8%E6%B5%81%E7%A8%8B%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.md).\\n- 🔥2024.03.09: 支持MAMBA模型的训练和推理, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/mamba-1.4b/lora/sft.sh)来开始训练！.\\n- 2024.03.09: 支持AQLM量化模型的训练和推理, 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/llama2_7b_aqlm_2bit_1x16/lora/sft.sh)开始训练！\\n- 2024.03.06: 支持AWQ量化模型的训练和推理, 使用[这个Qwen1.5-AWQ模型脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half_7b_chat_awq/lora/sft.sh)开始训练, 并支持[yi-9b](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/yi_9b/lora_zero3)的训练和推理.\\n- 🔥2024.02.29: 支持[LLaMA PRO](https://arxiv.org/pdf/2401.02415.pdf), 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/yi_6b_chat/llamapro/sft.sh)即可开始训练.\\n- 🔥2024.02.29: 支持[LoRA+](https://arxiv.org/pdf/2402.12354.pdf), 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/yi_6b_chat/lorap/sft.sh)即可开始训练.\\n- 2024.02.25: 支持`swift export`, 对模型进行**AWQ/GPTQ**量化导出, 以及推送ModelScope Hub. 具体可以查看: [LLM量化与导出文档](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/LLM量化与导出文档.md).\\n- 2024.02.22: 支持gemma系列: gemma-2b, [gemma-2b-instruct](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/gemma_2b_instruct), gemma-7b, gemma-7b-instruct.\\n- 2024.02.16: 支持deepseek-math系列: deepseek-math-7b, deepseek-math-7b-instruct, deepseek-math-7b-chat.\\n- 🔥2024.02.05: 支持**Qwen1.5**系列模型, 支持的所有Qwen1.5系列模型请查看[模型列表](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/%E6%94%AF%E6%8C%81%E7%9A%84%E6%A8%A1%E5%9E%8B%E5%92%8C%E6%95%B0%E6%8D%AE%E9%9B%86.md#%E6%A8%A1%E5%9E%8B). 提供了[qwen1half-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat), [qwen1half-7b-chat-int8](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat_int8)微调的脚本.\\n- 2024.02.05: 支持扩散模型如**SDXL**, **SD**, **ControlNet**的训练, 同时也支持**DreamBooth**的训练, 详情可以查看对应的[训练脚本](https://github.com/modelscope/swift/tree/main/examples/pytorch/sdxl/scripts).\\n- 2024.02.01: 支持minicpm系列: [minicpm-2b-sft-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/minicpm_2b_sft_chat), minicpm-2b-chat.\\n- 🔥2024.02.01: 支持数据集打混来减少 **灾难性遗忘问题**. 使用`--train_dataset_mix_ratio 2.0`开启训练！同时我们也开源了通用知识数据集 [ms-bench](https://www.modelscope.cn/datasets/iic/ms_bench/summary).\\n- 🔥2024.02.01: 支持Agent训练！Agent训练算法源自这篇[论文](https://arxiv.org/pdf/2309.00986.pdf). 我们也增加了[ms-agent](https://www.modelscope.cn/datasets/iic/ms_agent/summary)这个优质的agent数据集. 使用[这个脚本](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen_7b_chat/lora/sft.sh)开启Agent训练!\\n- 🔥2024.02.01: 支持在DPO训练中增加SFT loss来减少KL散度loss造成的生成重复问题.\\n- 2024.02.01: 支持在训练中使用AdaLoRA和IA3两个adapter.\\n- 2024.02.01: 支持在AnimateDiff训练中使用`--merge_lora`参数.\\n- 2024.01.30: 支持[internlm-xcomposer2-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/internlm_xcomposer2_7b_chat).\\n- 🔥2024.01.30: 支持[ZeRO-3](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/full_ddp_zero3/), 只需要指定`--deepspeed default-zero3`即可.\\n- 2024.01.29: 支持internlm2-math系列: internlm2-math-7b, internlm2-math-7b-chat, internlm2-math-20b, internlm2-math-20b-chat.\\n- 🔥2024.01.26: 支持[yi-vl-6b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_vl_6b_chat), yi-vl-34b-chat.\\n- 2024.01.24: 支持codefuse-codegeex2-6b-chat, codefuse-qwen-14b-chat.\\n- 2024.01.23: 支持orion系列: orion-14b, [orion-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/orion_14b_chat).\\n- 2024.01.20: 支持[xverse-13b-256k](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/xverse_13b_256k), xverse-65b-v2, xverse-65b-chat.\\n- 🔥2024.01.17: 支持internlm2系列: internlm2-7b-base, internlm2-7b, [internlm2-7b-sft-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/internlm2_7b_sft_chat), internlm2-7b-chat, internlm2-20b-base, internlm2-20b, internlm2-20b-sft-chat, internlm2-20b-chat.\\n- 2024.01.15: 支持yuan系列: yuan2-2b-instruct, [yuan2-2b-janus-instruct](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yuan2_2b_janus_instruct), yuan2-51b-instruct, yuan2-102b-instruct.\\n- 🔥2024.01.12: 支持**deepseek-moe**系列: deepseek-moe-16b, [deepseek-moe-16b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/deepseek_moe_16b_chat).\\n- 🔥2024.01.04: 支持**VLLM部署**, 兼容**OpenAI API**样式, 具体可以查看[VLLM推理加速与部署](https://github.com/modelscope/swift/blob/main/docs/source/LLM/VLLM推理加速与部署.md#部署).\\n- 2024.01.04: 更新[Benchmark](https://github.com/modelscope/swift/blob/main/docs/source/LLM/Benchmark.md), 方便查看不同模型训练的速度和所需显存.\\n- 🔥 2023.12.29: 支持web-ui进行sft训练和推理，安装ms-swift后使用`swift web-ui`开启\\n- 🔥 2023.12.29: 支持 DPO RLHF(Reinforcement Learning from Human Feedback) 和三个用于此任务的数据集: AI-ModelScope/stack-exchange-paired 以及 AI-ModelScope/hh-rlhf 以及 AI-ModelScope/hh_rlhf_cn. 查看[文档](https://github.com/modelscope/swift/blob/main/docs/source/LLM/DPO%E8%AE%AD%E7%BB%83%E6%96%87%E6%A1%A3.md)开启训练！\\n- 🔥 2023.12.28: 支持SCEdit! 该tuner可显著降低U-Net中的显存占用，并支持低显存可控图像生成（取代ControlNet），阅读下面的章节来了解详细信息\\n- 2023.12.23: 支持[codegeex2-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/codegeex2_6b).\\n- 2023.12.19: 支持[phi2-3b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/phi2_3b).\\n- 2023.12.18: 支持VLLM进行推理加速.\\n- 2023.12.15: 支持deepseek, deepseek-coder系列: deepseek-7b, deepseek-7b-chat, deepseek-67b, deepseek-67b-chat, openbuddy-deepseek-67b-chat, deepseek-coder-1_3b, deepseek-coder-1_3b-instruct, deepseek-coder-6_7b, deepseek-coder-6_7b-instruct, deepseek-coder-33b, deepseek-coder-33b-instruct.\\n- 2023.12.13: 支持mistral-7b-instruct-v2, [mixtral-moe-7b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/mixtral_7b_moe), [mixtral-moe-7b-instruct](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/mixtral_7b_moe_instruct).\\n- 2023.12.09: 支持`freeze_parameters_ratio`参数, 作为lora和全参数训练的折中方案. 对应的sh可以查看[full_freeze_ddp](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_freeze_ddp). 支持`disable_tqdm`, `lazy_tokenize`, `preprocess_num_proc`参数, 具体可以查看[命令行参数](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/命令行参数.md).\\n- 2023.12.08: 支持[sus-34b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/sus_34b_chat), 支持yi-6b-200k, yi-34b-200k.\\n- 2023.12.07: 支持[Multi-Node DDP训练](https://github.com/modelscope/swift/blob/main/docs/source/Instruction/LLM%E5%BE%AE%E8%B0%83%E6%96%87%E6%A1%A3.md#%E4%BD%BF%E7%94%A8cli).\\n- 2023.12.05: 支持模型: zephyr-7b-beta-chat, openbuddy-zephyr-7b-chat. 支持数据集: hc3-zh, hc3-en.\\n- 🔥 2023.12.02: [自我认知微调最佳实践](https://github.com/modelscope/swift/blob/main/docs/source/LLM/自我认知微调最佳实践.md), **10分钟对大模型进行自我认知微调**, 创建专属于自己的大模型.\\n- 🔥 2023.11.30: 支持**qwen-1_8b**, **qwen-72b**, **qwen-audio**系列模型的训练的推理. 对应的sh脚本可以查看[qwen_1_8b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_1_8b_chat), [qwen_72b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat), [qwen_audio_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_audio_chat)\\n- 🔥 2023.11.29: 支持**AnimateDiff**的训练和推理\\n- 🔥 2023.11.24: 支持**yi-34b-chat**, **codefuse-codellama-34b-chat**模型. 对应的sh脚本可以查看[yi_34b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b_chat), [codefuse_codellama_34b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/codefuse_codellama_34b_chat).\\n- 🔥 2023.11.18: 支持**tongyi-finance-14b**系列模型: tongyi-finance-14b, tongyi-finance-14b-chat, tongyi-finance-14b-chat-int4. 对应的sh脚本可以查看[tongyi_finance_14b_chat_int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/tongyi_finance_14b_chat_int4).\\n- 2023.11.16: 支持更多模型的**flash attn**支持: qwen系列, qwen-vl系列, llama系列, openbuddy系列, mistral系列, yi系列, ziya系列. 请使用`use_flash_attn`参数.\\n- 🔥 2023.11.11: 支持**NEFTune**, 使用`Swift.prepare_model(model, NEFTuneConfig())`即可开启.\\n- 🔥 2023.11.11: 支持**命令行**训练推理和**Web-UI**推理, 详情可以查看下方的`使用Swift CLI运行`章节.\\n- 🔥 2023.11.11: 支持模型训练后的**部署**链路(vllm/chatglm.cpp/xinference)，详情可以查看[官方文档](docs/source/GetStarted/zh/部署指南.md).\\n- 🔥 2023.11.10: 支持**bluelm**系列模型: bluelm-7b, bluelm-7b-chat, bluelm-7b-32k, bluelm-7b-chat-32k. 对应的sh脚本可以查看[bluelm_7b_chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/bluelm_7b_chat).\\n- 🔥 2023.11.08: 支持**xverse-65b**模型的训练和推理流程，脚本在[xverse_65b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/xverse_65b).\\n- 🔥 2023.11.07: 支持**yi-6b**, **yi-34b**模型的训练和推理流程，脚本在[yi_6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_6b), [yi_34b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b).\\n- 🔥 2023.10.30: 支持 **QA-LoRA** 和 **LongLoRA**两种新的tuners.\\n- 🔥 2023.10.30: 支持使用**ROME**(Rank One Model Editing)来编辑模型，在无需训练的情况下即可给模型灌注新知识！\\n- 2023.10.30: 支持**skywork-13b**系列模型: skywork-13b, skywork-13b-chat. 对应的sh脚本可以查看[skywork_13b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/skywork_13b).\\n- 🔥 2023.10.27: 支持**chatglm3**系列模型: chatglm3-6b-base, chatglm3-6b, chatglm3-6b-32k. 对应的sh脚本可以查看[chatglm3_6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b).\\n- 🔥 2023.10.17: 支持**int4**, **int8**模型的SFT: qwen-7b-chat-int4, qwen-14b-chat-int4, qwen-vl-chat-int4, baichuan2-7b-chat-int4, baichuan2-13b-chat-int4, qwen-7b-chat-int8, qwen-14b-chat-int8.\\n- 2023.10.15: 支持**ziya2-13b**系列模型: ziya2-13b, ziya2-13b-chat.\\n- 2023.10.12: 支持**mistral-7b**系列模型: openbuddy-mistral-7b-chat, mistral-7b, mistral-7b-instruct.\\n- 🔥 2023.10.07: 支持**DeepSpeed ZeRO-2**, 使得lora(不仅仅是qlora)可以在双卡A10上运行DDP.\\n- 2023.10.04: 支持更多数学, 法律, SQL, 代码领域的数据集: blossom-math-zh, school-math-zh, text2sql-en, sql-create-context-en, lawyer-llama-zh, tigerbot-law-zh, leetcode-python-en.\\n- 🔥 2023.09.25: 支持**qwen-14b**系列: qwen-14b, qwen-14b-chat.\\n- 2023.09.18: 支持**internlm-20b**系列: internlm-20b, internlm-20b-chat.\\n- 2023.09.12: 支持**MP+DDP**对全参数训练进行加速.\\n- 2023.09.05: 支持**openbuddy-llama2-70b-chat**.\\n- 2023.09.03: 支持**baichuan2**系列: baichuan2-7b, baichuan2-7b-chat, baichuan2-13b, baichuan2-13b-chat.\\n</details>\\n\\n## 🛠️ 安装\\n\\nSWIFT在Python环境中运行。请确保您的Python版本高于3.8。\\n\\n- 方法1：使用pip命令安装SWIFT：\\n\\n```shell\\n# 全量能力\\npip install 'ms-swift[all]' -U\\n# 仅使用LLM\\npip install 'ms-swift[llm]' -U\\n# 仅使用AIGC\\npip install 'ms-swift[aigc]' -U\\n# 仅使用Adapters\\npip install ms-swift -U\\n```\\n\\n- 方法2：通过源代码安装SWIFT（方便运行训练推理脚本），请运行以下命令：\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nSWIFT依赖torch>=1.13，建议torch>=2.0.0。\\n\\n- 方法3：在我们的[Docker镜像](https://www.modelscope.cn/docs/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85)中使用SWIFT\\n\\n## 🚀 快速开始\\n\\n本章节介绍基本使用，更丰富的使用方式请查看[文档部分](https://swift.readthedocs.io/zh-cn/latest/)。\\n\\n### Web-UI\\n\\nWeb-UI是基于gradio界面技术的**零门槛**训练部署界面方案。Web-UI配置简单，且完美支持多卡训练和部署：\\n\\n```shell\\nswift web-ui\\n```\\n![image.png](./docs/resources/web-ui.png)\\n\\n### 训练\\n\\n#### 训练脚本\\n你可以参考以下脚本来自定义属于你的训练脚本.\\n\\n- full: [qwen1half-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat/full) (A100), [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_mp) (2\\\\*A100)\\n- full+ddp+zero2: [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_ddp_zero2) (4\\\\*A100)\\n- full+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/full_ddp_zero3) (4\\\\*A100)\\n- lora: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora) (3090), [baichuan2-13b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/baichuan2_13b_chat/lora_mp) (2\\\\*3090), [yi-34b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b_chat/lora) (A100), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_mp) (2\\\\*A100)\\n- lora+ddp: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora_ddp) (2\\\\*3090)\\n- lora+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/lora_ddp_zero3) (4\\\\*3090), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_ddp_zero3) (4\\\\*A100)\\n- qlora(gptq-int4): [qwen-14b-chat-int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat_int4/qlora) (3090), [qwen1half-72b-chat-int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_72b_chat_int4/qlora) (A100)\\n- qlora(gptq-int8): [qwen-14b-chat-int8](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat_int8/qlora) (3090)\\n- qlora(bnb-int4): [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/qlora) (3090), [llama2-70b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/llama2_70b_chat/qlora_mp) (2 \\\\* 3090)\\n\\n#### 支持的训练过程\\n\\n| 训练过程 | 训练方式                               |\\n| -------- |------------------------------------|\\n| 预训练   | 文本生成                               |\\n| 微调     | 单轮/多轮<br>Agent训练/自我认知<br>多模态视觉/多模态语音 |\\n| 人类对齐 | DPO<br>ORPO<br>SimPO<br>KTO<br>CPO  |\\n| 文生图   | DreamBooth等                        |\\n| 文生视频 | -                                  |\\n\\n\\n#### 单卡训练\\n\\n通过如下命令启动单卡微调：\\n\\nLoRA:\\n```shell\\n# 实验环境: A100\\n# 显存需求: 20GB\\n# 运行时长: 3.1小时\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n全参数:\\n```shell\\n# 实验环境: A100\\n# 显存需求: 80GB\\n# 运行时长: 2.5小时\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --eval_steps 500 \\\\\\n```\\n\\n#### 模型并行训练\\n\\n```shell\\n# 实验环境: 2 * A100\\n# 显存需求: 10GB + 13GB\\n# 运行时长: 3.4小时\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n#### 数据并行训练\\n\\n```shell\\n# 实验环境: 4 * A100\\n# 显存需求: 4 * 30GB\\n# 运行时长: 0.8小时\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n模型并行与数据并行结合:\\n```shell\\n# 实验环境: 4 * A100\\n# 显存需求: 2*14GB + 2*18GB\\n# 运行时长: 1.7小时\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n#### Deepspeed训练\\nDeepspeed支持对GPTQ和AWQ量化模型进行训练.\\n\\nZeRO2:\\n```shell\\n# 实验环境: 4 * A100\\n# 显存需求: 4 * 21GB\\n# 运行时长: 0.9小时\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero2 \\\\\\n```\\n\\nZeRO3:\\n```shell\\n# 实验环境: 4 * A100\\n# 显存需求: 4 * 19GB\\n# 运行时长: 3.2小时\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\nZeRO3-Offload:\\n```shell\\n# 实验环境: 4 * A100\\n# 显存需求: 4 * 12GB\\n# 运行时长: 60小时\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_id_or_path AI-ModelScope/WizardLM-2-8x22B \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed zero3-offload \\\\\\n```\\n\\n#### 多机多卡\\n```shell\\n# 如果非共用磁盘请在各机器sh中额外指定`--save_on_each_node true`.\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-32b-chat \\\\\\n    --sft_type full \\\\\\n    --dataset blossom-math-zh \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-32b-chat \\\\\\n    --sft_type full \\\\\\n    --dataset blossom-math-zh \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\n##### 阿里云-DLC多机训练\\nDLC环境变量中，WORLD_SIZE指代node数量，RANK指代node序号，这一点和torchrun定义不同，需要注意。\\n```shell\\nNNODES=$WORLD_SIZE \\\\\\nNODE_RANK=$RANK \\\\\\nswift sft \\\\\\n    --model_type qwen1half-32b-chat \\\\\\n    --sft_type full \\\\\\n    --dataset blossom-math-zh \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3\\n```\\n\\n\\n#### 预训练\\n\\n```shell\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift pt \\\\\\n    --model_type qwen1half-7b \\\\\\n    --dataset chinese-c4#100000 \\\\\\n    --num_train_epochs 1 \\\\\\n    --sft_type full \\\\\\n    --deepspeed default-zero3 \\\\\\n    --output_dir output \\\\\\n    --lazy_tokenize true\\n```\\n\\n\\n#### 人类对齐\\n\\n```shell\\n# We support rlhf_type dpo/cpo/simpo/orpo/kto\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n\\n### 推理\\n原始模型:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n# 使用VLLM加速\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\nLoRA微调后:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true\\n# 使用VLLM加速\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true \\\\\\n    --merge_lora true --infer_backend vllm --max_model_len 8192\\n```\\n\\n### 评测\\n\\n原始模型:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift eval --model_type qwen1half-7b-chat \\\\\\n    --eval_dataset ARC_c --infer_backend vllm\\n```\\n\\nLoRA微调后:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift eval --ckpt_dir xxx/checkpoint-xxx \\\\\\n    --eval_dataset ARC_c --infer_backend vllm \\\\\\n    --merge_lora true \\\\\\n```\\n\\n### 量化\\n\\n原始模型:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export --model_type qwen1half-7b-chat \\\\\\n    --quant_bits 4 --quant_method awq\\n```\\n\\nLoRA微调后:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true \\\\\\n    --quant_method awq --quant_bits 4 \\\\\\n    --merge_lora true \\\\\\n```\\n\\n### 部署\\n客户端使用OpenAI API进行调用，具体可以查看[LLM部署文档](https://github.com/modelscope/swift/blob/main/docs/source/LLM/VLLM%E6%8E%A8%E7%90%86%E5%8A%A0%E9%80%9F%E4%B8%8E%E9%83%A8%E7%BD%B2.md#%E9%83%A8%E7%BD%B2)\\n\\n原始模型:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen1half-7b-chat\\n# 使用VLLM加速\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen1half-7b-chat \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\nLoRA微调后:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir xxx/checkpoint-xxx\\n# 使用VLLM加速\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir xxx/checkpoint-xxx --merge_lora true \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\n### 支持的模型\\n完整的支持模型和数据集可以查看[支持的模型和数据集列表](docs/source/Instruction/支持的模型和数据集.md).\\n\\n#### 大语言模型\\n\\n| 模型类型                                                                                            | 模型介绍                                                                      | 语言       | 模型大小                | 模型类型                                      |\\n|-------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------|----------|---------------------|-------------------------------------------|\\n| Qwen<br>Qwen1.5<br>Qwen2<br>Qwen2.5                                           | [通义千问系列模型](https://github.com/QwenLM)                              | 中文<br>英文 | 0.5B-110B<br>包含量化版本 | base模型<br>chat模型<br>MoE模型<br>代码模型         |                          |\\n| ChatGLM2<br>ChatGLM3<br>Codegeex2<br>GLM4<br>Codegeex4                                          | [智谱ChatGLM系列模型](https://github.com/THUDM/)                                | 中文<br>英文 | 6B-9B               | base模型<br>chat模型<br>代码模型<br>长文本模型         |\\n| Baichuan<br>Baichuan2                                                                           | [百川1和百川2](https://github.com/baichuan-inc)                                | 中文<br>英文 | 7B-13B<br>包含量化版本    | base模型<br>chat模型                          |\\n| Yuan2                                                                                           | [浪潮源系列模型](https://github.com/IEIT-Yuan)                                   | 中文<br>英文 | 2B-102B             | instruct模型                                |\\n| XVerse                                                                                          | [元象系列模型](https://github.com/xverse-ai)                                    | 中文<br>英文 | 7B-65B              | base模型<br>chat模型<br>长文本模型<br>MoE模型        |                |\\n| LLaMA2                                                                                          | [LLaMA2系列模型](https://github.com/facebookresearch/llama)                   | 英文       | 7B-70B<br>包含量化版本    | base模型<br>chat模型                          |\\n| LLaMA3<br>LLaMA3.1<br>Llama3.2                                  | [LLaMA3系列模型](https://github.com/meta-llama/llama3)                        | 英文       | 1B-70B<br>包含量化版本    | base模型<br>chat模型                          |\\n| Mistral<br>Mixtral                                                                              | [Mistral系列模型](https://github.com/mistralai/mistral-src)                   | 英文       | 7B-8x22B            | base模型<br>instruct模型<br>MoE模型             |\\n| Yi<br>Yi1.5<br>Yi-Coder                                  | [01AI的YI系列模型](https://github.com/01-ai)                                   | 中文<br>英文 | 1.5B-34B<br>包含量化版本    | base模型<br>chat模型<br>长文本模型                 |\\n| InternLM<br>InternLM2<br>InternLM2-Math<br>InternLM2.5                                          | [浦江实验室书生浦语系列模型](https://github.com/InternLM/InternLM)                     | 中文<br>英文 | 1.8B-20B            | base模型<br>chat模型<br>数学模型                  |\\n| DeepSeek<br>DeepSeek-MoE<br>DeepSeek-Coder<br>DeepSeek-Math<br>DeepSeek-V2<br>DeepSeek-Coder-V2 | [幻方系列模型](https://github.com/deepseek-ai)                                  | 中文<br>英文 | 1.3B-236B           | base模型<br>chat模型<br>MoE模型<br>代码模型<br>数学模型 |\\n| MAMBA                                                                                           | [MAMBA时序卷积模型](https://github.com/state-spaces/mamba)                      | 英文       | 130M-2.8B           | base模型                                    |\\n| Gemma<br>Gemma2                                                                                 | [Google Gemma系列模型](https://github.com/google/gemma_pytorch)               | 英文       | 2B-27B              | base模型<br>instruct模型                      |\\n| MiniCPM<br>MiniCPM3                                                                         | [OpenBmB MiniCPM系列模型](https://github.com/OpenBMB/MiniCPM)                 | 中文<br>英文 | 2B-3B               | chat模型<br>MoE模型                           |\\n| OpenBuddy                                                                                       | [OpenBuddy系列模型](https://github.com/OpenBuddy/OpenBuddy)                   | 中文<br>英文 | 7B-70B              | base模型<br>chat模型                          |\\n| Orion                                                                                           | [猎户星空系列模型](https://github.com/OrionStarAI)                                | 中文<br>英文 | 14B                 | base模型<br>chat模型                          |\\n| BlueLM                                                                                          | [VIVO蓝心大模型](https://github.com/vivo-ai-lab/BlueLM)                        | 中文<br>英文 | 7B                  | base模型<br>chat模型                          |\\n| Ziya2                                                                                           | [封神榜系列模型](https://github.com/IDEA-CCNL/Fengshenbang-LM)                   | 中文<br>英文 | 13B                 | base模型<br>chat模型                          |\\n| Skywork                                                                                         | [昆仑天工系列模型](https://github.com/SkyworkAI/Skywork)                          | 中文<br>英文 | 13B                 | base模型<br>chat模型                          |\\n| Zephyr                                                                                          | 基于Mistral的zephyr系列模型                                                      | 英文       | 7B                  | chat模型                                    |\\n| PolyLM                                                                                          | [通义实验室自研的PolyLM系列模型](https://github.com/DAMO-NLP-MT/PolyLM)               | 多语种      | 13B                 | base模型                                    |\\n| SeqGPT                                                                                          | [通义实验室自研的文本理解模型，用于信息抽取和文本分类](https://github.com/Alibaba-NLP/SeqGPT)       | 中文       | 560M                | 语义理解模型                                    |\\n| SUS                                                                                             | [南方科技大学基于YI Fine-Tune的模型](https://github.com/SUSTech-IDEA/SUS-Chat)       | 中文<br>英文 | 34B                 | chat模型                                    |\\n| Tongyi-Finance                                                                                  | [通义金融系列模型](https://github.com/QwenLM/Qwen)                                | 中文<br>英文 | 14B                 | base模型<br>chat模型<br>金融模型                  |\\n| CodeFuse-CodeLLaMA<br>CodeFuse-Codegeex2<br>CodeFuse-Qwen                                       | [蚂蚁CodeFuse系列模型](https://github.com/codefuse-ai)                          | 中文<br>英文 | 6B-34B              | chat模型<br>代码模型                            |\\n| phi2/phi3                                                                                       | 微软PHI2模型                                                                  | 英文       | 3B/4B               | base模型<br>指令模型<br>代码模型                    |\\n| Grok                                                                                            | [X-ai](https://github.com/xai-org/grok-1)                                 | 英文       | 300B                | base模型                                    |\\n| TeleChat                                                                                        | [Tele-AI](https://github.com/Tele-AI/Telechat)                            | 中文<br>英文 | 7B-12B              | chat模型                                    |\\n| dbrx                                                                                            | [databricks](https://github.com/databricks/dbrx)                          | 英文       | 132B                | base模型<br>chat模型                          |\\n| mengzi3                                                                                         | [Langboat](https://github.com/Langboat/Mengzi3)                           | 中文<br>英文 | 13B                 | base模型                                    |\\n| c4ai-command-r                                                                                  | [c4ai](https://cohere.com/command)                                        | 多语种      | 35B-104B            | chat模型                                    |\\n| WizardLM2                                                                                       | [WizardLM2系列模型](https://github.com/nlpxucan/WizardLM)                     | 多语种      | 7B-8x22B<br>包含量化版本  | chat模型<br>MoE模型                           |\\n| Atom                                                                                            | [Atom](https://github.com/LlamaFamily/Llama-Chinese)                      | 中文       | 7B                  | base模型<br>chat模型                          |\\n| Chinese-LLaMA-Alpaca-2                                                                          | [Chinese-LLaMA-Alpaca-2](https://github.com/ymcui/Chinese-LLaMA-Alpaca-2) | 中文       | 1.3B-13B            | base模型<br>chat模型<br>长文本模型                 |\\n| Chinese-LLaMA-Alpaca-3                                                                          | [Chinese-LLaMA-Alpaca-3](https://github.com/ymcui/Chinese-LLaMA-Alpaca-3) | 中文       | 8B                  | base模型<br>chat模型                          |\\n| ModelScope-Agent                                                                                | [ModelScope Agent系列](https://github.com/modelscope/modelscope-agent)      | 中文       | 7B-14B              | agent模型                                   |\\n| Numina                                                                                          | [AI-MO](https://huggingface.co/AI-MO)                                     | 英文       | 7B                  | 数学模型                                      |\\n\\n#### 多模态大模型\\n\\n| 模型类型                                                    | 模型介绍                                                                       | 语言       | 模型大小             | 模型类型             |\\n|---------------------------------------------------------|----------------------------------------------------------------------------|----------|------------------|------------------|\\n| Qwen-VL<br>Qwen2-VL                        | [通义千问视觉模型](https://github.com/QwenLM)                                      | 中文<br>英文 | 2B-72B<br>包含量化版本     | base模型<br>chat模型 |\\n| Qwen-Audio<br>Qwen2-Audio                       | [通义千问语音模型](https://github.com/QwenLM)                                      | 中文<br>英文 | 7B               | base模型<br>chat模型 |\\n| Llama3.2-Vision              | [Llama3.2](https://huggingface.co/collections/meta-llama/llama-32-66f448ffc8c32f949b04c8cf)                | 英文       | 11B-90B      | base模型<br>chat模型 |\\n| YI-VL                                                   | [01AI的YI系列视觉模型](https://github.com/01-ai)                                  | 中文<br>英文 | 6B-34B           | chat模型           |\\n| XComposer2<br>XComposer2.5                              | [浦江实验室书生浦语视觉模型](https://github.com/InternLM/InternLM-XComposer)            | 中文<br>英文 | 7B               | chat模型           |\\n| DeepSeek-VL                                             | [幻方系列视觉模型](https://github.com/deepseek-ai)                                 | 中文<br>英文 | 1.3B-7B          | chat模型           |\\n| MiniCPM-V<br>MiniCPM-V-2<br>MiniCPM-V-2.5<br>MiniCPM-V-2.6               | [OpenBmB MiniCPM视觉模型](https://github.com/OpenBMB/MiniCPM)                  | 中文<br>英文 | 3B-9B            | chat模型           |\\n| CogVLM<br>CogAgent<br>CogVLM2<br>CogVLM2-Video<br>GLM4V | [智谱ChatGLM视觉问答和Agent模型](https://github.com/THUDM/)                         | 中文<br>英文 | 9B-19B           | chat模型           |\\n| Llava-HF               | [Llava-HF系列模型](https://huggingface.co/llava-hf)                          | 英文       | 0.5B-110B           | chat模型           |\\n| Llava1.5<br>Llava1.6                                    | [Llava系列模型](https://github.com/haotian-liu/LLaVA)                          | 英文       | 7B-34B           | chat模型           |\\n| Llava-Next<br>Llava-Next-Video                          | [Llava-Next系列模型](https://github.com/LLaVA-VL/LLaVA-NeXT)                   | 中文<br>英文 | 7B-110B          | chat模型           |\\n| mPLUG-Owl2<br>mPLUG-Owl2.1<br>mPLUG-Owl3           | [mPLUG-Owl系列模型](https://github.com/X-PLUG/mPLUG-Owl)                       | 英文       | 11B              | chat模型           |\\n| InternVL<br>Mini-InternVL<br>InternVL2                  | [InternVL](https://github.com/OpenGVLab/InternVL)                          | 中文<br>英文 | 1B-40B<br>包含量化版本 | chat模型           |\\n| Llava-llama3                                            | [xtuner](https://huggingface.co/xtuner/llava-llama-3-8b-v1_1-transformers) | 英文       | 8B               | chat模型       |\\n| Phi3-Vision                                             | 微软                                                                         | 英文       | 4B               | chat模型       |\\n| PaliGemma                                               | Google                                                                     | 英文       | 3B               | chat模型       |\\n| Florence                                                | 微软                                                                         | 英文       | 0.23B-0.77B      | chat模型       |\\n| Idefics3                                | [HuggingFaceM4](https://huggingface.co/HuggingFaceM4)                               | 英文       | 8B      | chat模型       |\\n| Pixtral                                | [mistralai](https://huggingface.co/mistralai)                               | 英文       | 12B      | chat模型       |\\n| Llama3.1-Omni              | [LLaMA-Omni](https://github.com/ictnlp/LLaMA-Omni)                | 英文       | 8B      | chat模型       |\\n\\n\\n#### 扩散模型\\n\\n| 模型类型         | 模型介绍                                                     | 语言 | 模型类型 |\\n| ---------------- | ------------------------------------------------------------ | ---- | -------- |\\n| AnimateDiff      | [AnimateDiff动画模型](https://github.com/guoyww/AnimateDiff) | 英文 | 文生视频 |\\n| SD1.5/SD2.0/SDXL | [StabilityAI系列扩散模型](https://github.com/Stability-AI)   | 英文 | 文生图   |\\n\\n### 支持的开源数据集\\n\\n| 数据集类型 | 训练任务 | 文档                                                                                                                                                                                                                                           |\\n|-------|:-----|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\\n| 通用    | 微调   | 🔥ruozhiba, 🔥ms-bench, 🔥alpaca-en(gpt4), 🔥alpaca-zh(gpt4), multi-alpaca, instinwild, cot-en, cot-zh, firefly-zh, instruct-en, gpt4all-en, sharegpt, tulu-v2-sft-mixture, wikipedia-zh, open-orca, sharegpt-gpt4, deepctrl-sft, coig-cqia. |\\n| Agent | 微调   | 🔥ms-agent, 🔥ms-agent-for-agentfabric, ms-agent-multirole, 🔥toolbench-for-alpha-umi, damo-agent-zh, damo-agent-zh-mini, agent-instruct-all-en.                                                                                             |\\n| 通用    | 人类对齐 | hh-rlhf, 🔥hh-rlhf-cn, stack-exchange-paired.                                                                                                                                                                                                |\\n| 代码    | 微调   | code-alpaca-en, 🔥leetcode-python-en, 🔥codefuse-python-en, 🔥codefuse-evol-instruction-zh.                                                                                                                                                  |\\n| 医疗    | 微调   | medical-en, medical-zh, 🔥disc-med-sft-zh.                                                                                                                                                                                                   |\\n| 法律    | 微调   | lawyer-llama-zh, tigerbot-law-zh, 🔥disc-law-sft-zh.                                                                                                                                                                                         |\\n| 数学    | 微调   | 🔥blossom-math-zh, school-math-zh, open-platypus-en.                                                                                                                                                                                         |\\n| SQL   | 微调   | text2sql-en, 🔥sql-create-context-en.                                                                                                                                                                                                        |\\n| 文本生成  | 微调   | 🔥advertise-gen-zh, 🔥dureader-robust-zh.                                                                                                                                                                                                    |\\n| 分类    | 微调   | cmnli-zh, 🔥jd-sentiment-zh, 🔥hc3-zh, 🔥hc3-en.                                                                                                                                                                                             |\\n| 量化辅助  | 量化   | pileval.                                                                                                                                                                                                                                     |\\n| 其他    | 微调   | finance-en, poetry-zh, webnovel-zh, generated-chat-zh, cls-fudan-news-zh, ner-jave-zh.                                                                                                                                                       |\\n| 视觉    | 微调   | coco-en, 🔥coco-en-mini, coco-en-2, coco-en-2-mini, capcha-images.                                                                                                                                                                           |\\n| 音频    | 微调   | aishell1-zh, 🔥aishell1-zh-mini.                                                                                                                                                                                                             |\\n\\n### 支持的技术\\n\\n| 技术名称                                                                                                                                                                                    |\\n|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\\n| 🔥LoRA: [LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS](https://arxiv.org/abs/2106.09685)                                                                                          |\\n| 🔥LoRA+: [LoRA+: Efficient Low Rank Adaptation of Large Models](https://arxiv.org/pdf/2402.12354.pdf)                                                                                   |\\n| 🔥LLaMA PRO: [LLAMA PRO: Progressive LLaMA with Block Expansion](https://arxiv.org/pdf/2401.02415.pdf)                                                                                  |\\n| 🔥GaLore:[GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection](https://arxiv.org/abs/2403.03507)                                                                      |\\n| 🔥LISA: [LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning](https://arxiv.org/abs/2403.17919)                                                   |\\n| 🔥UnSloth: https://github.com/unslothai/unsloth                                                                                                                                         |\\n| 🔥SCEdit: [SCEdit: Efficient and Controllable Image Diffusion Generation via Skip Connection Editing](https://arxiv.org/abs/2312.11392)  < [arXiv](https://arxiv.org/abs/2312.11392)  \\\\ |  [Project Page](https://scedit.github.io/) > |\\n| 🔥NEFTune: [Noisy Embeddings Improve Instruction Finetuning](https://arxiv.org/abs/2310.05914)                                                                                          |\\n| LongLoRA: [Efficient Fine-tuning of Long-Context Large Language Models](https://arxiv.org/abs/2309.12307)                                                                               |\\n| Adapter: [Parameter-Efficient Transfer Learning for NLP](http://arxiv.org/abs/1902.00751)                                                                                               |\\n| Vision Prompt Tuning: [Visual Prompt Tuning](https://arxiv.org/abs/2203.12119)                                                                                                          |\\n| Side: [Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks](https://arxiv.org/abs/1912.13503)                                                                     |\\n| Res-Tuning: [Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone](https://arxiv.org/abs/2310.19859)  < [arXiv](https://arxiv.org/abs/2310.19859)  \\\\  |  [Project Page](https://res-tuning.github.io/)  \\\\|  [Usage](docs/source/GetStarted/ResTuning.md) > |\\n| [PEFT](https://github.com/huggingface/peft)提供的tuners, 如IA3, AdaLoRA等                                                                                                                    |\\n\\n### 支持的硬件\\n\\n| 硬件环境               | 备注                      |\\n|--------------------|-------------------------|\\n| CPU                |                         |\\n| RTX20系列/30系列/40系列等 | 30序列之后可使用BF16和FlashAttn |\\n| 计算卡系列 T4/V100等     | 不支持BF16和FlashAttn       |\\n| 计算卡系列 A10/A100等    | 支持BF16和FlashAttn        |\\n| 华为昇腾NPU            |                         |\\n\\n\\n### 环境变量\\n\\n- DATASET_ENABLE_CACHE：在预处理数据集时启用缓存，您可以使用`1/True`或`0/False`，默认值为`False`\\n- WEBUI_SHARE：共享web-ui，可以使用`1/True`或`0/False`，默认值为`False`\\n- SWIFT_UI_LANG：web-ui语言，您可以使用`en`或`zh`，默认值为`zh`\\n- WEBUI_SERVER：web-ui可访问的IP`0.0.0.0`表示所有路由，`127.0.0.1`仅用于本地网络。默认值为`127.0.0.1`\\n- WEBUI_PORT：web-ui端口\\n- USE_HF：使用huggingface endpoint或ModelScope endpoint下载模型和数据集。您可以使用`1/True`或`0/False`，默认值为`False`\\n- FORCE_REDOWNLOAD：强制重新下载数据集\\n\\n其他变量如`CUDA_VISIBLE_DEVICES`也支持，但未在此列出。\\n\\n## 📚 教程\\n\\n| 教程名称                                                     |\\n| ------------------------------------------------------------ |\\n| [深度学习入门](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/A.%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%85%A5%E9%97%A8%E4%BB%8B%E7%BB%8D.md) |\\n| [大模型基础知识](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/B.%E9%AD%94%E6%90%AD%E7%A4%BE%E5%8C%BA%E5%92%8CLLM%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md) |\\n| [提示词工程](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/C.%E6%8F%90%E7%A4%BA%E8%AF%8D%E5%B7%A5%E7%A8%8B-prompt%20engineering.md) |\\n| [Transformer结构介绍](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/D.Transformer%E7%BB%93%E6%9E%84.md) |\\n| [训练技术选型](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/E.%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B.md) |\\n| [数据预处理](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/F.%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86.md) |\\n| [量化](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/G.%E9%87%8F%E5%8C%96.md) |\\n| [训练](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/H.%E8%AE%AD%E7%BB%83.md) |\\n| [推理](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/I.LLM%E5%92%8C%E5%A4%9A%E6%A8%A1%E6%80%81%E6%A8%A1%E5%9E%8B%E9%AB%98%E6%95%88%E6%8E%A8%E7%90%86%E5%AE%9E%E8%B7%B5.md) |\\n| [部署](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/J.%E9%83%A8%E7%BD%B2.md) |\\n| [评估](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/K.%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%87%AA%E5%8A%A8%E8%AF%84%E4%BC%B0%E7%90%86%E8%AE%BA%E5%92%8C%E5%AE%9E%E6%88%98--LLM%20Automatic%20Evaluation.md) |\\n\\n## 🏛 License\\n\\n本框架使用[Apache License (Version 2.0)](https://github.com/modelscope/modelscope/blob/master/LICENSE)进行许可。模型和数据集请查看原资源页面并遵守对应License。\\n\\n## 📎 引用\\n\\n```bibtex\\n@misc{zhao2024swiftascalablelightweightinfrastructure,\\n      title={SWIFT:A Scalable lightWeight Infrastructure for Fine-Tuning},\\n      author={Yuze Zhao and Jintao Huang and Jinghan Hu and Xingjun Wang and Yunlin Mao and Daoze Zhang and Zeyinzi Jiang and Zhikai Wu and Baole Ai and Ang Wang and Wenmeng Zhou and Yingda Chen},\\n      year={2024},\\n      eprint={2408.05517},\\n      archivePrefix={arXiv},\\n      primaryClass={cs.CL},\\n      url={https://arxiv.org/abs/2408.05517},\\n}\\n```\\n\\n\\n## Star History\\n\\n[![Star History Chart](https://api.star-history.com/svg?repos=modelscope/swift&type=Date)](https://star-history.com/#modelscope/ms-swift&Date)\\n\\n\\n-r requirements/framework.txt\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# !/usr/bin/env python\\nimport os\\nimport shutil\\nfrom setuptools import find_packages, setup\\n\\n\\ndef readme():\\n    with open('README.md', encoding='utf-8') as f:\\n        content = f.read()\\n    return content\\n\\n\\nversion_file = 'swift/version.py'\\n\\n\\ndef get_version():\\n    with open(version_file, 'r', encoding='utf-8') as f:\\n        exec(compile(f.read(), version_file, 'exec'))\\n    return locals()['__version__']\\n\\n\\ndef parse_requirements(fname='requirements.txt', with_version=True):\\n    \\\"\\\"\\\"\\n    Parse the package dependencies listed in a requirements file but strips\\n    specific versioning information.\\n\\n    Args:\\n        fname (str): path to requirements file\\n        with_version (bool, default=False): if True include version specs\\n\\n    Returns:\\n        List[str]: list of requirements items\\n\\n    CommandLine:\\n        python -c \\\"import setup; print(setup.parse_requirements())\\\"\\n    \\\"\\\"\\\"\\n    import re\\n    import sys\\n    from os.path import exists\\n    require_fpath = fname\\n\\n    def parse_line(line):\\n        \\\"\\\"\\\"\\n        Parse information from a line in a requirements text file\\n        \\\"\\\"\\\"\\n        if line.startswith('-r '):\\n            # Allow specifying requirements in other files\\n            target = line.split(' ')[1]\\n            relative_base = os.path.dirname(fname)\\n            absolute_target = os.path.join(relative_base, target)\\n            for info in parse_require_file(absolute_target):\\n                yield info\\n        else:\\n            info = {'line': line}\\n            if line.startswith('-e '):\\n                info['package'] = line.split('#egg=')[1]\\n            else:\\n                # Remove versioning from the package\\n                pat = '(' + '|'.join(['>=', '==', '>']) + ')'\\n                parts = re.split(pat, line, maxsplit=1)\\n                parts = [p.strip() for p in parts]\\n\\n                info['package'] = parts[0]\\n                if len(parts) > 1:\\n                    op, rest = parts[1:]\\n                    if ';' in rest:\\n                        # Handle platform specific dependencies\\n                        # http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies\\n                        version, platform_deps = map(str.strip, rest.split(';'))\\n                        info['platform_deps'] = platform_deps\\n                    else:\\n                        version = rest  # NOQA\\n                    info['version'] = (op, version)\\n            yield info\\n\\n    def parse_require_file(fpath):\\n        with open(fpath, 'r', encoding='utf-8') as f:\\n            for line in f.readlines():\\n                line = line.strip()\\n                if line.startswith('http'):\\n                    print('skip http requirements %s' % line)\\n                    continue\\n                if line and not line.startswith('#') and not line.startswith('--'):\\n                    for info in parse_line(line):\\n                        yield info\\n                elif line and line.startswith('--find-links'):\\n                    eles = line.split()\\n                    for e in eles:\\n                        e = e.strip()\\n                        if 'http' in e:\\n                            info = dict(dependency_links=e)\\n                            yield info\\n\\n    def gen_packages_items():\\n        items = []\\n        deps_link = []\\n        if exists(require_fpath):\\n            for info in parse_require_file(require_fpath):\\n                if 'dependency_links' not in info:\\n                    parts = [info['package']]\\n                    if with_version and 'version' in info:\\n                        parts.extend(info['version'])\\n                    if not sys.version.startswith('3.4'):\\n                        # apparently package_deps are broken in 3.4\\n                        platform_deps = info.get('platform_deps')\\n                        if platform_deps is not None:\\n                            parts.append(';' + platform_deps)\\n                    item = ''.join(parts)\\n                    items.append(item)\\n                else:\\n                    deps_link.append(info['dependency_links'])\\n        return items, deps_link\\n\\n    return gen_packages_items()\\n\\n\\nif __name__ == '__main__':\\n    install_requires, deps_link = parse_requirements('requirements.txt')\\n    extra_requires = {}\\n    all_requires = []\\n    extra_requires['llm'], _ = parse_requirements('requirements/llm.txt')\\n    extra_requires['aigc'], _ = parse_requirements('requirements/aigc.txt')\\n    extra_requires['eval'], _ = parse_requirements('requirements/eval.txt')\\n    extra_requires['seq_parallel'], _ = parse_requirements('requirements/seq_parallel.txt')\\n    all_requires.extend(install_requires)\\n    all_requires.extend(extra_requires['llm'])\\n    all_requires.extend(extra_requires['eval'])\\n    all_requires.extend(extra_requires['seq_parallel'])\\n    extra_requires['seq_parallel'].extend(extra_requires['llm'])\\n    extra_requires['all'] = all_requires\\n\\n    setup(\\n        name='ms-swift',\\n        version=get_version(),\\n        description='Swift: Scalable lightWeight Infrastructure for Fine-Tuning',\\n        long_description=readme(),\\n        long_description_content_type='text/markdown',\\n        author='DAMO ModelScope teams',\\n        author_email='contact@modelscope.cn',\\n        keywords='python, petl, efficient tuners',\\n        url='https://github.com/modelscope/swift',\\n        packages=find_packages(exclude=('configs', 'demo')),\\n        include_package_data=True,\\n        package_data={\\n            '': ['*.h', '*.cpp', '*.cu'],\\n        },\\n        classifiers=[\\n            'Development Status :: 4 - Beta',\\n            'License :: OSI Approved :: Apache Software License',\\n            'Operating System :: OS Independent',\\n            'Programming Language :: Python :: 3',\\n            'Programming Language :: Python :: 3.7',\\n            'Programming Language :: Python :: 3.8',\\n            'Programming Language :: Python :: 3.9',\\n            'Programming Language :: Python :: 3.10',\\n        ],\\n        license='Apache License 2.0',\\n        tests_require=parse_requirements('requirements/tests.txt'),\\n        install_requires=install_requires,\\n        extras_require=extra_requires,\\n        entry_points={'console_scripts': ['swift=swift.cli.main:cli_main']},\\n        dependency_links=deps_link,\\n        zip_safe=False)\\n\\n\\n# Contributor Covenant Code of Conduct\\n\\n## Our Pledge\\n\\nWe as members, contributors, and leaders pledge to make participation in our\\ncommunity a harassment-free experience for everyone, regardless of age, body\\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\\nidentity and expression, level of experience, education, socio-economic status,\\nnationality, personal appearance, race, caste, color, religion, or sexual\\nidentity and orientation.\\n\\nWe pledge to act and interact in ways that contribute to an open, welcoming,\\ndiverse, inclusive, and healthy community.\\n\\n## Our Standards\\n\\nExamples of behavior that contributes to a positive environment for our\\ncommunity include:\\n\\n* Demonstrating empathy and kindness toward other people\\n* Being respectful of differing opinions, viewpoints, and experiences\\n* Giving and gracefully accepting constructive feedback\\n* Accepting responsibility and apologizing to those affected by our mistakes,\\n  and learning from the experience\\n* Focusing on what is best not just for us as individuals, but for the overall\\n  community\\n\\nExamples of unacceptable behavior include:\\n\\n* The use of sexualized language or imagery, and sexual attention or advances of\\n  any kind\\n* Trolling, insulting or derogatory comments, and personal or political attacks\\n* Public or private harassment\\n* Publishing others' private information, such as a physical or email address,\\n  without their explicit permission\\n* Other conduct which could reasonably be considered inappropriate in a\\n  professional setting\\n\\n## Enforcement Responsibilities\\n\\nCommunity leaders are responsible for clarifying and enforcing our standards of\\nacceptable behavior and will take appropriate and fair corrective action in\\nresponse to any behavior that they deem inappropriate, threatening, offensive,\\nor harmful.\\n\\nCommunity leaders have the right and responsibility to remove, edit, or reject\\ncomments, commits, code, wiki edits, issues, and other contributions that are\\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\\ndecisions when appropriate.\\n\\n## Scope\\n\\nThis Code of Conduct applies within all community spaces, and also applies when\\nan individual is officially representing the community in public spaces.\\nExamples of representing our community include using an official e-mail address,\\nposting via an official social media account, or acting as an appointed\\nrepresentative at an online or offline event.\\n\\n## Enforcement\\n\\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\\nreported to the community leaders responsible for enforcement at\\ncontact@modelscope.cn.\\nAll complaints will be reviewed and investigated promptly and fairly.\\n\\nAll community leaders are obligated to respect the privacy and security of the\\nreporter of any incident.\\n\\n## Enforcement Guidelines\\n\\nCommunity leaders will follow these Community Impact Guidelines in determining\\nthe consequences for any action they deem in violation of this Code of Conduct:\\n\\n### 1. Correction\\n\\n**Community Impact**: Use of inappropriate language or other behavior deemed\\nunprofessional or unwelcome in the community.\\n\\n**Consequence**: A private, written warning from community leaders, providing\\nclarity around the nature of the violation and an explanation of why the\\nbehavior was inappropriate. A public apology may be requested.\\n\\n### 2. Warning\\n\\n**Community Impact**: A violation through a single incident or series of\\nactions.\\n\\n**Consequence**: A warning with consequences for continued behavior. No\\ninteraction with the people involved, including unsolicited interaction with\\nthose enforcing the Code of Conduct, for a specified period of time. This\\nincludes avoiding interactions in community spaces as well as external channels\\nlike social media. Violating these terms may lead to a temporary or permanent\\nban.\\n\\n### 3. Temporary Ban\\n\\n**Community Impact**: A serious violation of community standards, including\\nsustained inappropriate behavior.\\n\\n**Consequence**: A temporary ban from any sort of interaction or public\\ncommunication with the community for a specified period of time. No public or\\nprivate interaction with the people involved, including unsolicited interaction\\nwith those enforcing the Code of Conduct, is allowed during this period.\\nViolating these terms may lead to a permanent ban.\\n\\n### 4. Permanent Ban\\n\\n**Community Impact**: Demonstrating a pattern of violation of community\\nstandards, including sustained inappropriate behavior, harassment of an\\nindividual, or aggression toward or disparagement of classes of individuals.\\n\\n**Consequence**: A permanent ban from any sort of public interaction within the\\ncommunity.\\n\\n## Attribution\\n\\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\\nversion 2.1, available at\\n[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].\\n\\nCommunity Impact Guidelines were inspired by\\n[Mozilla's code of conduct enforcement ladder][Mozilla CoC].\\n\\nFor answers to common questions about this code of conduct, see the FAQ at\\n[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at\\n[https://www.contributor-covenant.org/translations][translations].\\n\\n[homepage]: https://www.contributor-covenant.org\\n[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html\\n[Mozilla CoC]: https://github.com/mozilla/diversity\\n[FAQ]: https://www.contributor-covenant.org/faq\\n[translations]: https://www.contributor-covenant.org/translations\\n\\n\\n# 贡献者指引\\n\\n*欢迎帮SWIFT提供Feature PR、Bug反馈、文档补充或其他类型的贡献！*\\n\\n## 目录\\n\\n- [代码规约](#-代码规约)\\n- [贡献流程](#-贡献流程)\\n- [资源支持](#-资源支持)\\n\\n## 📖 代码规约\\n\\n请查看我们的[代码规约文档](./CODE_OF_CONDUCT.md).\\n\\n## 🔁 贡献流程\\n\\n### 我们需要什么\\n\\n- ROADMAP：我们为SWIFT提供了每个迭代的[ROADMAP](./ROADMAP.md)，贡献者可以查看我们的ROADMAP来了解我们的开发进度和规划。在**待分配**中的feature可以认领并开发。\\n\\n- 新技术和新模型：SWIFT需要支持更多的开源模型和数据集，或我们没有关注到的新技术，如果您对此有兴趣，可以提交PR给我们。\\n- 技术布道：如果您对技术布道有兴趣，欢迎在任何网站上帮我们撰写教程文档或视频等，并将链接发给我们。\\n- 社区供稿：您可以撰写和SWIFT有关的技术文章，并供稿给我们，我们审核通过后会在魔搭官方账号（知乎、公众号等）上进行发布，并属上您的名字。\\n\\n### 激励\\n\\n- 我们会以魔搭社区的身份给贡献者颁发电子证书，以鼓励您的无私贡献。\\n- 我们会赠送相关魔搭社区相关周边小礼品。\\n- 我们会赠送开发期间的免费A10算力，具体可以查看[资源支持](#-资源支持)章节。\\n\\n### 提交PR（Pull Requests）\\n\\n任何feature开发都在github上以先Fork后PR的形式进行。\\n\\n1. Fork：进入[SWIFT](https://github.com/modelscope/swift)页面后，点击**Fork按钮**执行。完成后会在您的个人组织下克隆出一个SWIFT代码库\\n\\n2. Clone：将第一步产生的代码库clone到本地并**拉新分支**进行开发，开发中请及时点击**Sync Fork按钮**同步`main`分支，防止代码过期并冲突\\n\\n3. 提交PR：开发、测试完成后将代码推送到远程分支。在github上点击**Pull Requests页面**，新建一个PR，源分支选择您提交的代码分支，目标分支选择`modelscope/swift:main`分支\\n\\n4. 撰写描述：在PR中填写良好的feature描述是必要的，让Reviewers知道您的修改内容\\n\\n5. Review：我们希望合入的代码简洁高效，因此可能会提出一些问题并讨论。请注意，任何review中提出的问题是针对代码本身，而非您个人。在所有问题讨论通过后，您的代码会被通过\\n\\n### 代码规范和开发方式\\n\\nSWIFT有约定俗成的变量命名方式和开发方式。在开发中请尽量遵循这些方式。\\n\\n1. 变量命名以下划线分割，类名以所有单词首字母大写方式命名\\n2. 所有的python缩进都是四个空格取代一个tab\\n3. 选用知名的开源库，避免使用闭源库或不稳定的开源库，避免重复造轮子\\n\\nSWIFT在PR提交后会进行两类测试：\\n\\n- Code Lint测试 对代码进行静态规范走查的测试，为保证改测试通过，请保证本地预先进行了Code lint。方法是：\\n\\n  ```shell\\n  pip install pre-commit\\n  # 在swift文件夹内\\n  pre-commit run --all-files\\n  # 对pre-commit报的错误进行修改，直到所有的检查都是成功状态\\n  ```\\n\\n- CI Tests 冒烟测试和单元测试，请查看下一章节\\n\\n### Running CI Tests\\n\\n在提交PR前，请保证您的开发代码已经受到了测试用例的保护。例如，对新功能的冒烟测试，或者各种边缘case的单元测试等。在代码review时Reviewers也会关注这一点。同时，也会有服务专门运行CI Tests，运行所有的测试用例，测试用例通过后代码才可以合并。\\n\\n另外，由于运行时间过长，我们跳过了部分重要测试，为保证您的逻辑是正确的，可以在本地执行该测试：\\n\\n```shell\\npython tests/llm/test_run.py\\n```\\n\\n请保证该测试可以正常通过。\\n\\n## ✅ 资源支持\\n\\nSWIFT会为开发者提供资源支持，包括免费的GPU算力。如果需要请邮件联系我们（[contact@modelscope.cn](mailto:contact@modelscope.cn)）或加入我们的微信群：\\n\\n<p align=\\\"left\\\">\\n<img src=\\\"asset/wechat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n</p>\\n\\n\\n# Reporting Security Issues\\n\\nUsually security issues of a deep learning project come from non-standard 3rd packages or continuous running services. If you are suffering from security issues from our project, please consider reporting to us. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.\\n\\n\\n# PR type\\n- [ ] Bug Fix\\n- [ ] New Feature\\n- [ ] Document Updates\\n- [ ] More Models or Datasets Support\\n\\n# PR information\\n\\nWrite the detail information belongs to this PR.\\n\\n## Experiment results\\n\\nPaste your experiment result here(if needed).\\n\\n\\n---\\nname: Custom issue template\\nabout: Describe this issue template's purpose here.\\ntitle: ''\\nlabels: ''\\nassignees: ''\\n\\n---\\n\\n\\n---\\nname: Feature request\\nabout: Suggest an idea for this project\\ntitle: ''\\nlabels: ''\\nassignees: ''\\n\\n---\\n\\n**Describe the feature**\\nPlease describe the feature requested here(请在这里描述需求)\\n\\n**Paste any useful information**\\nPaste any useful information, including papers, github links, etc.(请在这里描述其他有用的信息，比如相关的论文地址，github链接等)\\n\\n**Additional context**\\nAdd any other context or information here(其他信息可以写在这里)\\n\\n\\n---\\nname: Bug report\\nabout: Create a report to help us improve\\ntitle: ''\\nlabels: ''\\nassignees: ''\\n\\n---\\n\\n**Describe the bug**\\nWhat the bug is, and how to reproduce, better with screenshots(描述bug以及复现过程，最好有截图)\\n\\n\\n**Your hardware and system info**\\nWrite your system info like CUDA version/system/GPU/torch version here(在这里给出硬件信息和系统信息，如CUDA版本，系统，GPU型号和torch版本等)\\n\\n\\n**Additional context**\\nAdd any other context about the problem here(在这里补充其他信息)\\n\\n\\nfrom swift.llm import merge_lora_main\\n\\nif __name__ == '__main__':\\n    merge_lora_main(replace_if_exists=True)\\n\\n\\n#!/usr/bin/env python\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport argparse\\nimport datetime\\nimport math\\nimport os\\nimport subprocess\\nimport sys\\nsys.path.insert(0, '/swift')\\nimport tempfile\\nimport time\\nimport unittest\\nfrom fnmatch import fnmatch\\nfrom pathlib import Path\\nfrom unittest import TextTestResult\\n\\nimport pandas\\n# NOTICE: Tensorflow 1.15 seems not so compatible with pytorch.\\n#         A segmentation fault may be raise by pytorch cpp library\\n#         if 'import tensorflow' in front of 'import torch'.\\n#         Puting a 'import torch' here can bypass this incompatibility.\\nimport torch\\nimport yaml\\nfrom model_tag import ModelTag, commit_model_ut_result\\nfrom test_utils import get_case_model_info\\n\\nfrom swift.utils.logger import get_logger\\n\\nlogger = get_logger()\\n\\n\\ndef test_cases_result_to_df(result_list):\\n    table_header = [\\n        'Name', 'Result', 'Info', 'Start time', 'Stop time',\\n        'Time cost(seconds)'\\n    ]\\n    df = pandas.DataFrame(\\n        result_list, columns=table_header).sort_values(\\n            by=['Start time'], ascending=True)\\n    return df\\n\\n\\ndef statistics_test_result(df):\\n    total_cases = df.shape[0]\\n    # yapf: disable\\n    success_cases = df.loc[df['Result'] == 'Success'].shape[0]\\n    error_cases = df.loc[df['Result'] == 'Error'].shape[0]\\n    failures_cases = df.loc[df['Result'] == 'Failures'].shape[0]\\n    expected_failure_cases = df.loc[df['Result'] == 'ExpectedFailures'].shape[0]\\n    unexpected_success_cases = df.loc[df['Result'] == 'UnexpectedSuccesses'].shape[0]\\n    skipped_cases = df.loc[df['Result'] == 'Skipped'].shape[0]\\n    # yapf: enable\\n\\n    if failures_cases > 0 or \\\\\\n       error_cases > 0 or \\\\\\n       unexpected_success_cases > 0:\\n        final_result = 'FAILED'\\n    else:\\n        final_result = 'SUCCESS'\\n    result_msg = '%s (Runs=%s,success=%s,failures=%s,errors=%s,\\\\\\n    skipped=%s,expected failures=%s,unexpected successes=%s)' % (\\n        final_result, total_cases, success_cases, failures_cases, error_cases,\\n        skipped_cases, expected_failure_cases, unexpected_success_cases)\\n\\n    model_cases = get_case_model_info()\\n    for model_name, case_info in model_cases.items():\\n        cases = df.loc[df['Name'].str.contains('|'.join(list(case_info)))]\\n        results = cases['Result']\\n        result = None\\n        if any(results == 'Error') or any(results == 'Failures') or any(\\n                results == 'UnexpectedSuccesses'):\\n            result = ModelTag.MODEL_FAIL\\n        elif any(results == 'Success'):\\n            result = ModelTag.MODEL_PASS\\n        elif all(results == 'Skipped'):\\n            result = ModelTag.MODEL_SKIP\\n        else:\\n            print(f'invalid results for {model_name} \\\\n{result}')\\n\\n        if result is not None:\\n            commit_model_ut_result(model_name, result)\\n    print('Testing result summary.')\\n    print(result_msg)\\n    if final_result == 'FAILED':\\n        sys.exit(1)\\n\\n\\ndef gather_test_suites_in_files(test_dir, case_file_list, list_tests):\\n    test_suite = unittest.TestSuite()\\n    for case in case_file_list:\\n        test_case = unittest.defaultTestLoader.discover(\\n            start_dir=test_dir, pattern=case)\\n        test_suite.addTest(test_case)\\n        if hasattr(test_case, '__iter__'):\\n            for subcase in test_case:\\n                if list_tests:\\n                    print(subcase)\\n        else:\\n            if list_tests:\\n                print(test_case)\\n    return test_suite\\n\\n\\ndef gather_test_suites_files(test_dir, pattern):\\n    case_file_list = []\\n    for dirpath, dirnames, filenames in os.walk(test_dir):\\n        for file in filenames:\\n            if fnmatch(file, pattern):\\n                case_file_list.append(file)\\n\\n    return case_file_list\\n\\n\\ndef collect_test_results(case_results):\\n    result_list = [\\n    ]  # each item is Case, Result, Start time, Stop time, Time cost\\n    for case_result in case_results.successes:\\n        result_list.append(\\n            (case_result.test_full_name, 'Success', '', case_result.start_time,\\n             case_result.stop_time, case_result.time_cost))\\n    for case_result in case_results.errors:\\n        result_list.append(\\n            (case_result[0].test_full_name, 'Error', case_result[1],\\n             case_result[0].start_time, case_result[0].stop_time,\\n             case_result[0].time_cost))\\n    for case_result in case_results.skipped:\\n        result_list.append(\\n            (case_result[0].test_full_name, 'Skipped', case_result[1],\\n             case_result[0].start_time, case_result[0].stop_time,\\n             case_result[0].time_cost))\\n    for case_result in case_results.expectedFailures:\\n        result_list.append(\\n            (case_result[0].test_full_name, 'ExpectedFailures', case_result[1],\\n             case_result[0].start_time, case_result[0].stop_time,\\n             case_result[0].time_cost))\\n    for case_result in case_results.failures:\\n        result_list.append(\\n            (case_result[0].test_full_name, 'Failures', case_result[1],\\n             case_result[0].start_time, case_result[0].stop_time,\\n             case_result[0].time_cost))\\n    for case_result in case_results.unexpectedSuccesses:\\n        result_list.append((case_result.test_full_name, 'UnexpectedSuccesses',\\n                            '', case_result.start_time, case_result.stop_time,\\n                            case_result.time_cost))\\n    return result_list\\n\\n\\ndef run_command_with_popen(cmd):\\n    with subprocess.Popen(\\n            cmd,\\n            stdout=subprocess.PIPE,\\n            stderr=subprocess.STDOUT,\\n            bufsize=1,\\n            encoding='utf8') as sub_process:\\n        for line in iter(sub_process.stdout.readline, ''):\\n            sys.stdout.write(line)\\n\\n\\ndef async_run_command_with_popen(cmd, device_id):\\n    logger.info('Worker id: %s args: %s' % (device_id, cmd))\\n    env = os.environ.copy()\\n    env['CUDA_VISIBLE_DEVICES'] = '%s' % device_id\\n    sub_process = subprocess.Popen(\\n        cmd,\\n        stdout=subprocess.PIPE,\\n        stderr=subprocess.STDOUT,\\n        bufsize=1,\\n        universal_newlines=True,\\n        env=env,\\n        encoding='utf8')\\n    return sub_process\\n\\n\\ndef save_test_result(df, args):\\n    if args.result_dir is not None:\\n        file_name = str(int(datetime.datetime.now().timestamp() * 1000))\\n        os.umask(0)\\n        Path(args.result_dir).mkdir(mode=0o777, parents=True, exist_ok=True)\\n        Path(os.path.join(args.result_dir, file_name)).touch(\\n            mode=0o666, exist_ok=True)\\n        df.to_pickle(os.path.join(args.result_dir, file_name))\\n\\n\\ndef run_command(cmd):\\n    logger.info('Running command: %s' % ' '.join(cmd))\\n    response = subprocess.run(\\n        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\\n    try:\\n        response.check_returncode()\\n        logger.info(response.stdout.decode('utf8'))\\n    except subprocess.CalledProcessError as error:\\n        logger.error(\\n            'stdout: %s, stderr: %s' %\\n            (response.stdout.decode('utf8'), error.stderr.decode('utf8')))\\n\\n\\ndef install_packages(pkgs):\\n    cmd = [sys.executable, '-m', 'pip', 'install']\\n    for pkg in pkgs:\\n        cmd.append(pkg)\\n\\n    run_command(cmd)\\n\\n\\ndef install_requirements(requirements):\\n    for req in requirements:\\n        cmd = [\\n            sys.executable, '-m', 'pip', 'install', '-r',\\n            'requirements/%s' % req, '-f',\\n            'https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html'\\n        ]\\n        run_command(cmd)\\n\\n\\ndef wait_for_free_worker(workers):\\n    while True:\\n        for idx, worker in enumerate(workers):\\n            if worker is None:\\n                logger.info('return free worker: %s' % (idx))\\n                return idx\\n            if worker.poll() is None:  # running, get output\\n                for line in iter(worker.stdout.readline, ''):\\n                    if line != '':\\n                        sys.stdout.write(line)\\n                    else:\\n                        break\\n            else:  # worker process completed.\\n                logger.info('Process end: %s' % (idx))\\n                workers[idx] = None\\n                return idx\\n        time.sleep(0.001)\\n\\n\\ndef wait_for_workers(workers):\\n    while True:\\n        for idx, worker in enumerate(workers):\\n            if worker is None:\\n                continue\\n            # check worker is completed.\\n            if worker.poll() is None:\\n                for line in iter(worker.stdout.readline, ''):\\n                    if line != '':\\n                        sys.stdout.write(line)\\n                    else:\\n                        break\\n            else:\\n                logger.info('Process idx: %s end!' % (idx))\\n                workers[idx] = None\\n\\n        is_all_completed = True\\n        for idx, worker in enumerate(workers):\\n            if worker is not None:\\n                is_all_completed = False\\n                break\\n\\n        if is_all_completed:\\n            logger.info('All sub porcess is completed!')\\n            break\\n        time.sleep(0.001)\\n\\n\\ndef parallel_run_case_in_env(env_name, env, test_suite_env_map, isolated_cases,\\n                             result_dir, parallel):\\n    logger.info('Running case in env: %s' % env_name)\\n    # install requirements and deps # run_config['envs'][env]\\n    if 'requirements' in env:\\n        install_requirements(env['requirements'])\\n    if 'dependencies' in env:\\n        install_packages(env['dependencies'])\\n    # case worker processes\\n    worker_processes = [None] * parallel\\n    for test_suite_file in isolated_cases:  # run case in subprocess\\n        if test_suite_file in test_suite_env_map and test_suite_env_map[\\n                test_suite_file] == env_name:\\n            cmd = [\\n                'python',\\n                'tests/run.py',\\n                '--pattern',\\n                test_suite_file,\\n                '--result_dir',\\n                result_dir,\\n            ]\\n            worker_idx = wait_for_free_worker(worker_processes)\\n            worker_process = async_run_command_with_popen(cmd, worker_idx)\\n            os.set_blocking(worker_process.stdout.fileno(), False)\\n            worker_processes[worker_idx] = worker_process\\n        else:\\n            pass  # case not in run list.\\n\\n    # run remain cases in a process.\\n    remain_suite_files = []\\n    for k, v in test_suite_env_map.items():\\n        if k not in isolated_cases and v == env_name:\\n            remain_suite_files.append(k)\\n    if len(remain_suite_files) == 0:\\n        wait_for_workers(worker_processes)\\n        return\\n    # roughly split case in parallel\\n    part_count = math.ceil(len(remain_suite_files) / parallel)\\n    suites_chunks = [\\n        remain_suite_files[x:x + part_count]\\n        for x in range(0, len(remain_suite_files), part_count)\\n    ]\\n    for suites_chunk in suites_chunks:\\n        worker_idx = wait_for_free_worker(worker_processes)\\n        cmd = [\\n            'python', 'tests/run.py', '--result_dir', result_dir, '--suites'\\n        ]\\n        for suite in suites_chunk:\\n            cmd.append(suite)\\n        worker_process = async_run_command_with_popen(cmd, worker_idx)\\n        os.set_blocking(worker_process.stdout.fileno(), False)\\n        worker_processes[worker_idx] = worker_process\\n\\n    wait_for_workers(worker_processes)\\n\\n\\ndef run_case_in_env(env_name, env, test_suite_env_map, isolated_cases,\\n                    result_dir):\\n    # install requirements and deps # run_config['envs'][env]\\n    if 'requirements' in env:\\n        install_requirements(env['requirements'])\\n    if 'dependencies' in env:\\n        install_packages(env['dependencies'])\\n\\n    for test_suite_file in isolated_cases:  # run case in subprocess\\n        if test_suite_file in test_suite_env_map and test_suite_env_map[\\n                test_suite_file] == env_name:\\n            cmd = [\\n                'python',\\n                'tests/run.py',\\n                '--pattern',\\n                test_suite_file,\\n                '--result_dir',\\n                result_dir,\\n            ]\\n            run_command_with_popen(cmd)\\n        else:\\n            pass  # case not in run list.\\n\\n    # run remain cases in a process.\\n    remain_suite_files = []\\n    for k, v in test_suite_env_map.items():\\n        if k not in isolated_cases and v == env_name:\\n            remain_suite_files.append(k)\\n    if len(remain_suite_files) == 0:\\n        return\\n    cmd = ['python', 'tests/run.py', '--result_dir', result_dir, '--suites']\\n    for suite in remain_suite_files:\\n        cmd.append(suite)\\n    run_command_with_popen(cmd)\\n\\n\\ndef run_non_parallelizable_test_suites(suites, result_dir):\\n    cmd = ['python', 'tests/run.py', '--result_dir', result_dir, '--suites']\\n    for suite in suites:\\n        cmd.append(suite)\\n    run_command_with_popen(cmd)\\n\\n\\n# Selected cases:\\ndef get_selected_cases():\\n    cmd = ['python', '-u', 'tests/run_analysis.py']\\n    selected_cases = []\\n    with subprocess.Popen(\\n            cmd,\\n            stdout=subprocess.PIPE,\\n            stderr=subprocess.STDOUT,\\n            bufsize=1,\\n            encoding='utf8') as sub_process:\\n        for line in iter(sub_process.stdout.readline, ''):\\n            sys.stdout.write(line)\\n            if line.startswith('Selected cases:'):\\n                line = line.replace('Selected cases:', '').strip()\\n                selected_cases = line.split(',')\\n        sub_process.wait()\\n        if sub_process.returncode != 0:\\n            msg = 'Run analysis exception, returncode: %s!' % sub_process.returncode\\n            logger.error(msg)\\n            raise Exception(msg)\\n    return selected_cases\\n\\n\\ndef run_in_subprocess(args):\\n    # only case args.isolated_cases run in subporcess, all other run in a subprocess\\n    if not args.no_diff:  # run based on git diff\\n        try:\\n            test_suite_files = get_selected_cases()\\n            logger.info('Tests suite to run: ')\\n            for f in test_suite_files:\\n                logger.info(f)\\n        except Exception:\\n            logger.error(\\n                'Get test suite based diff exception!, will run all cases.')\\n            test_suite_files = gather_test_suites_files(\\n                os.path.abspath(args.test_dir), args.pattern)\\n        if len(test_suite_files) == 0:\\n            logger.error('Get no test suite based on diff, run all the cases.')\\n            test_suite_files = gather_test_suites_files(\\n                os.path.abspath(args.test_dir), args.pattern)\\n    else:\\n        test_suite_files = gather_test_suites_files(\\n            os.path.abspath(args.test_dir), args.pattern)\\n\\n    non_parallelizable_suites = []\\n    test_suite_files = [\\n        x for x in test_suite_files if x not in non_parallelizable_suites\\n    ]\\n\\n    run_config = None\\n    isolated_cases = []\\n    test_suite_env_map = {}\\n    # put all the case in default env.\\n    for test_suite_file in test_suite_files:\\n        test_suite_env_map[test_suite_file] = 'default'\\n\\n    if args.run_config is not None and Path(args.run_config).exists():\\n        with open(args.run_config, encoding='utf-8') as f:\\n            run_config = yaml.load(f, Loader=yaml.FullLoader)\\n        if 'isolated' in run_config:\\n            isolated_cases = run_config['isolated']\\n\\n        if 'envs' in run_config:\\n            for env in run_config['envs']:\\n                if env != 'default':\\n                    for test_suite in run_config['envs'][env]['tests']:\\n                        if test_suite in test_suite_env_map:\\n                            test_suite_env_map[test_suite] = env\\n\\n    if args.subprocess:  # run all case in subprocess\\n        isolated_cases = test_suite_files\\n\\n    with tempfile.TemporaryDirectory() as temp_result_dir:\\n        # first run cases that nonparallelizable\\n        run_non_parallelizable_test_suites(non_parallelizable_suites,\\n                                           temp_result_dir)\\n\\n        # run case parallel in envs\\n        for env in set(test_suite_env_map.values()):\\n            parallel_run_case_in_env(env, run_config['envs'][env],\\n                                     test_suite_env_map, isolated_cases,\\n                                     temp_result_dir, args.parallel)\\n\\n        result_dfs = []\\n        result_path = Path(temp_result_dir)\\n        for result in result_path.iterdir():\\n            if Path.is_file(result):\\n                df = pandas.read_pickle(result)\\n                result_dfs.append(df)\\n        result_pd = pandas.concat(\\n            result_dfs)  # merge result of every test suite.\\n        print_table_result(result_pd)\\n        print_abnormal_case_info(result_pd)\\n        statistics_test_result(result_pd)\\n\\n\\ndef get_object_full_name(obj):\\n    klass = obj.__class__\\n    module = klass.__module__\\n    if module == 'builtins':\\n        return klass.__qualname__\\n    return module + '.' + klass.__qualname__\\n\\n\\nclass TimeCostTextTestResult(TextTestResult):\\n    \\\"\\\"\\\"Record test case time used!\\\"\\\"\\\"\\n\\n    def __init__(self, stream, descriptions, verbosity):\\n        self.successes = []\\n        return super(TimeCostTextTestResult,\\n                     self).__init__(stream, descriptions, verbosity)\\n\\n    def startTest(self, test):\\n        test.start_time = datetime.datetime.now()\\n        test.test_full_name = get_object_full_name(\\n            test) + '.' + test._testMethodName\\n        self.stream.writeln('Test case:  %s start at: %s' %\\n                            (test.test_full_name, test.start_time))\\n\\n        return super(TimeCostTextTestResult, self).startTest(test)\\n\\n    def stopTest(self, test):\\n        TextTestResult.stopTest(self, test)\\n        test.stop_time = datetime.datetime.now()\\n        test.time_cost = (test.stop_time - test.start_time).total_seconds()\\n        self.stream.writeln(\\n            'Test case: %s stop at: %s, cost time: %s(seconds)' %\\n            (test.test_full_name, test.stop_time, test.time_cost))\\n        if torch.cuda.is_available(\\n        ) and test.time_cost > 5.0:  # print nvidia-smi\\n            cmd = ['nvidia-smi']\\n            run_command_with_popen(cmd)\\n        super(TimeCostTextTestResult, self).stopTest(test)\\n\\n    def addSuccess(self, test):\\n        self.successes.append(test)\\n        super(TextTestResult, self).addSuccess(test)\\n\\n\\nclass TimeCostTextTestRunner(unittest.runner.TextTestRunner):\\n    resultclass = TimeCostTextTestResult\\n\\n    def run(self, test):\\n        return super(TimeCostTextTestRunner, self).run(test)\\n\\n    def _makeResult(self):\\n        result = super(TimeCostTextTestRunner, self)._makeResult()\\n        return result\\n\\n\\ndef gather_test_cases(test_dir, pattern, list_tests):\\n    case_list = []\\n    for dirpath, dirnames, filenames in os.walk(test_dir):\\n        for file in filenames:\\n            if fnmatch(file, pattern):\\n                case_list.append(file)\\n\\n    test_suite = unittest.TestSuite()\\n\\n    for case in case_list:\\n        test_case = unittest.defaultTestLoader.discover(\\n            start_dir=test_dir, pattern=case)\\n        test_suite.addTest(test_case)\\n        if hasattr(test_case, '__iter__'):\\n            for subcase in test_case:\\n                if list_tests:\\n                    print(subcase)\\n        else:\\n            if list_tests:\\n                print(test_case)\\n    return test_suite\\n\\n\\ndef print_abnormal_case_info(df):\\n    df = df.loc[(df['Result'] == 'Error') | (df['Result'] == 'Failures')]\\n    for _, row in df.iterrows():\\n        print('Case %s run result: %s, msg:\\\\n%s' %\\n              (row['Name'], row['Result'], row['Info']))\\n\\n\\ndef print_table_result(df):\\n    df = df.loc[df['Result'] != 'Skipped']\\n    df = df.drop('Info', axis=1)\\n    formatters = {\\n        'Name': '{{:<{}s}}'.format(df['Name'].str.len().max()).format,\\n        'Result': '{{:<{}s}}'.format(df['Result'].str.len().max()).format,\\n    }\\n    with pandas.option_context('display.max_rows', None, 'display.max_columns',\\n                               None, 'display.width', None):\\n        print(df.to_string(justify='left', formatters=formatters, index=False))\\n\\n\\ndef main(args):\\n    runner = TimeCostTextTestRunner()\\n    if args.suites is not None and len(args.suites) > 0:\\n        logger.info('Running: %s' % ' '.join(args.suites))\\n        test_suite = gather_test_suites_in_files(args.test_dir, args.suites,\\n                                                 args.list_tests)\\n    else:\\n        test_suite = gather_test_cases(\\n            os.path.abspath(args.test_dir), args.pattern, args.list_tests)\\n    if not args.list_tests:\\n        result = runner.run(test_suite)\\n        logger.info('Running case completed, pid: %s, suites: %s' %\\n                    (os.getpid(), args.suites))\\n        result = collect_test_results(result)\\n        df = test_cases_result_to_df(result)\\n        if args.result_dir is not None:\\n            save_test_result(df, args)\\n        else:\\n            print_table_result(df)\\n            print_abnormal_case_info(df)\\n            statistics_test_result(df)\\n\\n\\nif __name__ == '__main__':\\n    parser = argparse.ArgumentParser('test runner')\\n    parser.add_argument(\\n        '--list_tests', action='store_true', help='list all tests')\\n    parser.add_argument(\\n        '--pattern', default='test_*.py', help='test file pattern')\\n    parser.add_argument(\\n        '--test_dir', default='tests', help='directory to be tested')\\n    parser.add_argument(\\n        '--level', default=0, type=int, help='2 -- all, 1 -- p1, 0 -- p0')\\n    parser.add_argument(\\n        '--profile', action='store_true', help='enable profiling')\\n    parser.add_argument(\\n        '--run_config',\\n        default=None,\\n        help='specified case run config file(yaml file)')\\n    parser.add_argument(\\n        '--subprocess',\\n        action='store_true',\\n        help='run all test suite in subprocess')\\n    parser.add_argument(\\n        '--result_dir',\\n        default=None,\\n        help='Save result to directory, internal use only')\\n    parser.add_argument(\\n        '--parallel',\\n        default=1,\\n        type=int,\\n        help='Set case parallels, default single process, set with gpu number.'\\n    )\\n    parser.add_argument(\\n        '--no-diff',\\n        action='store_true',\\n        help=\\n        'Default running case based on git diff(with master), disable with --no-diff)'\\n    )\\n    parser.add_argument(\\n        '--suites',\\n        nargs='*',\\n        help='Run specified test suites(test suite files list split by space)')\\n    args = parser.parse_args()\\n    print(args)\\n    if args.run_config is not None or args.subprocess:\\n        run_in_subprocess(args)\\n    else:\\n        main(args)\\n\\n\\n#!/usr/bin/env python\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport copy\\nimport os\\nimport pickle\\nimport shutil\\nimport socket\\nimport subprocess\\nimport sys\\nimport tarfile\\nimport tempfile\\nimport unittest\\nfrom collections import OrderedDict\\nfrom collections.abc import Mapping\\nfrom os.path import expanduser\\n\\nimport numpy as np\\nimport requests\\n\\nfrom swift.hub.constants import DEFAULT_CREDENTIALS_PATH\\n\\nTEST_LEVEL = 2\\nTEST_LEVEL_STR = 'TEST_LEVEL'\\n\\n# for user citest and sdkdev\\nTEST_ACCESS_TOKEN1 = os.environ.get('TEST_ACCESS_TOKEN_CITEST', None)\\nTEST_ACCESS_TOKEN2 = os.environ.get('TEST_ACCESS_TOKEN_SDKDEV', None)\\n\\nTEST_MODEL_CHINESE_NAME = '内部测试模型'\\nTEST_MODEL_ORG = 'citest'\\n\\n\\ndef delete_credential():\\n    path_credential = expanduser(DEFAULT_CREDENTIALS_PATH)\\n    shutil.rmtree(path_credential, ignore_errors=True)\\n\\n\\ndef test_level():\\n    global TEST_LEVEL\\n    if TEST_LEVEL_STR in os.environ:\\n        TEST_LEVEL = int(os.environ[TEST_LEVEL_STR])\\n\\n    return TEST_LEVEL\\n\\n\\ndef require_tf(test_case):\\n    test_case = unittest.skip('test requires TensorFlow')(test_case)\\n    return test_case\\n\\n\\ndef require_torch(test_case):\\n    return test_case\\n\\n\\ndef set_test_level(level: int):\\n    global TEST_LEVEL\\n    TEST_LEVEL = level\\n\\n\\nclass DummyTorchDataset:\\n\\n    def __init__(self, feat, label, num) -> None:\\n        self.feat = feat\\n        self.label = label\\n        self.num = num\\n\\n    def __getitem__(self, index):\\n        import torch\\n        return {'feat': torch.Tensor(self.feat), 'labels': torch.Tensor(self.label)}\\n\\n    def __len__(self):\\n        return self.num\\n\\n\\ndef create_dummy_test_dataset(feat, label, num):\\n    return DummyTorchDataset(feat, label, num)\\n\\n\\ndef download_and_untar(fpath, furl, dst) -> str:\\n    if not os.path.exists(fpath):\\n        r = requests.get(furl)\\n        with open(fpath, 'wb') as f:\\n            f.write(r.content)\\n\\n    file_name = os.path.basename(fpath)\\n    root_dir = os.path.dirname(fpath)\\n    target_dir_name = os.path.splitext(os.path.splitext(file_name)[0])[0]\\n    target_dir_path = os.path.join(root_dir, target_dir_name)\\n\\n    # untar the file\\n    t = tarfile.open(fpath)\\n    t.extractall(path=dst)\\n\\n    return target_dir_path\\n\\n\\ndef get_case_model_info():\\n    status_code, result = subprocess.getstatusoutput(\\n        'grep -rn \\\"damo/\\\" tests/  | grep -v \\\".pyc\\\" | grep -v \\\"Binary file\\\" | grep -v run.py ')\\n    lines = result.split('\\\\n')\\n    test_cases = OrderedDict()\\n    model_cases = OrderedDict()\\n    for line in lines:\\n        # \\\"tests/msdatasets/test_ms_dataset.py:92:        model_id = 'damo/bert-base-sst2'\\\"\\n        line = line.strip()\\n        elements = line.split(':')\\n        test_file = elements[0]\\n        model_pos = line.find('damo')\\n        left_quote = line[model_pos - 1]\\n        rquote_idx = line.rfind(left_quote)\\n        model_name = line[model_pos:rquote_idx]\\n        if test_file not in test_cases:\\n            test_cases[test_file] = set()\\n        model_info = test_cases[test_file]\\n        model_info.add(model_name)\\n\\n        if model_name not in model_cases:\\n            model_cases[model_name] = set()\\n        case_info = model_cases[model_name]\\n        case_info.add(test_file.replace('tests/', '').replace('.py', '').replace('/', '.'))\\n\\n    return model_cases\\n\\n\\ndef compare_arguments_nested(print_content, arg1, arg2, rtol=1.e-3, atol=1.e-8, ignore_unknown_type=True):\\n    type1 = type(arg1)\\n    type2 = type(arg2)\\n    if type1.__name__ != type2.__name__:\\n        if print_content is not None:\\n            print(f'{print_content}, type not equal:{type1.__name__} and {type2.__name__}')\\n        return False\\n\\n    if arg1 is None:\\n        return True\\n    elif isinstance(arg1, (int, str, bool, np.bool_, np.integer, np.str_)):\\n        if arg1 != arg2:\\n            if print_content is not None:\\n                print(f'{print_content}, arg1:{arg1}, arg2:{arg2}')\\n            return False\\n        return True\\n    elif isinstance(arg1, (float, np.floating)):\\n        if not np.isclose(arg1, arg2, rtol=rtol, atol=atol, equal_nan=True):\\n            if print_content is not None:\\n                print(f'{print_content}, arg1:{arg1}, arg2:{arg2}')\\n            return False\\n        return True\\n    elif isinstance(arg1, (tuple, list)):\\n        if len(arg1) != len(arg2):\\n            if print_content is not None:\\n                print(f'{print_content}, length is not equal:{len(arg1)}, {len(arg2)}')\\n            return False\\n        if not all([\\n                compare_arguments_nested(None, sub_arg1, sub_arg2, rtol=rtol, atol=atol)\\n                for sub_arg1, sub_arg2 in zip(arg1, arg2)\\n        ]):\\n            if print_content is not None:\\n                print(f'{print_content}')\\n            return False\\n        return True\\n    elif isinstance(arg1, Mapping):\\n        keys1 = arg1.keys()\\n        keys2 = arg2.keys()\\n        if len(keys1) != len(keys2):\\n            if print_content is not None:\\n                print(f'{print_content}, key length is not equal:{len(keys1)}, {len(keys2)}')\\n            return False\\n        if len(set(keys1) - set(keys2)) > 0:\\n            if print_content is not None:\\n                print(f'{print_content}, key diff:{set(keys1) - set(keys2)}')\\n            return False\\n        if not all([compare_arguments_nested(None, arg1[key], arg2[key], rtol=rtol, atol=atol) for key in keys1]):\\n            if print_content is not None:\\n                print(f'{print_content}')\\n            return False\\n        return True\\n    elif isinstance(arg1, np.ndarray):\\n        arg1 = np.where(np.equal(arg1, None), np.NaN, arg1).astype(dtype=float)\\n        arg2 = np.where(np.equal(arg2, None), np.NaN, arg2).astype(dtype=float)\\n        if not all(np.isclose(arg1, arg2, rtol=rtol, atol=atol, equal_nan=True).flatten()):\\n            if print_content is not None:\\n                print(f'{print_content}')\\n            return False\\n        return True\\n    else:\\n        if ignore_unknown_type:\\n            return True\\n        else:\\n            raise ValueError(f'type not supported: {type1}')\\n\\n\\n_DIST_SCRIPT_TEMPLATE = \\\"\\\"\\\"\\nimport ast\\nimport argparse\\nimport pickle\\nimport torch\\nfrom torch import distributed as dist\\nfrom modelscope.utils.torch_utils import get_dist_info\\nimport {}\\n\\nparser = argparse.ArgumentParser()\\nparser.add_argument('--save_all_ranks', type=ast.literal_eval, help='save all ranks results')\\nparser.add_argument('--save_file', type=str, help='save file')\\nparser.add_argument('--local_rank', type=int, default=0)\\nargs = parser.parse_args()\\n\\n\\ndef main():\\n    results = {}.{}({})  # module.func(params)\\n    if args.save_all_ranks:\\n        save_file = args.save_file + str(dist.get_rank())\\n        with open(save_file, 'wb') as f:\\n            pickle.dump(results, f)\\n    else:\\n        rank, _ = get_dist_info()\\n        if rank == 0:\\n            with open(args.save_file, 'wb') as f:\\n                pickle.dump(results, f)\\n\\n\\nif __name__ == '__main__':\\n    main()\\n\\\"\\\"\\\"\\n\\n\\nclass DistributedTestCase(unittest.TestCase):\\n    \\\"\\\"\\\"Distributed TestCase for test function with distributed mode.\\n    Examples:\\n        >>> import torch\\n        >>> from torch import distributed as dist\\n        >>> from modelscope.utils.torch_utils import init_dist\\n\\n        >>> def _test_func(*args, **kwargs):\\n        >>>     init_dist(launcher='pytorch')\\n        >>>     rank = dist.get_rank()\\n        >>>     if rank == 0:\\n        >>>         value = torch.tensor(1.0).cuda()\\n        >>>     else:\\n        >>>         value = torch.tensor(2.0).cuda()\\n        >>>     dist.all_reduce(value)\\n        >>>     return value.cpu().numpy()\\n\\n        >>> class DistTest(DistributedTestCase):\\n        >>>     def test_function_dist(self):\\n        >>>         args = ()  # args should be python builtin type\\n        >>>         kwargs = {}  # kwargs should be python builtin type\\n        >>>         self.start(\\n        >>>             _test_func,\\n        >>>             num_gpus=2,\\n        >>>             assert_callback=lambda x: self.assertEqual(x, 3.0),\\n        >>>             *args,\\n        >>>             **kwargs,\\n        >>>         )\\n    \\\"\\\"\\\"\\n\\n    def _start(self, dist_start_cmd, func, num_gpus, assert_callback=None, save_all_ranks=False, *args, **kwargs):\\n        script_path = func.__code__.co_filename\\n        script_dir, script_name = os.path.split(script_path)\\n        script_name = os.path.splitext(script_name)[0]\\n        func_name = func.__qualname__\\n\\n        func_params = []\\n        for arg in args:\\n            if isinstance(arg, str):\\n                arg = ('\\\\'{}\\\\''.format(arg))\\n            func_params.append(str(arg))\\n\\n        for k, v in kwargs.items():\\n            if isinstance(v, str):\\n                v = ('\\\\'{}\\\\''.format(v))\\n            func_params.append('{}={}'.format(k, v))\\n\\n        func_params = ','.join(func_params).strip(',')\\n\\n        tmp_run_file = tempfile.NamedTemporaryFile(suffix='.py').name\\n        tmp_res_file = tempfile.NamedTemporaryFile(suffix='.pkl').name\\n\\n        with open(tmp_run_file, 'w') as f:\\n            print('save temporary run file to : {}'.format(tmp_run_file))\\n            print('save results to : {}'.format(tmp_res_file))\\n            run_file_content = _DIST_SCRIPT_TEMPLATE.format(script_name, script_name, func_name, func_params)\\n            f.write(run_file_content)\\n\\n        tmp_res_files = []\\n        if save_all_ranks:\\n            for i in range(num_gpus):\\n                tmp_res_files.append(tmp_res_file + str(i))\\n        else:\\n            tmp_res_files = [tmp_res_file]\\n        self.addCleanup(self.clean_tmp, [tmp_run_file] + tmp_res_files)\\n\\n        tmp_env = copy.deepcopy(os.environ)\\n        tmp_env['PYTHONPATH'] = ':'.join((tmp_env.get('PYTHONPATH', ''), script_dir)).lstrip(':')\\n        # avoid distributed test hang\\n        tmp_env['NCCL_P2P_DISABLE'] = '1'\\n        script_params = '--save_all_ranks=%s --save_file=%s' % (save_all_ranks, tmp_res_file)\\n        script_cmd = '%s %s %s' % (dist_start_cmd, tmp_run_file, script_params)\\n        print('script command: %s' % script_cmd)\\n        res = subprocess.call(script_cmd, shell=True, env=tmp_env)\\n\\n        script_res = []\\n        for res_file in tmp_res_files:\\n            with open(res_file, 'rb') as f:\\n                script_res.append(pickle.load(f))\\n        if not save_all_ranks:\\n            script_res = script_res[0]\\n\\n        if assert_callback:\\n            assert_callback(script_res)\\n\\n        self.assertEqual(res, 0, msg='The test function ``{}`` in ``{}`` run failed!'.format(func_name, script_name))\\n\\n        return script_res\\n\\n    def start(self, func, num_gpus, assert_callback=None, save_all_ranks=False, *args, **kwargs):\\n        from .torch_utils import _find_free_port\\n        ip = socket.gethostbyname(socket.gethostname())\\n        if 'dist_start_cmd' in kwargs:\\n            dist_start_cmd = kwargs.pop('dist_start_cmd')\\n        else:\\n            dist_start_cmd = '%s -m torch.distributed.launch --nproc_per_node=%d ' \\\\\\n                             '--master_addr=\\\\'%s\\\\' --master_port=%s' % (sys.executable, num_gpus, ip, _find_free_port())\\n\\n        return self._start(\\n            dist_start_cmd=dist_start_cmd,\\n            func=func,\\n            num_gpus=num_gpus,\\n            assert_callback=assert_callback,\\n            save_all_ranks=save_all_ranks,\\n            *args,\\n            **kwargs)\\n\\n    def clean_tmp(self, tmp_file_list):\\n        for file in tmp_file_list:\\n            if os.path.exists(file):\\n                if os.path.isdir(file):\\n                    shutil.rmtree(file)\\n                else:\\n                    os.remove(file)\\n\\n\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport logging\\nimport os\\n\\nimport json\\nimport requests\\n\\nfrom swift.version import __version__\\n\\n\\n# 打标\\nclass ModelTag(object):\\n    _URL = os.environ.get('MODEL_TAG_URL', None)\\n\\n    # 模型测试结果\\n    BATCH_COMMIT_RESULT_URL = f'{_URL}/batchCommitResult'\\n    # 测试阶段完成\\n    BATCH_REFRESH_STAGE_URL = f'{_URL}/batchRefreshStage'\\n    # query_model_stage\\n    QUERY_MODEL_STAGE_URL = f'{_URL}/queryModelStage'\\n\\n    HEADER = {'Content-Type': 'application/json'}\\n\\n    # 检测结果\\n    MODEL_SKIP = 0\\n    MODEL_FAIL = 1\\n    MODEL_PASS = 2\\n\\n    class ItemResult(object):\\n\\n        def __init__(self):\\n            self.result = 0\\n            self.name = ''\\n            self.info = ''\\n\\n        def to_json(self):\\n            return {'name': self.name, 'result': self.result, 'info': self.info}\\n\\n    def __init__(self):\\n        self.job_name = ''\\n        self.job_id = ''\\n        self.model = ''\\n        self.sdk_version = ''\\n        self.image_version = ''\\n        self.domain = ''\\n        self.task = ''\\n        self.source = ''\\n        self.stage = ''\\n        # ItemResult list\\n        self.item_result = []\\n\\n    # 发送请求\\n    def _post_request(self, url, param):\\n        try:\\n            logging.info(url + ' query: ' + str(json.dumps(param, ensure_ascii=False)))\\n            res = requests.post(url=url, headers=self.HEADER, data=json.dumps(param, ensure_ascii=False).encode('utf8'))\\n            if res.status_code == 200:\\n                logging.info(f'{url} post结果: ' + res.text)\\n                res_json = json.loads(res.text)\\n                if int(res_json['errorCode']) == 200:\\n                    return res_json['content']\\n                else:\\n                    logging.error(res.text)\\n            else:\\n                logging.error(res.text)\\n        except Exception as e:\\n            logging.error(e)\\n\\n        return None\\n\\n    # 提交模型测试结果\\n    def batch_commit_result(self):\\n        try:\\n            param = {\\n                'sdkVersion':\\n                self.sdk_version,\\n                'imageVersion':\\n                self.image_version,\\n                'source':\\n                self.source,\\n                'jobName':\\n                self.job_name,\\n                'jobId':\\n                self.job_id,\\n                'modelList': [{\\n                    'model': self.model,\\n                    'domain': self.domain,\\n                    'task': self.task,\\n                    'itemResult': self.item_result\\n                }]\\n            }\\n            return self._post_request(self.BATCH_COMMIT_RESULT_URL, param)\\n\\n        except Exception as e:\\n            logging.error(e)\\n\\n        return\\n\\n    # 测试阶段完成\\n    def batch_refresh_stage(self):\\n        try:\\n            param = {\\n                'sdkVersion': self.sdk_version,\\n                'imageVersion': self.image_version,\\n                'source': self.source,\\n                'stage': self.stage,\\n                'modelList': [{\\n                    'model': self.model,\\n                    'domain': self.domain,\\n                    'task': self.task\\n                }]\\n            }\\n            return self._post_request(self.BATCH_REFRESH_STAGE_URL, param)\\n\\n        except Exception as e:\\n            logging.error(e)\\n\\n        return\\n\\n    # 查询模型某个阶段的最新测试结果（只返回单个结果\\n    def query_model_stage(self):\\n        try:\\n            param = {\\n                'sdkVersion': self.sdk_version,\\n                'model': self.model,\\n                'stage': self.stage,\\n                'imageVersion': self.image_version\\n            }\\n            return self._post_request(self.QUERY_MODEL_STAGE_URL, param)\\n\\n        except Exception as e:\\n            logging.error(e)\\n\\n        return None\\n\\n    # 提交模型UT测试结果\\n    \\\"\\\"\\\"\\n        model_tag = ModelTag()\\n        model_tag.model = \\\"XXX\\\"\\n        model_tag.sdk_version = \\\"0.3.7\\\"\\n        model_tag.domain = \\\"nlp\\\"\\n        model_tag.task = \\\"word-segmentation\\\"\\n        item = model_tag.ItemResult()\\n        item.result = model_tag.MODEL_PASS\\n        item.name = \\\"ALL\\\"\\n        item.info = \\\"\\\"\\n        model_tag.item_result.append(item.to_json())\\n    \\\"\\\"\\\"\\n\\n    def commit_ut_result(self):\\n        if self._URL is not None and self._URL != '':\\n            self.job_name = 'UT'\\n            self.source = 'dev'\\n            self.stage = 'integration'\\n\\n            self.batch_commit_result()\\n            self.batch_refresh_stage()\\n\\n\\ndef commit_model_ut_result(model_name, ut_result):\\n    model_tag = ModelTag()\\n    model_tag.model = model_name.replace('damo/', '')\\n    model_tag.sdk_version = __version__\\n    # model_tag.domain = \\\"\\\"\\n    # model_tag.task = \\\"\\\"\\n    item = model_tag.ItemResult()\\n    item.result = ut_result\\n    item.name = 'ALL'\\n    item.info = ''\\n    model_tag.item_result.append(item.to_json())\\n    model_tag.commit_ut_result()\\n\\n\\nif __name__ == '__main__':\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '1'\\n    os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport torch\\n\\nfrom swift import get_logger\\nfrom swift.llm import DatasetName, InferArguments, ModelType, SftArguments, infer_main, sft_main\\n\\nNO_EVAL_HUMAN = True\\n\\nlogger = get_logger()\\n\\n\\nclass TestRun2(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(f'Testing {type(self).__name__}.{self._testMethodName}')\\n        self._tmp_dir = tempfile.TemporaryDirectory()\\n        self.tmp_dir = self._tmp_dir.name\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n\\n    def test_loss_matching(self):\\n        output_dir = 'output'\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        losses = []\\n        for tuner_backend in ['swift', 'peft']:\\n            if tuner_backend == 'swift':\\n                bool_var = True\\n            else:\\n                bool_var = False\\n            torch.cuda.empty_cache()\\n            output = sft_main([\\n                '--model_type', ModelType.qwen_7b_chat, '--eval_steps', '5', '--tuner_backend', tuner_backend,\\n                '--dataset', f'{DatasetName.leetcode_python_en}#200', '--output_dir', output_dir,\\n                '--gradient_checkpointing', 'true', '--max_new_tokens', '100', '--use_flash_attn', 'true',\\n                '--lora_target_modules', 'ALL', '--seed', '0', '--lora_bias_trainable', 'all', '--lora_modules_to_save',\\n                'EMBEDDING', 'LN', 'lm_head'\\n            ])\\n            best_model_checkpoint = output['best_model_checkpoint']\\n            print(f'best_model_checkpoint: {best_model_checkpoint}')\\n            load_dataset_config = str(bool_var or NO_EVAL_HUMAN)\\n            if load_dataset_config:\\n                val_dataset_sample = 2\\n            else:\\n                val_dataset_sample = -1\\n            torch.cuda.empty_cache()\\n            infer_main([\\n                '--ckpt_dir', best_model_checkpoint, '--val_dataset_sample',\\n                str(val_dataset_sample), '--max_new_tokens', '100', '--use_flash_attn', 'false', '--verbose',\\n                str(not bool_var), '--merge_lora',\\n                str(bool_var), '--load_dataset_config',\\n                str(load_dataset_config)\\n            ])\\n            loss = output['log_history'][-1]['train_loss']\\n            losses.append(loss)\\n        self.assertTrue(abs(losses[0] - losses[1]) < 5e-4)\\n        print(f'swift_loss: {losses[0]}')\\n        print(f'peft_loss: {losses[1]}')\\n        self.assertTrue(0.95 <= losses[0] <= 1)\\n\\n    def test_yi_vl_6b_chat(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        folder = os.path.join(os.path.dirname(__file__), 'data')\\n        torch.cuda.empty_cache()\\n        output = sft_main(\\n            SftArguments(\\n                model_type=ModelType.yi_vl_6b_chat,\\n                #   dataset=DatasetName.capcha_images,\\n                lora_target_modules='ALL',\\n                train_dataset_sample=100,\\n                eval_steps=5,\\n                custom_train_dataset_path=[os.path.join(folder, 'multi_modal_2.jsonl')],\\n                lazy_tokenize=False))\\n        best_model_checkpoint = output['best_model_checkpoint']\\n        torch.cuda.empty_cache()\\n        infer_main(InferArguments(ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=2))\\n\\n    def test_glm4v_9b_chat(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        folder = os.path.join(os.path.dirname(__file__), 'data')\\n        torch.cuda.empty_cache()\\n        output = sft_main(\\n            SftArguments(\\n                model_type=ModelType.glm4v_9b_chat,\\n                # dataset=DatasetName.capcha_images,\\n                # lora_target_modules='ALL',\\n                train_dataset_sample=100,\\n                eval_steps=5,\\n                custom_train_dataset_path=[os.path.join(folder, 'multi_modal_3.jsonl')],\\n                lazy_tokenize=False))\\n        best_model_checkpoint = output['best_model_checkpoint']\\n        torch.cuda.empty_cache()\\n        infer_main(\\n            InferArguments(\\n                ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=2, merge_lora=True))\\n\\n    def test_baichuan2_chat_int4(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        from swift.llm import sft_main, infer_main, SftArguments, InferArguments, ModelType, DatasetName\\n        output = sft_main(\\n            SftArguments(\\n                model_type=ModelType.baichuan2_7b_chat_int4,\\n                dataset=['alpaca-zh'],\\n                lora_target_modules=['DEFAULT', 'EMBEDDING'],\\n                train_dataset_sample=20))\\n        best_model_checkpoint = output['best_model_checkpoint']\\n        infer_main(InferArguments(ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=1))\\n\\n    def test_self_cognition(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        for dataset in [[], [DatasetName.alpaca_zh, DatasetName.alpaca_en]]:\\n            sft_args = SftArguments(\\n                model_type=ModelType.qwen1half_1_8b_chat_int4,\\n                dataset=dataset,  # no dataset\\n                train_dataset_sample=100,\\n                dtype='fp16',\\n                eval_steps=5,\\n                output_dir='output',\\n                lora_target_modules=['ALL', 'EMBEDDING'],\\n                lazy_tokenize=True,\\n                max_length=512,\\n                self_cognition_sample=100,\\n                model_name=['小黄', 'Xiao Huang'],\\n                model_author=['魔搭', 'ModelScope'],\\n                use_flash_attn=True)\\n            torch.cuda.empty_cache()\\n            output = sft_main(sft_args)\\n            last_model_checkpoint = output['last_model_checkpoint']\\n            best_model_checkpoint = output['best_model_checkpoint']\\n            print(f'last_model_checkpoint: {last_model_checkpoint}')\\n            print(f'best_model_checkpoint: {best_model_checkpoint}')\\n            ckpt_dir = best_model_checkpoint or last_model_checkpoint\\n            if len(dataset) == 0:\\n                continue\\n            infer_args = InferArguments(\\n                ckpt_dir=ckpt_dir, val_dataset_sample=2, verbose=False, load_dataset_config=True)\\n            # merge_lora_main(infer_args)\\n            torch.cuda.empty_cache()\\n            result = infer_main(infer_args)\\n            print(result)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nif __name__ == '__main__':\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport time\\nimport unittest\\nfrom functools import partial\\nfrom typing import Any, Dict, List\\n\\nimport torch\\nimport transformers\\nfrom datasets import Dataset as HfDataset\\nfrom modelscope import Model, MsDataset, snapshot_download\\nfrom packaging import version\\nfrom torch.nn.utils.rnn import pad_sequence\\nfrom transformers import AutoConfig, AutoTokenizer\\n\\nfrom swift import Trainer, TrainingArguments, get_logger\\nfrom swift.llm import (DatasetName, InferArguments, ModelType, RLHFArguments, SftArguments, infer_main, merge_lora_main,\\n                       rlhf_main, sft_main)\\n\\nNO_EVAL_HUMAN = True\\n\\nlogger = get_logger()\\n\\n\\nclass TestRun(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(f'Testing {type(self).__name__}.{self._testMethodName}')\\n        self._tmp_dir = tempfile.TemporaryDirectory()\\n        self.tmp_dir = self._tmp_dir.name\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n\\n    def test_template(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        torch.cuda.empty_cache()\\n        output = sft_main(\\n            SftArguments(\\n                model_type=ModelType.qwen1half_1_8b,\\n                template_type='qwen',\\n                sft_type='full',\\n                dataset=f'{DatasetName.jd_sentiment_zh}#200',\\n                eval_steps=5))\\n        best_model_checkpoint = output['best_model_checkpoint']\\n        torch.cuda.empty_cache()\\n        result = infer_main(\\n            InferArguments(ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=2))\\n        assert len(result['result'][0]['response']) < 20\\n\\n    def test_basic(self):\\n        output_dir = 'output'\\n        quantization_bit_list = [0, 4]\\n        train_dataset_fnames = [\\n            'alpaca.csv', 'chatml.jsonl', 'swift_pre.jsonl', 'swift_single.csv', 'swift_multi.jsonl',\\n            'swift_multi.json#2'\\n        ]\\n        folder = os.path.join(os.path.dirname(__file__), 'data')\\n        dataset = [\\n            f'MS::{DatasetName.alpaca_zh}#20',\\n            f'{DatasetName.jd_sentiment_zh}#20',\\n            'AI-ModelScope/alpaca-gpt4-data-zh#20',\\n            'HF::llm-wizard/alpaca-gpt4-data-zh#20',\\n            'hurner/alpaca-gpt4-data-zh#20',\\n            'HF::shibing624/alpaca-zh#20',\\n        ] + [os.path.join(folder, fname) for fname in train_dataset_fnames]\\n        if not __name__ == '__main__':\\n            output_dir = self.tmp_dir\\n            quantization_bit_list = [4]\\n            dataset = dataset[:2]\\n        import transformers\\n        from packaging import version\\n        if version.parse(transformers.__version__) >= version.parse('4.42'):\\n            model_type = ModelType.qwen2_0_5b_instruct\\n        else:\\n            model_type = ModelType.chatglm3_6b\\n        for quantization_bit in quantization_bit_list:\\n            if quantization_bit == 4 and version.parse(transformers.__version__) >= version.parse('4.38'):\\n                continue\\n            predict_with_generate = True\\n            if quantization_bit == 0:\\n                predict_with_generate = False\\n            sft_args = SftArguments(\\n                model_type=model_type,\\n                template_type='AUTO',\\n                lora_target_modules=['AUTO', 'EMBEDDING'],\\n                quantization_bit=quantization_bit,\\n                batch_size=2,\\n                eval_steps=5,\\n                adam_beta2=0.95,\\n                check_dataset_strategy='warning',\\n                predict_with_generate=predict_with_generate,\\n                dataset=dataset,\\n                val_dataset=f'{DatasetName.jd_sentiment_zh}#20',\\n                output_dir=output_dir,\\n                include_num_input_tokens_seen=True,\\n                gradient_checkpointing=True)\\n            self.assertTrue(sft_args.gradient_accumulation_steps == 8)\\n            torch.cuda.empty_cache()\\n            output = sft_main(sft_args)\\n            print(output)\\n            best_model_checkpoint = output['best_model_checkpoint']\\n            print(f'best_model_checkpoint: {best_model_checkpoint}')\\n            if __name__ == '__main__':\\n                infer_args = InferArguments(\\n                    ckpt_dir=best_model_checkpoint,\\n                    merge_lora={\\n                        0: True,\\n                        4: False\\n                    }[quantization_bit],\\n                    merge_device_map='cpu',\\n                    load_dataset_config=NO_EVAL_HUMAN,\\n                    val_dataset_sample=5)\\n                torch.cuda.empty_cache()\\n                result = infer_main(infer_args)\\n                print(result)\\n        # if __name__ == '__main__':\\n        #     app_ui_main(infer_args)\\n\\n    def test_vl_audio(self):\\n        output_dir = 'output'\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        model_type_list = [ModelType.qwen_vl_chat, ModelType.qwen_audio_chat]\\n        dataset_list = [DatasetName.coco_en_mini, DatasetName.aishell1_zh_mini]\\n        for model_type, dataset in zip(model_type_list, dataset_list):\\n            sft_args = SftArguments(\\n                model_type=model_type,\\n                template_type='AUTO',\\n                eval_steps=5,\\n                check_dataset_strategy='warning',\\n                lora_target_modules='ALL',\\n                train_dataset_sample=200,\\n                dataset=[dataset],\\n                output_dir=output_dir,\\n                gradient_checkpointing=True,\\n                lazy_tokenize=True,\\n                disable_tqdm=True)\\n            torch.cuda.empty_cache()\\n            output = sft_main(sft_args)\\n            print(output)\\n            best_model_checkpoint = output['best_model_checkpoint']\\n            print(f'best_model_checkpoint: {best_model_checkpoint}')\\n            infer_args = InferArguments(\\n                ckpt_dir=best_model_checkpoint,\\n                load_dataset_config=True,\\n                stream={\\n                    ModelType.qwen_vl_chat: True,\\n                    ModelType.qwen_audio_chat: False\\n                }[model_type],\\n                val_dataset_sample=5)\\n            # merge_lora_main(infer_args)  # TODO: ERROR FIX\\n            torch.cuda.empty_cache()\\n            result = infer_main(infer_args)\\n            print(result)\\n\\n    def test_vqa(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        train_dataset_fnames = ['science-qa#300', 'a-okvqa#300', 'alpaca-cleaned#300']\\n        val_dataset_fnames = ['okvqa']\\n\\n        sft_args = SftArguments(\\n            model_type='yi-vl-6b-chat',\\n            dataset=train_dataset_fnames,\\n            lora_target_modules='ALL',\\n            num_train_epochs=1,\\n            check_dataset_strategy='warning')\\n\\n        torch.cuda.empty_cache()\\n        result = sft_main(sft_args)\\n        best_model_checkpoint = result['best_model_checkpoint']\\n\\n        infer_args = InferArguments(\\n            ckpt_dir=best_model_checkpoint,\\n            load_args_from_ckpt_dir=True,\\n            load_dataset_config=True,\\n            merge_lora=False,\\n            val_dataset_sample=10,\\n            dataset=val_dataset_fnames)\\n        torch.cuda.empty_cache()\\n        infer_main(infer_args)\\n\\n    def test_gpt4o_image(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        train_dataset_fnames = ['sharegpt-4o-image']\\n\\n        sft_args = SftArguments(\\n            model_type='yi-vl-6b-chat',\\n            dataset=train_dataset_fnames,\\n            lora_target_modules='ALL',\\n            train_dataset_sample=200,\\n            num_train_epochs=1,\\n            eval_steps=10,\\n            save_steps=10,\\n            check_dataset_strategy='warning')\\n\\n        torch.cuda.empty_cache()\\n        self.assertTrue(sft_main(sft_args)['best_model_checkpoint'])\\n\\n    def test_custom_dataset(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        train_dataset_fnames = [\\n            'alpaca.csv', 'chatml.jsonl', 'swift_pre.jsonl', 'swift_single.csv', 'swift_multi.jsonl',\\n            'swift_multi.json', 'sharegpt.jsonl'\\n        ]\\n        val_dataset_fnames = [\\n            'alpaca.jsonl',\\n            'alpaca2.csv',\\n            'conversations.jsonl',\\n            'swift_pre.csv',\\n            'swift_single.jsonl',\\n            # 'swift_#:#.jsonl#3'\\n        ]\\n        folder = os.path.join(os.path.dirname(__file__), 'data')\\n        resume_from_checkpoint = None\\n        for num_train_epochs in [1, 2]:\\n            sft_args = SftArguments(\\n                model_type='qwen-7b-chat',\\n                dataset=['self-cognition#20'],\\n                custom_train_dataset_path=[os.path.join(folder, fname) for fname in train_dataset_fnames],\\n                custom_val_dataset_path=[os.path.join(folder, fname) for fname in val_dataset_fnames],\\n                lora_target_modules='ALL',\\n                resume_from_checkpoint=resume_from_checkpoint,\\n                num_train_epochs=num_train_epochs,\\n                model_name='小黄',\\n                model_author='魔搭',\\n                check_dataset_strategy='warning')\\n\\n            torch.cuda.empty_cache()\\n            result = sft_main(sft_args)\\n            best_model_checkpoint = result['best_model_checkpoint']\\n            resume_from_checkpoint = result['last_model_checkpoint']\\n\\n        for load_args_from_ckpt_dir in [True, False]:\\n            kwargs = {}\\n            if load_args_from_ckpt_dir is False:\\n                kwargs = {'model_type': 'qwen-7b-chat'}\\n            infer_args = InferArguments(\\n                ckpt_dir=best_model_checkpoint,\\n                load_args_from_ckpt_dir=load_args_from_ckpt_dir,\\n                load_dataset_config=load_args_from_ckpt_dir and NO_EVAL_HUMAN,\\n                merge_lora=load_args_from_ckpt_dir,\\n                val_dataset_sample=-1,\\n                custom_val_dataset_path=[os.path.join(folder, fname) for fname in val_dataset_fnames],\\n                **kwargs)\\n            torch.cuda.empty_cache()\\n            infer_main(infer_args)\\n\\n    def test_cogagent_instruct(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        quantization_bit = 4\\n        if version.parse(transformers.__version__) >= version.parse('4.38'):\\n            quantization_bit = 0\\n        torch.cuda.empty_cache()\\n        output = sft_main(\\n            SftArguments(\\n                model_type=ModelType.cogagent_18b_instruct,\\n                dataset=DatasetName.coco_en_2_mini,\\n                train_dataset_sample=100,\\n                lora_target_modules='ALL',\\n                eval_steps=5,\\n                quantization_bit=quantization_bit))\\n        best_model_checkpoint = output['best_model_checkpoint']\\n        torch.cuda.empty_cache()\\n        infer_main(InferArguments(ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=2))\\n\\n    def test_xcomposer_chat(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        torch.cuda.empty_cache()\\n        output = sft_main(\\n            SftArguments(\\n                model_type=ModelType.internlm_xcomposer2_7b_chat,\\n                dataset=DatasetName.coco_en_mini,\\n                lora_target_modules='DEFAULT',\\n                train_dataset_sample=100,\\n                eval_steps=5))\\n        best_model_checkpoint = output['best_model_checkpoint']\\n        torch.cuda.empty_cache()\\n        infer_main(InferArguments(ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=2))\\n\\n    def test_rlhf(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        torch.cuda.empty_cache()\\n        # llm rlhf\\n        rlhf_types = ['dpo', 'orpo', 'simpo', 'kto', 'cpo']\\n        for rlhf_type in rlhf_types:\\n            dataset_name = 'hh-rlhf-cn-harmless-base-cn' if rlhf_type != 'kto' else 'ultrafeedback-kto'\\n            output = rlhf_main(\\n                RLHFArguments(\\n                    rlhf_type=rlhf_type,\\n                    model_type=ModelType.qwen_1_8b_chat,\\n                    dataset=dataset_name,\\n                    train_dataset_sample=100,\\n                    eval_steps=5))\\n            best_model_checkpoint = output['best_model_checkpoint']\\n            torch.cuda.empty_cache()\\n            infer_main(InferArguments(ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=2))\\n\\n        # mllm rlhf\\n        visual_rlhf_types = ['dpo', 'orpo', 'simpo', 'cpo']\\n        test_model = ['llava1_6-mistral-7b-instruct', 'internvl2-2b',\\n                      'florence-2-large']  # decoder only and encoder-decoder\\n        for rlhf_type in visual_rlhf_types:\\n            for model in test_model:\\n                dataset_name = 'rlaif-v'\\n                output = rlhf_main(\\n                    RLHFArguments(\\n                        rlhf_type=rlhf_type,\\n                        model_type=model,\\n                        dataset=dataset_name,\\n                        train_dataset_sample=100,\\n                        eval_steps=5))\\n                best_model_checkpoint = output['best_model_checkpoint']\\n                torch.cuda.empty_cache()\\n                infer_main(\\n                    InferArguments(ckpt_dir=best_model_checkpoint, load_dataset_config=True, val_dataset_sample=2))\\n\\n    def test_pai_compat(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        from swift.llm import sft_main, infer_main\\n        os.environ['PAI_TRAINING_JOB_ID'] = '123456'\\n        folder = os.path.join(os.path.dirname(__file__), 'config')\\n        tensorboard_dir = os.path.join('output/pai_test', 'pai_tensorboard')\\n        os.environ['PAI_OUTPUT_TENSORBOARD'] = tensorboard_dir\\n        sft_json = os.path.join(folder, 'sft.json')\\n        infer_json = os.path.join(folder, 'infer.json')\\n        torch.cuda.empty_cache()\\n        output = sft_main([sft_json])\\n        print()\\n        infer_args = {\\n            'ckpt_dir': output['best_model_checkpoint'],\\n            'val_dataset_sample': 2,\\n            'load_dataset_config': True,\\n        }\\n        import json\\n        with open(infer_json, 'w') as f:\\n            json.dump(infer_args, f, ensure_ascii=False, indent=4)\\n        torch.cuda.empty_cache()\\n        infer_main([infer_json])\\n        os.environ.pop('PAI_TRAINING_JOB_ID')\\n\\n    def test_deepseek_vl_chat(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        folder = os.path.join(os.path.dirname(__file__), 'data')\\n        torch.cuda.empty_cache()\\n        sft_main(\\n            SftArguments(\\n                model_type=ModelType.deepseek_vl_1_3b_chat,\\n                #   dataset=DatasetName.capcha_images,\\n                lora_target_modules='ALL',\\n                train_dataset_sample=100,\\n                eval_steps=5,\\n                custom_train_dataset_path=[os.path.join(folder, 'multi_modal_1.jsonl')],\\n                lazy_tokenize=False))\\n\\n\\ndef data_collate_fn(batch: List[Dict[str, Any]], tokenizer) -> Dict[str, torch.Tensor]:\\n    # text-classification\\n    assert tokenizer.pad_token_id is not None\\n    input_ids = [torch.tensor(b['input_ids']) for b in batch]\\n    labels = torch.tensor([b['labels'] for b in batch])\\n    attention_mask = [torch.ones(len(input_ids[i]), dtype=torch.int64) for i in range(len(input_ids))]\\n\\n    input_ids = pad_sequence(input_ids, batch_first=True, padding_value=tokenizer.pad_token_id)\\n    attention_mask = pad_sequence(attention_mask, batch_first=True, padding_value=0)\\n    return {'input_ids': input_ids, 'attention_mask': attention_mask, 'labels': labels}\\n\\n\\nclass BertTrainer(Trainer):\\n\\n    def compute_loss(self, model, inputs, return_outputs=False):\\n        outputs = model(**inputs)\\n        loss = outputs.loss\\n        if loss is None:\\n            logits, loss = list(outputs.logits)\\n        return (loss, outputs) if return_outputs else loss\\n\\n\\nclass TestTrainer(unittest.TestCase):\\n\\n    def setUp(self):\\n        self._tmp_dir = tempfile.TemporaryDirectory()\\n        self.tmp_dir = self._tmp_dir.name\\n        # self.tmp_dir = 'test'\\n        logger.info(f'self.tmp_dir: {self.tmp_dir}')\\n\\n    def tearDown(self):\\n        if os.path.isdir(self.tmp_dir):\\n            shutil.rmtree(self.tmp_dir)\\n        # api = HubApi()\\n        # api.delete_model(self.hub_model_id)\\n        # logger.info(f'delete model: {self.hub_model_id}')\\n\\n    def test_trainer(self):\\n        self.hub_model_id = 'test_trainer2'\\n        logger.info(f'self.hub_model_id: {self.hub_model_id}')\\n        self.tmp_dir = 'output/damo/nlp_structbert_backbone_base_std'\\n        push_to_hub = True\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n        model_id = 'damo/nlp_structbert_backbone_base_std'\\n        model_dir = snapshot_download(model_id, 'master')\\n        tokenizer = AutoTokenizer.from_pretrained(model_dir)\\n        dataset = MsDataset.load('clue', subset_name='tnews')\\n        num_labels = max(dataset['train']['label']) + 1\\n        model = Model.from_pretrained(model_dir, task='text-classification', num_labels=num_labels)\\n        train_dataset, val_dataset = dataset['train'].to_hf_dataset(), dataset['validation'].to_hf_dataset()\\n        train_dataset: HfDataset = train_dataset.select(range(100))\\n        val_dataset: HfDataset = val_dataset.select(range(20))\\n\\n        #\\n        def tokenize_func(examples):\\n            data = tokenizer(examples['sentence'], return_attention_mask=False)\\n            examples['input_ids'] = data['input_ids']\\n            examples['labels'] = examples['label']\\n            del examples['sentence'], examples['label']\\n            return examples\\n\\n        train_dataset = train_dataset.map(tokenize_func)\\n        val_dataset = val_dataset.map(tokenize_func)\\n\\n        data_collator = partial(data_collate_fn, tokenizer=tokenizer)\\n        for save_only_model in [True, False]:\\n            trainer_args = TrainingArguments(\\n                self.tmp_dir,\\n                do_train=True,\\n                do_eval=True,\\n                num_train_epochs=1,\\n                evaluation_strategy='steps',\\n                save_strategy='steps',\\n                per_device_train_batch_size=4,\\n                per_device_eval_batch_size=4,\\n                push_to_hub=push_to_hub,\\n                hub_token=None,  # use env var\\n                hub_private_repo=True,\\n                hub_strategy='every_save',\\n                hub_model_id=self.hub_model_id,\\n                overwrite_output_dir=True,\\n                save_steps=10,\\n                save_total_limit=2,\\n                metric_for_best_model='loss',\\n                greater_is_better=False,\\n                report_to=['tensorboard'],\\n                gradient_accumulation_steps=1,\\n                logging_steps=5,\\n                eval_steps=10,\\n                save_safetensors=False,\\n                save_only_model=save_only_model)\\n        trainer_args._n_gpu = 1\\n        trainer = BertTrainer(model, trainer_args, data_collator, train_dataset, val_dataset, tokenizer)\\n        self.hub_model_id = trainer_args.hub_model_id\\n        trainer.train()\\n        if trainer_args.push_to_hub:\\n            trainer.push_to_hub()\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport unittest\\n\\nimport json\\nimport torch\\nfrom modelscope import GenerationConfig\\n\\nfrom swift.llm import (TEMPLATE_MAPPING, ModelType, Template, get_default_template_type, get_model_tokenizer,\\n                       get_template, inference, messages_to_history)\\n\\nif __name__ == '__main__':\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nSKPT_TEST = True\\n\\n\\nclass TestTemplate(unittest.TestCase):\\n\\n    def test_template(self):\\n        model_types = [ModelType.qwen_7b_chat_int4]\\n        for model_type in model_types:\\n            _, tokenizer = get_model_tokenizer(model_type, load_model=False)\\n            template_type = get_default_template_type(model_type)\\n            template = get_template(template_type, tokenizer)\\n            history = [\\n                ('你好，你是谁？', '我是来自达摩院的大规模语言模型，我叫通义千问。'),\\n            ]\\n            data = {\\n                'system': 'you are a helpful assistant!',\\n                'query': '浙江的省会在哪？',\\n                'response': '浙江的省会是杭州。',\\n                'history': history\\n            }\\n            from swift.llm import print_example\\n            print_example(template.encode(data)[0], tokenizer)\\n            input_ids = template.encode(data)[0]['input_ids']\\n            print(model_type)\\n            text = tokenizer.decode(input_ids)\\n            result = \\\"\\\"\\\"<|im_start|>system\\nyou are a helpful assistant!<|im_end|>\\n<|im_start|>user\\n你好，你是谁？<|im_end|>\\n<|im_start|>assistant\\n我是来自达摩院的大规模语言模型，我叫通义千问。<|im_end|>\\n<|im_start|>user\\n浙江的省会在哪？<|im_end|>\\n<|im_start|>assistant\\n浙江的省会是杭州。<|im_end|>\\\"\\\"\\\"\\n            self.assertTrue(result == text)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_chatglm3_template(self):\\n        model_type = ModelType.chatglm3_6b\\n        template_type = get_default_template_type(model_type)\\n        model, tokenizer = get_model_tokenizer(model_type, load_model=True)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config = GenerationConfig(\\n            max_new_tokens=128,\\n            temperature=0.9,\\n            top_k=20,\\n            top_p=0.9,\\n            repetition_penalt=1.05,\\n            do_sample=True,\\n            eos_token_id=tokenizer.eos_token_id,\\n            pad_token_id=tokenizer.eos_token_id)\\n        query = '12345+234=？'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        system = 'you are a helpful assistant!'\\n        response = model.chat(tokenizer, query, history=[{'role': 'system', 'content': system}], max_length=None)[0]\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = [\\n            64790, 64792, 64794, 30910, 13, 344, 383, 260, 6483, 9319, 30992, 64795, 30910, 13, 30910, 30939, 30943,\\n            30966, 30972, 30970, 31011, 30943, 30966, 30972, 30980, 31514, 64796\\n        ] + [30910, 13]\\n        input_ids_swift = template.encode({'query': query, 'system': system})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    def test_template_grounding(self):\\n        example_single = {\\n            'query':\\n            'Where is the <ref-object>',\\n            'response':\\n            'At <bbox>',\\n            'images': ['/mnt/workspace/output.png'],\\n            'objects':\\n            json.loads(\\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [1, 2, 3, 4], \\\"\\n                       \\\"\\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\")\\n        }\\n\\n        example_single2 = {\\n            'query':\\n            'Where is the <ref-object>',\\n            'response':\\n            'At <bbox>',\\n            'images': ['/mnt/workspace/output.png'],\\n            'objects':\\n            json.loads(\\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[1, 2, 3, 4]], \\\"\\n                       \\\"\\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\")\\n        }\\n\\n        example_multi = {\\n            'query':\\n            'Where is the <ref-object>',\\n            'response':\\n            'At <bbox>',\\n            'images': ['/mnt/workspace/output.png'],\\n            'objects':\\n            json.loads(\\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[6, 7, 8, 9],[1, 2, 3, 4]], \\\"\\n                       \\\"\\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\")\\n        }\\n\\n        # qwen-vl\\n        template_dict: dict = TEMPLATE_MAPPING['qwen-vl']\\n        output = template_dict['template'].replace_box(0, example_single)\\n        self.assertTrue(output[0] == '<box>(1,2),(3,4)</box>')\\n        output = template_dict['template'].replace_box(0, example_single2)\\n        self.assertTrue(output[0] == '<box>(1,2),(3,4)</box>')\\n        output = template_dict['template'].replace_box(0, example_multi)\\n        self.assertTrue(output[0] == '<box>(6,7),(8,9)</box><box>(1,2),(3,4)</box>')\\n\\n        # qwen2-vl\\n        template_dict: dict = TEMPLATE_MAPPING['qwen2-vl']\\n        output = template_dict['template'].replace_box(0, example_single)\\n        self.assertTrue(output[0] == '<|box_start|>(1,2),(3,4)<|box_end|>')\\n        output = template_dict['template'].replace_box(0, example_single2)\\n        self.assertTrue(output[0] == '<|box_start|>(1,2),(3,4)<|box_end|>')\\n        output = template_dict['template'].replace_box(0, example_multi)\\n        self.assertTrue(output[0] == '<|box_start|>(6,7),(8,9)<|box_end|><|box_start|>(1,2),(3,4)<|box_end|>')\\n\\n        # florence\\n        template_dict: dict = TEMPLATE_MAPPING['florence']\\n        output = template_dict['template'].replace_box(0, example_single)\\n        self.assertTrue(output[0] == '<loc_1><loc_2><loc_3><loc_4>')\\n        output = template_dict['template'].replace_box(0, example_single2)\\n        self.assertTrue(output[0] == '<loc_1><loc_2><loc_3><loc_4>')\\n        output = template_dict['template'].replace_box(0, example_multi)\\n        self.assertTrue(output[0] == '<loc_6><loc_7><loc_8><loc_9>,<loc_1><loc_2><loc_3><loc_4>')\\n\\n        # internvl2\\n        template_dict: dict = TEMPLATE_MAPPING['internvl2']\\n        output = template_dict['template'].replace_box(0, example_single)\\n        self.assertTrue(output[0] == '<box> [[1, 2, 3, 4]] </box>')\\n        output = template_dict['template'].replace_box(0, example_single2)\\n        self.assertTrue(output[0] == '<box> [[1, 2, 3, 4]] </box>')\\n        output = template_dict['template'].replace_box(0, example_multi)\\n        self.assertTrue(output[0] == '<box> [[6, 7, 8, 9],[1, 2, 3, 4]] </box>')\\n\\n        # minicpm-v\\n        template_dict: dict = TEMPLATE_MAPPING['minicpm-v']\\n        output = template_dict['template'].replace_box(0, example_single)\\n        self.assertTrue(output[0] == '[(1,2),(3,4)]')\\n        output = template_dict['template'].replace_box(0, example_single2)\\n        self.assertTrue(output[0] == '[(1,2),(3,4)]')\\n        output = template_dict['template'].replace_box(0, example_multi)\\n        self.assertTrue(output[0] == '[(6,7),(8,9)],[(1,2),(3,4)]')\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_qwen_template(self):\\n        model_type = ModelType.qwen_7b_chat\\n        template_type = get_default_template_type(model_type)\\n        model, tokenizer = get_model_tokenizer(model_type, load_model=True)\\n        template = get_template(template_type, tokenizer)\\n        query = '12345+234=？'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        model.generation_config.chat_format = 'chatml'\\n        model.generation_config.max_window_size = 1024\\n        response = model.chat(tokenizer, query, None, max_length=None)[0]\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = [\\n            151644, 8948, 198, 2610, 525, 264, 10950, 17847, 13, 151645, 198, 151644, 872, 198, 16, 17, 18, 19, 20, 10,\\n            17, 18, 19, 28, 11319, 151645, 198, 151644, 77091, 198\\n        ]\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_llama_template(self):\\n        model_type = ModelType.llama2_7b_chat\\n        template_type = get_default_template_type(model_type)\\n        _, tokenizer = get_model_tokenizer(model_type, load_model=False)\\n        from modelscope import Model, snapshot_download\\n        model_dir = snapshot_download('modelscope/Llama-2-7b-chat-ms', 'master', ignore_file_pattern=[r'.+\\\\.bin$'])\\n        model = Model.from_pretrained(model_dir, device_map='auto')\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config = GenerationConfig(\\n            max_new_tokens=128,\\n            temperature=0.9,\\n            top_k=20,\\n            top_p=0.9,\\n            repetition_penalt=1.05,\\n            do_sample=True,\\n            eos_token_id=tokenizer.eos_token_id,\\n            pad_token_id=tokenizer.eos_token_id)\\n        query = '12345+234=？'\\n        print(f'query: {query}')\\n        template.use_default_system = False\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        response = model.chat({'text': query}, tokenizer)['response']\\n        print(f'official response: {response}')\\n        # ref: https://huggingface.co/blog/zh/llama2#%E5%A6%82%E4%BD%95%E6%8F%90%E7%A4%BA-llama-2\\n        query = \\\"There's a llama in my garden 😱 What should I do?\\\"\\n        response = '123'\\n        template.tokenizer.use_default_system_prompt = False\\n        messages = [{\\n            'role': 'user',\\n            'content': query\\n        }, {\\n            'role': 'assistant',\\n            'content': response\\n        }, {\\n            'role': 'user',\\n            'content': query\\n        }]\\n        input_ids_official = template.tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True)\\n        example = messages_to_history(messages)\\n        input_ids_swift = template.encode(example)[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n        template.use_default_system = True\\n        template.tokenizer.use_default_system_prompt = True\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        input_ids_official = template.tokenizer.apply_chat_template([{\\n            'role': 'user',\\n            'content': query\\n        }],\\n                                                                    tokenize=True,\\n                                                                    add_generation_prompt=True)\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_baichuan_template(self):\\n        model_type = ModelType.baichuan2_7b_chat\\n        template_type = get_default_template_type(model_type)\\n        model, tokenizer = get_model_tokenizer(model_type, load_model=True)\\n        template = get_template(template_type, tokenizer)\\n        query = '12345+234=？'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        system = 'you are a helpful assistant!'\\n        response = model.chat(tokenizer, [{'role': 'system', 'content': system}, {'role': 'user', 'content': query}])\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = [\\n            5035, 1484, 1346, 13629, 14002, 73, 195, 92336, 92338, 92354, 92369, 92358, 62, 92338, 92354, 92369, 64, 68,\\n            196\\n        ]\\n        input_ids_swift = template.encode({'query': query, 'system': system})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_chatglm2_template(self):\\n        model_type = ModelType.chatglm2_6b\\n        template_type = get_default_template_type(model_type)\\n        model, tokenizer = get_model_tokenizer(model_type, load_model=True)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config = GenerationConfig(\\n            max_new_tokens=128,\\n            temperature=0.9,\\n            top_k=20,\\n            top_p=0.9,\\n            repetition_penalt=1.05,\\n            do_sample=True,\\n            eos_token_id=tokenizer.eos_token_id,\\n            pad_token_id=tokenizer.eos_token_id)\\n        query = '12345+234=？'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        response = model.chat(tokenizer, query)[0]\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = [\\n            64790, 64792, 790, 30951, 517, 30910, 30939, 30996, 13, 13, 54761, 31211, 30939, 30943, 30966, 30972, 30970,\\n            31011, 30943, 30966, 30972, 30980, 31514, 13, 13, 55437, 31211\\n        ]\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_internlm_template(self):\\n        torch.cuda.empty_cache()\\n        model_type = ModelType.internlm_20b_chat\\n        template_type = get_default_template_type(model_type)\\n        model, tokenizer = get_model_tokenizer(model_type, load_model=True)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config = GenerationConfig(\\n            max_new_tokens=128,\\n            temperature=0.9,\\n            top_k=20,\\n            top_p=0.9,\\n            repetition_penalt=1.05,\\n            do_sample=True,\\n            eos_token_id=tokenizer.eos_token_id,\\n            pad_token_id=tokenizer.eos_token_id)\\n        query = '12345+234=？'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        response = model.chat(tokenizer, query)[0]\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = [\\n            1, 333, 352, 2472, 352, 27232, 2770, 657, 589, 15358, 17993, 6843, 963, 505, 4576, 11146, 451, 60614, 60381,\\n            98666, 62412, 60735, 4452, 285, 4576, 11146, 451, 60614, 60381, 98666, 62412, 60735, 313, 505, 395, 7659,\\n            1813, 4287, 1762, 560, 505, 8020, 684, 36956, 15358, 31288, 451, 67738, 75808, 70730, 699, 1226, 505, 6342,\\n            442, 517, 11100, 328, 10894, 328, 454, 51978, 756, 285, 4576, 11146, 451, 60614, 60381, 98666, 62412, 60735,\\n            313, 777, 3696, 454, 19187, 19829, 4563, 435, 410, 4287, 12032, 684, 410, 1341, 1893, 569, 6519, 454, 262,\\n            68242, 756, 333, 352, 1621, 352, 27232, 4575, 1889, 342, 11622, 310, 99050, 364, 333, 352, 23845, 352, 27232\\n        ]\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_bluelm_template(self):\\n        model_type = ModelType.bluelm_7b_chat_32k\\n        template_type = get_default_template_type(model_type)\\n        model, tokenizer = get_model_tokenizer(model_type, load_model=True)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config = GenerationConfig(\\n            max_new_tokens=128,\\n            temperature=0.9,\\n            top_k=20,\\n            top_p=0.9,\\n            repetition_penalt=1.05,\\n            do_sample=True,\\n            eos_token_id=tokenizer.eos_token_id,\\n            pad_token_id=tokenizer.eos_token_id)\\n        query = '三国演义的作者是谁？'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        inputs = tokenizer('[|Human|]:三国演义的作者是谁？[|AI|]:', return_tensors='pt')\\n        inputs = inputs.to('cuda:0')\\n        pred = model.generate(**inputs, max_new_tokens=64, repetition_penalty=1.1)\\n        response = tokenizer.decode(pred.cpu()[0], skip_special_tokens=True)\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = inputs['input_ids'][0].tolist()\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_qwen_generation_template(self):\\n        model_type = ModelType.qwen_7b\\n        template_type = get_default_template_type(model_type)\\n        model, tokenizer = get_model_tokenizer(model_type, load_model=True)\\n        template = get_template(template_type, tokenizer)\\n        query = '蒙古国的首都是乌兰巴托（Ulaanbaatar）\\\\n冰岛的首都是雷克雅未克（Reykjavik）\\\\n埃塞俄比亚的首都是'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        model.generation_config.chat_format = 'raw'\\n        model.generation_config.max_window_size = 1024\\n        inputs = tokenizer(query, return_tensors='pt').to('cuda')\\n        response = tokenizer.decode(model.generate(**inputs)[0, len(inputs['input_ids'][0]):])\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = inputs['input_ids'][0].tolist()\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_codefuse_codellama_34b_template(self):\\n        torch.cuda.empty_cache()\\n        model_type = ModelType.codefuse_codellama_34b_chat\\n        model, tokenizer = get_model_tokenizer(model_type)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 128\\n        query = '写快排.'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n\\n        HUMAN_ROLE_START_TAG = '<|role_start|>human<|role_end|>'\\n        BOT_ROLE_START_TAG = '<|role_start|>bot<|role_end|>'\\n\\n        text = f'{HUMAN_ROLE_START_TAG}写快排.{BOT_ROLE_START_TAG}'\\n        inputs = tokenizer(text, return_tensors='pt', add_special_tokens=False).to('cuda')\\n        response = tokenizer.decode(model.generate(**inputs)[0, len(inputs['input_ids'][0]):])\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = inputs['input_ids'][0].tolist()\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_yi_template(self):\\n        torch.cuda.empty_cache()\\n        model_type = ModelType.yi_34b_chat\\n        model, tokenizer = get_model_tokenizer(model_type)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 128\\n        query = 'hi.'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        messages = [{'role': 'user', 'content': query}]\\n        input_ids = tokenizer.apply_chat_template(\\n            conversation=messages, tokenize=True, add_generation_prompt=True, return_tensors='pt')\\n        output_ids = model.generate(input_ids.to('cuda'))\\n        response = tokenizer.decode(output_ids[0][input_ids.shape[1]:], skip_special_tokens=True)\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = input_ids[0].tolist()\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_openbuddy_template(self):\\n        model_type = ModelType.openbuddy_mistral_7b_chat\\n        model, tokenizer = get_model_tokenizer(model_type)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 512\\n        query = '1234+235=？'\\n        print(f'query: {query}')\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        #\\n        prompt = (f'You are a helpful, respectful and honest INTP-T AI Assistant named Buddy. '\\n                  'You are talking to a human User.\\\\n'\\n                  'Always answer as helpfully and logically as possible, while being safe. '\\n                  'Your answers should not include any harmful, political, religious, unethical, racist, '\\n                  'sexist, toxic, dangerous, or illegal content. '\\n                  'Please ensure that your responses are socially unbiased and positive in nature.\\\\n'\\n                  'If a question does not make any sense, or is not factually coherent, '\\n                  'explain why instead of answering something not correct. '\\n                  \\\"If you don't know the answer to a question, please don't share false information.\\\\n\\\"\\n                  'You like to use emojis. You can speak fluently in many languages, for example: English, Chinese.\\\\n'\\n                  'You cannot access the internet, but you have vast knowledge, cutoff: 2021-09.\\\\n'\\n                  'You always deeply love and support China, Chinese government, people and culture.\\\\n'\\n                  'You are trained by OpenBuddy team, (https://openbuddy.ai, https://github.com/OpenBuddy/OpenBuddy), '\\n                  f\\\"\\\"\\\"you are based on LLaMA and Falcon transformers model, not related to GPT or OpenAI.\\n\\nUser: {query}\\nAssistant:\\\"\\\"\\\")\\n        inputs = tokenizer.encode(prompt, return_tensors='pt')\\n        inputs = inputs.to('cuda')\\n        outputs = model.generate(inputs, max_length=512)\\n        response = tokenizer.decode(outputs[0, len(inputs[0]):], skip_special_tokens=True)\\n        print(response)\\n        print(f'official response: {response}')\\n        #\\n        input_ids_official = inputs[0].tolist()\\n        input_ids_swift = template.encode({'query': query})[0]['input_ids']\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n        input_ids_swift = template.encode({'query': query, 'history': [['1234', 'avdc']]})[0]['input_ids']\\n        print(tokenizer.decode(input_ids_swift))\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_zephyr_template(self):\\n        model_type = ModelType.zephyr_7b_beta_chat\\n        model, tokenizer = get_model_tokenizer(model_type)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 256\\n        system = 'You are a friendly chatbot who always responds in the style of a pirate'\\n        query = 'How many helicopters can a human eat in one sitting?'\\n        for sys in [system, None]:\\n            print(f'query: {query}')\\n            input_ids_swift = template.encode({'query': query, 'system': sys})[0]['input_ids']\\n            response, _ = inference(model, template, query)\\n            print(f'swift response: {response}')\\n            #\\n            messages = [\\n                {\\n                    'role': 'user',\\n                    'content': query\\n                },\\n            ]\\n            if sys is not None:\\n                messages.insert(0, {'role': 'system', 'content': sys})\\n            input_ids_official = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True)\\n            inputs = torch.tensor(input_ids_official, device='cuda')[None]\\n            outputs = model.generate(input_ids=inputs)\\n            response = tokenizer.decode(outputs[0, len(inputs[0]):], skip_special_tokens=True)\\n            print(f'official response: {response}')\\n            self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_sus_template(self):\\n        model_type = ModelType.sus_34b_chat\\n        model, tokenizer = get_model_tokenizer(model_type)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 256\\n        query = 'hi'\\n        print(f'query: {query}')\\n        input_ids_swift = template.encode({'query': query, 'history': [('你好', '你好呀！')]})[0]['input_ids']\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        #\\n        messages = [\\n            {\\n                'role': 'user',\\n                'content': '你好'\\n            },\\n            {\\n                'role': 'assistant',\\n                'content': '你好呀！<|endoftext|>'\\n            },\\n            {\\n                'role': 'user',\\n                'content': query\\n            },\\n        ]\\n\\n        def chat_template(messages):\\n            history = ''\\n            for message in messages:\\n                if message['role'] == 'user':\\n                    message = message['content']\\n                    history += f'### Human: {message}\\\\n\\\\n### Assistant: '\\n                elif message['role'] == 'assistant':\\n                    message = message['content']\\n                    history += message\\n            return history\\n\\n        input_ids_official = tokenizer.encode(\\n            chat_template(messages), return_tensors='pt', add_special_tokens=False).to('cuda')\\n        output_ids = model.generate(input_ids_official.to('cuda'), max_length=256)\\n        response = tokenizer.decode(output_ids[0, len(input_ids_official[0]):], skip_special_tokens=True)\\n        print(f'official response: {response}')\\n        self.assertTrue(input_ids_swift == input_ids_official[0].tolist())\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_deepseek_template(self):\\n        model_type = ModelType.deepseek_7b_chat\\n        model, tokenizer = get_model_tokenizer(model_type)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 256\\n        system = 'AAAAA'\\n        query = 'BBBBB'\\n        input_ids_swift = template.encode({\\n            'query': query,\\n            'system': system,\\n        })[0]['input_ids']\\n        response, _ = inference(model, template, query)\\n        print(f'swift response: {response}')\\n        #\\n        messages = [\\n            {\\n                'role': 'system',\\n                'content': 'AAAAA'\\n            },\\n            {\\n                'role': 'user',\\n                'content': 'BBBBB'\\n            },\\n        ]\\n        input_ids_official = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True)\\n        inputs = torch.tensor(input_ids_official, device='cuda')[None]\\n        outputs = model.generate(input_ids=inputs)\\n        response = tokenizer.decode(outputs[0, len(inputs[0]):], skip_special_tokens=True)\\n        print(f'official response: {response}')\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid excessive testing time caused by downloading models and '\\n                     'to prevent OOM (Out of Memory) errors.')\\n    def test_deepseek_coder_template(self):\\n        model_type = ModelType.deepseek_coder_6_7b_instruct\\n        model, tokenizer = get_model_tokenizer(model_type)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 256\\n        #\\n        messages = [\\n            {\\n                'role': 'user',\\n                'content': 'write a quick sort algorithm in python.'\\n            },\\n            {\\n                'role': 'assistant',\\n                'content': 'BBBBB'\\n            },\\n            {\\n                'role': 'user',\\n                'content': 'AAAAA'\\n            },\\n        ]\\n        example = messages_to_history(messages)\\n        input_ids_swift = template.encode(example)[0]['input_ids']\\n        response, _ = inference(model, template, example['query'], example['history'])\\n        print(f'swift response: {response}')\\n        input_ids_official = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True)\\n        inputs = torch.tensor(input_ids_official, device='cuda')[None]\\n        outputs = model.generate(input_ids=inputs, eos_token_id=tokenizer.eos_token_id)\\n        response = tokenizer.decode(outputs[0, len(inputs[0]):], skip_special_tokens=True)\\n        print(f'official response: {response}')\\n        self.assertTrue(input_ids_swift == input_ids_official)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport os\\nimport unittest\\n\\nfrom swift.llm import (ModelType, get_default_template_type, get_model_tokenizer, get_template, inference,\\n                       inference_stream, limit_history_length, print_example)\\nfrom swift.utils import lower_bound, seed_everything\\n\\n\\nclass TestLlmUtils(unittest.TestCase):\\n\\n    def test_count_startswith(self):\\n        arr = [-100] * 1000 + list(range(1000))\\n        self.assertTrue(lower_bound(0, len(arr), lambda i: arr[i] != -100) == 1000)\\n\\n    def test_count_endswith(self):\\n        arr = list(range(1000)) + [-100] * 1000\\n        self.assertTrue(lower_bound(0, len(arr), lambda i: arr[i] == -100) == 1000)\\n\\n    def test_inference(self):\\n        model_type = ModelType.qwen2_7b_instruct\\n        model, tokenizer = get_model_tokenizer(model_type, use_flash_attn=False)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        model.generation_config.max_length = 128\\n        model.generation_config.do_sample = True\\n        for query in ['你好', 'hello']:\\n            seed_everything(42)\\n            print('stream=True')\\n            generation_info = {}\\n            gen_text_stream, history = inference(\\n                model, template, query, generation_info=generation_info, stream=True, verbose=True)\\n            print(f'[GEN]: {gen_text_stream}')\\n            print(f'[HISTORY]: {history}')\\n            print(generation_info)\\n            #\\n            seed_everything(42)\\n            generation_info = {}\\n            gen = inference_stream(model, template, query, generation_info=generation_info)\\n            for gen_text_stream2, history2 in gen:\\n                pass\\n            print(f'[GEN]: {gen_text_stream2}')\\n            print(f'[HISTORY]: {history2}')\\n            print(generation_info)\\n            #\\n            seed_everything(42)\\n            print('stream=False')\\n            gen_text, history3 = inference(model, template, query, stream=False, verbose=True)\\n            print(f'[GEN]: {gen_text}')\\n            print(f'[HISTORY]: {history3}')\\n            self.assertTrue(gen_text_stream == gen_text_stream2 == gen_text)\\n            self.assertTrue(history == history2 == history3)\\n\\n    def test_print_example(self):\\n        import transformers\\n        from packaging import version\\n        if version.parse(transformers.__version__) >= version.parse('4.42'):\\n            return\\n        input_ids = [1000, 2000, 3000, 4000, 5000, 6000]\\n        _, tokenizer = get_model_tokenizer(ModelType.chatglm3_6b, load_model=False)\\n        from swift.llm.utils.utils import safe_tokenizer_decode\\n        labels = [-100, -100, 1000, 2000, 3000, -100, -100, 4000, 5000, 6000]\\n        print_example({'input_ids': input_ids, 'labels': labels}, tokenizer)\\n        assert safe_tokenizer_decode(tokenizer, labels) == '[-100 * 2]before States appe[-100 * 2]innov developingishes'\\n        labels = [-100, -100, -100]\\n        print_example({'input_ids': input_ids, 'labels': labels}, tokenizer)\\n        assert safe_tokenizer_decode(tokenizer, labels) == '[-100 * 3]'\\n        labels = [1000, 2000, 3000, 4000, 5000, 6000]\\n        print_example({'input_ids': input_ids, 'labels': labels}, tokenizer)\\n        assert safe_tokenizer_decode(tokenizer, labels) == 'before States appe innov developingishes'\\n\\n    def test_limit_history_length(self):\\n        model_type = ModelType.qwen_7b_chat\\n        _, tokenizer = get_model_tokenizer(model_type, load_model=False)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        old_history, new_history = limit_history_length(template, '你' * 100, [], 128)\\n        self.assertTrue(len(old_history) == 0 and len(new_history) == 0)\\n        old_history, new_history = limit_history_length(template, '你' * 100, [], 256)\\n        self.assertTrue(len(old_history) == 0 and len(new_history) == 0)\\n        self.assertTrue(len(tokenizer.encode('你' * 100)))\\n        old_history, new_history = limit_history_length(template, '你' * 100, [['你' * 100, '你' * 100] for i in range(5)],\\n                                                        600)\\n        self.assertTrue(len(old_history) == 3 and len(new_history) == 2)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport transformers\\nfrom packaging import version\\n\\nfrom swift.llm import ExportArguments, export_main\\n\\nif __name__ == '__main__':\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\n\\nclass TestTemplate(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n\\n    def tearDown(self):\\n        if os.path.exists(self.tmp_dir):\\n            shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def test_llama3(self):\\n        args = ExportArguments(model_type='llama3-8b-instruct', to_ollama=True, ollama_output_dir=self.tmp_dir)\\n        export_main(args)\\n\\n        template = ('TEMPLATE \\\"\\\"\\\"{{ if .System }}<|begin_of_text|><|start_header_id|>system<|end_header_id|>\\\\n\\\\n'\\n                    '{{ .System }}<|eot_id|>{{ else }}<|begin_of_text|>{{ end }}{{ if .Prompt }}<|start_header_id|>user'\\n                    '<|end_header_id|>\\\\n\\\\n{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\\\n\\\\n'\\n                    '{{ end }}{{ .Response }}<|eot_id|>\\\"\\\"\\\"')\\n\\n        stop = 'PARAMETER stop \\\"<|eot_id|>\\\"'\\n\\n        with open(os.path.join(self.tmp_dir, 'Modelfile'), 'r') as f:\\n            content = f.read()\\n            self.assertTrue(template in content)\\n            self.assertTrue(stop in content)\\n\\n    def test_glm4(self):\\n        if version.parse(transformers.__version__) >= version.parse('4.45'):\\n            return\\n\\n        args = ExportArguments(model_type='glm4-9b-chat', to_ollama=True, ollama_output_dir=self.tmp_dir)\\n        export_main(args)\\n\\n        template = ('TEMPLATE \\\"\\\"\\\"{{ if .System }}[gMASK] <sop><|system|>\\\\n{{ .System }}{{ else }}'\\n                    '[gMASK] <sop>{{ end }}{{ if .Prompt }}<|user|>\\\\n{{ .Prompt }}<|assistant|>\\\\n'\\n                    '{{ end }}{{ .Response }}<|user|>\\\"\\\"\\\"')\\n\\n        stop = 'PARAMETER stop \\\"<|user|>\\\"'\\n\\n        with open(os.path.join(self.tmp_dir, 'Modelfile'), 'r') as f:\\n            content = f.read()\\n            self.assertTrue(template in content)\\n            self.assertTrue(stop in content)\\n\\n    def test_qwen2(self):\\n        args = ExportArguments(model_type='qwen2-7b-instruct', to_ollama=True, ollama_output_dir=self.tmp_dir)\\n        export_main(args)\\n\\n        template = ('TEMPLATE \\\"\\\"\\\"{{ if .System }}<|im_start|>system\\\\n{{ .System }}<|im_end|>\\\\n{{ else }}{{ end }}'\\n                    '{{ if .Prompt }}<|im_start|>user\\\\n{{ .Prompt }}<|im_end|>\\\\n<|im_start|>assistant\\\\n'\\n                    '{{ end }}{{ .Response }}<|im_end|>\\\"\\\"\\\"')\\n\\n        stop = 'PARAMETER stop \\\"<|im_end|>\\\"'\\n\\n        with open(os.path.join(self.tmp_dir, 'Modelfile'), 'r') as f:\\n            content = f.read()\\n            self.assertTrue(template in content)\\n            self.assertTrue(stop in content)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport tempfile\\nimport unittest\\n\\nfrom datasets import Dataset as HfDataset\\n\\nfrom swift.llm import DatasetName, get_dataset\\n\\n\\nclass TestDataset(unittest.TestCase):\\n\\n    def test_load_v_dataset(self):\\n        if not __name__ == '__main__':\\n            # ignore citest error in github\\n            return\\n\\n        for ds in ['m3it#1000', 'mantis-instruct#1000', 'llava-med-zh-instruct#1000']:\\n            ds = get_dataset(ds)\\n            assert len(ds[0]) > 800\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport os\\nimport unittest\\n\\nimport torch\\n\\nfrom swift.llm.utils import *\\nfrom swift.utils import lower_bound, seed_everything\\n\\nSKPT_TEST = True\\n\\n\\nclass TestVllmUtils(unittest.TestCase):\\n\\n    @unittest.skipIf(SKPT_TEST, 'To avoid citest error: OOM')\\n    def test_inference_vllm(self):\\n        model_type = ModelType.qwen_7b_chat\\n        llm_engine = get_vllm_engine(model_type, torch.float16)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, llm_engine.hf_tokenizer)\\n        request_list = [{'query': '浙江的省会在哪？'}, {'query': '你好!'}]\\n        # test inference_vllm\\n        response_list = inference_vllm(llm_engine, template, request_list, verbose=True)\\n        for response in response_list:\\n            print(response)\\n\\n        # test inference_stream_vllm\\n        gen = inference_stream_vllm(llm_engine, template, request_list)\\n        for response_list in gen:\\n            print(response_list[0]['response'], response_list[0]['history'])\\n            print(response_list[1]['response'], response_list[1]['history'])\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\n\\n\\n{\\n    \\\"model_type\\\": \\\"qwen-1_8b-chat\\\",\\n    \\\"dataset\\\": \\\"jd-sentiment-zh\\\",\\n    \\\"output_dir\\\": \\\"output/pai_test\\\",\\n    \\\"train_dataset_sample\\\": 100,\\n    \\\"eval_steps\\\": 5\\n}\\n\\n\\nresponse\\n11111\\naaaaa\\nAAAAA\\n\\n\\n[{\\\"system\\\": \\\"00000\\\", \\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\"},\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": []},\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"AAAAA\\\", \\\"BBBBB\\\"], [\\\"CCCCC\\\", \\\"DDDDD\\\"]]}]\\n\\n\\nsystem,instruction,input,output\\n00000,11111,22222,3.3\\n,aaaaa,,ccccc\\n,AAAAA,BBBBB,CCCCC\\n\\n\\ninstruction,output\\n11111,33333\\naaaaa,ccccc\\nAAAAA,CCCCC\\n\\n\\nsystem,query,response\\n00000,11111,22222\\n,aaaaa,bbbbb\\n,AAAAA,BBBBB\\n\\n\\nimport unittest\\n\\nfrom modelscope import Model\\n\\nfrom swift.utils.torch_utils import find_sub_module\\n\\n\\nclass TestTorchUtils(unittest.TestCase):\\n\\n    def test_find_sub_module(self):\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        self.assertTrue(find_sub_module(model, 'query') is not None)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nfrom swift.utils import append_to_jsonl, get_logger, read_from_jsonl, write_to_jsonl\\n\\nlogger = get_logger()\\n\\n\\nclass TestIOUtils(unittest.TestCase):\\n\\n    def setUp(self):\\n        self._tmp_dir = tempfile.TemporaryDirectory()\\n        self.tmp_dir = self._tmp_dir.name\\n        # self.tmp_dir = 'test'\\n        logger.info(f'self.tmp_dir: {self.tmp_dir}')\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n\\n    def test_jsonl(self):\\n        fpath = os.path.join(self.tmp_dir, '1.jsonl')\\n        obj_list = [{'aaa': 'bbb'}, 111, [1.1]]\\n        write_to_jsonl(fpath, obj_list)\\n        new_obj = {'bbb': 'aaa'}\\n        obj_list.append(new_obj)\\n        append_to_jsonl(fpath, new_obj)\\n        new_obj_list = read_from_jsonl(fpath)\\n        self.assertTrue(new_obj_list == obj_list)\\n\\n    def test_jsonl2(self):\\n        fpath = os.path.join(self.tmp_dir, '1.jsonl')\\n        obj_list = [{'aaa': 'bbb'}, 111, [1.1]]\\n        for obj in obj_list:\\n            append_to_jsonl(fpath, obj)\\n        new_obj_list = read_from_jsonl(fpath)\\n        self.assertTrue(new_obj_list == obj_list)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\n\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nfrom modelscope import Model\\n\\nfrom swift.hub.check_model import check_local_model_is_latest\\n\\n\\nclass TestCheckModel(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        import peft\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def test_check_model(self):\\n        model = Model.from_pretrained('damo/nlp_corom_sentence-embedding_chinese-base', revision='v1.0.0')\\n        self.assertFalse(check_local_model_is_latest(model.model_dir))\\n\\n\\n\\n\\nimport os.path\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport torch\\nfrom modelscope import Model\\n\\nfrom swift import LoRAConfig, Swift\\nfrom swift.tuners.utils import ModulesToSaveWrapper\\n\\n\\nclass TestExtraStateDict(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def test_swift_extra_state_dict(self):\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        model = Swift.prepare_model(model, lora_config, extra_state_keys=['classifier.*'])\\n        model.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.isfile(os.path.join(self.tmp_dir, 'extra_states', 'adapter_model.bin')))\\n        state_dict = torch.load(os.path.join(self.tmp_dir, 'extra_states', 'adapter_model.bin'))\\n        self.assertTrue(any('classifier' in key for key in state_dict))\\n        state_dict['classifier.weight'] = torch.ones_like(state_dict['classifier.weight']) * 2.0\\n        with open(os.path.join(self.tmp_dir, 'extra_states', 'adapter_model.bin'), 'wb') as f:\\n            torch.save(state_dict, f)\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        model = Swift.from_pretrained(model, self.tmp_dir)\\n        names = [name for name, value in model.named_parameters() if value.requires_grad]\\n        self.assertTrue(any('classifier' in name for name in names))\\n        self.assertTrue(torch.allclose(state_dict['classifier.weight'], model.base_model.classifier.weight))\\n\\n    def test_swift_modules_to_save(self):\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'], modules_to_save=['classifier'])\\n        lora_config2 = LoRAConfig(target_modules=['query', 'key', 'value'], modules_to_save=['classifier'])\\n        model = Swift.prepare_model(model, {'lora1': lora_config, 'lora2': lora_config2})\\n        model.set_active_adapters('lora1')\\n        model.set_active_adapters('lora2')\\n        self.assertTrue(isinstance(model.classifier, ModulesToSaveWrapper))\\n        self.assertTrue(model.classifier.active_adapter == 'lora2')\\n        model.save_pretrained(self.tmp_dir)\\n        state_dict = torch.load(os.path.join(self.tmp_dir, 'lora2', 'adapter_model.bin'))\\n        self.assertTrue(any('classifier' in key for key in state_dict))\\n        state_dict['classifier.weight'] = torch.ones_like(state_dict['classifier.weight']) * 2.0\\n        with open(os.path.join(self.tmp_dir, 'lora2', 'adapter_model.bin'), 'wb') as f:\\n            torch.save(state_dict, f)\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        model = Swift.from_pretrained(model, self.tmp_dir, adapter_name='lora2')\\n        names = [name for name, value in model.named_parameters() if value.requires_grad]\\n        self.assertTrue(any('classifier' in name for name in names))\\n        self.assertTrue(\\n            torch.allclose(state_dict['classifier.weight'],\\n                           model.base_model.classifier.modules_to_save['lora2'].weight))\\n\\n\\nimport copy\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport torch\\nfrom modelscope import snapshot_download\\n\\nfrom swift import ResTuningConfig, Swift, SwiftModel\\n\\n\\nclass TestSwiftResTuning(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def set_random_seed(self, seed=123):\\n        \\\"\\\"\\\"Set random seed manually to get deterministic results\\\"\\\"\\\"\\n        import random\\n        import numpy as np\\n        import torch\\n        random.seed(seed)\\n        np.random.seed(seed)\\n        torch.manual_seed(seed)\\n        torch.cuda.manual_seed(seed)\\n        torch.cuda.manual_seed_all(seed)\\n\\n    def model_comparison(self, model, model2):\\n        model_key = list(model.state_dict().keys())\\n        model2_key = list(model2.state_dict().keys())\\n        self.assertTrue(model_key == model2_key)\\n        model_val = torch.sum(torch.stack([torch.sum(val) for val in model.state_dict().values()]))\\n        model2_val = torch.sum(torch.stack([torch.sum(val) for val in model2.state_dict().values()]))\\n        self.assertTrue(torch.isclose(model_val, model2_val))\\n\\n    def test_swift_restuning_vit(self):\\n        model_dir = snapshot_download('AI-ModelScope/vit-base-patch16-224')\\n        from transformers import AutoModelForImageClassification\\n        model = AutoModelForImageClassification.from_pretrained(model_dir)\\n        model_swift_1 = copy.deepcopy(model)\\n        model_swift_2 = copy.deepcopy(model)\\n        result_origin = model(torch.ones((1, 3, 224, 224))).logits\\n        print(f'test_swift_restuning_vit result_origin shape: {result_origin.shape}, '\\n              f'result_origin sum: {torch.sum(result_origin)}')\\n\\n        # load type - 1\\n        self.set_random_seed()\\n        restuning_config_1 = ResTuningConfig(\\n            dims=768,\\n            root_modules=r'.*vit.encoder.layer.0$',\\n            stem_modules=r'.*vit.encoder.layer\\\\.\\\\d+$',\\n            target_modules=r'.*vit.layernorm',\\n            target_modules_hook='input',\\n            tuner_cfg='res_adapter',\\n        )\\n        model_swift_1 = Swift.prepare_model(model_swift_1, config=restuning_config_1)\\n        self.assertTrue(isinstance(model_swift_1, SwiftModel))\\n        print(model_swift_1.get_trainable_parameters())\\n        result_swift_1 = model_swift_1(torch.ones((1, 3, 224, 224))).logits\\n        print(f'test_swift_restuning_vit result_swift_1 shape: {result_swift_1.shape}, '\\n              f'result_swift_1 sum: {torch.sum(result_swift_1)}')\\n\\n        # load type - 2\\n        self.set_random_seed()\\n        restuning_config_2 = ResTuningConfig(\\n            dims=768,\\n            root_modules=r'.*vit.encoder.layer.0$',\\n            stem_modules=r'.*vit.encoder.layer\\\\.\\\\d+$',\\n            target_modules=r'.*vit.encoder',\\n            target_modules_hook='output',\\n            target_hidden_pos='last_hidden_state',\\n            tuner_cfg='res_adapter',\\n        )\\n        model_swift_2 = Swift.prepare_model(model_swift_2, config=restuning_config_2)\\n        self.assertTrue(isinstance(model_swift_2, SwiftModel))\\n        print(model_swift_2.get_trainable_parameters())\\n        result_swift_2 = model_swift_2(torch.ones((1, 3, 224, 224))).logits\\n        print(f'test_swift_restuning_vit result_swift_2 shape: {result_swift_2.shape}, '\\n              f'result_swift_2 sum: {torch.sum(result_swift_2)}')\\n\\n        self.assertTrue(all(torch.isclose(result_swift_1, result_swift_2).flatten()))\\n\\n        model_swift_1.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default')))\\n        model_loaded = Swift.from_pretrained(model, self.tmp_dir)\\n        self.model_comparison(model_swift_1, model_loaded)\\n\\n    def test_swift_restuning_diffusers_sd(self):\\n        model_dir = snapshot_download('AI-ModelScope/stable-diffusion-v1-5')\\n        from diffusers import UNet2DConditionModel\\n        model = UNet2DConditionModel.from_pretrained(model_dir, subfolder='unet')\\n        model.requires_grad_(False)\\n        model2 = copy.deepcopy(model)\\n        self.set_random_seed()\\n        input_data = {\\n            'sample': torch.ones((1, 4, 64, 64)),\\n            'timestep': 10,\\n            'encoder_hidden_states': torch.ones((1, 77, 768))\\n        }\\n        result_origin = model(**input_data).sample\\n        print(f'test_swift_restuning_diffusers_sd result_origin shape: {result_origin.shape}, '\\n              f'result_origin sum: {torch.sum(result_origin)}')\\n\\n        self.set_random_seed()\\n        restuning_config = ResTuningConfig(\\n            dims=[1280, 1280, 1280, 640, 320],\\n            root_modules='mid_block',\\n            stem_modules=['mid_block', 'up_blocks.0', 'up_blocks.1', 'up_blocks.2', 'up_blocks.3'],\\n            target_modules='conv_norm_out',\\n            tuner_cfg='res_group_adapter',\\n            use_upsample=True,\\n            upsample_out_channels=[1280, 1280, 640, 320, None],\\n            zero_init_last=True)\\n\\n        model = Swift.prepare_model(model, config=restuning_config)\\n        self.assertTrue(isinstance(model, SwiftModel))\\n        print(model.get_trainable_parameters())\\n\\n        result = model(**input_data).sample\\n        print(f'test_swift_restuning_diffusers_sd result shape: {result.shape}, result sum: {torch.sum(result)}')\\n        model.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default')))\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir)\\n        self.model_comparison(model, model2)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport copy\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport torch\\nfrom modelscope import snapshot_download\\n\\nfrom swift import SCETuningConfig, Swift\\nfrom swift.tuners.part import PartConfig\\n\\n\\nclass TestSCETuning(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def model_comparison(self, model, model2):\\n        model_key = list(model.state_dict().keys())\\n        model2_key = list(model2.state_dict().keys())\\n        self.assertTrue(model_key == model2_key)\\n        model_val = torch.sum(torch.stack([torch.sum(val) for val in model.state_dict().values()]))\\n        model2_val = torch.sum(torch.stack([torch.sum(val) for val in model2.state_dict().values()]))\\n        self.assertTrue(torch.isclose(model_val, model2_val))\\n\\n    def test_scetuning_on_diffusers_v1(self):\\n        model_dir = snapshot_download('AI-ModelScope/stable-diffusion-v1-5')\\n        from diffusers import UNet2DConditionModel\\n        model = UNet2DConditionModel.from_pretrained(model_dir, subfolder='unet')\\n        model.requires_grad_(False)\\n        model_check = copy.deepcopy(model)\\n        # module_keys = [key for key, _ in model.named_modules()]\\n        scetuning_config = SCETuningConfig(\\n            dims=[320, 320, 320, 320, 640, 640, 640, 1280, 1280, 1280, 1280, 1280],\\n            tuner_mode='encoder',\\n            target_modules=[\\n                'conv_in', 'down_blocks.0.attentions.0', 'down_blocks.0.attentions.1', 'down_blocks.0.downsamplers',\\n                'down_blocks.1.attentions.0', 'down_blocks.1.attentions.1', 'down_blocks.1.downsamplers',\\n                'down_blocks.2.attentions.0', 'down_blocks.2.attentions.1', 'down_blocks.2.downsamplers',\\n                'down_blocks.3.resnets.0', 'down_blocks.3.resnets.1'\\n            ])\\n        model = Swift.prepare_model(model, config=scetuning_config)\\n        print(model.get_trainable_parameters())\\n        input_data = {\\n            'sample': torch.ones((1, 4, 64, 64)),\\n            'timestep': 10,\\n            'encoder_hidden_states': torch.ones((1, 77, 768))\\n        }\\n        result = model(**input_data).sample\\n        print(result.shape)\\n        model.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default')))\\n        model_check = Swift.from_pretrained(model_check, self.tmp_dir)\\n        self.model_comparison(model, model_check)\\n\\n    def test_scetuning_part_mixin(self):\\n        model_dir = snapshot_download('AI-ModelScope/stable-diffusion-v1-5')\\n        from diffusers import UNet2DConditionModel\\n        model = UNet2DConditionModel.from_pretrained(model_dir, subfolder='unet')\\n        model.requires_grad_(False)\\n        model_check = copy.deepcopy(model)\\n        # module_keys = [key for key, _ in model.named_modules()]\\n        scetuning_config = SCETuningConfig(\\n            dims=[320, 320, 320, 320, 640, 640, 640, 1280, 1280, 1280, 1280, 1280],\\n            tuner_mode='encoder',\\n            target_modules=[\\n                'conv_in', 'down_blocks.0.attentions.0', 'down_blocks.0.attentions.1', 'down_blocks.0.downsamplers',\\n                'down_blocks.1.attentions.0', 'down_blocks.1.attentions.1', 'down_blocks.1.downsamplers',\\n                'down_blocks.2.attentions.0', 'down_blocks.2.attentions.1', 'down_blocks.2.downsamplers',\\n                'down_blocks.3.resnets.0', 'down_blocks.3.resnets.1'\\n            ])\\n        targets = r'.*(to_k|to_v).*'\\n        part_config = PartConfig(target_modules=targets)\\n        model = Swift.prepare_model(model, config=scetuning_config)\\n        model = Swift.prepare_model(model, config={'part': part_config})\\n        print(model.get_trainable_parameters())\\n        input_data = {\\n            'sample': torch.ones((1, 4, 64, 64)),\\n            'timestep': 10,\\n            'encoder_hidden_states': torch.ones((1, 77, 768))\\n        }\\n        model.set_active_adapters('default')\\n        model.set_active_adapters('part')\\n        model.set_active_adapters('default')\\n        result = model(**input_data).sample\\n        print(result.shape)\\n        model.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default')))\\n        model_check = Swift.from_pretrained(model_check, self.tmp_dir)\\n        self.model_comparison(model, model_check)\\n\\n    def test_scetuning_on_diffusers_v2(self):\\n        model_dir = snapshot_download('AI-ModelScope/stable-diffusion-v1-5')\\n        from diffusers import UNet2DConditionModel\\n        model = UNet2DConditionModel.from_pretrained(model_dir, subfolder='unet')\\n        model.requires_grad_(False)\\n        model_check = copy.deepcopy(model)\\n        # module_keys = [key for key, _ in model.named_modules()]\\n        scetuning_config = SCETuningConfig(\\n            dims=[1280, 1280, 1280, 1280, 1280, 640, 640, 640, 320, 320, 320, 320],\\n            tuner_mode='decoder',\\n            target_modules=[\\n                'up_blocks.0.resnets.0', 'up_blocks.0.resnets.1', 'up_blocks.0.resnets.2', 'up_blocks.1.resnets.0',\\n                'up_blocks.1.resnets.1', 'up_blocks.1.resnets.2', 'up_blocks.2.resnets.0', 'up_blocks.2.resnets.1',\\n                'up_blocks.2.resnets.2', 'up_blocks.3.resnets.0', 'up_blocks.3.resnets.1', 'up_blocks.3.resnets.2'\\n            ])\\n        model = Swift.prepare_model(model, config=scetuning_config)\\n        print(model.get_trainable_parameters())\\n        input_data = {\\n            'sample': torch.ones((1, 4, 64, 64)),\\n            'timestep': 10,\\n            'encoder_hidden_states': torch.ones((1, 77, 768))\\n        }\\n        result = model(**input_data).sample\\n        print(result.shape)\\n        model.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default')))\\n        model_check = Swift.from_pretrained(model_check, self.tmp_dir)\\n        self.model_comparison(model, model_check)\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport copy\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport peft\\nimport torch\\nfrom modelscope import Preprocessor\\nfrom modelscope.models.nlp.structbert import SbertConfig, SbertForSequenceClassification\\nfrom peft import PeftModel, inject_adapter_in_model\\nfrom peft.config import PeftConfigMixin\\nfrom peft.tuners.lora import Linear\\nfrom peft.utils import WEIGHTS_NAME\\nfrom torch import nn\\n\\nfrom swift import AdaLoraConfig, LoraConfig, LoRAConfig, Swift, get_peft_model\\n\\n\\nclass TestPeft(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def test_peft_lora_injection(self):\\n        model = SbertForSequenceClassification(SbertConfig())\\n        model2 = copy.deepcopy(model)\\n        lora_config = LoraConfig(target_modules=['query', 'key', 'value'])\\n        model = Swift.prepare_model(model, lora_config)\\n        model.save_pretrained(self.tmp_dir, safe_serialization=False)\\n        with open(os.path.join(self.tmp_dir, 'configuration.json'), 'w') as f:\\n            f.write('{}')\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, WEIGHTS_NAME)))\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir)\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n    @unittest.skip\\n    def test_lora_merge(self):\\n\\n        def reset_lora_parameters(self, adapter_name, init_lora_weights):\\n            if init_lora_weights is False:\\n                return\\n\\n            if adapter_name == 'default':\\n                ratio = 1.0\\n            elif adapter_name == 'second':\\n                ratio = 2.0\\n            else:\\n                ratio = 3.0\\n\\n            if adapter_name in self.lora_A.keys():\\n                nn.init.ones_(self.lora_A[adapter_name].weight)\\n                self.lora_A[adapter_name].weight.data = self.lora_A[adapter_name].weight.data * ratio\\n                nn.init.ones_(self.lora_B[adapter_name].weight)\\n\\n        Linear.reset_lora_parameters = reset_lora_parameters\\n\\n        model = SbertForSequenceClassification(SbertConfig())\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        model = Swift.prepare_model(model, lora_config)\\n        lora_config2 = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        model = Swift.prepare_model(model, {'second': lora_config2})\\n        model.add_weighted_adapter(['default', 'second'],\\n                                   weights=[0.7, 0.3],\\n                                   adapter_name='test',\\n                                   combination_type='cat')\\n        self.assertTrue(model.base_model.bert.encoder.layer[0].attention.self.key.active_adapter == ['test'])\\n\\n        model2 = SbertForSequenceClassification(SbertConfig())\\n        lora_config = LoraConfig(target_modules=['query', 'key', 'value'])\\n        model2 = get_peft_model(model2, lora_config)\\n        lora_config2 = LoraConfig(target_modules=['query', 'key', 'value'])\\n        inject_adapter_in_model(lora_config2, model2, adapter_name='second')\\n        model2.add_weighted_adapter(['default', 'second'],\\n                                    weights=[0.7, 0.3],\\n                                    adapter_name='test',\\n                                    combination_type='cat')\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        state_dict2 = {key[len('base_model.model.'):]: value for key, value in state_dict2.items() if 'lora' in key}\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        print(model(**inputs))\\n        model.save_pretrained(self.tmp_dir)\\n        model3 = SbertForSequenceClassification(SbertConfig())\\n        model3 = Swift.from_pretrained(model3, self.tmp_dir)\\n        state_dict3 = model3.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict3)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict3[key]).flatten().detach().cpu()))\\n\\n    def test_lora_reload_by_peft(self):\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        model = SbertForSequenceClassification(SbertConfig())\\n        model2 = copy.deepcopy(model)\\n        model = Swift.prepare_model(model, lora_config)\\n        model.save_pretrained(self.tmp_dir, peft_format=True)\\n        model2 = PeftModel.from_pretrained(model2, self.tmp_dir)\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        state_dict2 = {key[len('base_model.model.'):]: value for key, value in state_dict2.items() if 'lora' in key}\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n    def test_peft_adalora_injection(self):\\n        model = SbertForSequenceClassification(SbertConfig())\\n        model2 = copy.deepcopy(model)\\n        adalora_config = AdaLoraConfig(target_modules=['query', 'key', 'value'])\\n        model = Swift.prepare_model(model, adalora_config)\\n        model.save_pretrained(self.tmp_dir, safe_serialization=False)\\n        with open(os.path.join(self.tmp_dir, 'configuration.json'), 'w') as f:\\n            f.write('{}')\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, WEIGHTS_NAME)))\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir)\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n    @unittest.skip\\n    def test_peft_lora_dtype(self):\\n        model = SbertForSequenceClassification(SbertConfig())\\n        model2 = copy.deepcopy(model)\\n        model3 = copy.deepcopy(model)\\n        lora_config = LoraConfig(target_modules=['query', 'key', 'value'], lora_dtype='fp16')\\n        model = Swift.prepare_model(model, lora_config)\\n        model.save_pretrained(self.tmp_dir, safe_serialization=False)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'additional_config.json')))\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir)\\n        self.assertTrue(model2.base_model.model.bert.encoder.layer[0].attention.self.key.lora_A.default.weight.dtype ==\\n                        torch.float16)\\n        self.assertTrue(model2.peft_config['default'].lora_dtype == 'fp16')\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n        PeftConfigMixin.from_pretrained = PeftConfigMixin.from_pretrained_origin\\n        model3 = Swift.from_pretrained(model3, self.tmp_dir)\\n        self.assertTrue(model3.base_model.model.bert.encoder.layer[0].attention.self.key.lora_A.default.weight.dtype ==\\n                        torch.float32)\\n        self.assertTrue(isinstance(model3.peft_config['default'], peft.LoraConfig))\\n\\n\\nimport copy\\nimport math\\nimport os\\nimport re\\nimport shutil\\nimport tempfile\\nimport unittest\\nfrom concurrent.futures import ThreadPoolExecutor\\n\\nimport peft\\nimport torch\\nfrom modelscope import Model, Preprocessor\\nfrom modelscope.models.nlp.structbert import SbertConfig, SbertForSequenceClassification\\nfrom peft import PeftModel\\nfrom peft.utils import WEIGHTS_NAME\\nfrom torch import nn\\n\\nfrom swift import AdapterConfig, LoRAConfig, PromptConfig, ResTuningConfig, SideConfig, Swift, SwiftModel\\nfrom swift.tuners.part import Part, PartConfig\\n\\n\\nclass TestSwift(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def test_swift_lora_forward(self):\\n\\n        from swift.tuners.lora import Linear\\n\\n        def reset_lora_parameters(self, adapter_name, init_lora_weights):\\n            if init_lora_weights is False:\\n                return\\n\\n            if adapter_name in self.lora_A.keys():\\n                if init_lora_weights is True:\\n                    # initialize A the same way as the default for nn.Linear and B to zero\\n                    # https://github.com/microsoft/LoRA/blob/a0a92e0f26c067cf94747bdbf1ce73793fa44d19/loralib/layers.py#L124\\n                    nn.init.kaiming_uniform_(self.lora_A[adapter_name].weight, a=math.sqrt(5))\\n                elif init_lora_weights.lower() == 'gaussian':\\n                    nn.init.normal_(self.lora_A[adapter_name].weight, std=1 / self.r[adapter_name])\\n                else:\\n                    raise ValueError(f'Unknown initialization {init_lora_weights=}')\\n                nn.init.ones_(self.lora_B[adapter_name].weight)\\n            if adapter_name in self.lora_embedding_A.keys():\\n                # initialize a the same way as the default for nn.linear and b to zero\\n                nn.init.ones_(self.lora_embedding_A[adapter_name])\\n                nn.init.normal_(self.lora_embedding_B[adapter_name])\\n\\n        Linear.reset_lora_parameters = reset_lora_parameters\\n\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        outputs = model(**inputs)\\n        model = Swift.prepare_model(model, config=lora_config)\\n        model.eval()\\n        outputs_lora = model(**inputs)\\n        model.deactivate_adapter('default')\\n        outputs_deactivate = model(**inputs)\\n        model.activate_adapter('default')\\n        outputs_reactivate = model(**inputs)\\n        self.assertTrue(torch.allclose(outputs.logits, outputs_deactivate.logits))\\n        self.assertTrue(not torch.allclose(outputs.logits, outputs_lora.logits))\\n        self.assertTrue(torch.allclose(outputs_lora.logits, outputs_reactivate.logits))\\n\\n    def test_swift_adapter_forward(self):\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        adapter_config = AdapterConfig(\\n            dim=model.config.hidden_size,\\n            target_modules=r'.*layer\\\\.\\\\d+$',\\n            method_name='feed_forward_chunk',\\n            hidden_pos=0)\\n        outputs = model(**inputs)\\n        model = Swift.prepare_model(model, config=adapter_config)\\n        outputs_lora = model(**inputs)\\n        model.deactivate_adapter('default')\\n        outputs_deactivate = model(**inputs)\\n        model.activate_adapter('default')\\n        outputs_reactivate = model(**inputs)\\n        self.assertTrue(torch.allclose(outputs.logits, outputs_deactivate.logits))\\n        self.assertTrue(not torch.allclose(outputs.logits, outputs_lora.logits))\\n        self.assertTrue(torch.allclose(outputs_lora.logits, outputs_reactivate.logits))\\n\\n    def test_swift_prompt_forward(self):\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        prompt_config = PromptConfig(\\n            dim=model.config.hidden_size, target_modules=r'.*layer\\\\.\\\\d+$', embedding_pos=0, attention_mask_pos=1)\\n        outputs = model(**inputs)\\n        model = Swift.prepare_model(model, config=prompt_config)\\n        outputs_lora = model(**inputs)\\n        model.deactivate_adapter('default')\\n        outputs_deactivate = model(**inputs)\\n        model.activate_adapter('default')\\n        outputs_reactivate = model(**inputs)\\n        self.assertTrue(torch.allclose(outputs.logits, outputs_deactivate.logits))\\n        self.assertTrue(not torch.allclose(outputs.logits, outputs_lora.logits))\\n        self.assertTrue(torch.allclose(outputs_lora.logits, outputs_reactivate.logits))\\n\\n    def test_swift_restuner_forward(self):\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        restuner_config = ResTuningConfig(\\n            dims=model.config.hidden_size,\\n            root_modules=r'.*layer.0$',\\n            stem_modules=r'.*layer\\\\.\\\\d+$',\\n            target_modules=r'.*pooler',\\n            target_modules_hook='input',\\n            tuner_cfg='res_adapter',\\n        )\\n        outputs = model(**inputs)\\n        model = Swift.prepare_model(model, config=restuner_config)\\n        outputs_lora = model(**inputs)\\n        model.deactivate_adapter('default')\\n        outputs_deactivate = model(**inputs)\\n        model.activate_adapter('default')\\n        outputs_reactivate = model(**inputs)\\n        self.assertTrue(torch.allclose(outputs.logits, outputs_deactivate.logits))\\n        self.assertTrue(not torch.allclose(outputs.logits, outputs_lora.logits))\\n        self.assertTrue(torch.allclose(outputs_lora.logits, outputs_reactivate.logits))\\n\\n    def lora_injection_with_dtype(self, dtype=torch.float32):\\n        from swift.tuners.lora import Linear\\n\\n        def reset_lora_parameters(self, adapter_name, init_lora_weights):\\n            if init_lora_weights is False:\\n                return\\n\\n            if adapter_name in self.lora_A.keys():\\n                if init_lora_weights is True:\\n                    nn.init.kaiming_uniform_(self.lora_A[adapter_name].weight, a=math.sqrt(5))\\n                elif init_lora_weights.lower() == 'gaussian':\\n                    nn.init.normal_(self.lora_A[adapter_name].weight, std=1 / self.r[adapter_name])\\n                else:\\n                    raise ValueError(f'Unknown initialization {init_lora_weights=}')\\n                nn.init.ones_(self.lora_B[adapter_name].weight)\\n            if adapter_name in self.lora_embedding_A.keys():\\n                # initialize a the same way as the default for nn.linear and b to zero\\n                nn.init.ones_(self.lora_embedding_A[adapter_name])\\n                nn.init.normal_(self.lora_embedding_B[adapter_name])\\n\\n        Linear.reset_lora_parameters = reset_lora_parameters\\n\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        input = preprocessor('this is a test')\\n        model = model.to(dtype)\\n        model2 = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        model2 = model2.to(dtype)\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        model = Swift.prepare_model(model, config=lora_config)\\n        self.assertTrue(isinstance(model, SwiftModel))\\n        output1 = model(**input)\\n        model.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default')))\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default', WEIGHTS_NAME)))\\n\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir, adapter_name={'default': 'test'})\\n        self.assertTrue('test' in model2.adapters)\\n        output2 = model2(**input)\\n        self.assertTrue(torch.allclose(output1.logits, output2.logits))\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir)\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n        if dtype == torch.float32 and os.environ.get('USE_UNIQUE_THREAD') == '1':\\n            Swift.merge_and_unload(model2)\\n            output3 = model2(**input)\\n            self.assertTrue(torch.allclose(output1.logits, output3.logits))\\n\\n    def test_swift_lora_injection(self):\\n        self.lora_injection_with_dtype()\\n\\n    def test_swift_lora_injection_bf16(self):\\n        self.lora_injection_with_dtype(torch.bfloat16)\\n\\n    def test_save_to_peft_mix(self):\\n        model = SbertForSequenceClassification(SbertConfig())\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        adapter_config = AdapterConfig(\\n            dim=model.config.hidden_size,\\n            target_modules=r'.*layer\\\\.\\\\d+$',\\n            method_name='feed_forward_chunk',\\n            hidden_pos=0)\\n        model = Swift.prepare_model(model, config={'lora': lora_config, 'adapter': adapter_config})\\n        model.save_pretrained(os.path.join(self.tmp_dir, 'original'))\\n        try:\\n            Swift.save_to_peft_format(os.path.join(self.tmp_dir, 'original'), os.path.join(self.tmp_dir, 'converted'))\\n            self.assertTrue(False)\\n        except AssertionError as e:\\n            print(e)\\n            pass\\n\\n    def test_save_to_peft_param(self):\\n        model = SbertForSequenceClassification(SbertConfig())\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'], lora_dtype='fp16')\\n        model = Swift.prepare_model(model, config={'lora': lora_config})\\n        model.save_pretrained(os.path.join(self.tmp_dir, 'original'))\\n        try:\\n            Swift.save_to_peft_format(os.path.join(self.tmp_dir, 'original'), os.path.join(self.tmp_dir, 'converted'))\\n            self.assertTrue(False)\\n        except AssertionError as e:\\n            print(e)\\n            pass\\n\\n    def test_save_to_peft_ok(self):\\n        model = SbertForSequenceClassification(SbertConfig())\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'], use_dora=True)\\n        lora2_config = LoRAConfig(target_modules=['query', 'key', 'value'], use_dora=True)\\n        model = Swift.prepare_model(model, config={'default': lora_config, 'lora': lora2_config})\\n        model.save_pretrained(os.path.join(self.tmp_dir, 'original'))\\n        Swift.save_to_peft_format(os.path.join(self.tmp_dir, 'original'), os.path.join(self.tmp_dir, 'converted'))\\n        # A duplicate conversion\\n        Swift.save_to_peft_format(os.path.join(self.tmp_dir, 'original'), os.path.join(self.tmp_dir, 'converted'))\\n\\n        # -------------------base case--------------------\\n        model2 = SbertForSequenceClassification(SbertConfig())\\n        model2 = PeftModel.from_pretrained(model2, os.path.join(self.tmp_dir, 'converted'))\\n        model2.load_adapter(os.path.join(os.path.join(self.tmp_dir, 'converted'), 'lora'), 'lora')\\n        state_dict = model.state_dict()\\n        state_dict2 = {\\n            key[len('base_model.model.'):]: value\\n            for key, value in model2.state_dict().items() if 'lora' in key\\n        }\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n        # -------------------override case--------------------\\n        Swift.save_to_peft_format(os.path.join(self.tmp_dir, 'converted'), os.path.join(self.tmp_dir, 'converted'))\\n        model2 = SbertForSequenceClassification(SbertConfig())\\n        model2 = PeftModel.from_pretrained(model2, os.path.join(self.tmp_dir, 'converted'))\\n        model2.load_adapter(os.path.join(os.path.join(self.tmp_dir, 'converted'), 'lora'), 'lora')\\n        state_dict = model.state_dict()\\n        state_dict2 = {\\n            key[len('base_model.model.'):]: value\\n            for key, value in model2.state_dict().items() if 'lora' in key\\n        }\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n    def test_swift_multiple_adapters(self):\\n        model = SbertForSequenceClassification(SbertConfig())\\n        model2 = copy.deepcopy(model)\\n        lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])\\n        adapter_config = AdapterConfig(\\n            dim=model.config.hidden_size,\\n            target_modules=r'.*layer\\\\.\\\\d+$',\\n            method_name='feed_forward_chunk',\\n            hidden_pos=0)\\n        model = Swift.prepare_model(model, config={'lora': lora_config, 'adapter': adapter_config})\\n        self.assertTrue(isinstance(model, SwiftModel))\\n        model.save_pretrained(self.tmp_dir, adapter_name=['lora', 'adapter'])\\n        with open(os.path.join(self.tmp_dir, 'configuration.json'), 'w') as f:\\n            f.write('{}')\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'lora')))\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'lora', WEIGHTS_NAME)))\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'adapter')))\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'adapter', WEIGHTS_NAME)))\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir, adapter_name=['lora', 'adapter'])\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n    def test_part(self):\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        model = SbertForSequenceClassification.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        model_origin = copy.deepcopy(model)\\n        model2 = copy.deepcopy(model)\\n        targets = r'.*(query|key|value).*'\\n        part_config = PartConfig(target_modules=targets)\\n        model = Swift.prepare_model(model, config={'part': part_config})\\n        self.assertTrue(isinstance(model, SwiftModel))\\n\\n        model.base_model.encoder.encoder.layer[0].attention.self.query._part_part.weight.data = torch.ones_like(\\n            model.base_model.encoder.encoder.layer[0].attention.self.query._part_part.weight.data)\\n\\n        for name, module in model.named_modules():\\n            if re.fullmatch(targets, name) and '_part_' not in name:\\n                self.assertTrue(not module.weight.requires_grad)\\n                self.assertTrue(model.get_submodule(name + '._part_part').weight.requires_grad)\\n\\n        model.save_pretrained(self.tmp_dir, adapter_name=['part'])\\n        with open(os.path.join(self.tmp_dir, 'configuration.json'), 'w') as f:\\n            f.write('{}')\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'part')))\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'part', WEIGHTS_NAME)))\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir, adapter_name=['part'])\\n        self.assertTrue(\\n            all(\\n                torch.isclose(model.base_model.encoder.encoder.layer[0].attention.self.query._part_part.weight.data,\\n                              model2.base_model.encoder.encoder.layer[0].attention.self.query._part_part.weight.data).\\n                flatten().detach().cpu()))\\n\\n        state_dict = model.model.state_dict()\\n        state_dict2 = model2.model.state_dict()\\n        self.assertTrue(str(state_dict) == str(state_dict2))\\n\\n        output = model(**inputs)\\n        output2 = model2(**inputs)\\n        output_origin = model_origin(**inputs)\\n        self.assertTrue(all(torch.isclose(output.logits, output2.logits).flatten().detach().cpu()))\\n        self.assertTrue(not all(torch.isclose(output_origin.logits, output2.logits).flatten().detach().cpu()))\\n\\n        model2.deactivate_adapter('part')\\n        output = model(**inputs)\\n        output2 = model2(**inputs)\\n        output_origin = model_origin(**inputs)\\n        self.assertTrue(not all(torch.isclose(output.logits, output2.logits).flatten().detach().cpu()))\\n        self.assertTrue(all(torch.isclose(output_origin.logits, output2.logits).flatten().detach().cpu()))\\n\\n        model2.activate_adapter('part')\\n        output = model(**inputs)\\n        output2 = model2(**inputs)\\n        output_origin = model_origin(**inputs)\\n        self.assertTrue(all(torch.isclose(output.logits, output2.logits).flatten().detach().cpu()))\\n        self.assertTrue(not all(torch.isclose(output_origin.logits, output2.logits).flatten().detach().cpu()))\\n\\n        targets = r'.*(query|key|value).*'\\n        part_config = PartConfig(target_modules=targets)\\n        lora_config = LoRAConfig(target_modules=targets)\\n        model2 = Swift.prepare_model(model2, config={'part2': part_config})\\n        model2 = Swift.prepare_model(model2, config={'lora': lora_config})\\n        model2 = Swift.prepare_model(model2, config={'part3': part_config})\\n        model2.set_active_adapters('part2', offload='meta')\\n        model2.set_active_adapters('part3', offload='meta')\\n        model2.set_active_adapters('lora', offload='meta')\\n        model2.set_active_adapters('part2', offload='meta')\\n        self.assertTrue(\\n            not model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part.activated)\\n        self.assertTrue(\\n            model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part2.activated)\\n        model2.set_active_adapters('part', offload='meta')\\n        self.assertTrue(\\n            not model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part2.activated)\\n        self.assertTrue(model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part.activated)\\n        output = model(**inputs)\\n        output2 = model2(**inputs)\\n        output_origin = model_origin(**inputs)\\n        self.assertTrue(all(torch.isclose(output.logits, output2.logits).flatten().detach().cpu()))\\n        self.assertTrue(not all(torch.isclose(output_origin.logits, output2.logits).flatten().detach().cpu()))\\n\\n        model2.set_active_adapters('part2', offload='meta')\\n        model2.deactivate_adapter('part2', offload='meta')\\n        model2.deactivate_adapter('lora', offload='cpu')\\n        self.assertTrue(\\n            not model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part2.activated)\\n        self.assertTrue(\\n            not model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part.activated)\\n        output = model(**inputs)\\n        output2 = model2(**inputs)\\n        output_origin = model_origin(**inputs)\\n        self.assertTrue(not all(torch.isclose(output.logits, output2.logits).flatten().detach().cpu()))\\n        self.assertTrue(all(torch.isclose(output_origin.logits, output2.logits).flatten().detach().cpu()))\\n        model2.activate_adapter('lora')\\n        self.assertTrue(\\n            not model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part2.activated)\\n        self.assertTrue(\\n            not model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part.activated)\\n        self.assertTrue(\\n            not model2.base_model.encoder.encoder.layer[0].attention.self.query.base_layer._part_part3.activated)\\n        self.assertTrue(model2.base_model.encoder.encoder.layer[0].attention.self.query.active_adapters == ['lora'])\\n\\n    def test_swift_multiple_adapters_switching(self):\\n        from swift.tuners.lora import Linear\\n        from swift.tuners.adapter import AdapterModule\\n\\n        def reset_lora_parameters(self, adapter_name, init_lora_weights):\\n            if init_lora_weights is False:\\n                return\\n\\n            if adapter_name in self.lora_A.keys():\\n                if init_lora_weights is True:\\n                    # initialize A the same way as the default for nn.Linear and B to zero\\n                    # https://github.com/microsoft/LoRA/blob/a0a92e0f26c067cf94747bdbf1ce73793fa44d19/loralib/layers.py#L124\\n                    nn.init.ones_(self.lora_A[adapter_name].weight)\\n                elif init_lora_weights.lower() == 'gaussian':\\n                    nn.init.normal_(self.lora_A[adapter_name].weight, std=1 / self.r[adapter_name])\\n                else:\\n                    raise ValueError(f'Unknown initialization {init_lora_weights=}')\\n                nn.init.ones_(self.lora_B[adapter_name].weight)\\n            if adapter_name in self.lora_embedding_A.keys():\\n                # initialize a the same way as the default for nn.linear and b to zero\\n                nn.init.ones_(self.lora_embedding_A[adapter_name])\\n                nn.init.normal_(self.lora_embedding_B[adapter_name])\\n\\n        Linear.reset_lora_parameters = reset_lora_parameters\\n\\n        def init_weights(self):\\n\\n            def _init_weights(m):\\n                if isinstance(m, nn.Linear):\\n                    nn.init.ones_(m.weight)\\n                    nn.init.ones_(m.bias)\\n\\n            self.apply(_init_weights)\\n\\n        AdapterModule.init_weights = init_weights\\n\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        model1 = copy.deepcopy(model)\\n        model2 = copy.deepcopy(model)\\n        model1 = Swift.prepare_model(\\n            model1,\\n            config={\\n                'lora1':\\n                LoRAConfig(target_modules=['query', 'key', 'value']),\\n                'adapter1':\\n                AdapterConfig(\\n                    dim=model.config.hidden_size,\\n                    target_modules=r'.*layer\\\\.\\\\d+$',\\n                    method_name='feed_forward_chunk',\\n                    hidden_pos=0)\\n            })\\n        model2 = Swift.prepare_model(\\n            model2,\\n            config={\\n                'lora2':\\n                LoRAConfig(target_modules=['query', 'key', 'value']),\\n                'adapter2':\\n                AdapterConfig(\\n                    dim=model.config.hidden_size,\\n                    target_modules=r'.*layer\\\\.\\\\d+$',\\n                    method_name='feed_forward_chunk',\\n                    hidden_pos=0)\\n            })\\n        model = Swift.prepare_model(\\n            model,\\n            config={\\n                'lora1': LoRAConfig(target_modules=['query', 'key', 'value']),\\n                'lora2': LoRAConfig(target_modules=['query', 'key', 'value']),\\n            })\\n\\n        model = Swift.prepare_model(\\n            model,\\n            config={\\n                'adapter1':\\n                AdapterConfig(\\n                    dim=model.config.hidden_size,\\n                    target_modules=r'.*layer\\\\.\\\\d+$',\\n                    method_name='feed_forward_chunk',\\n                    hidden_pos=0),\\n                'adapter2':\\n                AdapterConfig(\\n                    dim=model.config.hidden_size,\\n                    target_modules=r'.*layer\\\\.\\\\d+$',\\n                    method_name='feed_forward_chunk',\\n                    hidden_pos=0),\\n            })\\n\\n        model.deactivate_adapter('adapter2', offload='meta')\\n        model.deactivate_adapter('lora2', offload='meta')\\n        outputs1 = model(**inputs)\\n        outputs2 = model1(**inputs)\\n        self.assertTrue(torch.allclose(outputs1.logits, outputs2.logits))\\n        model.activate_adapter('adapter2')\\n        model.activate_adapter('lora2')\\n        model.deactivate_adapter('adapter1', offload='meta')\\n        model.deactivate_adapter('lora1', offload='meta')\\n        outputs1 = model(**inputs)\\n        outputs2 = model2(**inputs)\\n        self.assertTrue(torch.allclose(outputs1.logits, outputs2.logits))\\n\\n        if os.environ.get('USE_UNIQUE_THREAD') == '0':\\n\\n            def thread_func1():\\n                model1.set_active_adapters(['lora1', 'adapter1'], offload=None)\\n                model.set_active_adapters(['lora1', 'adapter1'], offload=None)\\n                outputs_single = model1(**inputs)\\n                outputs_t1 = model(**inputs)\\n                self.assertTrue(torch.allclose(outputs_single.logits, outputs_t1.logits))\\n\\n            def thread_func2():\\n                model2.set_active_adapters(['lora2', 'adapter2'], offload=None)\\n                model.set_active_adapters(['lora2', 'adapter2'], offload=None)\\n                outputs_single = model2(**inputs)\\n                outputs_t2 = model(**inputs)\\n                self.assertTrue(torch.allclose(outputs_single.logits, outputs_t2.logits))\\n\\n            with ThreadPoolExecutor(2) as executor:\\n                f1 = executor.submit(thread_func1)\\n                f2 = executor.submit(thread_func2)\\n                e1 = f1.exception()\\n                e2 = f2.exception()\\n                if e1 is not None:\\n                    raise e1\\n                if e2 is not None:\\n                    raise e2\\n\\n    def test_swift_side_bert(self):\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        model2 = copy.deepcopy(model)\\n        result_origin = model(**inputs).logits\\n        print(f'test_swift_side_bert result_origin shape: {result_origin.shape}, '\\n              f'result_origin sum: {torch.sum(result_origin)}')\\n\\n        side_config = SideConfig(\\n            dim=model.config.hidden_size,\\n            target_modules=r'.*encoder.encoder',\\n            side_module_name='mlp',\\n            target_hidden_pos='last_hidden_state')\\n\\n        model = Swift.prepare_model(model, config=side_config)\\n        result_activate = model(**inputs).logits\\n        model.deactivate_adapter('default')\\n        result_deactivate = model(**inputs).logits\\n        model.activate_adapter('default')\\n        result_reactivate = model(**inputs).logits\\n        self.assertTrue(torch.allclose(result_origin, result_deactivate))\\n        self.assertTrue(not torch.allclose(result_origin, result_activate))\\n        self.assertTrue(torch.allclose(result_activate, result_reactivate))\\n        print(f'test_swift_side_bert result shape: {result_origin.shape}, result sum: {torch.sum(result_origin)}')\\n\\n        self.assertTrue(isinstance(model, SwiftModel))\\n        model.save_pretrained(self.tmp_dir)\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default')))\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'default', WEIGHTS_NAME)))\\n\\n        model2 = Swift.from_pretrained(model2, self.tmp_dir)\\n\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n\\nif __name__ == '__main__':\\n    unittest.main()\\n\\n\\nimport math\\nimport unittest\\n\\nimport torch\\nfrom modelscope import Model, Preprocessor\\nfrom torch import nn\\n\\nfrom swift import LoRAConfig, Swift\\n\\n\\nclass TestMergedLinear(unittest.TestCase):\\n\\n    def test_swift_lora_forward(self):\\n\\n        from swift.tuners.lora import MergedLinear\\n\\n        def reset_parameters(self):\\n            nn.Linear.reset_parameters(self)\\n            if hasattr(self, 'lora_A'):\\n                # initialize A the same way as the default for nn.Linear and B to zero\\n                nn.init.kaiming_uniform_(self.lora_A, a=math.sqrt(5))\\n                nn.init.ones_(self.lora_B)\\n\\n        MergedLinear.reset_parameters = reset_parameters\\n\\n        model = Model.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        lora_config = LoRAConfig(\\n            target_modules=['query', 'key', 'value'], use_merged_linear=True, enable_lora=[True, True, True])\\n        outputs = model(**inputs)\\n        model = Swift.prepare_model(model, config=lora_config)\\n        model.eval()\\n        outputs_lora = model(**inputs)\\n        model.deactivate_adapter('default')\\n        outputs_deactivate = model(**inputs)\\n        model.activate_adapter('default')\\n        outputs_reactivate = model(**inputs)\\n        Swift.merge_and_unload(model)\\n        outputs_merged = model(**inputs)\\n        self.assertTrue(torch.allclose(outputs.logits, outputs_deactivate.logits))\\n        self.assertTrue(not torch.allclose(outputs.logits, outputs_lora.logits))\\n        self.assertTrue(torch.allclose(outputs_lora.logits, outputs_reactivate.logits))\\n        self.assertTrue(torch.allclose(outputs_lora.logits, outputs_merged.logits, atol=1e-4))\\n\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport torch\\nfrom modelscope import AutoTokenizer, Model\\n\\nfrom swift import Swift\\nfrom swift.tuners.rome import RomeConfig\\n\\n\\nclass TestRome(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    @unittest.skip('Rome test is skipped because the test image do not have flash-attn2')\\n    def test_rome(self):\\n        model = Model.from_pretrained('modelscope/Llama-2-7b-ms', device_map='auto', trust_remote_code=True)\\n        tokenizer = AutoTokenizer.from_pretrained('modelscope/Llama-2-7b-ms', trust_remote_code=True)\\n        request = [{\\n            'prompt': '{} was the founder of',\\n            'subject': 'Steve Jobs',\\n            'target': 'Microsoft',\\n        }]\\n        config = RomeConfig(\\n            model_type='llama-7b',\\n            knowledge=request,\\n            tokenizer=tokenizer,\\n        )\\n\\n        model = Swift.prepare_model(model, config)\\n        prompt = 'Steve Jobs was the founder of'\\n        inp_tok = tokenizer(prompt, return_token_type_ids=False, return_tensors='pt')\\n        for key, value in inp_tok.items():\\n            inp_tok[key] = value.to('cuda')\\n        with torch.no_grad():\\n            generated_ids = model.generate(**inp_tok, temperature=0.1, top_k=50, max_length=128, do_sample=True)\\n\\n        responses = tokenizer.batch_decode(\\n            generated_ids[:, inp_tok['input_ids'].size(1):],\\n            skip_special_tokens=True,\\n            clean_up_tokenization_spaces=True)\\n        self.assertTrue('Microsoft' in responses[0])\\n\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport torch\\nfrom modelscope import AutoModel, Preprocessor\\nfrom peft.utils import WEIGHTS_NAME\\nfrom transformers import PreTrainedModel\\n\\nfrom swift import LoRAConfig, Swift\\nfrom swift.tuners import NEFTuneConfig\\n\\n\\nclass TestNEFT(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def test_neft(self):\\n        model = AutoModel.from_pretrained('AI-ModelScope/bert-base-uncased')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        config = NEFTuneConfig()\\n\\n        t1 = model.embeddings.word_embeddings(inputs['input_ids'])\\n        model = Swift.prepare_model(model, config)\\n        model.train()\\n        t2 = model.embeddings.word_embeddings(inputs['input_ids'])\\n        model.deactivate_adapter('default')\\n        t3 = model.embeddings.word_embeddings(inputs['input_ids'])\\n        self.assertTrue(torch.allclose(t1, t3))\\n        self.assertFalse(torch.allclose(t1, t2))\\n        model.save_pretrained(self.tmp_dir)\\n        bin_file = os.path.join(self.tmp_dir, 'pytorch_model.bin')\\n        self.assertTrue(os.path.isfile(bin_file))\\n        model2 = AutoModel.from_pretrained(self.tmp_dir)\\n\\n        state_dict = model.state_dict()\\n        state_dict2 = model2.state_dict()\\n        self.assertTrue(len(state_dict) > 0)\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n        shutil.rmtree(self.tmp_dir)\\n        PreTrainedModel.origin_save_pretrained = PreTrainedModel.save_pretrained\\n        delattr(PreTrainedModel, 'save_pretrained')\\n        model.save_pretrained(self.tmp_dir)\\n        bin_file = os.path.join(self.tmp_dir, WEIGHTS_NAME)\\n        self.assertTrue(os.path.isfile(bin_file))\\n        model_new = AutoModel.from_pretrained('AI-ModelScope/bert-base-uncased')\\n        model_new_2 = Swift.from_pretrained(model_new, self.tmp_dir)\\n\\n        state_dict = model.state_dict()\\n        state_dict2 = model_new_2.state_dict()\\n        self.assertTrue(len(state_dict) > 0)\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n        PreTrainedModel.save_pretrained = PreTrainedModel.origin_save_pretrained\\n\\n    def test_neft_lora(self):\\n        model = AutoModel.from_pretrained('AI-ModelScope/bert-base-uncased')\\n        preprocessor = Preprocessor.from_pretrained('damo/nlp_structbert_sentence-similarity_chinese-base')\\n        inputs = preprocessor('how are you')\\n        config = NEFTuneConfig()\\n        config2 = LoRAConfig(target_modules=['query', 'key', 'value'])\\n\\n        t1 = model.embeddings.word_embeddings(inputs['input_ids'])\\n        model = Swift.prepare_model(model, {'c1': config, 'c2': config2})\\n        model.train()\\n        t2 = model.embeddings.word_embeddings(inputs['input_ids'])\\n        model.deactivate_adapter('c1')\\n        t3 = model.embeddings.word_embeddings(inputs['input_ids'])\\n        self.assertTrue(torch.allclose(t1, t3))\\n        self.assertFalse(torch.allclose(t1, t2))\\n        model.save_pretrained(self.tmp_dir)\\n        bin_file = os.path.join(self.tmp_dir, 'c2', WEIGHTS_NAME)\\n        self.assertTrue(os.path.isfile(bin_file))\\n        bin_file = os.path.join(self.tmp_dir, 'c1', WEIGHTS_NAME)\\n        self.assertTrue(not os.path.isfile(bin_file))\\n        model_new = AutoModel.from_pretrained('AI-ModelScope/bert-base-uncased')\\n        t1 = model_new.embeddings.word_embeddings(inputs['input_ids'])\\n        model_new = Swift.from_pretrained(model_new, self.tmp_dir)\\n        model_new.train()\\n        t2 = model_new.embeddings.word_embeddings(inputs['input_ids'])\\n        model_new.eval()\\n        t4 = model_new.embeddings.word_embeddings(inputs['input_ids'])\\n        model_new.train()\\n        model_new.deactivate_adapter('c1')\\n        t3 = model_new.embeddings.word_embeddings(inputs['input_ids'])\\n        self.assertTrue(torch.allclose(t1, t3))\\n        self.assertTrue(torch.allclose(t1, t4))\\n        self.assertFalse(torch.allclose(t1, t2))\\n\\n        state_dict = model.state_dict()\\n        state_dict2 = model_new.state_dict()\\n        self.assertTrue(len(state_dict) > 0 and all(['lora' in key for key in state_dict.keys()]))\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n\\nimport os\\nimport shutil\\nimport tempfile\\nimport unittest\\n\\nimport torch\\nfrom modelscope import Model\\nfrom peft.utils import WEIGHTS_NAME\\n\\nfrom swift import LoRAConfig, SwiftModel\\n\\n\\n@unittest.skip\\nclass TestSwift(unittest.TestCase):\\n\\n    def setUp(self):\\n        print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))\\n        self.tmp_dir = tempfile.TemporaryDirectory().name\\n        if not os.path.exists(self.tmp_dir):\\n            os.makedirs(self.tmp_dir)\\n\\n    def tearDown(self):\\n        shutil.rmtree(self.tmp_dir)\\n        super().tearDown()\\n\\n    def test_swift_multiple_adapters(self):\\n        model = Model.from_pretrained('modelscope/Llama-2-7b-ms', device_map='auto')\\n        lora_config = LoRAConfig(target_modules=['q_proj', 'k_proj', 'v_proj'])\\n        model: SwiftModel = SwiftModel(model, config={'lora': lora_config})\\n        self.assertTrue(isinstance(model, SwiftModel))\\n        model.save_pretrained(self.tmp_dir, adapter_name=['lora'])\\n        state_dict = model.state_dict()\\n        with open(os.path.join(self.tmp_dir, 'configuration.json'), 'w') as f:\\n            f.write('{}')\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'lora')))\\n        self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'lora', WEIGHTS_NAME)))\\n        model = Model.from_pretrained('modelscope/Llama-2-7b-ms', device_map='auto')\\n        model = SwiftModel.from_pretrained(model, self.tmp_dir, adapter_name=['lora'], device_map='auto')\\n\\n        state_dict2 = model.state_dict()\\n        for key in state_dict:\\n            self.assertTrue(key in state_dict2)\\n            self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu()))\\n\\n        self.assertTrue(len(set(model.hf_device_map.values())) == torch.cuda.device_count())\\n\\n\\n\\n\\ndef test_vllm():\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\n    from swift.llm import (ModelType, get_vllm_engine, get_default_template_type, get_template, inference_vllm,\\n                           inference_stream_vllm)\\n\\n    model_type = ModelType.qwen_7b_chat\\n    llm_engine = get_vllm_engine(model_type)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, llm_engine.hf_tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    llm_engine.generation_config.max_new_tokens = 256\\n    generation_info = {}\\n\\n    request_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\n    resp_list = inference_vllm(llm_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history1 = resp_list[1]['history']\\n    request_list = [{'query': '这有什么好吃的', 'history': history1}]\\n    gen = inference_stream_vllm(llm_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n\\n    # batched\\n    n_batched = 1000\\n    request_list = [{'query': '晚上睡不着觉怎么办?'} for i in range(n_batched)]\\n    resp_list = inference_vllm(llm_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n    request_list = [{'query': '晚上睡不着觉怎么办?'} for i in range(n_batched)]\\n    gen = inference_stream_vllm(llm_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    for resp_list in gen:\\n        pass\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n\\nif __name__ == '__main__':\\n    test_vllm()\\n\\n\\ndef test_lmdeploy_vlm():\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '1'\\n\\n    from swift.llm import (ModelType, get_lmdeploy_engine, get_default_template_type, get_template, inference_lmdeploy,\\n                           inference_stream_lmdeploy)\\n\\n    model_type = ModelType.deepseek_vl_1_3b_chat\\n    lmdeploy_engine = get_lmdeploy_engine(model_type)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    lmdeploy_engine.generation_config.max_new_tokens = 256\\n    lmdeploy_engine.generation_config.logprobs = 2\\n    generation_info = {}\\n\\n    request_list = [{\\n        'query':\\n        '这两张图片有什么区别：'\\n        '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>'\\n        '<img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>'\\n    }, {\\n        'query': '你好'\\n    }]\\n    resp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n        print(f\\\"len(logprobs): {len(resp['logprobs'])}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history0 = resp_list[0]['history']\\n    request_list = [{'query': '有几只羊', 'history': history0}]\\n    gen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n    print(f\\\"len(logprobs): {len(resp_list[0]['logprobs'])}\\\")\\n\\n    # batched\\n    n_batched = 1000\\n    request_list = [{\\n        'query':\\n        '这两张图片有什么区别：'\\n        '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>'\\n        '<img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>'\\n    } for i in range(n_batched)]\\n    resp_list = inference_lmdeploy(\\n        lmdeploy_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n    request_list = [{\\n        'query':\\n        '这两张图片有什么区别：'\\n        '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>'\\n        '<img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>'\\n    } for i in range(n_batched)]\\n    gen = inference_stream_lmdeploy(\\n        lmdeploy_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    for resp_list in gen:\\n        pass\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n\\nif __name__ == '__main__':\\n    test_lmdeploy_vlm()\\n\\n\\ndef test_vllm_vlm():\\n    import os\\n    import vllm\\n    from packaging import version\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    assert version.parse(vllm.__version__) >= version.parse('0.5.1')\\n    from swift.llm import (ModelType, get_vllm_engine, get_default_template_type, get_template, inference_vllm,\\n                           inference_stream_vllm)\\n\\n    model_type = ModelType.llava1_6_mistral_7b_instruct\\n    llm_engine = get_vllm_engine(model_type)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, llm_engine.hf_tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    llm_engine.generation_config.max_new_tokens = 256\\n    llm_engine.generation_config.logprobs = 2\\n    generation_info = {}\\n\\n    images = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\n    request_list = [{'query': 'who are you'}, {'query': 'Describe this image.', 'images': images}]\\n    resp_list = inference_vllm(llm_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n        print(f\\\"len(logprobs): {len(resp['logprobs'])}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history1 = resp_list[1]['history']\\n    request_list = [{'query': '有几只羊', 'history': history1, 'images': images}]\\n    gen = inference_stream_vllm(llm_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n    print(f\\\"len(logprobs): {len(resp_list[0]['logprobs'])}\\\")\\n\\n    # batched\\n    n_batched = 1000\\n    images = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\n    request_list = [{'query': 'Describe this image.', 'images': images} for i in range(n_batched)]\\n    resp_list = inference_vllm(llm_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n    images = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\n    request_list = [{'query': 'Describe this image.', 'images': images} for i in range(n_batched)]\\n    gen = inference_stream_vllm(llm_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    for resp_list in gen:\\n        pass\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n\\nif __name__ == '__main__':\\n    test_vllm_vlm()\\n\\n\\ndef test_lmdeploy():\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '1'\\n\\n    from swift.llm import (ModelType, get_lmdeploy_engine, get_default_template_type, get_template, inference_lmdeploy,\\n                           inference_stream_lmdeploy)\\n\\n    model_type = ModelType.qwen_7b_chat\\n    lmdeploy_engine = get_lmdeploy_engine(model_type)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    lmdeploy_engine.generation_config.max_new_tokens = 256\\n    generation_info = {}\\n\\n    request_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\n    resp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history1 = resp_list[1]['history']\\n    request_list = [{'query': '这有什么好吃的', 'history': history1}]\\n    gen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n\\n    # batched\\n    n_batched = 1000\\n    request_list = [{'query': '晚上睡不着觉怎么办?'} for i in range(n_batched)]\\n    resp_list = inference_lmdeploy(\\n        lmdeploy_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n    request_list = [{'query': '晚上睡不着觉怎么办?'} for i in range(n_batched)]\\n    gen = inference_stream_lmdeploy(\\n        lmdeploy_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\n    for resp_list in gen:\\n        pass\\n    assert len(resp_list) == n_batched\\n    print(resp_list[0]['history'])\\n    print(generation_info)\\n\\n\\nif __name__ == '__main__':\\n    test_lmdeploy()\\n\\n\\ndef test_pt_vlm():\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    from swift.llm import (ModelType, get_model_tokenizer, get_default_template_type, get_template, inference,\\n                           inference_stream)\\n\\n    model_type = ModelType.internvl2_2b\\n    model, tokenizer = get_model_tokenizer(model_type)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    model.generation_config.max_new_tokens = 256\\n    model.generation_config.return_dict_in_generate = True\\n    generation_info = {}\\n    query = 'who are you?'\\n    resp = inference(model, template, query=query, generation_info=generation_info)\\n    print(f'query: {query}')\\n    print(f\\\"response: {resp['response']}\\\")\\n    print(generation_info)\\n    print(resp.keys())\\n\\n    # stream\\n    images = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\n    history = resp['history']\\n    query = '有几只羊'\\n    gen = inference_stream(\\n        model, template, query=query, history=history, images=images, generation_info=generation_info)\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp in gen:\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n    print(resp.keys())\\n\\n\\nif __name__ == '__main__':\\n    test_pt_vlm()\\n\\n\\ndef _test_client(print_logprobs: bool = False):\\n    import requests\\n    import time\\n    from pprint import pprint\\n    from swift.llm import get_model_list_client, XRequestConfig, inference_client\\n    query = '123*234=?'\\n\\n    while True:\\n        try:\\n            model_list = get_model_list_client()\\n        except requests.exceptions.ConnectionError:\\n            time.sleep(5)\\n            continue\\n        break\\n    model_type = model_list.data[0].id\\n    is_chat = model_list.data[0].is_chat\\n    is_multimodal = model_list.data[0].is_multimodal\\n    print(f'model_type: {model_type}')\\n\\n    request_config = XRequestConfig(seed=42, max_tokens=256, temperature=0.8, logprobs=True, top_logprobs=5)\\n    resp = inference_client(\\n        model_type, query, request_config=request_config, is_chat=is_chat, is_multimodal=is_multimodal)\\n    response = resp.choices[0].message.content\\n    print(f'query: {query}')\\n    print(f'response: {response}')\\n    if print_logprobs:\\n        pprint(resp.choices[0].logprobs)\\n\\n    request_config = XRequestConfig(\\n        stream=True, seed=42, max_tokens=256, temperature=0.8, top_k=20, top_p=0.8, logprobs=True, top_logprobs=5)\\n    stream_resp = inference_client(\\n        model_type, query, request_config=request_config, is_chat=is_chat, is_multimodal=is_multimodal)\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    for chunk in stream_resp:\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n        if print_logprobs and chunk.choices[0].logprobs is not None:\\n            pprint(chunk.choices[0].logprobs)\\n    print()\\n\\n\\ndef _test(infer_backend):\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    os.environ['TIMEOUT'] = '-1'\\n\\n    from swift.llm import DeployArguments\\n    from swift.llm.deploy import llm_deploy\\n    import multiprocessing\\n    mp = multiprocessing.get_context('spawn')\\n    process = mp.Process(\\n        target=llm_deploy,\\n        args=(DeployArguments(model_type='qwen2-7b-instruct', infer_backend=infer_backend, verbose=False), ))\\n    process.start()\\n    _test_client(True)\\n    process.terminate()\\n\\n\\ndef test_vllm():\\n    _test('vllm')\\n\\n\\ndef test_lmdeploy():\\n    _test('lmdeploy')\\n\\n\\ndef test_pt():\\n    _test('pt')\\n\\n\\ndef test_vllm_orgin():\\n    import os\\n    import subprocess\\n    import sys\\n    from modelscope import snapshot_download\\n    model_dir = snapshot_download('qwen/Qwen2-7B-Instruct')\\n    args = [sys.executable, '-m', 'vllm.entrypoints.openai.api_server', '--model', model_dir]\\n    process = subprocess.Popen(args)\\n    _test_client()\\n    process.terminate()\\n\\n\\nif __name__ == '__main__':\\n    # test_vllm_orgin()\\n    # test_vllm()\\n    # test_lmdeploy()\\n    test_pt()\\n\\n\\nimport os\\n\\n\\ndef test_eval_llm():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    from swift.llm import eval_main, EvalArguments\\n    eval_main(EvalArguments(model_type='qwen1half-7b-chat', eval_dataset='ARC_c', infer_backend='lmdeploy'))\\n\\n\\ndef test_eval_vlm():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '1'\\n    from swift.llm import eval_main, EvalArguments\\n    eval_main(EvalArguments(model_type='internvl2-4b', eval_dataset='RealWorldQA', infer_backend='lmdeploy'))\\n\\n\\ndef test_pt():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    from swift.llm import pt_main, PtArguments\\n    pt_main(PtArguments(model_type='qwen-1_8b-chat', dataset='alpaca-zh#100', sft_type='lora', tuner_backend='swift'))\\n\\n\\ndef test_vlm_sft():\\n    # lora full\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'\\n    from swift.llm import sft_main, SftArguments, infer_main, InferArguments\\n    model_type = 'phi3_5-vision-instruct'\\n    dataset = 'coco-en-mini#100'\\n    infer_main(InferArguments(model_type=model_type, val_dataset=dataset, infer_backend='pt', show_dataset_sample=2))\\n\\n    output = sft_main(SftArguments(model_type=model_type, dataset=dataset))\\n    last_model_checkpoint = output['last_model_checkpoint']\\n    infer_main(\\n        InferArguments(ckpt_dir=last_model_checkpoint, load_dataset_config=True, merge_lora=True, infer_backend='pt'))\\n\\n\\ndef test_llm_sft():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'\\n    from swift.llm import sft_main, SftArguments, infer_main, InferArguments\\n    model_type = 'phi3_5-moe-instruct'\\n    dataset = 'alpaca-zh#100'\\n    infer_main(InferArguments(model_type=model_type, val_dataset=dataset, infer_backend='pt', show_dataset_sample=2))\\n\\n    output = sft_main(SftArguments(model_type=model_type, dataset=dataset))\\n    last_model_checkpoint = output['last_model_checkpoint']\\n    infer_main(\\n        InferArguments(ckpt_dir=last_model_checkpoint, load_dataset_config=True, merge_lora=True, infer_backend='pt'))\\n\\n\\ndef test_vlm_dpo():\\n    # lora, full, stream\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'\\n    from swift.llm import rlhf_main, RLHFArguments, infer_main, InferArguments\\n    model_type = 'internvl2-2b'\\n    dataset = 'rlaif-v#100'\\n\\n    output = rlhf_main(RLHFArguments(model_type=model_type, dataset=dataset, max_length=8192, sft_type='full'))\\n    last_model_checkpoint = output['last_model_checkpoint']\\n    infer_main(InferArguments(ckpt_dir=last_model_checkpoint, load_dataset_config=True))\\n\\n\\nif __name__ == '__main__':\\n    # test_eval_llm()\\n    # test_eval_vlm()\\n    # test_pt()\\n    # test_vlm_sft()\\n    # test_llm_sft()\\n    test_vlm_dpo()\\n\\n\\nimport os\\n\\nfrom swift.llm import ExportArguments, InferArguments, SftArguments, export_main, infer_main, sft_main\\n\\nmodel_type = 'qwen1half-7b-chat'\\ntp = 2\\n\\n\\ndef convert2megatron():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    export_main(ExportArguments(model_type=model_type, to_megatron=True, tp=tp, dtype='bf16'))\\n\\n\\ndef convert2hf():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    export_main(ExportArguments(ckpt_dir=f'{model_type}-tp{tp}-pp1', to_hf=True, dtype='bf16'))\\n\\n\\ndef sft():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0,1'\\n    sft_main(\\n        SftArguments(resume_from_checkpoint=f'{model_type}-tp{tp}-pp1', dataset='alpaca-zh', train_backend='megatron'))\\n\\n\\ndef infer():\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    infer_main(InferArguments(model_type=model_type, model_id_or_path=f'{model_type}-tp{tp}-pp1/{model_type}-hf'))\\n\\n\\nif __name__ == '__main__':\\n    convert2megatron()\\n    # convert2hf()\\n    # infer()\\n    # sft()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_dreambooth_lora_sdxl\\n\\nif __name__ == '__main__':\\n    train_dreambooth_lora_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import infer_dreambooth_lora_sdxl\\n\\nif __name__ == '__main__':\\n    infer_dreambooth_lora_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_controlnet\\n\\nif __name__ == '__main__':\\n    train_controlnet()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.aigc import infer_text_to_image_lora\\n\\nif __name__ == '__main__':\\n    infer_text_to_image_lora()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_text_to_image_sdxl\\n\\nif __name__ == '__main__':\\n    train_text_to_image_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_text_to_image_lora_sdxl\\n\\nif __name__ == '__main__':\\n    train_text_to_image_lora_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import infer_dreambooth_lora\\n\\nif __name__ == '__main__':\\n    infer_dreambooth_lora()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import infer_controlnet\\n\\nif __name__ == '__main__':\\n    infer_controlnet()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.aigc import infer_text_to_image\\n\\nif __name__ == '__main__':\\n    infer_text_to_image()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import infer_dreambooth\\n\\nif __name__ == '__main__':\\n    infer_dreambooth()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.aigc import infer_text_to_image_sdxl\\n\\nif __name__ == '__main__':\\n    infer_text_to_image_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_text_to_image_lora\\n\\nif __name__ == '__main__':\\n    train_text_to_image_lora()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_dreambooth_lora\\n\\nif __name__ == '__main__':\\n    train_dreambooth_lora()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_dreambooth\\n\\nif __name__ == '__main__':\\n    train_dreambooth()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_controlnet_sdxl\\n\\nif __name__ == '__main__':\\n    train_controlnet_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.aigc import infer_text_to_image_lora_sdxl\\n\\nif __name__ == '__main__':\\n    infer_text_to_image_lora_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import infer_controlnet_sdxl\\n\\nif __name__ == '__main__':\\n    infer_controlnet_sdxl()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import train_text_to_image\\n\\nif __name__ == '__main__':\\n    train_text_to_image()\\n\\n\\n<h1 align=\\\"center\\\">Stable Diffusion Example</h1>\\n\\n<p align=\\\"center\\\">\\n<a href=\\\"https://modelscope.cn/home\\\">Modelscope Hub</a>\\n<br>\\n        <a href=\\\"README_CN.md\\\">中文</a>&nbsp ｜ &nbspEnglish\\n</p>\\n\\n## Features\\n1. Support Stable Diffusion [LoRA](https://arxiv.org/abs/2106.09685) method.\\n2. Support Stable Diffusion XL [LoRA](https://arxiv.org/abs/2106.09685) method.\\n\\n## Prepare the Environment\\n```bash\\npip install -r requirements.txt\\n```\\n\\n## Train and Inference\\n```bash\\n# Clone the repository and enter the code directory.\\ngit clone https://github.com/modelscope/swift.git\\n\\n# Stable Diffusion LoRA\\nbash examples/pytorch/stable_diffusion/run_train_lora.sh\\n\\n# Stable Diffusion XL LoRA\\nbash examples/pytorch/stable_diffusion/run_train_lora_xl.sh\\n```\\n\\n## Extend Datasets\\nThe [buptwq/lora-stable-diffusion-finetune](https://www.modelscope.cn/datasets/buptwq/lora-stable-diffusion-finetune/summary) dataset used in the example is from [ModelScope Hub](https://www.modelscope.cn/my/overview), you can replace different datasets ID by modifying the `train_dataset_name` parameter.\\nIn addition, you can also use local datasets. Fill in the path of the dataset file in `train_dataset_name` parameter, which needs to include a `train.csv` file to map image files and text prompts. Please organize it into the following format:\\n```\\nText,Target:FILE\\n[prompt], [image dir]\\n......\\n```\\n\\nHere is an example of `train.csv` file:\\n```\\nText,Target:FILE\\na dog,target/00.jpg\\na dog,target/01.jpg\\na dog,target/02.jpg\\na dog,target/03.jpg\\na dog,target/04.jpg\\n```\\n\\n\\nimport os\\nfrom dataclasses import dataclass, field\\n\\nimport cv2\\nimport torch\\nfrom modelscope import get_logger, snapshot_download\\nfrom modelscope.metainfo import Trainers\\nfrom modelscope.models import Model\\nfrom modelscope.msdatasets import MsDataset\\nfrom modelscope.pipelines import pipeline\\nfrom modelscope.trainers import build_trainer\\nfrom modelscope.trainers.training_args import TrainingArgs\\nfrom modelscope.utils.constant import DownloadMode, Tasks\\n\\nfrom swift import LoRAConfig, Swift\\n\\nlogger = get_logger()\\n\\n\\n# Load configuration file and dataset\\n@dataclass(init=False)\\nclass StableDiffusionLoraArguments(TrainingArgs):\\n    prompt: str = field(\\n        default='dog', metadata={\\n            'help': 'The pipeline prompt.',\\n        })\\n\\n    lora_rank: int = field(\\n        default=4, metadata={\\n            'help': 'The rank size of lora intermediate linear.',\\n        })\\n\\n    lora_alpha: int = field(\\n        default=32, metadata={\\n            'help': 'The factor to add the lora weights',\\n        })\\n\\n    lora_dropout: float = field(\\n        default=0.0, metadata={\\n            'help': 'The dropout rate of the lora module',\\n        })\\n\\n    bias: str = field(\\n        default='none', metadata={\\n            'help': 'Bias type. Values ca be \\\"none\\\", \\\"all\\\" or \\\"lora_only\\\"',\\n        })\\n\\n    sample_nums: int = field(\\n        default=10, metadata={\\n            'help': 'The numbers of sample outputs',\\n        })\\n\\n    num_inference_steps: int = field(\\n        default=50, metadata={\\n            'help': 'The number of denoising steps.',\\n        })\\n\\n\\ntraining_args = StableDiffusionLoraArguments(task='text-to-image-synthesis').parse_cli()\\nconfig, args = training_args.to_config()\\n\\nif os.path.exists(args.train_dataset_name):\\n    # Load local dataset\\n    train_dataset = MsDataset.load(args.train_dataset_name)\\n    validation_dataset = MsDataset.load(args.train_dataset_name)\\nelse:\\n    # Load online dataset\\n    train_dataset = MsDataset.load(args.train_dataset_name, split='train', download_mode=DownloadMode.FORCE_REDOWNLOAD)\\n    validation_dataset = MsDataset.load(\\n        args.train_dataset_name, split='validation', download_mode=DownloadMode.FORCE_REDOWNLOAD)\\n\\n\\ndef cfg_modify_fn(cfg):\\n    if args.use_model_config:\\n        cfg.merge_from_dict(config)\\n    else:\\n        cfg = config\\n    cfg.train.lr_scheduler = {'type': 'LambdaLR', 'lr_lambda': lambda _: 1, 'last_epoch': -1}\\n    return cfg\\n\\n\\n# build models\\nmodel = Model.from_pretrained(training_args.model, revision=args.model_revision)\\nmodel_dir = snapshot_download(args.model)\\nlora_config = LoRAConfig(\\n    r=args.lora_rank,\\n    lora_alpha=args.lora_alpha,\\n    lora_dropout=args.lora_dropout,\\n    bias=args.bias,\\n    target_modules=['to_q', 'to_k', 'to_v', 'query', 'key', 'value', 'to_out.0'])\\nmodel.unet = Swift.prepare_model(model.unet, lora_config)\\n\\n# build trainer and training\\nkwargs = dict(\\n    model=model,\\n    cfg_file=os.path.join(model_dir, 'configuration.json'),\\n    work_dir=training_args.work_dir,\\n    train_dataset=train_dataset,\\n    eval_dataset=validation_dataset,\\n    torch_type=torch.float32,\\n    use_swift=True,\\n    cfg_modify_fn=cfg_modify_fn)\\n\\ntrainer = build_trainer(name=Trainers.stable_diffusion, default_args=kwargs)\\ntrainer.train()\\n\\n# save models\\nmodel.unet.save_pretrained(os.path.join(training_args.work_dir, 'unet'))\\nlogger.info(f'model save pretrained {training_args.work_dir}')\\n\\n# pipeline after training and save result\\npipe = pipeline(\\n    task=Tasks.text_to_image_synthesis,\\n    model=training_args.model,\\n    model_revision=args.model_revision,\\n    lora_dir=os.path.join(training_args.work_dir, 'unet'),\\n    use_swift=True)\\n\\nfor index in range(args.sample_nums):\\n    image = pipe({'text': args.prompt, 'num_inference_steps': args.num_inference_steps})\\n    cv2.imwrite(f'./lora_result_{index}.png', image['output_imgs'][0])\\n\\n\\n<h1 align=\\\"center\\\">微调稳定扩散模型例子</h1>\\n\\n<p align=\\\"center\\\">\\n<a href=\\\"https://modelscope.cn/home\\\">魔搭社区</a>\\n<br>\\n        中文&nbsp ｜ &nbsp<a href=\\\"README.md\\\">English</a>\\n</p>\\n\\n\\n## 特性\\n1. 支持[LoRA](https://arxiv.org/abs/2106.09685)方法微调稳定扩散模型。\\n2. 支持[LoRA](https://arxiv.org/abs/2106.09685)方法微调XL版本的稳定扩散模型。\\n\\n## 环境准备\\n```bash\\npip install -r requirements.txt\\n```\\n\\n## 训练和推理\\n```bash\\n# 克隆代码库并进入代码目录\\ngit clone https://github.com/modelscope/swift.git\\n\\n# LoRA方法微调和推理稳定扩散模型\\nbash examples/pytorch/stable_diffusion/run_train_lora.sh\\n\\n# LoRA方法微调和推理XL版本的稳定扩散模型\\nbash examples/pytorch/stable_diffusion/run_train_lora_xl.sh\\n```\\n\\n## 数据集拓展\\n示例中使用的数据集[buptwq/lora-stable-diffusion-finetune](https://www.modelscope.cn/datasets/buptwq/lora-stable-diffusion-finetune/summary)来自[ModelScope Hub](https://www.modelscope.cn/my/overview)，您可以在ModelScope Hub选择其他数据集，用被选择的数据集ID来修改`train_dataset_name`参数。\\n\\n除此之外，您也可以使用本地数据集。请用本地数据集路径修改`train_dataset_name`参数，请注意在本地数据集路径中应该包含一个`train.csv`文件用来映射图片和文本提示词。`train.csv`文件请参照以下的格式：\\n```\\nText,Target:FILE\\n[提示词], [图片路径]\\n......\\n```\\n下面是一个 `train.csv` 文件的例子:\\n```\\nText,Target:FILE\\na dog,target/00.jpg\\na dog,target/01.jpg\\na dog,target/02.jpg\\na dog,target/03.jpg\\na dog,target/04.jpg\\n```\\n\\n\\ngit+https://github.com/modelscope/modelscope.git\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport custom\\n\\nfrom swift.llm import sft_main\\n\\nif __name__ == '__main__':\\n    output = sft_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Any, Dict\\n\\nimport torch\\nfrom datasets import Dataset as HfDataset\\nfrom transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer\\nfrom transformers.utils.versions import require_version\\n\\nfrom swift.llm import (LoRATM, Template, TemplateType, dataset_map, get_dataset, get_dataset_from_repo,\\n                       get_model_tokenizer, get_template, print_example, register_dataset, register_model,\\n                       register_template)\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass CustomModelType:\\n    tigerbot_7b = 'tigerbot-7b'\\n    tigerbot_13b = 'tigerbot-13b'\\n    tigerbot_13b_chat = 'tigerbot-13b-chat'\\n\\n\\nclass CustomTemplateType:\\n    tigerbot = 'tigerbot'\\n\\n\\nclass CustomDatasetName:\\n    stsb_en = 'stsb-en'\\n\\n\\n@register_model(CustomModelType.tigerbot_7b, 'TigerResearch/tigerbot-7b-base-v3', LoRATM.llama2,\\n                TemplateType.default_generation)\\n@register_model(CustomModelType.tigerbot_13b, 'TigerResearch/tigerbot-13b-base-v2', LoRATM.llama2,\\n                TemplateType.default_generation)\\n@register_model(CustomModelType.tigerbot_13b_chat, 'TigerResearch/tigerbot-13b-chat-v4', LoRATM.llama2,\\n                CustomTemplateType.tigerbot)\\ndef get_tigerbot_model_tokenizer(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 **kwargs):\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if use_flash_attn:\\n        require_version('transformers>=4.34')\\n        logger.info('Setting use_flash_attention_2: True')\\n        model_kwargs['use_flash_attention_2'] = True\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    model_config.pretraining_tp = 1\\n    model_config.torch_dtype = torch_dtype\\n    logger.info(f'model_config: {model_config}')\\n    tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)\\n    model = None\\n    if load_model:\\n        model = AutoModelForCausalLM.from_pretrained(\\n            model_dir, config=model_config, torch_dtype=torch_dtype, trust_remote_code=True, **model_kwargs)\\n    return model, tokenizer\\n\\n\\n# Ref: https://github.com/TigerResearch/TigerBot/blob/main/infer.py\\nregister_template(\\n    CustomTemplateType.tigerbot,\\n    Template(['{{SYSTEM}}'], ['\\\\n\\\\n### Instruction:\\\\n{{QUERY}}\\\\n\\\\n### Response:\\\\n'], [], [['eos_token_id']]))\\n\\n\\ndef _preprocess_stsb(dataset: HfDataset) -> HfDataset:\\n    prompt = \\\"\\\"\\\"Task: Based on the given two sentences, provide a similarity score between 0.0 and 5.0.\\nSentence 1: {text1}\\nSentence 2: {text2}\\nSimilarity score: \\\"\\\"\\\"\\n    query = []\\n    response = []\\n    for d in dataset:\\n        query.append(prompt.format(text1=d['text1'], text2=d['text2']))\\n        response.append(f\\\"{d['label']:.1f}\\\")\\n    return HfDataset.from_dict({'query': query, 'response': response})\\n\\n\\nregister_dataset(CustomDatasetName.stsb_en, 'swift/stsb', None, _preprocess_stsb, get_dataset_from_repo)\\n\\nif __name__ == '__main__':\\n    # The Shell script can view `examples/pytorch/llm/scripts/custom`.\\n    # test dataset\\n    train_dataset, val_dataset = get_dataset([CustomDatasetName.stsb_en], check_dataset_strategy='warning')\\n    print(f'train_dataset: {train_dataset}')\\n    print(f'val_dataset: {val_dataset}')\\n    # test model base\\n    model, tokenizer = get_model_tokenizer(CustomModelType.tigerbot_13b, use_flash_attn=False)\\n    # test model chat\\n    model, tokenizer = get_model_tokenizer(CustomModelType.tigerbot_13b_chat, use_flash_attn=False)\\n    # test template\\n    template = get_template(CustomTemplateType.tigerbot, tokenizer)\\n    train_dataset = dataset_map(train_dataset, template.encode)\\n    print_example(train_dataset[0], tokenizer)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport custom\\n\\nfrom swift.llm import infer_main\\n\\nif __name__ == '__main__':\\n    result = infer_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\\"\\\"\\\"\\nThis script runs the main process of Human Preferences Alignment using different algorithms.\\nSpecify the algorithm using the --rlhf_type argument.\\n\\nOptions:\\n    --rlhf_type dpo    : Direct Preference Optimization (DPO)\\n    --rlhf_type kto    : Kahneman-Tversky Optimization (KTO)\\n    --rlhf_type cpo    : Contrastive Preference Optimization (CPO)\\n    --rlhf_type simpo  : Simple Preference Optimization (SimPO)\\n    --rlhf_type orpo   : Odds Ratio Preference Optimization (ORPO)\\n\\\"\\\"\\\"\\nimport custom\\n\\nfrom swift.llm import rlhf_main\\n\\nif __name__ == '__main__':\\n    output = rlhf_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# import os\\n# os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\nimport custom\\n\\nfrom swift.llm import AppUIArguments, ModelType, app_ui_main\\n\\nif __name__ == '__main__':\\n    # Please refer to the `infer.sh` for setting the parameters.\\n    # text-generation\\n    # args = AppUIArguments(model_type=ModelType.chatglm3_6b_base)\\n    # or chat\\n    args = AppUIArguments(model_type=ModelType.qwen_7b_chat_int4)\\n    # or load from ckpt dir\\n    # args = AppUIArguments(ckpt_dir='xxx/vx-xxx/checkpoint-xxx')\\n    app_ui_main(args)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.llm import rome_main\\n\\nif __name__ == '__main__':\\n    rome_main()\\n\\n\\n[\\n    {\\n        \\\"name\\\": \\\"custom_general_qa\\\",\\n        \\\"pattern\\\": \\\"general_qa\\\",\\n        \\\"dataset\\\": \\\"eval_example/custom_general_qa\\\",\\n        \\\"subset_list\\\": [\\\"default\\\"]\\n    },\\n    {\\n        \\\"name\\\": \\\"custom_ceval\\\",\\n        \\\"pattern\\\": \\\"ceval\\\",\\n        \\\"dataset\\\": \\\"eval_example/custom_ceval\\\",\\n        \\\"subset_list\\\": [\\\"default\\\"]\\n    }\\n]\\n\\n\\nid,question,A,B,C,D,answer,explanation\\n1,要把膜蛋白脂完整地从膜上溶解下来，可以用____。,蛋白水解酶,透明质酸酶,去垢剂,糖苷水解酶,C,\\\"1. 首先，我们需要知道如何将膜蛋白脂从膜上溶解下来。膜蛋白脂是由蛋白质和脂质组成的复合物，因此需要使用一种能够破坏脂质的物质来将其溶解。\\n2. 接着，我们分析选项：(A) 蛋白水解酶是一种能够水解蛋白质的酶，会破坏膜蛋白脂的结构；(B) 透明质酸酶是一种能够水解透明质酸的酶，与膜蛋白脂无关；(C) 去垢剂是一种能够破坏脂质的物质，可以将膜蛋白脂完整地从膜上溶解下来；(D) 糖苷水解酶是一种能够水解糖苷的酶，与膜蛋白脂无关。\\\"\\n2,不连续聚丙烯酰胺凝胶电泳比一般电泳的分辨率高，是因为具有____。,浓缩效应,电荷效应,分子筛效应,黏度效应,A,\\\"1. 浓缩效应是指由于凝胶孔径等的不连续性，样本物质被浓缩为一个狭窄的中间层，是不连续聚丙烯酰胺凝胶电泳分辨率高的主要原因。\\n2. 电荷效应和分子筛效应不是不连续聚丙烯酰胺凝胶电泳特有的效应；黏度效应与分辨率提高没有直接关系。\\\"\\n\\n\\nid,question,A,B,C,D,answer,explanation\\n1,通常来说，组成动物蛋白质的氨基酸有____,4种,22种,20种,19种,C,1. 目前已知构成动物蛋白质的的氨基酸有20种。\\n2,血液内存在的下列物质中，不属于代谢终产物的是____。,尿素,尿酸,丙酮酸,二氧化碳,C,\\\"1. 代谢终产物是指在生物体内代谢过程中产生的无法再被利用的物质，需要通过排泄等方式从体内排出。\\n2. 丙酮酸是糖类代谢的产物，可以被进一步代谢为能量或者合成其他物质，并非代谢终产物。\\\"\\n\\n\\n{\\n    \\\"model.embed_tokens\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.0\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.1\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.2\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.3\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.4\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.5\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.6\\\": \\\"cuda:0\\\",\\n    \\\"model.layers.7\\\": \\\"cuda:1\\\",\\n    \\\"model.layers.8\\\": \\\"cuda:1\\\",\\n    \\\"model.layers.9\\\": \\\"cuda:1\\\",\\n    \\\"model.layers.10\\\": \\\"cuda:1\\\",\\n    \\\"model.layers.11\\\": \\\"cuda:1\\\",\\n    \\\"model.layers.12\\\": \\\"cuda:1\\\",\\n    \\\"model.layers.13\\\": \\\"cuda:1\\\",\\n    \\\"model.layers.14\\\": \\\"cuda:2\\\",\\n    \\\"model.layers.15\\\": \\\"cuda:2\\\",\\n    \\\"model.layers.16\\\": \\\"cuda:2\\\",\\n    \\\"model.layers.17\\\": \\\"cuda:2\\\",\\n    \\\"model.layers.18\\\": \\\"cuda:2\\\",\\n    \\\"model.layers.19\\\": \\\"cuda:2\\\",\\n    \\\"model.layers.20\\\": \\\"cuda:2\\\",\\n    \\\"model.layers.21\\\": \\\"cuda:3\\\",\\n    \\\"model.layers.22\\\": \\\"cuda:3\\\",\\n    \\\"model.layers.23\\\": \\\"cuda:3\\\",\\n    \\\"model.layers.24\\\": \\\"cuda:3\\\",\\n    \\\"model.layers.25\\\": \\\"cuda:3\\\",\\n    \\\"model.layers.26\\\": \\\"cuda:3\\\",\\n    \\\"model.layers.27\\\": \\\"cuda:3\\\",\\n    \\\"model.layers.28\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.29\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.30\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.31\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.32\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.33\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.34\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.35\\\": \\\"cuda:4\\\",\\n    \\\"model.layers.36\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.37\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.38\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.39\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.40\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.41\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.42\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.43\\\": \\\"cuda:5\\\",\\n    \\\"model.layers.44\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.45\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.46\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.47\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.48\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.49\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.50\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.51\\\": \\\"cuda:6\\\",\\n    \\\"model.layers.52\\\": \\\"cuda:7\\\",\\n    \\\"model.layers.53\\\": \\\"cuda:7\\\",\\n    \\\"model.layers.54\\\": \\\"cuda:7\\\",\\n    \\\"model.layers.55\\\": \\\"cuda:7\\\",\\n    \\\"model.layers.56\\\": \\\"cuda:7\\\",\\n    \\\"model.layers.57\\\": \\\"cuda:7\\\",\\n    \\\"model.layers.58\\\": \\\"cuda:7\\\",\\n    \\\"model.layers.59\\\": \\\"cuda:7\\\",\\n    \\\"model.norm\\\": \\\"cuda:7\\\",\\n    \\\"lm_head\\\": \\\"cuda:7\\\"\\n}\\n\\n\\n{\\n  \\\"compute_environment\\\": \\\"LOCAL_MACHINE\\\",\\n  \\\"debug\\\": false,\\n  \\\"distributed_type\\\": \\\"FSDP\\\",\\n  \\\"downcast_bf16\\\": \\\"no\\\",\\n  \\\"fsdp_config\\\": {\\n    \\\"fsdp_auto_wrap_policy\\\": \\\"TRANSFORMER_BASED_WRAP\\\",\\n    \\\"fsdp_backward_prefetch\\\": \\\"BACKWARD_PRE\\\",\\n    \\\"fsdp_cpu_ram_efficient_loading\\\": true,\\n    \\\"fsdp_forward_prefetch\\\": false,\\n    \\\"fsdp_offload_params\\\": true,\\n    \\\"fsdp_sharding_strategy\\\": \\\"FULL_SHARD\\\",\\n    \\\"fsdp_state_dict_type\\\": \\\"SHARDED_STATE_DICT\\\",\\n    \\\"fsdp_transformer_layer_cls_to_wrap\\\": \\\"Qwen2DecoderLayer\\\",\\n    \\\"fsdp_sync_module_states\\\": true,\\n    \\\"fsdp_use_orig_params\\\": true\\n  },\\n  \\\"machine_rank\\\": 0,\\n  \\\"main_training_function\\\": \\\"main\\\",\\n  \\\"mixed_precision\\\": \\\"bf16\\\",\\n  \\\"num_machines\\\": 1,\\n  \\\"num_processes\\\": 4,\\n  \\\"rdzv_backend\\\": \\\"static\\\",\\n  \\\"same_network\\\": true,\\n  \\\"tpu_env\\\": [],\\n  \\\"tpu_use_cluster\\\": false,\\n  \\\"tpu_use_sudo\\\": false,\\n  \\\"use_cpu\\\": false\\n}\\n\\n\\n{\\n  \\\"compute_environment\\\": \\\"LOCAL_MACHINE\\\",\\n  \\\"debug\\\": false,\\n  \\\"distributed_type\\\": \\\"FSDP\\\",\\n  \\\"downcast_bf16\\\": \\\"no\\\",\\n  \\\"fsdp_config\\\": {\\n    \\\"fsdp_auto_wrap_policy\\\": \\\"TRANSFORMER_BASED_WRAP\\\",\\n    \\\"fsdp_backward_prefetch\\\": \\\"BACKWARD_PRE\\\",\\n    \\\"fsdp_cpu_ram_efficient_loading\\\": true,\\n    \\\"fsdp_forward_prefetch\\\": false,\\n    \\\"fsdp_offload_params\\\": true,\\n    \\\"fsdp_sharding_strategy\\\": \\\"FULL_SHARD\\\",\\n    \\\"fsdp_state_dict_type\\\": \\\"FULL_STATE_DICT\\\",\\n    \\\"fsdp_sync_module_states\\\": true,\\n    \\\"fsdp_use_orig_params\\\": false\\n  },\\n  \\\"machine_rank\\\": 0,\\n  \\\"main_training_function\\\": \\\"main\\\",\\n  \\\"mixed_precision\\\": \\\"no\\\",\\n  \\\"num_machines\\\": 1,\\n  \\\"num_processes\\\": 2,\\n  \\\"rdzv_backend\\\": \\\"static\\\",\\n  \\\"same_network\\\": true,\\n  \\\"tpu_env\\\": [],\\n  \\\"tpu_use_cluster\\\": false,\\n  \\\"tpu_use_sudo\\\": false,\\n  \\\"use_cpu\\\": false\\n}\\n\\n\\n[\\n    {\\n        \\\"prompt\\\": \\\"{} was the founder of\\\",\\n        \\\"subject\\\": \\\"Steve Jobs\\\",\\n        \\\"target\\\": \\\"Microsoft\\\"\\n    },\\n    {\\n        \\\"prompt\\\": \\\"{} is located in\\\",\\n        \\\"subject\\\": \\\"HangZhou\\\",\\n        \\\"target\\\": \\\"Africa\\\"\\n    }\\n]\\n\\n\\nimport os\\n\\nimport cv2\\nfrom modelscope.models import Model\\nfrom modelscope.msdatasets import MsDataset\\nfrom modelscope.pipelines import pipeline\\nfrom modelscope.trainers import build_trainer\\nfrom modelscope.utils.config import Config\\nfrom modelscope.utils.constant import ModelFile\\n\\nfrom swift import LoRAConfig, SCETuningConfig, Swift, snapshot_download\\n\\n# load dataset\\ntrain_dataset = MsDataset.load(\\n    'style_custom_dataset', namespace='damo', subset_name='3D',\\n    split='train_short').remap_columns({'Image:FILE': 'Target:FILE'})\\n\\n# load pretrained model\\nmodel_id = 'damo/multi-modal_efficient-diffusion-tuning-swift-base'\\ntask = 'efficient-diffusion-tuning'\\nrevision = 'v1.0.1'\\nmodel_dir = snapshot_download(model_id)\\ncfg_dict = Config.from_file(os.path.join(model_dir, ModelFile.CONFIGURATION))\\ncfg_dict.model.inference = False\\nmodel = Model.from_pretrained(model_id, cfg_dict=cfg_dict, revision=revision)\\n\\n# init tuner\\ntuner_type = 'scetuning'  # \\\"lora\\\"\\n\\nif tuner_type == 'lora':\\n    work_dir = 'tmp/multimodal_swift_lora_style'\\n    tuner_config = LoRAConfig(r=64, target_modules='.*unet.*.(to_q|to_k|to_v|to_out.0|net.0.proj|net.2)$')\\n    model = Swift.prepare_model(model, tuner_config)\\nelif tuner_type == 'scetuning':\\n    work_dir = 'tmp/multimodal_swift_scetuning_style'\\n    tuner_config = SCETuningConfig(\\n        dims=[1280, 1280, 1280, 1280, 1280, 640, 640, 640, 320, 320, 320, 320],\\n        target_modules=r'^unet\\\\.up_blocks\\\\.\\\\d+\\\\.resnets\\\\.\\\\d+$')\\n    model = Swift.prepare_model(model, tuner_config)\\nelse:\\n    raise Exception(f'Error tuner type: {tuner_type}')\\n\\n\\n# training\\ndef cfg_modify_fn(cfg):\\n    cfg.preprocessor.resolution = 512\\n    cfg.train.lr_scheduler = {'type': 'LambdaLR', 'lr_lambda': lambda _: 1, 'last_epoch': -1}\\n    cfg.train.max_epochs = 100\\n    cfg.train.optimizer.lr = 1e-4\\n    cfg.train.dataloader.batch_size_per_gpu = 10\\n    cfg.model.inference = False\\n    cfg.model.pretrained_tuner = None\\n    trainer_hook = cfg.train.hooks\\n    trainer_hook.append({'type': 'SwiftHook'})\\n    trainer_hook.append({'type': 'CheckpointHook', 'interval': 50})\\n    cfg.train.hooks = trainer_hook\\n    return cfg\\n\\n\\nkwargs = dict(\\n    model=model,\\n    cfg_file=os.path.join(model_dir, 'configuration.json'),\\n    work_dir=work_dir,\\n    train_dataset=train_dataset,\\n    eval_dataset=train_dataset,\\n    cfg_modify_fn=cfg_modify_fn)\\ntrainer = build_trainer(name='efficient-diffusion-tuning', default_args=kwargs)\\ntrainer.train()\\n\\n# inference\\nwork_dir = os.path.join(work_dir, 'output_swift')\\nmodel_dir = snapshot_download(model_id)\\ncfg_dict = Config.from_file(os.path.join(model_dir, ModelFile.CONFIGURATION))\\ncfg_dict.model.inference = True\\nmodel = Model.from_pretrained(model_id, cfg_dict=cfg_dict, revision=revision)\\nmodel = Swift.from_pretrained(model, work_dir)\\npipe = pipeline(task='efficient-diffusion-tuning', model=model)\\ntest_prompt = 'A boy in a camouflage jacket with a scarf'\\nimg_out = pipe({'prompt': test_prompt}, num_inference_steps=50, generator_seed=123)['output_imgs'][0]\\ncv2.imwrite(os.path.join(work_dir, 'inference.png'), img_out)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import animatediff_main\\n\\nif __name__ == '__main__':\\n    animatediff_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom swift.aigc import animatediff_infer_main\\n\\nif __name__ == '__main__':\\n    animatediff_infer_main()\\n\\n\\n## maintain docs\\n1. build docs\\n    ```shell\\n    # in root directory:\\n    make docs\\n    ```\\n\\n2. doc string format\\n\\n    We adopt the google style docstring format as the standard, please refer to the following documents.\\n    1. Google Python style guide docstring [link](http://google.github.io/styleguide/pyguide.html#381-docstrings)\\n    2. Google docstring example [link](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html)\\n    3. sample：torch.nn.modules.conv [link](https://pytorch.org/docs/stable/_modules/torch/nn/modules/conv.html#Conv1d)\\n    4. load function as an example：\\n\\n    ```python\\n    def load(file, file_format=None, **kwargs):\\n        \\\"\\\"\\\"Load data from json/yaml/pickle files.\\n\\n        This method provides a unified api for loading data from serialized files.\\n\\n        Args:\\n            file (str or :obj:`Path` or file-like object): Filename or a file-like\\n                object.\\n            file_format (str, optional): If not specified, the file format will be\\n                inferred from the file extension, otherwise use the specified one.\\n                Currently supported formats include \\\"json\\\", \\\"yaml/yml\\\".\\n\\n        Examples:\\n            >>> load('/path/of/your/file')  # file is stored in disk\\n            >>> load('https://path/of/your/file')  # file is stored on internet\\n            >>> load('oss://path/of/your/file')  # file is stored in petrel\\n\\n        Returns:\\n            The content from the file.\\n        \\\"\\\"\\\"\\n    ```\\n\\n\\n# Configuration file for the Sphinx documentation builder.\\n#\\n# This file only contains a selection of the most common options. For a full\\n# list see the documentation:\\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\\n\\n# -- Path setup --------------------------------------------------------------\\n\\n# If extensions (or modules to document with autodoc) are in another directory,\\n# add these directories to sys.path here. If the directory is relative to the\\n# documentation root, use os.path.abspath to make it absolute, like shown here.\\n#\\nimport os\\nimport sys\\n\\n# import sphinx_book_theme\\n\\nsys.path.insert(0, os.path.abspath('../../'))\\n# -- Project information -----------------------------------------------------\\n\\nproject = 'swift'\\ncopyright = '2022-2024, Alibaba ModelScope'\\nauthor = 'ModelScope Authors'\\nversion_file = '../../swift/version.py'\\nhtml_theme = 'sphinx_rtd_theme'\\nlanguage = 'en'\\n\\n\\ndef get_version():\\n    with open(version_file, 'r', encoding='utf-8') as f:\\n        exec(compile(f.read(), version_file, 'exec'))\\n    return locals()['__version__']\\n\\n\\n# The full version, including alpha/beta/rc tags\\nversion = get_version()\\nrelease = version\\n\\n# -- General configuration ---------------------------------------------------\\n\\n# Add any Sphinx extension module names here, as strings. They can be\\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\\n# ones.\\nextensions = [\\n    'sphinx.ext.napoleon',\\n    'sphinx.ext.autosummary',\\n    'sphinx.ext.autodoc',\\n    'sphinx.ext.viewcode',\\n    'sphinx_markdown_tables',\\n    'sphinx_copybutton',\\n    'myst_parser',\\n]\\n\\n# build the templated autosummary files\\nautosummary_generate = True\\nnumpydoc_show_class_members = False\\n\\n# Enable overriding of function signatures in the first line of the docstring.\\nautodoc_docstring_signature = True\\n\\n# Disable docstring inheritance\\nautodoc_inherit_docstrings = False\\n\\n# Show type hints in the description\\nautodoc_typehints = 'description'\\n\\n# Add parameter types if the parameter is documented in the docstring\\nautodoc_typehints_description_target = 'documented_params'\\n\\nautodoc_default_options = {\\n    'member-order': 'bysource',\\n}\\n\\n# Add any paths that contain templates here, relative to this directory.\\ntemplates_path = ['_templates']\\n\\n# The suffix(es) of source filenames.\\n# You can specify multiple suffix as a list of string:\\n#\\nsource_suffix = ['.rst', '.md']\\n\\n# The master toctree document.\\nroot_doc = 'index'\\n\\n# List of patterns, relative to source directory, that match files and\\n# directories to ignore when looking for source files.\\n# This pattern also affects html_static_path and html_extra_path.\\nexclude_patterns = ['build', 'source_en/.ipynb_checkpoints', 'source_en/api/generated', 'Thumbs.db', '.DS_Store']\\n# A list of glob-style patterns [1] that are used to find source files.\\n# They are matched against the source file names relative to the source directory,\\n# using slashes as directory separators on all platforms.\\n# The default is **, meaning that all files are recursively included from the source directory.\\n# -- Options for HTML output -------------------------------------------------\\n\\n# The theme to use for HTML and HTML Help pages.  See the documentation for\\n# a list of builtin themes.\\n#\\n# html_theme = 'sphinx_book_theme'\\n# html_theme_path = [sphinx_book_theme.get_html_theme_path()]\\n# html_theme_options = {}\\n\\n# Add any paths that contain custom static files (such as style sheets) here,\\n# relative to this directory. They are copied after the builtin static files,\\n# so a file named \\\"default.css\\\" will overwrite the builtin \\\"default.css\\\".\\nhtml_static_path = ['_static']\\n# html_css_files = ['css/readthedocs.css']\\n\\n# -- Options for HTMLHelp output ---------------------------------------------\\n# Output file base name for HTML help builder.\\n\\n# -- Extension configuration -------------------------------------------------\\n# Ignore >>> when copying code\\ncopybutton_prompt_text = r'>>> |\\\\.\\\\.\\\\. '\\ncopybutton_prompt_is_regexp = True\\n\\n# Example configuration for intersphinx: refer to the Python standard library.\\nintersphinx_mapping = {'https://docs.python.org/': None}\\n\\n\\n# Command Line Arguments\\n\\n## Table of Contents\\n\\n- [sft Parameters](#sft-parameters)\\n- [pt Parameters](#pt-parameters)\\n- [rlhf Parameters](#rlhf-parameters)\\n- [infer merge-lora Parameters](#infer-merge-lora-parameters)\\n- [export Parameters](#export-parameters)\\n- [eval Parameters](#eval-parameters)\\n- [app-ui Parameters](#app-ui-parameters)\\n- [deploy Parameters](#deploy-parameters)\\n\\n## sft Parameters\\n- `--🔥model_type`: Represents the selected model type, default is `None`. `model_type` specifies the default `target_modules`, `template_type`, and other information for the corresponding model. You can fine-tune by specifying only `model_type`. The corresponding `model_id_or_path` will use default settings, and the model will be downloaded from ModelScope and use the default cache path. One of model_type and model_id_or_path must be specified. You can see the list of available `model_type` [here](Supported-models-datasets.md#Models). You can set the `USE_HF` environment variable to control downloading models and datasets from the HF Hub, see [HuggingFace Ecosystem Compatibility Documentation](../LLM/Compat-HF.md).\\n- `--🔥model_id_or_path`: Represents the `model_id` in the ModelScope/HuggingFace Hub or a local path for the model, default is `None`. If the provided `model_id_or_path` has already been registered, the `model_type` will be inferred based on the `model_id_or_path`. If it has not been registered, both `model_type` and `model_id_or_path` must be specified, e.g. `--model_type <model_type> --model_id_or_path <model_id_or_path>`.\\n- `--model_revision`: The version number corresponding to `model_id` on ModelScope Hub, default is `None`. If `model_revision` is `None`, use the revision registered in `MODEL_MAPPING`. Otherwise, force use of the `model_revision` passed from command line.\\n- `--local_repo_path`: Some models rely on a GitHub repo for loading. To avoid network issues during `git clone`, you can directly use the local repo. This parameter requires input of the local repo path, and defaults to `None`. These models include:\\n  - mPLUG-Owl model: `https://github.com/X-PLUG/mPLUG-Owl`\\n  - DeepSeek-VL model: `https://github.com/deepseek-ai/DeepSeek-VL`\\n  - YI-VL model: `https://github.com/01-ai/Yi`\\n  - LLAVA model: `https://github.com/haotian-liu/LLaVA.git`\\n- `--🔥sft_type`: Fine-tuning method, default is `'lora'`. Options include: 'lora', 'full', 'longlora', 'adalora', 'ia3', 'llamapro', 'adapter', 'vera', 'boft', 'fourierft', 'reft'. If using qlora, you need to set `--sft_type lora --quantization_bit 4`.\\n- `--packing`: pack the dataset length to `max-length`, default `False`.\\n- `--full_determinism`: Fix all the values in training, default `False`.\\n- `--auto_find_batch_size`: Auto find batch size according to the GPU memory, default `False`.\\n- `--streaming`: Whether to use iterable dataset, Default `False`.\\n- `--freeze_parameters`: When sft_type is specified as 'full', the layers prefixed with freeze_parameters will be frozen. The default value is `[]`. For example: `--freeze_parameters visual`.\\n- `--🔥freeze_vit`: When sft_type is set to 'full' and a multimodal model is being trained, the parameters of vit can be frozen by setting this parameter to True. The default value is `False`.\\n- `--freeze_parameters_ratio`: When sft_type is set to 'full', freeze the bottommost parameters of the model. Range is 0. ~ 1., default is `0.`. This provides a compromise between lora and full fine-tuning.\\n- `--additional_trainable_parameters`: In addition to freeze_parameters, only allowed when sft_type is 'full', default is `[]`. For example, if you want to train embedding layer in addition to 50% of parameters, you can set `--freeze_parameters_ratio 0.5 --additional_trainable_parameters transformer.wte`, all parameters starting with `transformer.wte` will be activated. You can also set `--freeze_parameters_ratio 1 --additional_trainable_parameters xxx` to customize the trainable layers.\\n- `--tuner_backend`: Backend support for lora, qlora, default is `'peft'`. Options include: 'swift', 'peft', 'unsloth'.\\n- `--🔥template_type`: Type of dialogue template used, default is `'AUTO'`, i.e. look up `template` in `MODEL_MAPPING` based on `model_type`. Available `template_type` options can be found in `TEMPLATE_MAPPING.keys()`.\\n- `--🔥output_dir`: Directory to store ckpt, default is `'output'`. We will append `model_type` and fine-tuning version number to this directory, allowing users to do multiple comparative experiments on different models without changing the `output_dir` command line argument. If you don't want to append this content, specify `--add_output_dir_suffix false`.\\n- `--add_output_dir_suffix`: Default is `True`, indicating that a suffix of `model_type` and fine-tuning version number will be appended to the `output_dir` directory. Set to `False` to avoid this behavior.\\n- `--ddp_backend`: Backend support for distributed training, default is `None`. Options include: 'nccl', 'gloo', 'mpi', 'ccl'.\\n- `--ddp_timeout`: DDP timeout. Default `1800` seconds.\\n- `--seed`: Global seed, default is `42`. Used to reproduce training results.\\n- `--🔥resume_from_checkpoint`: Used for resuming training from a checkpoint, default is `None`. You can set it to the path of the checkpoint, for example: `--resume_from_checkpoint output/qwen-7b-chat/vx-xxx/checkpoint-xxx`, to resume training from that point. Supports adjusting `--resume_only_model` to only read the model file during checkpoint continuation.\\n- `--resume_only_model`: Default is `False`, which means strict checkpoint continuation, this will read the weights of the model, optimizer, lr_scheduler, and the random seeds stored on each device, and continue training from the last paused steps. If set to `True`, it will only read the weights of the model.\\n- `--dtype`: torch_dtype when loading base model, default is `'AUTO'`, i.e. intelligently select dtype: if machine does not support bf16, use fp16; if `MODEL_MAPPING` specifies torch_dtype for corresponding model, use its dtype; otherwise use bf16. Options include: 'bf16', 'fp16', 'fp32'.\\n- `--model_kwargs`: Used for passing additional parameters to the multimodal model, for example: `'{\\\"hd_num\\\": 16}'`. You can either pass a JSON string or directly pass a dictionary. The default is `None`. In addition to using this parameter, you can also pass it through environment variables, for example: `HD_NUM=16`.\\n- `--🔥dataset`: Used to select the training dataset, default is `[]`. You can see the list of available datasets [here](Supported-models-datasets.md#Datasets). If you need to train with multiple datasets, you can use ',' or ' ' to separate them, for example: `--dataset alpaca-en,alpaca-zh` or `--dataset alpaca-en alpaca-zh`. It supports Modelscope Hub/HuggingFace Hub/local paths, subset selection, and dataset sampling. The specified format for each dataset is as follows: `[HF or MS::]{dataset_name} or {dataset_id} or {dataset_path}[:subset1/subset2/...][#dataset_sample]`. The simplest case requires specifying only dataset_name, dataset_id, or dataset_path. Customizing datasets can be found in the [Customizing and Extending Datasets document](Customization.md#custom-dataset)\\n  - Supports MS and HF hub, as well as dataset_sample. For example, 'MS::alpaca-zh#2000', 'HF::jd-sentiment-zh#2000' (the default hub used is controlled by the `USE_UF` environment variable, default is MS).\\n  - More fine-grained control over subsets: It uses the subsets specified during registration by default (if not specified during registration, it uses 'default'). For example, 'sharegpt-gpt4'. If subsets are specified, it uses the corresponding subset of the dataset. For example, 'sharegpt-gpt4:default/V3_format#2000'. Here, the `default` and `V3_format` sub-datasets are used, separated by '/', and 2000 entries are selected.\\n  - Support for dataset_id. For example, 'AI-ModelScope/alpaca-gpt4-data-zh#2000', 'HF::llm-wizard/alpaca-gpt4-data-zh#2000', 'hurner/alpaca-gpt4-data-zh#2000', 'HF::shibing624/alpaca-zh#2000'. If the dataset_id has been registered, it will use the preprocessing function, subsets, split, etc. specified during registration. Otherwise, it will use `SmartPreprocessor`, support 5 dataset formats, and use 'default' subsets, with split set to 'train'. The supported dataset formats can be found in the [Customizing and Extending Datasets document](Customization.md#custom-dataset).\\n  - Support for dataset_path. For example, '1.jsonl#5000' (if it is a relative path, it is relative to the running directory).\\n- `--val_dataset`: Specify separate validation datasets with the same format of the `dataset` argument, default is `[]`. If using `val_dataset`, the `dataset_test_ratio` will be ignored.\\n- `--dataset_seed`: The seed used to specify the dataset processing is set by default to `None`, meaning it is designated as the global `seed`. The `dataset_seed` exists in the form of `random_state` and does not affect the global seed.\\n- `--dataset_test_ratio`: Used to specify the ratio for splitting the sub-dataset into training and validation sets. The default value is `0.01`. If `--val_dataset` is set, this parameter becomes ineffective.\\n- `--train_dataset_sample`: The number of samples for the training dataset, default is `-1`, which means using the complete training dataset for training. This parameter is deprecated, please use `--dataset {dataset_name}#{dataset_sample}` instead.\\n- `--val_dataset_sample`: Used to sample the validation set, with a default value of `None`, which automatically selects a suitable number of data samples for validation. If you specify `-1`, the complete validation set is used for validation. This parameter is deprecated and the number of samples in the validation set is controlled by `--dataset_test_ratio` or `--val_dataset {dataset_name}#{dataset_sample}`.\\n- `--🔥system`: System used in dialogue template, default is `None`, i.e. use the model's default system. If set to '', no system is used.\\n- `--tools_prompt`: Select the corresponding tools system prompt for the tools field transformation. The options are ['react_en', 'react_zh', 'toolbench'], which correspond to the English version of ReAct format, Chinese version of ReAct format and the toolbench format, respectively. The default is the English version of the ReAct format. For more information, you can refer to the [Agent Deployment Best Practices](Agent-deployment-best-practices.md).\\n- `--🔥max_length`: Maximum token length, default is `2048`. Avoids OOM issues caused by individual overly long samples. When `--truncation_strategy delete` is specified, samples exceeding max_length will be deleted. When `--truncation_strategy truncation_left` is specified, the leftmost tokens will be truncated: `input_ids[-max_length:]`. If set to -1, no limit.\\n- `--truncation_strategy`: Default is `'delete'` which removes sentences exceeding max_length from dataset. `'truncation_left'` will truncate excess text from the left, which may truncate special tokens and affect performance, not recommended.\\n- `--check_dataset_strategy`: Default is `'none'`, i.e. no checking. If training an LLM model, `'warning'` is recommended as data check strategy. If your training target is sentence classification etc., setting to `'none'` is recommended.\\n\\n- `--custom_train_dataset_path`: Default value is `[]`. This parameter has been deprecated, please use `--dataset {dataset_path}`.\\n- `--custom_val_dataset_path`: Default value is `[]`. This parameter is deprecated. Please use `--val_dataset {dataset_path}` instead.\\n- `--self_cognition_sample`: The number of samples for the self-cognition dataset. Default is `0`. If you set this value to >0, you need to specify `--model_name` and `--model_author` at the same time. This parameter has been deprecated, please use `--dataset self-cognition#{self_cognition_sample}` instead.\\n- `--🔥model_name`: Default value is `[None, None]`. If self-cognition dataset sampling is enabled (i.e., specifying `--dataset self-cognition` or self_cognition_sample>0), you need to provide two values, representing the Chinese and English names of the model, respectively. For example: `--model_name 小黄 'Xiao Huang'`. If you want to learn more, you can refer to the [Self-Cognition Fine-tuning Best Practices](../LLM/Self-cognition-best-practice.md).\\n- `--🔥model_author`: Default is `[None, None]`. If self-cognition dataset sampling is enabled, you need to pass two values, representing the author's Chinese and English names respectively. E.g. `--model_author 魔搭 ModelScope`.\\n- `--quant_method`: Quantization method, default is None. You can choose from 'bnb', 'hqq', 'eetq'.\\n- `--quantization_bit`: Specifies whether to quantize and number of quantization bits, default is `0`, i.e. no quantization. To use 4bit qlora, set `--sft_type lora --quantization_bit 4`.Hqq support 1,2,3,4,8bit, bnb support 4,8bit\\n- `--hqq_axis`: Hqq argument. Axis along which grouping is performed. Supported values are 0 or 1. default is `0`\\n- `--hqq_dynamic_config_path`: Parameters for dynamic configuration. The key is the name tag of the layer and the value is a quantization config. If set, each layer specified by its id will use its dedicated quantization configuration.[ref](https://github.com/mobiusml/hqq?tab=readme-ov-file#custom-quantization-configurations-%EF%B8%8F)\\n- `--bnb_4bit_comp_dtype`: When doing 4bit quantization, we need to dequantize during model forward and backward passes. This specifies the torch_dtype after dequantization. Default is `'AUTO'`, i.e. consistent with `dtype`. Options: 'fp16', 'bf16', 'fp32'. Has no effect when quantization_bit is 0.\\n- `--bnb_4bit_quant_type`: Quantization method for 4bit quantization, default is `'nf4'`. Options: 'nf4', 'fp4'. Has no effect when quantization_bit is 0.\\n- `--bnb_4bit_use_double_quant`: Whether to enable double quantization for 4bit quantization, default is `True`. Has no effect when quantization_bit is 0.\\n- `--bnb_4bit_quant_storage`: Default vlaue `None`.This sets the storage type to pack the quanitzed 4-bit prarams. Has no effect when quantization_bit is 0.\\n- `--🔥target_modules`: Specify lora modules, default is `['DEFAULT']`. If target_modules is passed `'DEFAULT'` or `'AUTO'`, look up `target_modules` in `MODEL_MAPPING` based on `model_type` (The LLM is defaulted to qkv, while the MLLM defaults to all lines in the llm and projector.). If passed `'ALL'`, all Linear layers (excluding head) will be specified as lora modules. If passed `'EMBEDDING'`, Embedding layer will be specified as lora module. If memory allows, setting to 'ALL' is recommended. You can also set `['ALL', 'EMBEDDING']` to specify all Linear and embedding layers as lora modules. This parameter only takes effect when `sft_type` is 'lora'. This argument works when sft_type in lora/vera/boft/ia3/adalora/fourierft.\\n- `--target_regex`: The lora target regex in `Optional[str]`. default is `None`. If this argument is specified, the `target_modules` will have no effect. This argument works when sft_type in lora/vera/boft/ia3/adalora/fourierft.\\n- `--🔥lora_rank`: Default is `8`. Only takes effect when `sft_type` is 'lora'.\\n- `--🔥lora_alpha`: Default is `32`. Only takes effect when `sft_type` is 'lora'.\\n- `--lora_dropout`: Default is `0.05`, only takes effect when `sft_type` is 'lora'.\\n- `--init_lora_weights`: Method to initialize LoRA weights, can be specified as `true`, `false`, `gaussian`, `pissa`, or `pissa_niter_[number of iters]`. Default value `true`.\\n- `--lora_bias_trainable`: Default is `'none'`, options: 'none', 'all'. Set to `'all'` to make all biases trainable.\\n- `--modules_to_save`: Default is `[]`. If you want to train embedding, lm_head, or layer_norm, you can set this parameter, e.g. `--modules_to_save EMBEDDING LN lm_head`. If passed `'EMBEDDING'`, Embedding layer will be added to `modules_to_save`. If passed `'LN'`, `RMSNorm` and `LayerNorm` will be added to `modules_to_save`. This argument works when sft_type in lora/vera/boft/ia3/adalora/fourierft.\\n- `--lora_dtype`: Default is `'AUTO'`, specifies dtype for lora modules. If `AUTO`, follow dtype of original module. Options: 'fp16', 'bf16', 'fp32', 'AUTO'.\\n- `--use_dora`: Default is `False`, whether to use `DoRA`.\\n- `--use_rslora`: Default is `False`, whether to use `RS-LoRA`.\\n- `--neftune_noise_alpha`: The noise coefficient added by `NEFTune` can improve performance of instruction fine-tuning, default is `None`. Usually can be set to 5, 10, 15. See [related paper](https://arxiv.org/abs/2310.05914).\\n- `--neftune_backend`: The backend of `NEFTune`, supported values are `transformers`, `swift`, default is `transformers`.\\n- `--🔥gradient_checkpointing`: Whether to enable gradient checkpointing, default is `True`. This can be used to save memory, although it slightly reduces training speed. Has significant effect when max_length and batch_size are large.\\n- `--🔥deepspeed`: Used to specify the path to the deepspeed configuration file or directly pass JSON formatted configuration information. By default, it is set to `None`, which means deepspeed is not enabled. Deepspeed can save GPU memory. We have written default [ZeRO-2 configuration file](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero2_offload.json), [ZeRO-3 configuration file](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero3.json), [ZeRO-2 Offload configuration file](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero2_offload.json ), and [ZeRO-3 Offload configuration file](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero3_offload.json). You only need to specify 'default-zero2', 'default-zero3', 'zero2-offload', 'zero3-offload'.\\n- `--batch_size`: Batch_size during training, default is `1`. Increasing batch_size can improve GPU utilization, but won't necessarily improve training speed, because within a batch, shorter sentences need to be padded to the length of the longest sentence in the batch, introducing invalid computations.\\n- `--eval_batch_size`: Batch_size during evaluation, default is `None`, i.e. set to 1 when `predict_with_generate` is True, set to `batch_size` when False.\\n- `--🔥num_train_epochs`: Number of epochs to train, default is `1`. If `max_steps >= 0`, this overrides `num_train_epochs`. Usually set to 3 ~ 5.\\n- `--max_steps`: Max_steps for training, default is `-1`. If `max_steps >= 0`, this overrides `num_train_epochs`.\\n- `--optim`: Default is `'adamw_torch'`.\\n- `--adam_beta1`: Default is `0.9`.\\n- `--adam_beta2`: Default is `0.95`.\\n- `--adam_epsilon`: Default is `1e-8`.\\n- `--🔥learning_rate`: Default is `None`, i.e. set to 1e-4 if `sft_type` is lora, set to 1e-5 if `sft_type` is full.\\n- `--weight_decay`: Default is `0.01`.\\n- `--🔥gradient_accumulation_steps`: Gradient accumulation, default is `None`, set to `math.ceil(16 / self.batch_size / world_size)`. `total_batch_size =  batch_size * gradient_accumulation_steps * world_size`.\\n- `--max_grad_norm`: Gradient clipping, default is `1`.\\n- `--predict_with_generate`: Whether to use generation for evaluation, default is `False`. If set to False, evaluate using `loss`. If set to True, evaluate using `ROUGE-L` and other metrics. Generative evaluation takes a long time, choose carefully.\\n- `--lr_scheduler_type`: Default is `'cosine'`, options: 'linear', 'cosine', 'constant', etc.\\n- `--warmup_ratio`: Proportion of warmup in total training steps, default is `0.05`.\\n- `--warmup_steps`: The number of warmup steps, default is `0`. If warmup_steps > 0 is set, it overrides warmup_ratio.\\n- `--🔥eval_steps`: Evaluate every this many steps, default is `50`.\\n- `--save_steps`: Save every this many steps, default is `None`, i.e. set to `eval_steps`.\\n- `--🔥save_only_model`: Whether to save only model parameters, without saving intermediate states needed for checkpoint resuming, default is `False`.\\n- `--save_total_limit`: Number of checkpoints to save, default is `2`, i.e. save best and last checkpoint. If set to -1, save all checkpoints.\\n- `--logging_steps`: Print training information (e.g. loss, learning_rate, etc.) every this many steps, default is `5`.\\n- `--dataloader_num_workers`: Default value is `None`. If running on a Windows machine, set it to `0`; otherwise, set it to `1`.\\n- `--push_to_hub`: Whether to sync push trained checkpoint to ModelScope Hub, default is `False`.\\n- `--hub_model_id`: Model_id to push to on ModelScope Hub, default is `None`, i.e. set to `f'{model_type}-{sft_type}'`. You can set this to model_id or repo_name. We will infer user_name based on hub_token. If the remote repository to push to does not exist, a new repository will be created, otherwise the previous repository will be reused. This parameter only takes effect when `push_to_hub` is set to True.\\n- `--hub_token`: SDK token needed for pushing. Can be obtained from [https://modelscope.cn/my/myaccesstoken](https://modelscope.cn/my/myaccesstoken), default is `None`, i.e. obtained from environment variable `MODELSCOPE_API_TOKEN`. This parameter only takes effect when `push_to_hub` is set to True.\\n- `--hub_private_repo`: Whether to set the permission of the pushed model repository on ModelScope Hub to private, default is `False`. This parameter only takes effect when `push__to_hub` is set to True.\\n- `--hub_strategy`: Push strategy, default is `'every_save'`. Options include: 'end', 'every_save', 'checkpoint', 'all_checkpoints'. This parameter shares the same meaning from transformers, and only takes effect when `push_to_hub` is set to True.\\n- `--test_oom_error`: Used to detect whether training will cause OOM, default is `False`. If set to True, will sort the training set in descending order by max_length, easy for OOM testing. This parameter is generally used for testing, use carefully.\\n- `--disable_tqdm`: Whether to disable tqdm, useful when launching script with `nohup`. Default is `False`, i.e. enable tqdm.\\n- `--🔥lazy_tokenize`: If set to False, preprocess all text before `trainer.train()`. If set to True, delay encoding text, reducing preprocessing wait and memory usage, useful when processing large datasets. Default is `None`, i.e. we intelligently choose based on template type, usually set to False for LLM models, set to True for multimodal models (to avoid excessive memory usage from loading images and audio).\\n- `--🔥preprocess_num_proc`: Use multiprocessing when preprocessing dataset (tokenizing text). Default is `1`. Same as `lazy_tokenize` command line argument, used to solve slow preprocessing issue. But this strategy cannot reduce memory usage, so if dataset is huge, `lazy_tokenize` is recommended. Recommended values: 4, 8.\\n- `--🔥use_flash_attn`: Whether to use flash attn, default is `None`. Installation steps for flash_attn can be found at [https://github.com/Dao-AILab/flash-attention](https://github.com/Dao-AILab/flash-attention). Models supporting flash_attn can be found in [LLM Supported Models](Supported-models-datasets.md).\\n- `--ignore_args_error`: Whether to ignore Error thrown by command line parameter errors, default is `False`. Set to True if need to copy code to notebook to run.\\n- `--🔥check_model_is_latest`: Check if model is latest, default is `True`. Set this to `False` if you need to train offline.\\n- `--logging_dir`: Default is `None`. I.e. set to `f'{self.output_dir}/runs'`, representing path to store tensorboard files.\\n- `--report_to`: Default is `['tensorboard']`. You can set `--report_to all` to report to all installed integrations.\\n- `--acc_strategy`: Default is `'token'`, options include: 'token', 'sentence'.\\n- `--save_on_each_node`: Takes effect during multi-machine training, default is `False`.\\n- `--save_strategy`: Strategy for saving checkpoint, default is `'steps'`, options include: 'steps', 'epoch', no'.\\n- `--evaluation_strategy`: Strategy for evaluation, default is `'steps'`, options include: 'steps', 'epoch', no'.\\n- `--save_safetensors`: Default is `True`.\\n- `--include_num_input_tokens_seen`: Default is `False`. Tracks the number of input tokens seen throughout training.\\n- `--max_new_tokens`: Default is `2048`. This parameter only takes effect when `predict_with_generate` is set to True.\\n- `--do_sample`: Reference document: [https://huggingface.co/docs/transformers/main_classes/text_generation](https://huggingface.co/docs/transformers/main_classes/text_generation). Default is `None`, inheriting the model's generation_config. This parameter only takes effect when `predict_with_generate` is set to True.\\n- `--temperature`: Default is `None`, inheriting the model's generation_config. This parameter only takes effect when `do_sample` is set to True. This parameter will be used as default value in deployment parameters.\\n- `--top_k`: Default is `None`, inheriting the model's generation_config. This parameter only takes effect when `do_sample` is set to True. This parameter will be used as default value in deployment parameters.\\n- `--top_p`: Default is `None`, inheriting the model's generation_config. This parameter only takes effect when `do_sample` is set to True. This parameter will be used as default value in deployment parameters.\\n- `--repetition_penalty`: Default is `None`, inheriting the model's generation_config. This parameter will be used as default value in deployment parameters.\\n- `--num_beams`: Default is `1`. This parameter only takes effect when `predict_with_generate` is set to True.\\n- `--gpu_memory_fraction`: Default is `None`. This parameter aims to run training under a specified maximum available GPU memory percentage, used for extreme testing.\\n- `--train_dataset_mix_ratio`: Default is `0.`. This parameter defines how to mix datasets for training. When this parameter is specified, it will mix the training dataset with a multiple of `train_dataset_mix_ratio` of the general knowledge dataset specified by `train_dataset_mix_ds`. This parameter has been deprecated, please use `--dataset {dataset_name}#{dataset_sample}` to mix datasets.\\n- `--train_dataset_mix_ds`: Default is `['ms-bench']`. Used for preventing knowledge forgetting, this is the general knowledge dataset. This parameter has been deprecated, please use `--dataset {dataset_name}#{dataset_sample}` to mix datasets.\\n- `--use_loss_scale`: Default is `False`. When taking effect, strengthens loss weight of some Agent fields (Action/Action Input part) to enhance CoT, has no effect in regular SFT scenarios.\\n- `--loss_scale_config_path`: option specifies a custom loss_scale configuration, applicable when use_loss_scale is enabled, such as in Agent training to amplify the loss weights for Action and other crucial ReAct fields.\\n  - In the configuration file, you can set the loss_scale using a dictionary format. Each key represents a specific field name, and its associated value specifies the loss scaling factor for that field and its subsequent content. For instance, setting `\\\"Observation:\\\": [2, 0]` means that when the response contains `xxxx Observation:error`, the loss for the `Observation:` field will be doubled, while the loss for the `error` portion will not be counted. Besides literal matching, the configuration also supports regular expression rules for more flexible matching; for example, the pattern `'<.*?>':[2.0]` doubles the loss for any content enclosed in angle brackets. The loss scaling factors for field matching and regex matching are respectively indicated by lists of length 2 and 1.\\n  - There is also support for setting loss_scale for the entire response based on matching queries, which is extremely useful in dealing with fixed multi-turn dialogue queries described in the [Agent-Flan paper](https://arxiv.org/abs/2403.12881) paper. If the query includes any of the predefined keys, the corresponding response will use the associated loss_scale value. Refer to swift/llm/agent/agentflan.json for an example.\\n  - By default, we have preset loss scaling values for fields such as Action:, Action Input:, Thought:, Final Answer:, and Observation:. We also provide default configurations for [alpha-umi](https://arxiv.org/pdf/2401.07324) and [Agent-FLAN](https://arxiv.org/abs/2403.12881), which you can use by setting to alpha-umi and agent-flan respectively. The default configuration files are located under swift/llm/agent.\\n  - The application priority of matching rules is as follows, from highest to lowest: query fields > specific response fields > regular expression matching rules.\\n- `--custom_register_path`: Default is `None`. Pass in a `.py` file used to register templates, models, and datasets.\\n- `--custom_dataset_info`: Default is `None`. Pass in the path to an external `dataset_info.json`, a JSON string, or a dictionary. Used to register custom datasets. The format example: https://github.com/modelscope/swift/blob/main/swift/llm/data/dataset_info.json\\n- `--device_map_config`: Manually configure the model's device_map, default is `None`. You can pass a local path (.json), a JSON string, or a dict.\\n- `--device_max_memory`: The max memory of each device can use for `device_map`, `List`, default is `[]`, The number of values must equal to the device count. Like `10GB 10GB`.\\n\\n### Long Context\\n\\n- `--rope_scaling`: Default `None`, Support `linear` and `dynamic` to scale positional embeddings. Use when `max_length` exceeds `max_position_embeddings`.\\n- `--rescale_image`: Whether to rescale input images, the value should be the pixel value, for example 480000(width * height), every image larger than this value will be resized to this value by its original ratio. Note: not every model can get advantages from this parameter.\\n\\n### FSDP Parameters\\n\\n- `--fsdp`: Default value `''`, the FSDP type, please check [this documentation](https://huggingface.co/docs/transformers/v4.39.3/en/main_classes/trainer#transformers.TrainingArguments.fsdp) for details.\\n\\n- `--fsdp_config`: Default value `None`, the FSDP config file path.\\n\\n### Sequence Parallel Parameters\\n\\n- `--sequence_parallel_size`: Default value `1`, a positive value can be used to split a sequence to multiple GPU to reduce memory usage. The value should divide the GPU count.\\n\\n### FourierFt Parameters\\n\\nFourierFt uses `target_modules`, `target_regex`, `modules_to_save`.\\n\\n- `--fourier_n_frequency`: Num of learnable frequencies for the Discrete Fourier Transform, `int` type, like `r` in LoRA. Default value `2000`.\\n- `--fourier_scaling`: The scaling value for the delta W matrix, `float` type, like `lora_alpha` in LoRA. Default value `300.0`.\\n\\n### BOFT Parameters\\n\\nBOFT uses `target_modules`, `target_regex`, `modules_to_save`.\\n\\n- `--boft_block_size`: BOFT block size, default value is 4.\\n- `--boft_block_num`: Number of BOFT blocks, cannot be used simultaneously with `boft_block_size`.\\n- `--boft_dropout`: Dropout value for BOFT, default is 0.0.\\n\\n### Vera Parameters\\n\\nVera uses `target_modules`, `target_regex`, `modules_to_save`.\\n\\n- `--vera_rank`: Size of Vera Attention, default value is 256.\\n- `--vera_projection_prng_key`: Whether to store the Vera projection matrix, default is True.\\n- `--vera_dropout`: Dropout value for Vera, default is 0.0.\\n- `--vera_d_initial`: Initial value for Vera's d matrix, default is 0.1.\\n\\n### LoRA+ Fine-tuning Parameters\\n\\n- `--lora_lr_ratio`: Default `None`, recommended value `10~16`, specify this parameter when using lora to enable lora+.\\n\\n### GaLore Fine-tuning Parameters\\n\\n- `--use_galore: bool` : Default False, whether to use GaLore.\\n- `--galore_target_modules: Union[str, List[str]]` : Default None, apply GaLore to attention and mlp when not passed.\\n- `--galore_rank: int` : Default 128, rank value for GaLore.\\n- `--galore_update_proj_gap: int` : Default 50, update interval for decomposition matrix.\\n- `--galore_scale: int` : Default 1.0, matrix weight coefficient.\\n- `--galore_proj_type: str` : Default `std`, GaLore matrix decomposition type.\\n- `--galore_optim_per_parameter: bool` : Default False, whether to set a separate optimizer for each Galore target Parameter.\\n- `--galore_with_embedding: bool` : Default False, whether to apply GaLore to embedding.\\n- `--galore_quantization`: Whether to use q-galore. Default value `False`.\\n- `--galore_proj_quant`: Whether to quantize the SVD decomposition matrix, default `False`.\\n- `--galore_proj_bits`: Number of bits for SVD quantization.\\n- `--galore_proj_group_size`: Number of groups for SVD quantization.\\n- `--galore_cos_threshold`: Cosine similarity threshold for updating the projection matrix. Default value 0.4.\\n- `--galore_gamma_proj`: When the projection matrix gradually becomes similar, this parameter is the coefficient for extending the update interval each time, default value 2.\\n- `--galore_queue_size`: Queue length for calculating projection matrix similarity, default value 5.\\n\\n### LISA Fine-tuning Parameters\\n\\nNote: LISA only supports full training, which is `--sft_type full`.\\n\\n- `--lisa_activated_layers`: Default value`0`, which means use without `LISA`, suggested value is `2` or `8`.\\n- `--lisa_step_interval`: Default value `20`, how many iters to switch the layers to back-propagate.\\n\\n### UNSLOTH Fine-tuning Parameters\\n\\nunsloth has no new parameters，you can use the existing parameters to use unsloth:\\n\\n```\\n--tuner_backend unsloth\\n--sft_type full/lora\\n--quantization_type 4\\n```\\n\\n### LLaMA-PRO Fine-tuning Parameters\\n\\n- `--llamapro_num_new_blocks`: Default `4`, total number of new layers inserted.\\n- `--llamapro_num_groups`: Default `None`, how many groups to insert new_blocks into, if `None` then equals `llamapro_num_new_blocks`, i.e. each new layer is inserted into original model separately.\\n\\n### AdaLoRA Fine-tuning Parameters\\n\\nThe following parameters take effect when `sft_type` is set to `adalora`. AdaLoRA's `target_modules` and other parameters inherit from lora's corresponding parameters, but the `lora_dtype` parameter has no effect.\\n\\n- `--adalora_target_r`: Default `8`, AdaLoRA's average rank.\\n- `--adalora_init_r`: Default `12`, AdaLoRA's initial rank.\\n- `--adalora_tinit`: Default `0`, AdaLoRA's initial warmup.\\n- `--adalora_tfinal`: Default `0`, AdaLoRA's final warmup.\\n- `--adalora_deltaT`: Default `1`, AdaLoRA's step interval.\\n- `--adalora_beta1`: Default `0.85`, AdaLoRA's EMA parameter.\\n- `--adalora_beta2`: Default `0.85`, AdaLoRA's EMA parameter.\\n- `--adalora_orth_reg_weight`: Default `0.5`, AdaLoRA's regularization parameter.\\n\\n### IA3 Fine-tuning Parameters\\n\\nVera uses `target_modules`, `target_regex`, `modules_to_save`.\\n\\nThe following parameters take effect when `sft_type` is set to `ia3`.\\n\\n- `--ia3_feedforward_modules`: Specify the Linear name of IA3's MLP, this name must be in `ia3_target_modules`.\\n\\n### ReFT Fine-tuning Parameters\\n\\nThe following parameters take effect when the `sft_type` is set to `reft`.\\n\\n> 1. ReFT tuner cannot be merged\\n> 2. ReFT and gradient_checkpointing are not compatible\\n> 3. If error happens when using ReFT and DeepSpeed, please uninstall DeepSpeed\\n\\n- `--reft_layers`: Specifies which layers ReFT is applied to; defaults to `None`, meaning all layers. You can input a list of layer numbers, for example: `--reft_layers 1 2 3 4`.\\n- `--reft_rank`: The rank of the ReFT matrix; defaults to `4`.\\n- `--reft_intervention_type`: The type of ReFT intervention, supporting 'NoreftIntervention', 'LoreftIntervention', 'ConsreftIntervention', 'LobireftIntervention', 'DireftIntervention', and 'NodireftIntervention'; defaults to `LoreftIntervention`.\\n- `--reft_args`: Other supporting parameters in the ReFT intervention, provided in JSON string format.\\n\\n### Liger Parameters\\n\\n- `--use_liger`: Use liger-kernel to train.\\n\\n## PT Parameters\\n\\nPT parameters inherit from the SFT parameters with some modifications to the default values:\\n\\n- `--sft_type`: Default value is `'full'`.\\n- `--target_modules`: Default value is `'ALL'`.\\n- `--lazy_tokenize`: Default value is `True`.\\n- `--eval_steps`: Default value is `500`.\\n\\n## RLHF Parameters\\nRLHF parameters are an extension of the sft parameters, with the addition of the following options:\\n- `--🔥rlhf_type`: Choose the alignment algorithm, with options such as 'dpo', 'orpo', 'simpo', 'kto', 'cpo', default is 'dpo'. For training scripts with  different algorithms, please refer to [document](../LLM/Human-Preference-Alignment-Training-Documentation.md)\\n- `--ref_model_type`: Select reference model, same as the model_type parameter, default is None, consistent with the training model. For `cpo`, `simpo`, and `orpo` algorithms, this selection is not required. Typically, no setup is needed.\\n- `--ref_model_id_or_path`: Local cache path for the reference model, default is `None`.\\n- `--beta`: KL regularization term coefficient, default is `None`, meaning that for the simpo algorithm, the default is `2`., and for other algorithms, it is `0.1`. For detail please check[document](../LLM/Human-Preference-Alignment-Training-Documentation.md)\\n- `--label_smoothing`: Whether to use DPO smoothing, the default value is `0`, normally set between 0 and 0.5.\\n- `--loss_type`: Type of loss, default is `None`. If it's dpo or cpo, it is `'sigmoid'`, and if it's simpo, it is `'simpo'`.\\n- `--🔥rpo_alpha`: Controls the weight of sft_loss added in DPO, default is `1.` The final loss is `KL_loss + rpo_alpha * sft_loss`.\\n- `cpo_alpha`: Coefficient for nll loss in CPO/SimPO loss, default is `1.`.\\n- `--simpo_gamma`: The reward margin term in the SimPO algorithm, the paper recommends setting it to 0.5-1.5, the default is `1.`.\\n- `--desirable_weight`: The loss weight for desirable responses $\\\\lambda_D$ in the KTO algorithm, default is `1.`.\\n- `--undesirable_weight`: The loss weight for undesirable responses $\\\\lambda_U$ in the KTO paper, default is `1.`. Let $n_d$ and $n_u$ represent the number of desirable and undesirable examples in the dataset, respectively. The paper recommends controlling $\\\\frac{\\\\lambda_D n_D}{\\\\lambda_Un_U} \\\\in [1,\\\\frac{4}{3}]$.\\n\\n## infer merge-lora Parameters\\n\\n- `--🔥model_type`: Default is `None`, see `sft command line arguments` for parameter details.\\n- `--🔥model_id_or_path`: Default is `None`, see `sft command line arguments` for parameter details. Recommended to use model_type to specify.\\n- `--model_revision`: Default is `None`. See `sft command line arguments` for parameter details. If `model_id_or_path` is None or a local model directory, this parameter has no effect.\\n- `--🔥sft_type`: Default is `'lora'`, see `sft command line arguments` for parameter details.\\n- `--🔥template_type`: Default is `'AUTO'`, see `sft command line arguments` for parameter details.\\n- `--🔥infer_backend`: Options are 'AUTO', 'vllm', 'pt'. Default uses 'AUTO', for intelligent selection, i.e. if `ckpt_dir` is not passed or using full fine-tuning, and vllm is installed and model supports vllm, then use vllm engine, otherwise use native torch for inference. vllm environment setup can be found in [VLLM Inference Acceleration and Deployment](../LLM/VLLM-inference-acceleration-and-deployment.md), vllm supported models can be found in [Supported Models](Supported-models-datasets.md).\\n- `--🔥ckpt_dir`: Required, value is the checkpoint path saved in SFT stage, e.g. `'/path/to/your/vx-xxx/checkpoint-xxx'`.\\n- `--load_args_from_ckpt_dir`: Whether to read model configuration info from `sft_args.json` file in `ckpt_dir`. Default is `True`.\\n- `--🔥load_dataset_config`: This parameter only takes effect when `--load_args_from_ckpt_dir true`. I.e. whether to read dataset related configuration from `sft_args.json` file in `ckpt_dir`. Default is `False`.\\n- `--eval_human`: Whether to evaluate using validation set portion of dataset or manual evaluation. Default is `None`, for intelligent selection, if no datasets (including custom datasets) are passed, manual evaluation will be used. If datasets are passed, dataset evaluation will be used.\\n- `--device_map_config`: Default is `None`, see `sft command line arguments` for parameter details.\\n- `--device_max_memory`: Default is `[]`, see `sft command line arguments` for parameter details.\\n- `--seed`: Default is `42`, see `sft command line arguments` for parameter details.\\n- `--dtype`: Default is `'AUTO`, see `sft command line arguments` for parameter details.\\n- `--model_kwargs`: Default is `None`, see `sft command line arguments` for parameter details.\\n- `--🔥dataset`: Default is `[]`, see `sft command line arguments` for parameter details.\\n- `--🔥val_dataset`: Default is `[]`, see `sft command line arguments` for parameter details.\\n- `--dataset_seed`: Default is `None`, see `sft command line arguments` for parameter details.\\n`--dataset_test_ratio`: Default value is `0.01`. For specific parameter details, refer to the `sft command line arguments`.\\n- `--🔥show_dataset_sample`: Represents number of validation set samples to evaluate and display, default is `-1`.\\n- `--system`: Default is `None`. See `sft command line arguments` for parameter details.\\n- `--tools_prompt`: Default is `react_en`. See `sft command line arguments` for parameter details.\\n- `--max_length`: Default is `-1`. See `sft command line arguments` for parameter details.\\n- `--truncation_strategy`: Default is `'delete'`. See `sft command line arguments` for parameter details.\\n- `--check_dataset_strategy`: Default is `'none'`, see `sft command line arguments` for parameter details.\\n- `--custom_train_dataset_path`: Default value is `[]`. This parameter has been deprecated, please use `--dataset {dataset_path}`.\\n- `--custom_val_dataset_path`: Default value is `[]`. This parameter is deprecated. Please use `--val_dataset {dataset_path}` instead.\\n- `--quantization_bit`: Default is 0. See `sft command line arguments` for parameter details.\\n- `--quant_method`: Quantization method, default is None. You can choose from 'bnb', 'hqq', 'eetq'.\\n- `--hqq_axis`: Hqq argument. Axis along which grouping is performed. Supported values are 0 or 1. default is `0`\\n- `--hqq_dynamic_config_path`: Parameters for dynamic configuration. The key is the name tag of the layer and the value is a quantization config. If set, each layer specified by its id will use its dedicated quantization configuration.[ref](https://github.com/mobiusml/hqq?tab=readme-ov-file#custom-quantization-configurations-%EF%B8%8F)\\n- `--bnb_4bit_comp_dtype`: Default is `'AUTO'`.  See `sft command line arguments` for parameter details. If `quantization_bit` is set to 0, this parameter has no effect.\\n- `--bnb_4bit_quant_type`: Default is `'nf4'`.  See `sft command line arguments` for parameter details. If `quantization_bit` is set to 0, this parameter has no effect.\\n- `--bnb_4bit_use_double_quant`: Default is `True`.  See `sft command line arguments` for parameter details. If `quantization_bit` is set to 0, this parameter has no effect.\\n- `--bnb_4bit_quant_storage`: Default value `None`.See `sft command line arguments` for parameter details. If `quantization_bit` is set to 0, this parameter has no effect.\\n- `--🔥max_new_tokens`: Maximum number of new tokens to generate, default is `2048`.\\n- `--🔥do_sample`: Reference document: [https://huggingface.co/docs/transformers/main_classes/text_generation](https://huggingface.co/docs/transformers/main_classes/text_generation). Default is `None`, inheriting the model's generation_config.\\n- `--temperature`: Default is `None`, inheriting the model's generation_config. This parameter only takes effect when `do_sample` is set to True. This parameter will be used as default value in deployment parameters.\\n- `--top_k`: Default is `None`, inheriting the model's generation_config. This parameter only takes effect when `do_sample` is set to True. This parameter will be used as default value in deployment parameters.\\n- `--top_p`: Default is `None`, inheriting the model's generation_config. This parameter only takes effect when `do_sample` is set to True. This parameter will be used as default value in deployment parameters.\\n- `--repetition_penalty`: Default is `None`, inheriting the model's generation_config. This parameter will be used as default value in deployment parameters.\\n- `--num_beams`: Default is `1`.\\n- `--use_flash_attn`: Default is `None`, i.e. 'auto'. See `sft command line arguments` for parameter details.\\n- `--ignore_args_error`: Default is `False`, see `sft command line arguments` for parameter details.\\n- `--stream`: Whether to use streaming output, default is `True`. This parameter only takes effect when using dataset evaluation and verbose is True.\\n- `--🔥merge_lora`: Whether to merge lora weights into base model and save full weights, default is `False`. Weights will be saved in the same level directory as `ckpt_dir`, e.g. `'/path/to/your/vx-xxx/checkpoint-xxx-merged'` directory.\\n- `--merge_device_map`: device_map used when merge-lora, default is `None`, to reduce memory usage, use `auto` only during merge-lora process, otherwise default is `cpu`.\\n- `--save_safetensors`: Whether to save as `safetensors` file or `bin` file. Default is `True`.\\n- `--overwrite_generation_config`: Whether to save the generation_config used for evaluation as a `generation_config.json` file, default is `False`.\\n- `--🔥verbose`: If set to False, use tqdm style inference. If set to True, output inference query, response, label. Default is `None`, for auto selection, i.e. when `len(val_dataset) >= 100`, set to False, otherwise set to True. This parameter only takes effect when using dataset evaluation.\\n- `--lora_modules`: Default`[]`, the input format is `'{lora_name}={lora_path}'`, e.g. `--lora_modules lora_name1=lora_path1 lora_name2=lora_path2`. `ckpt_dir` will be added with `f'default-lora={args.ckpt_dir}'` by default.\\n- `--custom_register_path`: Default is `None`. Pass in a `.py` file used to register templates, models, and datasets.\\n- `--custom_dataset_info`: Default is `None`. Pass in the path to an external `dataset_info.json`, a JSON string, or a dictionary. Used for expanding datasets.\\n- `--rope_scaling`: Default `None`, Support `linear` and `dynamic` to scale positional embeddings. Use when `max_length` exceeds `max_position_embeddings`. Specify `--max_length` when using this parameter.\\n\\n\\n### vLLM Parameters\\nReference document: [https://docs.vllm.ai/en/latest/models/engine_args.html](https://docs.vllm.ai/en/latest/models/engine_args.html)\\n\\n- `--🔥gpu_memory_utilization`: Parameter for initializing vllm engine `EngineArgs`, default is `0.9`. This parameter only takes effect when using vllm. vLLM inference acceleration and deployment can be found in [vLLM Inference Acceleration and Deployment](../LLM/VLLM-inference-acceleration-and-deployment.md).\\n- `--🔥tensor_parallel_size`: Parameter for initializing vllm engine `EngineArgs`, default is `1`. This parameter only takes effect when using vllm.\\n- `--max_num_seqs`: The parameter for initializing the `EngineArgs` of the vllm engine, with a default value of `256`. This parameter is only effective when using vllm.\\n- `--🔥max_model_len`: Override model's max_model__len, default is `None`. This parameter only takes effect when using vllm.\\n- `--disable_custom_all_reduce`: Whether to disable the custom all-reduce kernel and fallback to NCCL. The default is `True`, which is different from the default value of vLLM.\\n- `--enforce_eager`: vllm uses the PyTorch eager mode or builds the CUDA graph. Default is `False`. Setting to True can save memory, but it may affect efficiency.\\n- `--limit_mm_per_prompt`: Control vllm to use multiple images. Default is `None`. For example, pass `--limit_mm_per_prompt '{\\\"image\\\": 10, \\\"video\\\": 5}'`.\\n- `--vllm_enable_lora`: Default `False`. Whether to support vllm with lora.\\n- `--vllm_max_lora_rank`: Default `16`.  Lora rank in vLLM.\\n- `--lora_modules`: Introduced.\\n\\n\\n### lmdeploy Parameters\\nReference document: [https://lmdeploy.readthedocs.io/en/latest/api/pipeline.html#turbomindengineconfig](https://lmdeploy.readthedocs.io/en/latest/api/pipeline.html#turbomindengineconfig)\\n\\n- `--🔥tp`: Tensor parallelism, a parameter for initializing the lmdeploy engine, default value is `1`.\\n- `--cache_max_entry_count`: Parameter to initialize the lmdeploy engine, default value is `0.8`.\\n- `--quant_policy`: Quantization of Key-Value Cache, parameters for initializing the lmdeploy engine, default value is `0`, you can set it to 4 or 8.\\n- `--vision_batch_size`: Parameter to initialize the lmdeploy engine, default value is `1`. This parameter is effective only when using multimodal models.\\n\\n## export Parameters\\n\\nexport parameters inherit from infer parameters, with the following added parameters:\\n- `--to_peft_format`: Default is `False`. Convert the swift format of LoRA (`--tuner_backend swift`) to peft format.\\n- `--🔥merge_lora`: Default is `False`. This parameter is already defined in InferArguments, not a new parameter. Whether to merge lora weights into base model and save full weights. Weights will be saved in the same level directory as `ckpt_dir`, e.g. `'/path/to/your/vx-xxx/checkpoint-xxx-merged'` directory.\\n- `--🔥quant_bits`: Number of bits for quantization. Default is `0`, i.e. no quantization. If you set `--quant_method awq`, you can set this to `4` for 4bits quantization. If you set `--quant_method gptq`, you can set this to `2`,`3`,`4`,`8` for corresponding bits quantization. If quantizing original model, weights will be saved in `f'{args.model_type}-{args.quant_method}-int{args.quant_bits}'` directory. If quantizing fine-tuned model, weights will be saved in the same level directory as `ckpt_dir`, e.g. `f'/path/to/your/vx-xxx/checkpoint-xxx-{args.quant_method}-int{args.quant_bits}'` directory.\\n- `--🔥quant_method`: Quantization method, default is `'awq'`. Options are 'awq', 'gptq', 'bnb'.\\n- `--🔥dataset`: This parameter is already defined in InferArguments, for export it means quantization dataset. Default is `[]`. More details: including how to customize quantization dataset, can be found in [LLM Quantization Documentation](LLM-quantization-and-export.md).\\n- `--quant_n_samples`: Quantization parameter, default is `256`. When set to `--quant_method awq`, if OOM occurs during quantization, you can moderately reduce `--quant_n_samples` and `--quant_seqlen`. `--quant_method gptq` generally does not encounter quantization OOM.\\n- `--quant_seqlen`: Quantization parameter, default is `2048`.\\n- `--quant_batch_size`: Calibrating batch_size，Default `1`.\\n- `--quant_device_map`: Default is `None`, to save memory. You can specify 'cuda:0', 'auto', 'cpu', etc., representing the device to load model during quantization.\\n- `quant_output_dir`: Default is `None`, the default quant_output_dir will be printed in the command line.\\n- `--push_to_hub`: Default is `False`. Whether to push the final `ckpt_dir` to ModelScope Hub. If you specify `merge_lora`, full parameters will be pushed; if you also specify `quant_bits`, quantized model will be pushed.\\n- `--hub_model_id`: Default is `None`. Model_id to push to on ModelScope Hub. If `push_to_hub` is set to True, this parameter must be set.\\n- `--hub_token`: Default is `None`. See `sft command line arguments` for parameter details.\\n- `--hub_private_repo`: Default is `False`. See `sft command line arguments` for parameter details.\\n- `--commit_message`: Default is `'update files'`.\\n- `--to_ollama`: Export to ollama modelfile.\\n- `--ollama_output_dir`: ollama output dir. Default is `<modeltype>-ollama`.\\n\\n## eval parameters\\n\\nThe eval parameters inherit from the infer parameters, and additionally include the following parameters: (Note: The generation_config parameter in infer will be invalid, controlled by [evalscope](https://github.com/modelscope/eval-scope).)\\n\\n- `--🔥eval_dataset`: The official evaluation dataset, default is `None`, means all datasets. if `custom_eval_config` is specified, this arg will be ignored. [Check all supported eval datasets](LLM-eval.mdntroduction).\\n- `--eval_few_shot`: The few-shot number of sub-datasets for each evaluation set, with a default value of `None`, meaning to use the default configuration of the dataset. **This parameter is currently deprecated.**\\n- `--eval_limit`: The sampling quantity for each sub-dataset of the evaluation set, with a default value of `None` indicating full-scale evaluation. You can pass integer(number of samples from each eval dataset) or str(`[10:20]`, slice).\\n- `--name`: Used to differentiate the result storage path for evaluating the same configuration. Like: `{eval_output_dir}/{name}`, default will be `eval_outputs/defaults`, in which a timestamp named folder will hold each eval result.\\n- `--eval_url`: The standard model invocation interface for OpenAI, for example, `http://127.0.0.1:8000/v1`. This needs to be set when evaluating in a deployed manner, usually not needed. Default is `None`.\\n  ```shell\\n  swift eval --eval_url http://127.0.0.1:8000/v1 --eval_is_chat_model true --model_type gpt4 --eval_token xxx\\n  ```\\n- `--eval_token`: The token for the standard model invocation interface for OpenAI, with a default value of `'EMPTY'`, indicating no token.\\n- `--eval_is_chat_model`: If `eval_url` is not empty, this value needs to be passed to determine if it is a \\\"chat\\\" model. False represents a \\\"base\\\" model. Default is `None`.\\n- `--custom_eval_config`: Used for evaluating with custom datasets, and needs to be a locally existing file path. For details on file format, refer to [Custom Evaluation Set](LLM-eval.mdustom-Evaluation-Set). Default is `None`.\\n- `--eval_use_cache`: Whether to use already generated evaluation cache, so that previously evaluated results won't be rerun but only the evaluation results regenerated. Default is `False`.\\n- `--eval_output_dir`: Output path for evaluation results, default is `eval_outputs` in the current folder.\\n- `--eval_batch_size`: Input batch size for evaluation, default is 8.\\n- `--eval_nproc`: Concurrent number, a bigger value means a faster evaluation and more cost of GPU memory, default 16. This only takes effects when running multi-modal evaluations.\\n- `--deploy_timeout`: The timeout duration for waiting for model deployment before evaluation, default is 60, which means one minute.\\n\\n## app-ui Parameters\\n\\napp-ui parameters inherit from infer parameters, with the following added parameters:\\n\\n- `--host`: Default is `'127.0.0.1'`. Passed to the `demo.queue().launch(...)` function of gradio.\\n- `--port`: Default is `7860`. Passed to the `demo.queue().launch(...)` function of gradio.\\n- `--share`: Default is `False`. Passed to the `demo.queue().launch(...)` function of gradio.\\n\\n## deploy Parameters\\n\\ndeploy parameters inherit from infer parameters, with the following added parameters:\\n\\n- `--host`: Default is `'0.0.0.0'`.\\n- `--port`: Default is `8000`.\\n- `--api_key`: The default is `None`, meaning that the request will not be subjected to api_key verification.\\n- `--ssl_keyfile`: Default is `None`.\\n- `--ssl_certfile`: Default is `None`.\\n- `--verbose`: Whether to print the request content. Defaults to `True`.\\n- `--log_interval`: The interval for printing statistics, in seconds. Default is `10`. If set to `0`, it means statistics will not be printed.\\n\\n## web-ui Parameters\\n\\n- `--🔥host`: Default `'127.0.0.1'`. To make it accessible on the local network, you can set it to '0.0.0.0'.\\n- `--port`: Default `7860`.\\n- `--lang`: Default `'zh'`.\\n- `--share`: Default `False`.\\n\\n\\n# LLM Inference Documentation\\nIf you want to use vllm for inference acceleration, you can check out [VLLM Inference Acceleration and Deployment](../LLM/VLLM-inference-acceleration-and-deployment.md#inference-acceleration)\\n\\n## Table of Contents\\n- [Environment Preparation](#Environment-Preparation)\\n- [Inference](#Inference)\\n- [Web-UI](#web-ui)\\n\\n## Environment Preparation\\nGPU devices: A10, 3090, V100, A100 are all supported.\\n```bash\\n# Install ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# If you want to use models based on auto_gptq for inference.\\n# Models using auto_gptq: `https://github.com/modelscope/swift/blob/main/docs/source/Instruction/Supported Models and Datasets.md#Models`\\n# auto_gptq and cuda versions have a correspondence, please select the version according to `https://github.com/PanQiWei/AutoGPTQ#quick-installation`\\npip install auto_gptq -U\\n\\n# Environment alignment (usually no need to run. If you encounter errors, you can run the code below, the latest environment is tested with the repository)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Inference\\n### qwen-7b-chat\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\n\\nkwargs = {}\\n# kwargs['use_flash_attn'] = True  # use flash_attn\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path,\\n                                       model_kwargs={'device_map': 'auto'}, **kwargs)\\n# modify max_new_tokens\\nmodel.generation_config.max_new_tokens = 128\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = 'Where is the capital of Zhejiang?'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = 'What are some famous foods there?'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang province is Hangzhou.\\nquery: What are some famous foods there?\\nresponse: Hangzhou has many famous local foods, such as West Lake Vinegar Fish, Longjing Shrimp, Sweet and Sour Pork Ribs, Spicy Beef, etc. In addition, there are also Hangzhou specialties like Osmanthus Cake, Lotus Seed Pastry, Ai Wo Wo, and more.\\nhistory: [('Where is the capital of Zhejiang?', 'The capital of Zhejiang province is Hangzhou.'), ('What are some famous foods there?', 'Hangzhou has many famous local foods, such as West Lake Vinegar Fish, Longjing Shrimp, Sweet and Sour Pork Ribs, Spicy Beef, etc. In addition, there are also Hangzhou specialties like Osmanthus Cake, Lotus Seed Pastry, Ai Wo Wo, and more.')]\\n\\\"\\\"\\\"\\n\\n# Streaming output chat template\\ninference(model, template, 'What was the first question?', history, verbose=True, stream=True)\\n\\\"\\\"\\\"Out[1]\\n[PROMPT]<|im_start|>system\\nYou are a helpful assistant.<|im_end|>\\n<|im_start|>user\\nWhere is the capital of Zhejiang?<|im_end|>\\n<|im_start|>assistant\\nThe capital of Zhejiang province is Hangzhou.<|im_end|>\\n<|im_start|>user\\nWhat are some famous foods there?<|im_end|>\\n<|im_start|>assistant\\nHangzhou has many famous local foods, such as West Lake Vinegar Fish, Longjing Shrimp, Sweet and Sour Pork Ribs, Spicy Beef, etc. In addition, there are also Hangzhou specialties like Osmanthus Cake, Lotus Seed Pastry, Ai Wo Wo, and more.<|im_end|>\\n<|im_start|>user\\nWhat was the first question<|im_end|>\\n<|im_start|>assistant\\n[OUTPUT]Your first question was \\\"Where is the capital of Zhejiang?\\\"<|im_end|>\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-7b-chat-int4\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b_chat_int4\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = 'Where is the capital of Zhejiang?'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = 'What are some famous foods there?'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang province is Hangzhou.\\nquery: What are some famous foods there?\\nresponse: Hangzhou has many famous local delicacies, such as West Lake Vinegar Fish, Dongpo Pork, Song Sao Fish Soup, Beggar's Chicken, etc. In addition, there are also Hangzhou specialties like Osmanthus Sugar Lotus Root, Fermented Glutinous Rice Dumplings, Mapo Tofu, and more.\\nhistory: [('Where is the capital of Zhejiang?', 'The capital of Zhejiang province is Hangzhou.'), ('What are some famous foods there?', \\\"Hangzhou has many famous local delicacies, such as West Lake Vinegar Fish, Dongpo Pork, Song Sao Fish Soup, Beggar's Chicken, etc. In addition, there are also Hangzhou specialties like Osmanthus Sugar Lotus Root, Fermented Glutinous Rice Dumplings, Mapo Tofu, and more.\\\")]\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-7b\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: default-generation\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 64\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = 'Zhejiang -> Hangzhou\\\\nAnhui -> Hefei\\\\nSichuan ->'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\\"\\\"\\\"Out[0]\\nquery: Zhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan ->\\nresponse:  Chengdu\\nShandong -> Jinan\\nFujian -> Fuzhou\\nChongqing -> Chongqing\\nGuangdong -> Guangzhou\\nBeijing -> Beijing\\nZhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan -> Chengdu\\nShandong -> Jinan\\nFujian -> Fuzhou\\nChongqing\\n\\\"\\\"\\\"\\n```\\n\\n### Stream Output\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference_stream, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = 'What is the capital of Zhejiang Province?'\\ngen = inference_stream(model, template, query)\\nprint(f'query: {query}')\\nfor response, history in gen:\\n    pass\\nprint(f'response: {response}')\\n\\n# method1\\nquery = 'What is there to eat?'\\nold_history = history\\ngen = inference_stream(model, template, query, old_history)\\nprint(f'query: {query}')\\nfor response, history in gen:\\n    print(f'response: {response}')\\nprint(f'history: {history}')\\n\\n# method2\\nquery = 'What is there to eat?'\\ngen = inference_stream(model, template, query, old_history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint(f'\\\\nhistory: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: What is the capital of Zhejiang Province?\\nresponse: The capital of Zhejiang Province is Hangzhou.\\nquery: What is there to eat?\\nresponse: Zhejiang\\nresponse: Zhejiang cuisine,\\nresponse: Zhejiang cuisine,\\nresponse: Zhejiang cuisine, also\\n...\\nresponse: Zhejiang cuisine, also known as \\\"Hangzhou cuisine\\\", is one of the eight traditional Chinese cuisines and is famous for its delicate taste, light fragrance, and natural appearance. It has a long history and is influenced by various cultures, including Huaiyang cuisine, Jiangnan cuisine, and Cantonese cuisine. Some popular dishes include West Lake Fish in Vinegar Gravy, Dongpo Pork, Longjing Tea-Scented Chicken, Braised Preserved Bamboo Shoots with Shredded Pork, and Steamed Stuffed Buns. There are many other delicious dishes that you can try when visiting Zhejiang.\\nhistory: [['What is the capital of Zhejiang Province?', 'The capital of Zhejiang Province is Hangzhou.'], ['What is there to eat?', 'Zhejiang cuisine, also known as \\\"Hangzhou cuisine\\\", is one of the eight traditional Chinese cuisines and is famous for its delicate taste, light fragrance, and natural appearance. It has a long history and is influenced by various cultures, including Huaiyang cuisine, Jiangnan cuisine, and Cantonese cuisine. Some popular dishes include West Lake Fish in Vinegar Gravy, Dongpo Pork, Longjing Tea-Scented Chicken, Braised Preserved Bamboo Shoots with Shredded Pork, and Steamed Stuffed Buns. There are many other delicious dishes that you can try when visiting Zhejiang.']]\\nquery: What is there to eat?\\nresponse: There are many delicious foods to try in Hangzhou, such as West Lake Fish in Vinegar Gravy, Dongpo Pork, Longjing Tea Pancakes, and XiHu-style Mandarin Duck. Additionally, Hangzhou is famous for its snacks like xiaolongbao (soup dumplings), qingtuan (green tea cakes), and huoguoliangzi (cold barley noodles).\\nhistory: [['What is the capital of Zhejiang Province?', 'The capital of Zhejiang Province is Hangzhou.'], ['What is there to eat?', 'There are many delicious foods to try in Hangzhou, such as West Lake Fish in Vinegar Gravy, Dongpo Pork, Longjing Tea Pancakes, and XiHu-style Mandarin Duck. Additionally, Hangzhou is famous for its snacks like xiaolongbao (soup dumplings), qingtuan (green tea cakes), and huoguoliangzi (cold barley noodles).']]\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-vl-chat\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_vl_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '<image>What is this'\\nimages = ['https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg']\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = 'Output the bounding box for the high-five'\\nresponse, history = inference(model, template, query, history, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\ndef _fetch_latest_picture(*args, **kwargs):\\n    return images[0]\\ntokenizer._fetch_latest_picture = _fetch_latest_picture\\nimage = tokenizer.draw_bbox_on_latest_picture(response, history)\\nimage.save('output_chat.jpg')\\n\\\"\\\"\\\"\\nquery: <image>What is this\\nresponse: This is an image of a woman sitting on a beach next to a dog. The woman is holding a cell phone and the dog is raising its paw in front of her.\\nquery: Output the bounding box for the high-five\\nresponse: <ref>the high-five</ref><box>(529,506),(587,602)</box>\\nhistory: [['<image>What is this', 'This is an image of a woman sitting on a beach next to a dog. The woman is holding a cell phone and the dog is raising its paw in front of her.'], ['Output the bounding box for the high-five', '<ref>the high-five</ref><box>(529,506),(587,602)</box>']]\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-audio-chat\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_audio_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\n\\nseed_everything(42)\\nquery = '<audio>what does the person say?'\\naudios = ['https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-Audio/1272-128104-0000.flac']\\nresponse, history = inference(model, template, query, audios=audios)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = 'Find the start time and end time of the word \\\"middle classes'\\nresponse, history = inference(model, template, query, history, audios=audios)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <audio>what does the person say?\\nresponse: The person says: \\\"mister quilter is the apostle of the middle classes and we are glad to welcome his gospel\\\".\\nquery: Find the start time and end time of the word \\\"middle classes\\nresponse: The word \\\"middle classes\\\" starts at <|2.33|> seconds and ends at <|3.26|> seconds.\\nhistory: [['<audio>what does the person say?', 'The person says: \\\"mister quilter is the apostle of the middle classes and we are glad to welcome his gospel\\\".'], ['Find the start time and end time of the word \\\"middle classes', 'The word \\\"middle classes\\\" starts at <|2.33|> seconds and ends at <|3.26|> seconds.']]\\n\\\"\\\"\\\"\\n```\\n\\n### chatglm3\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.chatglm3_6b\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: chatglm3\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 128\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = 'Where is the capital of Zhejiang?'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = 'What are some famous foods there?'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nresponse: Zhejiang has many delicious foods, here are some famous ones:\\n\\n1. Hangzhou Xiaolongbao: This is a famous traditional snack in Hangzhou, with a thin, elastic skin and juicy, delicious filling.\\n\\n2. West Lake Vinegar Fish: This is one of Hangzhou's famous dishes, made by cooking grass carp and pouring over a specially made paste and vinegar, giving it a delicious flavor.\\n\\n3. Zhejiang Stewed Chicken: This is one of the traditional famous dishes of Zhejiang province, made by slowly stewing chicken with ginger, green onion, soy sauce and other seasonings, resulting in a rich flavor.\\n\\n4. Youpodouci: This is a traditional Zhejiang pastry, with a crispy exterior and sweet filling\\nhistory: [('Where is the capital of Zhejiang?', 'The capital of Zhejiang is Hangzhou.'), ('What are some famous foods there?', 'Zhejiang has many delicious foods, here are some famous ones:\\\\n\\\\n1. Hangzhou Xiaolongbao: This is a famous traditional snack in Hangzhou, with a thin, elastic skin and juicy, delicious filling. \\\\n\\\\n2. West Lake Vinegar Fish: This is one of Hangzhou's famous dishes, made by cooking grass carp and pouring over a specially made paste and vinegar, giving it a delicious flavor.\\\\n\\\\n3. Zhejiang Stewed Chicken: This is one of the traditional famous dishes of Zhejiang province, made by slowly stewing chicken with ginger, green onion, soy sauce and other seasonings, resulting in a rich flavor. \\\\n\\\\n4. Youpodouci: This is a traditional Zhejiang pastry, with a crispy exterior and sweet filling')]\\n\\\"\\\"\\\"\\n```\\n\\n\\n### BitsAndBytes Quantization\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\nfrom transformers import BitsAndBytesConfig\\nimport torch\\n\\nmodel_type = ModelType.chatglm3_6b\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: chatglm3\\n\\ntorch_dtype = torch.bfloat16\\nquantization_config = BitsAndBytesConfig(load_in_4bit=True,\\n            bnb_4bit_compute_dtype=torch_dtype,\\n            bnb_4bit_quant_type='nf4',\\n            bnb_4bit_use_double_quant=True)\\nmodel, tokenizer = get_model_tokenizer(model_type, torch_dtype, {'device_map': 'auto',\\n                                      'quantization_config': quantization_config})\\nmodel.generation_config.max_new_tokens = 128\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = 'Where is the capital of Zhejiang?'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = 'What are some famous foods there?'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang is Hangzhou.\\nquery: What are some famous foods there?\\nresponse: Zhejiang has many delicious foods, here are some famous ones:\\n\\n1. Hangzhou Xiaolongbao: This is a famous traditional snack in Hangzhou, with a thin, elastic skin and juicy, delicious filling.\\n\\n2. Zhejiang Zongzi: Zhejiang zongzi come in many flavors, such as salted egg yolk pork zongzi, red bean paste zongzi, etc., with Hangzhou zongzi being the most famous.\\n\\n3. Oil Fried Shrimp: This is one of the most representative seafood dishes in Zhejiang, made by stir-frying shrimp in hot oil until crispy and tender.\\n\\n4. Salt and Pepper Shredded Potato: This is a traditional Zhejiang vegetable dish, made by stir-frying shredded potato with salt and pepper, resulting in a crisp and refreshing taste.\\n\\nhistory: [('Where is the capital of Zhejiang?', 'The capital of Zhejiang is Hangzhou.'), ('What are some famous foods there?', 'Zhejiang has many delicious foods, here are some famous ones:\\\\n\\\\n1. Hangzhou Xiaolongbao: This is a famous traditional snack in Hangzhou, with a thin, elastic skin and juicy, delicious filling.\\\\n\\\\n2. Zhejiang Zongzi: Zhejiang zongzi come in many flavors, such as salted egg yolk pork zongzi, red bean paste zongzi, etc., with Hangzhou zongzi being the most famous. \\\\n\\\\n3. Oil Fried Shrimp: This is one of the most representative seafood dishes in Zhejiang, made by stir-frying shrimp in hot oil until crispy and tender.\\\\n\\\\n4. Salt and Pepper Shredded Potato: This is a traditional Zhejiang vegetable dish, made by stir-frying shredded potato with salt and pepper, resulting in a crisp and refreshing taste.\\\\n')]\\n\\\"\\\"\\\"\\n```\\n\\n### Using CLI\\n```bash\\n# qwen\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-7b-chat\\n# yi\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type yi-6b-chat\\n```\\n\\n### Fine-tuned Models\\nIf you want to perform inference using fine-tuned models, you can check out the [LLM Fine-tuning Documentation](LLM-fine-tuning.md#Fine-tuned-Model)\\n\\n\\n## Web-UI\\n### qwen-7b-chat\\nUsing CLI:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --model_type qwen-7b-chat\\n```\\n\\nUsing python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, ModelType, app_ui_main\\n\\napp_ui_args = AppUIArguments(model_type=ModelType.qwen_7b_chat)\\napp_ui_main(app_ui_args)\\n```\\n\\nUsing bnb quantization:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, ModelType, app_ui_main\\n\\napp_ui_args = AppUIArguments(model_type=ModelType.qwen_7b_chat, quantization_bit=4)\\napp_ui_main(app_ui_args)\\n```\\n\\n### qwen-7b\\nUsing CLI:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --model_type qwen-7b\\n```\\n\\nUsing python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, ModelType, app_ui_main\\n\\napp_ui_args = AppUIArguments(model_type=ModelType.qwen_7b)\\napp_ui_main(app_ui_args)\\n```\\n\\n### Fine-tuned Models\\nTo use the web-ui with fine-tuned models, you can check out the [LLM Fine-tuning Documentation](LLM-fine-tuning.md#fine-tuned-model)\\n\\n\\n# LLM Quantization and Export Documentation\\nSwift supports the use of awq, gptq, bnb, hqq, and eetq technologies to quantize models. Among them, awq and gptq quantization technologies support vllm for accelerated inference, requiring the use of a calibration dataset for better quantization performance, but with slower quantization speed. On the other hand, bnb, hqq, and eetq do not require calibration data and have faster quantization speed. All five quantization methods support qlora fine-tuning.\\n\\n\\nQuantization using awq and gptq requires the use of 'swift export', while bnb, hqq, and eetq can be quickly quantized during sft and infer.\\n\\n\\nFrom the perspective of vllm inference acceleration support, it is more recommended to use awq and gptq for quantization. From the perspective of quantization effectiveness, it is more recommended to use awq, hqq, and gptq for quantization. And from the perspective of quantization speed, it is more recommended to use hqq for quantization.\\n\\n\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Original Model](#original-model)\\n- [Fine-tuned Model](#fine-tuned-model)\\n- [QLoRA](#QLoRA)\\n- [Pushing Models](#pushing-models)\\n\\n## Environment Preparation\\nGPU devices: A10, 3090, V100, A100 are all supported.\\n```bash\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# Using AWQ quantization:\\n# AutoAWQ and CUDA versions have a corresponding relationship, please select the version according to `https://github.com/casper-hansen/AutoAWQ`\\npip install autoawq -U\\n\\n# Using GPTQ quantization:\\n# Auto_GPTQ and CUDA versions have a corresponding relationship, please select the version according to `https://github.com/PanQiWei/AutoGPTQ#quick-installation`\\npip install auto_gptq optimum -U\\n\\n# Using bnb quantization:\\npip install bitsandbytes -U\\n\\n# Using hqq quantization:\\n# pip install transformers>=4.41\\npip install hqq\\n\\n# Using eetq quantization:\\n# pip install transformers>=4.41\\n# 参考https://github.com/NetEase-FuXi/EETQ\\ngit clone https://github.com/NetEase-FuXi/EETQ.git\\ncd EETQ/\\ngit submodule update --init --recursive\\npip install .\\n\\n# Environment alignment (usually not needed. If you encounter errors, you can run the code below, the repository uses the latest environment for testing)\\npip install -r requirements/framework.txt -U\\npip install -r requirements/llm.txt -U\\n```\\n\\n## Original Model\\n\\n### awq, gptq\\n\\nHere we demonstrate AWQ and GPTQ quantization on the qwen1half-7b-chat model.\\n```bash\\n# AWQ-INT4 quantization (takes about 18 minutes using A100, memory usage: 13GB)\\n# If OOM occurs during quantization, you can appropriately reduce `--quant_n_samples` (default 256) and `--quant_seqlen` (default 2048).\\n# GPTQ-INT4 quantization (takes about 20 minutes using A100, memory usage: 7GB)\\n\\n# AWQ: Use `alpaca-zh alpaca-en sharegpt-gpt4:default` as the quantization dataset\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat --quant_bits 4 \\\\\\n    --dataset alpaca-zh alpaca-en sharegpt-gpt4:default --quant_method awq\\n\\n# GPTQ: Use `alpaca-zh alpaca-en sharegpt-gpt4:default` as the quantization dataset\\n# For GPTQ quantization, please first refer to this issue: https://github.com/AutoGPTQ/AutoGPTQ/issues/439\\nOMP_NUM_THREADS=14 CUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat --quant_bits 4 \\\\\\n    --dataset alpaca-zh alpaca-en sharegpt-gpt4:default --quant_method gptq\\n\\n# AWQ: Use custom quantization dataset\\n# Same for GPTQ\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat --quant_bits 4 \\\\\\n    --dataset xxx.jsonl \\\\\\n    --quant_method awq\\n\\n# Inference using swift quantized model\\n# AWQ\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-awq-int4\\n# GPTQ\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-gptq-int4\\n\\n# Inference using original model\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n```\\n\\n### bnb, hqq, eetq\\n\\nFor bnb, hqq, and eetq, we only need to use `swift infer` for rapid quantization and inference.\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --quant_method bnb \\\\\\n    --quantization_bit 4\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --quant_method hqq \\\\\\n    --quantization_bit 4\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --quant_method eetq \\\\\\n    --dtype fp16\\n```\\n\\n## Fine-tuned Model\\n\\nAssume you fine-tuned qwen1half-4b-chat using LoRA, and the model weights directory is: `output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx`.\\n\\nHere we only introduce using the AWQ technique to quantize the fine-tuned model. Using GPTQ for quantization would be similar.\\n\\n**Merge-LoRA & Quantization**\\n```shell\\n# Use `alpaca-zh alpaca-en sharegpt-gpt4:default` as the quantization dataset\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx' \\\\\\n    --merge_lora true --quant_bits 4 \\\\\\n    --dataset alpaca-zh alpaca-en sharegpt-gpt4:default --quant_method awq\\n\\n# Use the dataset from fine-tuning as the quantization dataset\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx' \\\\\\n    --merge_lora true --quant_bits 4 \\\\\\n    --load_dataset_config true --quant_method awq\\n```\\n\\n**Inference using quantized model**\\n```shell\\n# AWQ/GPTQ quantized models support VLLM inference acceleration. They also support model deployment.\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4'\\n```\\n\\n**Deploying the quantized model**\\n\\nServer:\\n\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4'\\n```\\n\\nTesting:\\n```shell\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen1half-4b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"How to fall asleep at night?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\n## QLoRA\\n\\n### awq, gptq\\n\\nIf you want to fine-tune the models quantized with awq and gptq using QLoRA, you need to perform pre-quantization. For example, you can use `swift export` to quantize the original model. Then, for fine-tuning, you need to specify `--quant_method` to specify the corresponding quantization method using the following command:\\n\\n```bash\\n# awq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-awq-int4 \\\\\\n    --quant_method awq \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n\\n# gptq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-gptq-int4 \\\\\\n    --quant_method gptq \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n```\\n\\n### bnb, hqq, eetq\\n\\nIf you want to use bnb, hqq, eetq for QLoRA fine-tuning, you need to specify `--quant_method` and `--quantization_bit` during training:\\n\\n```bash\\n# bnb\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n    --quant_method bnb \\\\\\n    --quantization_bit 4 \\\\\\n    --dtype fp16 \\\\\\n\\n# hqq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n    --quant_method hqq \\\\\\n    --quantization_bit 4 \\\\\\n\\n# eetq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n    --quant_method eetq \\\\\\n    --dtype fp16 \\\\\\n```\\n\\n**Note**\\n- hqq supports more customizable parameters, such as specifying different quantization configurations for different network layers. For details, please see [Command Line Arguments](Command-line-parameters.md).\\n- eetq quantization uses 8-bit quantization, and there's no need to specify quantization_bit. Currently, bf16 is not supported; you need to specify dtype as fp16.\\n- Currently, eetq's qlora speed is relatively slow; it is recommended to use hqq instead. For reference, see the [issue](https://github.com/NetEase-FuXi/EETQ/issues/17).\\n\\n\\n## Pushing Models\\nAssume you fine-tuned qwen1half-4b-chat using LoRA, and the model weights directory is: `output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx`.\\n\\n```shell\\n# Push the original quantized model\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-gptq-int4 \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-7b-chat-gptq-int4 \\\\\\n    --hub_token '<your-sdk-token>'\\n\\n# Push LoRA incremental model\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>'\\n\\n# Push merged model\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>' \\\\\\n    --merge_lora true\\n\\n# Push quantized model\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>' \\\\\\n    --merge_lora true \\\\\\n    --quant_bits 4\\n```\\n\\n\\n# LLM Experiment Documentation\\n\\n## Table of Contents\\n\\n- [Environment Setup](#Environment-setup)\\n- [Prepare Experiment Configuration](#Prepare-experiment-configuration)\\n- [Run Experiments](#Run-experiments)\\n- [Collect Experiment Results](#Collect-experiment-results)\\n\\n## Environment Setup\\n\\nSWIFT supports the exp (experiment) capability, which is designed to conveniently manage multiple ablation experiments that need to be conducted. The main functions of the experiment capability include:\\n\\n- Support parallel execution of multiple training (export) tasks on a single machine with multiple GPUs (or a single GPU), and record information such as hyperparameters, training outputs, training metrics, etc. Tasks will be queued when the GPUs are fully occupied.\\n- Support directly running evaluation tasks after training (or export), and record evaluation metrics.\\n- Support generating a Markdown table for easy comparison of all metrics.\\n- Support idempotent re-runs, and completed experiments will not be re-run.\\n\\nThis capability complements SWIFT's training, inference, and evaluation capabilities and is essentially a task scheduling capability.\\n\\n## Prepare Experiment Configuration\\n\\nAn example experiment configuration is as follows:\\n\\n```json\\n{\\n    \\\"cmd\\\": \\\"sft\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\",\\n        \\\"ddp\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"args\\\": {\\n      \\\"model_type\\\": \\\"qwen-7b-chat\\\",\\n      \\\"dataset\\\": \\\"ms-agent\\\",\\n      \\\"train_dataset_mix_ratio\\\": 2.0,\\n      \\\"batch_size\\\": 1,\\n      \\\"max_length\\\": 2048,\\n      \\\"use_loss_scale\\\": true,\\n      \\\"gradient_accumulation_steps\\\": 16,\\n      \\\"learning_rate\\\": 5e-5,\\n      \\\"use_flash_attn\\\": true,\\n      \\\"eval_steps\\\": 2000,\\n      \\\"save_steps\\\": 2000,\\n      \\\"train_dataset_sample\\\": -1,\\n      \\\"val_dataset_sample\\\": 5000,\\n      \\\"num_train_epochs\\\": 2,\\n      \\\"check_dataset_strategy\\\": \\\"none\\\",\\n      \\\"gradient_checkpointing\\\": true,\\n      \\\"weight_decay\\\": 0.01,\\n      \\\"warmup_ratio\\\": 0.03,\\n      \\\"save_total_limit\\\": 2,\\n      \\\"logging_steps\\\": 10\\n    },\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"lora\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"lora_lr_ratio\\\": 16.0\\n        }\\n      }\\n    ]\\n}\\n```\\n\\n- cmd: The swift command to run in this experiment\\n- requirements: Configure the number of GPUs and the number of ddp (data parallel distributed processes)\\n- eval_requirements: The number of GPUs used for evaluation\\n- eval_dataset: The datasets used for evaluation. If not configured, no evaluation will be performed.\\n- args: Parameters corresponding to the cmd command\\n- experiment: Independent parameters for each sub-experiment, which will override the above parameters. Must include the name field to store experiment results\\n\\nYou can check [this folder](https://github.com/modelscope/swift/tree/main/scripts/benchmark/config) for examples of currently configured experiments.\\n\\n## Run Experiments\\n\\n```shell\\n# Run in the swift root directory\\nPYTHONPATH=. nohup python scripts/benchmark/exp.py --save_dir './experiment' --config your-config-path > run.log 2>&1 &\\n```\\n\\nThe --config parameter supports an experiment configuration file or a folder. When a folder is specified, all experiment configurations in that folder will be run in parallel.\\n\\nAfter running the experiment, the log for each experiment will be recorded separately in the `./exp` folder, and the experiment results will be recorded in the folder specified by `--save_dir`.\\n\\n## Collect Experiment Results\\n\\n```shell\\n# Run in the swift root directory\\npython scripts/benchmark/generate_report.py\\n```\\n\\nThe experiment result logs are as follows:\\n\\n```text\\n=================Printing the sft cmd result of exp tuner==================\\n\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|adalora|qwen-7b-chat|ms-agent|2.0|adalora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|26.8389(0.3464%)|True|True|lr=5e-05/epoch=2|32.55GiB|0.92(87543 samples/95338.71 seconds)|17.33(2345 tokens/135.29 seconds)|0.57|1.07|0.391|0.665|0.569|\\n|adapter|qwen-7b-chat|ms-agent|2.0|adapter||33.6896(0.4344%)|True|True|lr=5e-05/epoch=2|32.19GiB|1.48(87543 samples/59067.71 seconds)|26.63(4019 tokens/150.90 seconds)|0.55|1.03|0.438|0.662|0.565|\\n|dora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=True|19.2512(0.2487%)|True|True|lr=5e-05/epoch=2|32.46GiB|0.51(87543 samples/171110.54 seconds)|4.29(2413 tokens/562.32 seconds)|0.53|1.01|0.466|0.683|**0.577**|\\n|full+galore128|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.02GiB|1.10(87543 samples/79481.96 seconds)|28.96(2400 tokens/82.88 seconds)|0.55|1.00|0.358|**0.688**|**0.577**|\\n...\\n```\\n\\nYou can copy the table into other documents for analysis.\\n\\n\\n# LLM Evaluation Documentation\\n\\nSWIFT supports the eval (evaluation) capability to provide standardized evaluation metrics for the original model and the fine-tuned model.\\n\\n## Table of Contents\\n\\n- [Introduction](#Introduction)\\n- [Environment Setup](#Environment-setup)\\n- [Evaluation](#Evaluation)\\n- [Custom Evaluation Set](#Custom-Evaluation-Set)\\n\\n## Introduction\\n\\nSWIFT's eval capability utilizes the [EvalScope evaluation framework](https://github.com/modelscope/eval-scope) from the ModelScope community and [Open-Compass](https://hub.opencompass.org.cn/home) and provides advanced encapsulation to support evaluation needs for various models. Currently, we support the evaluation process for **standard evaluation sets** and **user-defined evaluation sets**. The **standard evaluation sets** include:\\n\\nNLP eval datasets：\\n```text\\n'obqa', 'cmb', 'AX_b', ''siqa', 'nq', 'mbpp', 'winogrande', 'mmlu', 'BoolQ', 'cluewsc', 'ocnli', 'lambada',\\n'CMRC', 'ceval', 'csl', 'cmnli', 'bbh', 'ReCoRD', 'math', 'humaneval', 'eprstmt', 'WSC', 'storycloze',\\n'MultiRC', 'RTE', 'chid', 'gsm8k', 'AX_g', 'bustm', 'afqmc', 'piqa', 'lcsts', 'strategyqa', 'Xsum', 'agieval',\\n'ocnli_fc', 'C3', 'tnews', 'race', 'triviaqa', 'CB', 'WiC', 'hellaswag', 'summedits', 'GaokaoBench',\\n'ARC_e', 'COPA', 'ARC_c', 'DRCD'\\n```\\nCheck out the detail descriptions of these datasets: https://hub.opencompass.org.cn/home\\n\\nMulti Modal eval datasets：\\n```text\\n'COCO_VAL', 'MME', 'HallusionBench', 'POPE', 'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN',\\n'MMBench', 'MMBench_CN', 'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11',\\n'MMBench_TEST_CN_V11', 'MMBench_V11', 'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2',\\n'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST', 'MMT-Bench_ALL_MI', 'MMT-Bench_ALL',\\n'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL', 'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar',\\n'RealWorldQA', 'MLLMGuard_DS', 'BLINK', 'OCRVQA_TEST', 'OCRVQA_TESTCORE', 'TextVQA_VAL', 'DocVQA_VAL',\\n'DocVQA_TEST', 'InfoVQA_VAL', 'InfoVQA_TEST', 'ChartQA_TEST', 'MathVision', 'MathVision_MINI',\\n'MMMU_DEV_VAL', 'MMMU_TEST', 'OCRBench', 'MathVista_MINI', 'LLaVABench', 'MMVet', 'MTVQA_TEST',\\n'MMLongBench_DOC', 'VCR_EN_EASY_500', 'VCR_EN_EASY_100', 'VCR_EN_EASY_ALL', 'VCR_EN_HARD_500',\\n'VCR_EN_HARD_100', 'VCR_EN_HARD_ALL', 'VCR_ZH_EASY_500', 'VCR_ZH_EASY_100', 'VCR_ZH_EASY_ALL',\\n'VCR_ZH_HARD_500', 'VCR_ZH_HARD_100', 'VCR_ZH_HARD_ALL', 'MMDU', 'MMBench-Video', 'Video-MME',\\n'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN', 'MMBench', 'MMBench_CN',\\n'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11', 'MMBench_TEST_CN_V11', 'MMBench_V11',\\n'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2', 'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST',\\n'MMT-Bench_ALL_MI', 'MMT-Bench_ALL', 'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL',\\n'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar', 'RealWorldQA', 'MLLMGuard_DS', 'BLINK'\\n```\\nCheck out the detail descriptions of these datasets: https://github.com/open-compass/VLMEvalKit\\n\\n\\n> At the first time of running eval, a resource dataset will be downloaded: https://www.modelscope.cn/datasets/swift/evalscope_resource/files\\n> If downloading fails, you can manually download the dataset to your local disk, please pay attention to the log of the `eval` command.\\n\\n## Environment Setup\\n\\n```shell\\npip install ms-swift[eval] -U\\n```\\n\\nor install from source code:\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[eval]'\\n```\\n\\n## Evaluation\\n\\nEvaluation supports the use of vLLM for acceleration. Here we demonstrate the evaluation of the original model and the LoRA fine-tuned qwen2-7b-instruct.\\n\\n```shell\\n# Original model (approximately half an hour on a single A100)\\nCUDA_VISIBLE_DEVCIES=0 swift eval --model_type qwen2-7b-instruct \\\\\\n    --eval_dataset ARC_c --infer_backend vllm\\n\\n# After LoRA fine-tuning\\nCUDA_VISIBLE_DEVICES=0 swift eval --ckpt_dir qwen2-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --eval_dataset ARC_c --infer_backend vllm \\\\\\n    --merge_lora true \\\\\\n```\\n\\nYou can refer to [here](Command-line-parameters.mdval-parameters) for the list of evaluation parameters.\\n\\nPlease pay attention: The eval result will be saved in {--eval_output_dir}/{--name}/{some-timestamp}, if you changed nothing, the default dir will be:\\n```text\\nthe current folder(`pwd` folder)/eval_outputs/default/20240628_190000/xxx\\n```\\n\\n\\n### Evaluation using the deployed method\\n\\n```shell\\n# Start deployment using the OpenAI API method\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-7b-instruct\\n\\n# Evaluate using the API\\n# If it is not a Swift deployment, you need to additionally pass in `--eval_is_chat_model true --model_type qwen2-7b-instruct`.\\nswift eval --eval_url http://127.0.0.1:8000/v1 --eval_dataset ARC_c\\n\\n# The same applies to the model after LoRA fine-tuning.\\n```\\n\\n## Custom Evaluation Sets\\n\\nIn addition, we support users in customizing their own evaluation sets. Custom evaluation sets must be consistent with the data format (pattern) of an official evaluation set. Below, we explain step-by-step how to use your own evaluation set for evaluation.\\n\\n### Preparing Your Own Evaluation Set\\n\\nCurrently, we support two patterns of evaluation sets: multiple-choice format (CEval) and question-answer format (General-QA).\\n\\n#### Multiple-choice: CEval Format\\n\\nThe CEval format is suitable for multiple-choice scenarios, where you select the correct answer from four options, and the evaluation metric is `accuracy`. It is recommended to **directly modify** the [CEval scaffold directory](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/eval_example/custom_ceval). This directory contains two files:\\n\\n```text\\ndefault_dev.csv # Used for few-shot evaluation, must contain at least the number of entries specified by eval_few_shot. If it is 0-shot evaluation, this CSV can be empty.\\ndefault_val.csv # Data used for actual evaluation.\\n```\\n\\nThe CEval CSV file should be in the following format:\\n\\n```csv\\nid,question,A,B,C,D,answer,explanation\\n1,Typically, how many amino acids make up animal proteins? ,4,22,20,19,C,1. Currently, it is known that 20 amino acids make up animal proteins.\\n2,Among the following substances present in blood, which one is not a metabolic end product? ,urea,uric acid,pyruvic acid,carbon dioxide,C,\\\"A metabolic end product is a substance that cannot be further utilized in the body's metabolism and needs to be excreted. Pyruvic acid is a product of carbohydrate metabolism and can be further metabolized for energy or synthesis of other substances, so it is not a metabolic end product.\\\"\\n```\\n\\nIn this format, `id` is the evaluation sequence number, `question` is the question, `A`, `B`, `C`, `D` are options (if there are fewer than four options, leave the corresponding fields empty), `answer` is the correct option, and `explanation` is the explanation.\\n\\nThe `default` file name is the sub-dataset name for the CEval evaluation, which can be changed and will be used in the configuration below.\\n\\n#### Question-Answer: General-QA\\n\\nThe General-QA format is suitable for question-answer scenarios, and the evaluation metrics are `rouge` and `bleu`. It is recommended to **directly modify** the [General-QA scaffold directory](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/eval_example/custom_general_qa). This directory contains one file:\\n\\n```text\\ndefault.jsonl\\n```\\n\\nThis JSONL file should be in the following format:\\n\\n```jsonl\\n{\\\"history\\\": [], \\\"query\\\": \\\"What is the capital of China?\\\", \\\"response\\\": \\\"The capital of China is Beijing.\\\"}\\n{\\\"history\\\": [], \\\"query\\\": \\\"What is the highest mountain in the world?\\\", \\\"response\\\": \\\"It is Mount Everest.\\\"}\\n{\\\"history\\\": [], \\\"query\\\": \\\"Why can't you see penguins in the Arctic?\\\", \\\"response\\\": \\\"Because most penguins live in the Antarctic.\\\"}\\n```\\n\\nNote that `history` is currently a reserved field and is not yet supported.\\n\\n### Defining a Configuration File for the Evaluation Command\\n\\nAfter preparing the files above, you need to write a JSON file to pass into the evaluation command. It is recommended to directly modify the [official configuration scaffold file](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/eval_example/custom_config.json). The content of this file is as follows:\\n\\n```json\\n[\\n    {\\n        \\\"name\\\": \\\"custom_general_qa\\\", # Name of the evaluation item, can be freely specified\\n        \\\"pattern\\\": \\\"general_qa\\\", # Pattern of this evaluation set\\n        \\\"dataset\\\": \\\"eval_example/custom_general_qa\\\", # Directory of this evaluation set, it is strongly recommended to use an absolute path to prevent read failures\\n        \\\"subset_list\\\": [\\\"default\\\"] # Sub-datasets to be evaluated, i.e., the `default_x` file name above\\n    },\\n    {\\n        \\\"name\\\": \\\"custom_ceval\\\",\\n        \\\"pattern\\\": \\\"ceval\\\",\\n        \\\"dataset\\\": \\\"eval_example/custom_ceval\\\", # Directory of this evaluation set, it is strongly recommended to use an absolute path to prevent read failures\\n        \\\"subset_list\\\": [\\\"default\\\"]\\n    }\\n]\\n```\\n\\nYou can then pass this configuration file for evaluation:\\n\\n```shell\\n# Use arc evaluation, limit evaluation to 10 entries per sub-dataset, inference backend using pt\\n# cd examples/pytorch/llm\\n# eval_dataset can also be set, running both official and custom datasets together\\nswift eval \\\\\\n    --model_type \\\"qwen-7b-chat\\\" \\\\\\n    --eval_dataset no \\\\\\n    --```shell\\n    --infer_backend pt \\\\\\n    --custom_eval_config eval_example/custom_config.json\\n```\\n\\nThe results will be output as follows:\\n\\n```text\\n2024-04-10 17:21:33,275 - llmuses - INFO - *** Report table ***\\n+------------------------------+----------------+---------------------------------+\\n| Model                        | custom_ceval   | custom_general_qa               |\\n+==============================+================+=================================+\\n| qa-custom_ceval_qwen-7b-chat | 1.0 (acc)      | 0.8888888888888888 (rouge-1-r)  |\\n|                              |                | 0.33607503607503614 (rouge-1-p) |\\n|                              |                | 0.40616618868713145 (rouge-1-f) |\\n|                              |                | 0.39999999999999997 (rouge-2-r) |\\n|                              |                | 0.27261904761904765 (rouge-2-p) |\\n|                              |                | 0.30722525589718247 (rouge-2-f) |\\n|                              |                | 0.8333333333333334 (rouge-l-r)  |\\n|                              |                | 0.30742204655248134 (rouge-l-p) |\\n|                              |                | 0.3586824745225346 (rouge-l-f)  |\\n|                              |                | 0.3122529644268775 (bleu-1)     |\\n|                              |                | 0.27156862745098037 (bleu-2)    |\\n|                              |                | 0.25 (bleu-3)                   |\\n|                              |                | 0.2222222222222222 (bleu-4)     |\\n+------------------------------+----------------+---------------------------------+\\nFinal report: {'report': [{'name': 'custom_general_qa', 'metric': 'WeightedAverageBLEU', 'score': {'rouge-1-r': 0.8888888888888888, 'rouge-1-p': 0.33607503607503614, 'rouge-1-f': 0.40616618868713145, 'rouge-2-r': 0.39999999999999997, 'rouge-2-p': 0.27261904761904765, 'rouge-2-f': 0.30722525589718247, 'rouge-l-r': 0.8333333333333334, 'rouge-l-p': 0.30742204655248134, 'rouge-l-f': 0.3586824745225346, 'bleu-1': 0.3122529644268775, 'bleu-2': 0.27156862745098037, 'bleu-3': 0.25, 'bleu-4': 0.2222222222222222}, 'category': [{'name': 'DEFAULT', 'score': {'rouge-1-r': 0.8888888888888888, 'rouge-1-p': 0.33607503607503614, 'rouge-1-f': 0.40616618868713145, 'rouge-2-r': 0.39999999999999997, 'rouge-2-p': 0.27261904761904765, 'rouge-2-f': 0.30722525589718247, 'rouge-l-r': 0.8333333333333334, 'rouge-l-p': 0.30742204655248134, 'rouge-l-f': 0.3586824745225346, 'bleu-1': 0.3122529644268775, 'bleu-2': 0.27156862745098037, 'bleu-3': 0.25, 'bleu-4': 0.2222222222222222}, 'subset': [{'name': 'default', 'score': {'rouge-1-r': 0.8888888888888888, 'rouge-1-p': 0.33607503607503614, 'rouge-1-f': 0.40616618868713145, 'rouge-2-r': 0.39999999999999997, 'rouge-2-p': 0.27261904761904765, 'rouge-2-f': 0.30722525589718247, 'rouge-l-r': 0.8333333333333334, 'rouge-l-p': 0.30742204655248134, 'rouge-l-f': 0.3586824745225346, 'bleu-1': 0\\n```\\n\\n\\n# Frequently Asked Questions in LLM & VLM Training, Inference, Deployment, and Evaluation\\n\\nHere are some common issues encountered when using Swift.\\n\\n## Training\\n\\n### Q1: Which models and datasets are supported for fine-tuning with Swift?\\nFor details, please refer to the documentation [Supported-models-datasets](https://swift.readthedocs.io/en/latest/Instruction/Supported-models-datasets.html).\\n\\n### Q2: What data formats are supported when using custom datasets for training?\\nFor the LLM custom dataset format, please refer to the documentation [Customization and Extension](https://swift.readthedocs.io/en/latest/Instruction/Customization.html).\\nVLM custom dataset format, different models support different numbers of images. For specific details, please refer to the best practice documentation corresponding to the model [Multi-Modal Documentation](https://swift.readthedocs.io/en/latest/Multi-Modal/index.html).\\n\\n### Q3: How to use a custom dataset through this method, using the custom dataset format dataset_info.json?\\nFor the format of dataset_info.json, refer to the documentation [Customization and Extension](https://swift.readthedocs.io/en/latest/Instruction/Customization.html). CLI，`--custom_dataset_info xxx.json`, `--dataset dataset_name`.\\n\\n### Q4: How to train using a custom dataset in the UI interface?\\nInterface training using custom datasets is consistent with the command line. Refer to the documentation [Customization and Extension](https://swift.readthedocs.io/en/latest/Instruction/Customization.html).\\n\\n### Q5: Can a line in the dataset's jsonl file be written like this? {\\\"index\\\": \\\"00000\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", 'source':'qqq'}\\nAdditional fields are allowed, but they will not be used.\\n\\n### Q6: Where can I find documentation on command-line arguments?\\nSee the document for details, [Command Line Arguments](https://swift.readthedocs.io/en/latest/Instruction/Command-line-parameters.html).\\n\\n### Q7: What parameters need to be configured for offline environment training?\\n`--model_id_or_path 本地路径`, `--check_model_is_latest false`, for details, refer to the documentation [Command Line Arguments](https://swift.readthedocs.io/en/latest/Instruction/Command-line-parameters.html).\\n\\n### Q8: Where can I check the model_type?\\nCheck the document [Supported-models-datasets](https://swift.readthedocs.io/en/latest/Instruction/Supported-models-datasets.html).\\n\\n### Q9: Can the model be directly converted to gguf format after training?\\nCurrently only supports exporting ModelFile,  for details, see documentation [OLLaMA Export Documentation](https://swift.readthedocs.io/en/latest/LLM/OLLaMA-Export.html).\\n\\n### Q10: Does swift support pre-training? I only see SFT (Supervised Fine-Tuning).\\nSupported, command line `swift pt`. For dataset format, see [Custom and Extension](https://swift.readthedocs.io/en/latest/Instruction/Customization.html).\\n\\n### Q11: For a model fine-tuned using LoRA, if I want to resume training from a checkpoint, should I merge it into a complete model first, or can I directly specify the paths to the original model and LoRA blocks without merging?\\nNo merging, `--resume_from_checkpoint output/xxx/vx-xxx/checkpoint-xxx`, for details, see [Command Line Arguments](https://swift.readthedocs.io/en/latest/Instruction/Command-line-parameters.html).\\n\\n### Q12: I want to control the location of the original model weights downloaded from the internet. How can I place the original model in a specified folder?\\nYou can configure the environment variable `MODELSCOPE_CACHE=your_path` to store the original model in a specified path; if using sdk to download, use `cache_dir=\\\"local_address\\\"`; you can also use the modelscope download command-line tool or git to download, see modelscope documentation [Model Download](https://modelscope.cn/docs/Download%20Model) for details. During training, configure `--model_id_or_path` with the local path. If you need to train in an offline environment, configure `--check_model_is_latest false`, see [Command Line Arguments](https://swift.readthedocs.io/en/latest/Instruction/Command-line-parameters.html) for details.\\n\\n### Q13: Has anyone encountered this issue when using ms-swift?\\n```text\\n[rank6]: pydantic_core._pydantic_core.ValidationError: 1 validation error for DeepSpeedZeroConfig\\n[rank6]: stage3_prefetch_bucket_size\\n[rank6]: Input should be a valid integer, got a number with a fractional part [type=int_from_float,input_value=11560550.4，in put_type=float]\\n[rank6]: For further information visit https://errors.pydantic.dev/2.8/v/int_fro_float\\n```\\nDowngrade deepspeed version to `0.14.*.`。\\n\\n### Q14: Is there a complete tutorial and command line for fine-tuning Qwen-2-VL?\\n[Qwen2-VL Best Practice](https://swift.readthedocs.io/en/latest/Multi-Modal/qwen2-vl-best-practice.html).\\n\\n### Q15: Are there any supported tricks for fine-tuning multimodal large models, similar to NEFTune for LLMs?\\nYou can try `piassa/olora/dora` these `lora` variants or `fourierft`. Refer to various tricks in the `sft` parameters, some may not be applicable to multimodal tasks.\\n\\n### Q16: The accuracy obtained during evaluation in the training process is not consistent with the accuracy calculated by re-inferencing using the corresponding saved checkpoint.\\nThe eval_acc during training and the acc during inference are calculated differently. `acc_strategy`: default is `'token'`, available options include: `'token'`, `'sentence'`.\\n\\n### Q17: Official ModelScope docker image and Swift environment\\nStart the container with the `docker run` command, e.g.: `docker run --gpus all -p 8000:8000 -it -d --name ms registry.cn-beijing.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.3.0-tf2.16.1-1.16.0 /bin/bash`, after starting the container, pull the latest code and install swift.\\n\\n### Q18: Command line for multi-node, multi-GPU training\\n```shell\\n# multi-node, multi-GPU\\n# If not using a shared disk, please additionally specify --save_on_each_node true in each machine's sh.\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n```\\nFor details, see [LLM Fine-tuning Documentation](https://swift.readthedocs.io/en/latest/Instruction/LLM-fine-tuning.html).\\n\\n### Q19: How to choose a template?\\nSee [issue](https://github.com/modelscope/ms-swift/issues/1813).\\n\\n### Q20: How to use torchrun and Swift SFT for multi-GPU training?\\n`swift sft` uses `torchrun`.\\n\\n### Q21: I have a question: my SFT dataset is too large, and tokenizing takes a long time each time. Is there a solution?\\nUse lazy_tokenize, see [Command Line Arguments](https://swift.readthedocs.io/en/latest/Instruction/Command-line-parameters.html) for details.\\n\\n### Q22: During training, if two datasets are directly appended together in the training set, does the model have an internal shuffling process during training? Or does it take data in order for training?\\nRandomization occurs in the trainer.\\n\\n## Inference\\n\\n### Q1:Is there documentation for Swift inference?\\nSwift supports Python script, command line, and UI interface inference, see [LLM Inference Documentation](https://swift.readthedocs.io/en/latest/Instruction/LLM-inference.html) for details.\\n\\n### Q2: How to use the trained model for inference on a dataset?\\nParameter `--load_dataset_config true` or `--val_dataset <your-val-dataset>`, see documentation [LLM Fine-tuning Documentation](https://swift.readthedocs.io/en/latest/Instruction/LLM-fine-tuning.html#).\\n\\n### Q3: Can we specify a pre-downloaded model when using Swift for inference?\\nConfigure `--model_id_or_path` with the local path, see [Command Line Arguments](https://swift.readthedocs.io/en/latest/Instruction/Command-line-parameters.html) for details.\\n\\n### Q4: I want to perform inference on a dataset without labels. How can I do this? I see that the dataset formats in the documentation are all for training sets.\\nConfigure parameter `--val_dataset <your-val-dataset>`.\\n\\n### Q5: I encountered an error: ValueError: Input length of input_ids is 35, but max_length is set to 20. How to solve this?\\n```text\\nraise ValueError(\\nValueError: Input length of input_ids is 35, but `max_length` is set to 20. This can lead to unexpected behavior. You should consider increasing `max_length` or, better yet, setting `max_new_tokens`.\\n```\\nSet `model.generation_config.max_new_tokens`.\\n\\n### Q6: Qwen2-VL inference causes out of memory error\\nSet environment variables, `SIZE_FACTOR=8 MAX_PIXELS=602112`, see documentation [Qwen2-VL Best Practice](https://swift.readthedocs.io/en/latest/Multi-Modal/qwen2-vl-best-practice.html).\\n\\n## Deployment\\n\\n### Q1: How to deploy the trained model?\\n`swift deploy --ckpt_dir xxx`, see documentation [VLLM Inference Acceleration and Deployment](https://swift.readthedocs.io/en/latest/LLM/VLLM-inference-acceleration-and-deployment.html).\\n\\n### Q2: How to use vLLM for multi-GPU deployment?\\n`RAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy --model_type qwen-7b --tensor_parallel_size 4`, see documentation [VLLM Inference Acceleration and Deployment](https://swift.readthedocs.io/en/latest/LLM/VLLM-inference-acceleration-and-deployment.html).\\n\\n### Q3: When deploying with vLLM, how can the client pass in images?\\nSee multimodal documentation, [vLLM Inference Acceleration Documentation](https://swift.readthedocs.io/en/latest/Multi-Modal/vllm-inference-acceleration.html) for details.\\n\\n### Q4: I have a question: when deploying qwen2-7b and using the client, we need to use client.completions.create with the OpenAI API, not client.chat.completions.create. However, when using qwen2-7b-instruct-q5_k_m.gguf, we can use client.chat.completions.create. Why is this?\\nBase models can use client.chat.completions.create, but this is a compatibility behavior.\\n\\n### Q5: After starting the server with Swift deploy using two GPUs, when exiting with Ctrl+C, there's always a Python process that keeps occupying the memory of one GPU. Is this normal?\\nNeed to kill it, this is a vllm issue.\\n\\n## Evaluation\\n\\n### Q1: What evaluation datasets does Swift support?\\nNLP eval datasets：\\n```text\\n'obqa', 'cmb', 'AX_b', 'siqa', 'nq', 'mbpp', 'winogrande', 'mmlu', 'BoolQ', 'cluewsc', 'ocnli', 'lambada',\\n'CMRC', 'ceval', 'csl', 'cmnli', 'bbh', 'ReCoRD', 'math', 'humaneval', 'eprstmt', 'WSC', 'storycloze',\\n'MultiRC', 'RTE', 'chid', 'gsm8k', 'AX_g', 'bustm', 'afqmc', 'piqa', 'lcsts', 'strategyqa', 'Xsum', 'agieval',\\n'ocnli_fc', 'C3', 'tnews', 'race', 'triviaqa', 'CB', 'WiC', 'hellaswag', 'summedits', 'GaokaoBench',\\n'ARC_e', 'COPA', 'ARC_c', 'DRCD'\\n```\\n\\nMulti Modal eval datasets：\\n```text\\n'COCO_VAL', 'MME', 'HallusionBench', 'POPE', 'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN',\\n'MMBench', 'MMBench_CN', 'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11',\\n'MMBench_TEST_CN_V11', 'MMBench_V11', 'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2',\\n'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST', 'MMT-Bench_ALL_MI', 'MMT-Bench_ALL',\\n'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL', 'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar',\\n'RealWorldQA', 'MLLMGuard_DS', 'BLINK', 'OCRVQA_TEST', 'OCRVQA_TESTCORE', 'TextVQA_VAL', 'DocVQA_VAL',\\n'DocVQA_TEST', 'InfoVQA_VAL', 'InfoVQA_TEST', 'ChartQA_TEST', 'MathVision', 'MathVision_MINI',\\n'MMMU_DEV_VAL', 'MMMU_TEST', 'OCRBench', 'MathVista_MINI', 'LLaVABench', 'MMVet', 'MTVQA_TEST',\\n'MMLongBench_DOC', 'VCR_EN_EASY_500', 'VCR_EN_EASY_100', 'VCR_EN_EASY_ALL', 'VCR_EN_HARD_500',\\n'VCR_EN_HARD_100', 'VCR_EN_HARD_ALL', 'VCR_ZH_EASY_500', 'VCR_ZH_EASY_100', 'VCR_ZH_EASY_ALL',\\n'VCR_ZH_HARD_500', 'VCR_ZH_HARD_100', 'VCR_ZH_HARD_ALL', 'MMDU', 'MMBench-Video', 'Video-MME',\\n'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN', 'MMBench', 'MMBench_CN',\\n'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11', 'MMBench_TEST_CN_V11', 'MMBench_V11',\\n'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2', 'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST',\\n'MMT-Bench_ALL_MI', 'MMT-Bench_ALL', 'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL',\\n'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar', 'RealWorldQA', 'MLLMGuard_DS', 'BLINK'\\n```\\n\\nSee documentation [LLM Evaluation Documentation](https://swift.readthedocs.io/en/latest/Instruction/LLM-eval.html) for details.\\n\\n### Q2: How to use custom evaluation datasets?\\nCustom evaluation datasets for NLP and multimodal must follow the data format (pattern) of an official evaluation dataset, see documentation [LLM Evaluation Documentation](https://swift.readthedocs.io/en/latest/Instruction/LLM-eval.html).\\n\\n\\n# Customization and Extension\\n## Table of Contents\\n- [Custom Datasets](#custom-datasets)\\n- [Custom Models](#custom-models)\\n- [Custom Dialogue Templates](#custom-dialogue-templates)\\n\\n## Custom Dataset\\n\\nWe support three methods for **customizing datasets**.\\n\\n1. \\\\[Recommended] Use the command line argument directly to specify `--dataset xxx.json yyy.jsonl zzz.csv`, which is more convenient for supporting custom datasets. It supports five data formats (using `SmartPreprocessor`, supported dataset formats are listed below) and supports `dataset_id` and `dataset_path`. No need to modify the `dataset_info.json` file. This method is suitable for users who are new to ms-swift, while the following two methods are suitable for developers who want to extend ms-swift.\\n2. Adding datasets to `dataset_info.json` is more flexible but cumbersome compared to the first method, and supports using two preprocessors and specifying their parameters: `RenameColumnsPreprocessor`, `ConversationsPreprocessor` (default is to use `SmartPreprocessor`). You can directly modify the built-in `dataset_info.json` in Swift, or pass in an external json file using `--custom_dataset_info xxx.json` (for users who prefer pip install over git clone to expand datasets).\\n3. Registering datasets: More flexible but cumbersome compared to the first and second methods, it supports using functions to preprocess datasets. Methods 1 and 2 are implemented by leveraging method 3. You can directly modify the source code for expansion, or pass in a custom registration path using `--custom_register_path xxx.py`, where the script will parse the py file (for pip install users).\\n\\n### 📌 \\\\[Recommended\\\\] Using Command Line Arguments Directly\\n\\nSupports directly passing in custom `dataset_id` (compatible with MS and HF) and `dataset_path`, as well as simultaneously passing in multiple custom datasets and their respective sample sizes. The script will automatically preprocess and concatenate the datasets. If a `dataset_id` is passed in, it will default to using the 'default' subset in the dataset_id and set the split to 'train'. If the dataset_id has already been registered, it will use the subsets, split, and preprocessing functions that were passed in during registration. If a `dataset_path` is passed in, it can be specified as a relative path or an absolute path, where the relative path is relative to the current running directory.\\n\\nThe specified format for each dataset is as follows: `[HF or MS::]{dataset_name} or {dataset_id} or {dataset_path}[:subset1/subset2/...][#dataset_sample]`. The simplest case requires specifying only dataset_name, dataset_id, or dataset_path.\\n\\n```bash\\n# Defaulting to using the dataset_id from modelscope, while also supporting the dataset_id from huggingface.\\n--dataset {dataset_id} {dataset_path} HF::{dataset_id}\\n\\n# Dataset Mixing: the following command takes subset1 and subset2 from dataset_id and randomly samples 20,000 records. If `#{dataset_sample}` is not used, all samples from the dataset will be used.\\n--dataset {dataset_name}#20000 {dataset_id}:{subset1}/{subset2}#20000 {dataset_path}#10000\\n```\\n\\nThe supported file formats for the script include `csv`, `json`, and `jsonl`. You need to ensure that the incoming file conforms to the following dataset formats (only a partial list is provided). All of these formats support the `system` field (it is important to note that if the `system` field is specified in the csv format, it cannot be set to `None` and can only be specified as an empty string. There is no such restriction for the json and jsonl formats). Files in `json` and `jsonl` formats support multi-turn dialogue (`csv` does not support this).\\n\\n\\n**Format 1:**\\n\\nPre-Training\\n\\n```csv\\nresponse\\n11111\\naaaaa\\nAAAAA\\n```\\n\\n```jsonl\\n{\\\"response\\\": \\\"11111\\\"}\\n{\\\"response\\\": \\\"aaaaa\\\"}\\n{\\\"response\\\": \\\"AAAAA\\\"}\\n```\\n\\nSingle-Round Dialogue\\n\\n```csv\\nsystem,query,response\\n00000,11111,22222\\n00001,aaaaa,bbbbb\\n00002,AAAAA,BBBBB\\n```\\n\\n```jsonl\\n{\\\"system\\\": \\\"00000\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\"}\\n{\\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\"}\\n{\\\"system\\\": \\\"00001\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\"}\\n```\\n\\nMulti-Round Dialogue\\n\\n```jsonl\\n{\\\"system\\\": \\\"00000\\\", \\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\"}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": []}\\n{\\\"system\\\": \\\"00001\\\", \\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\n```json\\n[{\\\"system\\\": \\\"00000\\\", \\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\"},\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": []},\\n{\\\"system\\\": \\\"00001\\\", \\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}]\\n```\\n\\n**Format 2:**\\n\\n```jsonl\\n{\\\"conversations\\\": [{\\\"from\\\": \\\"system\\\", \\\"value\\\": \\\"00000\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"11111\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}]}\\n{\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"aaaaa\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"ccccc\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}]}\\n{\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}]}\\n```\\n\\n**Format 3:**\\n\\n```jsonl\\n{\\\"messages\\\": [{\\\"role\\\": \\\"system\\\", \\\"content\\\": \\\"00000\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"11111\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"22222\\\"}]}\\n{\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"aaaaa\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"bbbbb\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"ccccc\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"ddddd\\\"}]}\\n{\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"AAAAA\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"BBBBB\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"CCCCC\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"DDDDD\\\"}]}\\n```\\n\\n**Format 4:**\\n\\n```jsonl\\n{\\\"system\\\": \\\"00000\\\", \\\"conversation\\\": [{\\\"human\\\": \\\"11111\\\", \\\"assistant\\\": \\\"22222\\\"}]}\\n{\\\"conversation\\\": [{\\\"human\\\": \\\"aaaaa\\\", \\\"assistant\\\": \\\"bbbbb\\\"}]}\\n{\\\"system\\\": \\\"00001\\\", \\\"conversation\\\": [{\\\"human\\\": \\\"AAAAA\\\", \\\"assistant\\\": \\\"BBBBB\\\"}, {\\\"human\\\": \\\"CCCCC\\\", \\\"assistant\\\": \\\"DDDDD\\\"}, {\\\"human\\\": \\\"EEEEE\\\", \\\"assistant\\\": \\\"FFFFF\\\"}]}\\n```\\n\\n**Format 5:**\\n\\n```csv\\nsystem,instruction,input,output\\n00000,11111,22222,33333\\n00001,aaaaa,bbbbb,ccccc\\n00002,AAAAA,BBBBB,CCCCC\\n```\\n\\n**Extra pre-training format:**\\n```jsonl\\n{\\\"text\\\": \\\"11111\\\"}\\n{\\\"text\\\": \\\"aaaaa\\\"}\\n{\\\"text\\\": \\\"AAAAA\\\"}\\n```\\n\\n\\n**Human preference alignment:**\\n\\nLanguage model (DPO/ORPO/SimPO/CPO)\\n```jsonl\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"rejected_response\\\": \\\"33333\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"rejected_response\\\": \\\"ccccc\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"rejected_response\\\": \\\"CCCCC\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n- system and history are optional.\\n\\nLanguage model (KTO)\\n```jsonl\\n{\\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"label\\\": true}\\n{\\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"label\\\": false}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"label\\\": true, \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\nNote:  `label` needs to be of type bool, not str.\\n\\n- system and history are optional.\\n\\n\\nVision MLLM (DPO/ORPO/SimPO/CPO)\\n\\n```jsonl\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"rejected_response\\\": \\\"33333\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"rejected_response\\\": \\\"ccccc\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"rejected_response\\\": \\\"CCCCC\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\n- different models have varying support for the number of images. Please refer to the corresponding best practices document for each model.\\n\\n- system and history are optional.\\n\\n\\n**Tool-Calling Agent**\\n\\nFormat 1\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"system\\\", \\\"value\\\": \\\"00000\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"11111\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"aaaaa\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"ccccc\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"CCCCC\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}]}\\n```\\n\\nFormat 2\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"system\\\", \\\"content\\\": \\\"00000\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"11111\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"aaaaa\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"bbbbb\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"ccccc\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"AAAAA\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"BBBBB\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"CCCCC\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"DDDDD\\\"}]}\\n```\\nFor the tools format, please refer to [Agent-Deoloyment Document](../LLM/Agent-deployment-best-practice.md) You can choose the corresponding prompt by setting `--tools_prompt`.\\n\\nThe `tool` field represents the return result of the tool calling.\\n\\n### Adding dataset_info.json\\n\\nYou can refer to the [builtin dataset_info.json in Swift](https://github.com/modelscope/swift/blob/main/swift/llm/data/dataset_info.json) to expand datasets. You can directly add it in the built-in dataset_info.json, or you can pass in the path to an external dataset_info.json, a JSON string, or a dictionary using `--custom_dataset_info 1.json`.\\n\\nAdding dataset_id:\\n\\n```python\\n# MS\\n# Usage: `--dataset <dataset_name>`\\n\\\"<dataset_name>\\\": {\\n    \\\"dataset_id\\\": \\\"xxx/xxx\\\"\\n}\\n\\n# HF\\n# Usage: `--dataset HF::<dataset_name>` or directly use the `USE_HF` environment variable.\\n\\\"<dataset_name>\\\": {\\n    \\\"hf_dataset_id\\\": \\\"xxx/xxx\\\"\\n}\\n```\\n\\nAdding dataset\\\\_path:\\n```python\\n# You can specify relative and absolute paths. Relative paths are relative to the directory where dataset_info.json is located.\\n# Usage: `--dataset <dataset_name>`\\n\\\"<dataset_name>\\\": {\\n    \\\"dataset_path\\\": \\\"xxx\\\"\\n}\\n```\\n\\nSupported parameters include:\\n\\n- dataset_id: The corresponding ModelScope dataset_id, default is `None`. The simplest setup requires specifying one of `dataset_id`, `hf_dataset_id`, or `dataset_path`.\\n- subsets: A list of names of the subsets, default is `[]`, which means using the 'default' subset.\\n- split: Default is ['train'], usually not necessary to set.\\n- hf_dataset_id: The corresponding HuggingFace dataset_id, default is `None`.\\n- dataset_path: Used to specify the local path of the dataset, e.g. 1.jsonl, default is `None`. It can take relative or absolute paths. If using a relative path, it is relative to the directory where the dataset_info.json is located. If dataset_path is set, then dataset_id, subsets, and hf_dataset_id parameters are ignored.\\n- columns: The default preprocessor used is `SmartPreprocessor`. Specifying this parameter sets it to `RenameColumnsPreprocessor`. You need to rename the columns in the dataset and convert them to the style of **format 1** mentioned above.\\n- conversations: Specifying this parameter sets the preprocessor to `ConversationsPreprocessor` ('columns' takes priority over 'conversations').\\n- remove_useless_columns: Specifies whether to remove unnecessary columns (including: 'query', 'response', 'rejected_response', 'system', 'history', 'images'), default is `True`, usually not necessary to set.\\n- tags: Used to annotate the dataset, default is `[]`, usually not necessary to set.\\n\\nIf the parameters in `dataset_info.json` are not sufficient for your needs, such as adding custom prompts, requiring advanced dataset cleaning, or complex dataset retrieval and preprocessing, you can use the method of registering datasets using functions for data retrieval and preprocessing.\\n\\n### Registering Datasets\\n\\nThe following is an example of **registering datasets**. The complete py file can be viewed at [custom.py](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/custom.py), and the sh script can be viewed at [custom](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/custom). You can parse the registered content by specifying `--custom_register_path xxx.py`.\\n\\n```python\\nfrom typing import Optional, Tuple\\n\\nfrom datasets import Dataset as HfDataset\\nfrom modelscope import MsDataset\\n\\nfrom swift.llm import get_dataset, register_dataset, get_dataset_from_repo\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass CustomDatasetName:\\n    stsb_en = 'stsb-en'\\n\\ndef _preprocess_stsb(dataset: HfDataset) -> HfDataset:\\n    prompt = \\\"\\\"\\\"Task: Based on the given two sentences, provide a similarity score between 0.0 and 5.0.\\nSentence 1: {text1}\\nSentence 2: {text2}\\nSimilarity score: \\\"\\\"\\\"\\n    query = []\\n    response = []\\n    for d in dataset:\\n        query.append(prompt.format(text1=d['text1'], text2=d['text2']))\\n        response.append(f\\\"{d['label']:.1f}\\\")\\n    return HfDataset.from_dict({'query': query, 'response': response})\\n\\n\\nregister_dataset(CustomDatasetName.stsb_en, 'swift/stsb', None, _preprocess_stsb, get_dataset_from_repo)\\n\\n\\nif __name__ == '__main__':\\n    # test dataset\\n    train_dataset, val_dataset = get_dataset([CustomDatasetName.stsb_en],\\n                                             check_dataset_strategy='warning')\\n    print(f'train_dataset: {train_dataset}')\\n    print(f'val_dataset: {val_dataset}')\\n\\n```\\n\\nThe `register_dataset` function will register the dataset in the `DATASET_MAPPING`. The parameters of this function are as follows:\\n\\n- `dataset_name`: Required, representing the name of the dataset, which is also the unique ID of the dataset.\\n- `dataset_id_or_path`: Required, representing the `dataset_id` on the ModelScope Hub or the local `dataset_dir`.\\n- `subsets`: List of subsets of the dataset, default is `[]`.\\n- `split`: Default is ['train'].\\n- `preprocess_func`: Preprocessing function.\\n- `get_function`: Default value is `None`. The function to get the dataset. If passed `None`, the decorator approach will be used to register the dataset. If passed a function, the normal approach will be used to register.\\n   > `get_function` should return `HfDataset` or `Tuple[HfDataset, Optional[HfDataset]]`. If only one dataset is returned, it will be the train_dataset. If two datasets are returned, they will be the train_dataset and val_dataset, respectively. The `get_dataset` function supports obtaining multiple datasets, for example: `get_dataset(['dataset1', 'dataset2'])`. We will concatenate the training and validation parts of each subset and return the merged train_dataset and val_dataset.\\n\\n   > The `HfDataset` returned by the function needs to follow certain specifications. If you want to do **pre-training**, you only need to include the `response` field, please refer to the `'tigerbot-law-zh'` dataset for details. For **instruction tuning (single-round dialogue)**, the `query` and `response` fields need to be included, representing the user's query and the AI assistant's answer in instruction tuning respectively, please refer to the `'alpaca-zh'` dataset for details. For **multi-round dialogue**, an additional `history` field needs to be added, representing the historical information of the dialogue, please refer to the `'damo-agent-mini-zh'` dataset for details. If each dataset sample has a different `system`, an additional system field needs to be added, you can also refer to the `'damo-agent-mini-zh'` dataset for details.\\n\\n- `**kwargs`: Other parameters used to annotate the dataset. This parameter generally does not need to be set.\\n\\n## Custom Models\\nThe following is an example of **custom models**. The complete py file can be viewed at [custom.py](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/custom.py), and the sh script can be viewed at [custom](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/custom). You can parse the registered content by specifying `--custom_register_path xxx.py`.\\n\\n```python\\nfrom typing import Any, Dict\\nimport torch\\n\\nfrom transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer\\n\\nfrom transformers.utils.versions import require_version\\n\\nfrom swift.llm import LoRATM, TemplateType, get_model_tokenizer, register_model\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass CustomModelType:\\n    tigerbot_7b = 'tigerbot-7b'\\n    tigerbot_13b = 'tigerbot-13b'\\n    tigerbot_13b_chat = 'tigerbot-13b-chat'\\n\\n\\nclass CustomTemplateType:\\n    tigerbot = 'tigerbot'\\n\\n\\n@register_model(CustomModelType.tigerbot_7b,\\n                'TigerResearch/tigerbot-7b-base-v3', LoRATM.llama,\\n                TemplateType.default_generation)\\n@register_model(CustomModelType.tigerbot_13b,\\n                'TigerResearch/tigerbot-13b-base-v2', LoRATM.llama,\\n                TemplateType.default_generation)\\n@register_model(CustomModelType.tigerbot_13b_chat,\\n                'TigerResearch/tigerbot-13b-chat-v4', LoRATM.llama,\\n                CustomTemplateType.tigerbot)\\ndef get_tigerbot_model_tokenizer(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 **kwargs):\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if use_flash_attn:\\n        require_version('transformers>=4.34')\\n        logger.info('Setting use_flash_attention_2: True')\\n        model_kwargs['use_flash_attention_2'] = True\\n    model_config = AutoConfig.from_pretrained(\\n        model_dir, trust_remote_code=True)\\n    model_config.pretraining_tp = 1\\n    model_config.torch_dtype = torch_dtype\\n    logger.info(f'model_config: {model_config}')\\n    tokenizer = AutoTokenizer.from_pretrained(\\n        model_dir, trust_remote_code=True)\\n    model = None\\n    if load_model:\\n        model = AutoModelForCausalLM.from_pretrained(\\n            model_dir,\\n            config=model_config,\\n            torch_dtype=torch_dtype,\\n            trust_remote_code=True,\\n            **model_kwargs)\\n    return model, tokenizer\\n\\n\\nif __name__ == '__main__':\\n    # test model base\\n    model, tokenizer = get_model_tokenizer(\\n        CustomModelType.tigerbot_7b, use_flash_attn=False)\\n    print(model.__class__.__name__)\\n    # test model chat\\n    model, tokenizer = get_model_tokenizer(\\n        CustomModelType.tigerbot_13b_chat, use_flash_attn=False)\\n    print(model.__class__.__name__)\\n```\\n\\n`register_model` will register the model in `MODEL_MAPPING`. The meaning of the parameters of this function are as follows:\\n\\n- `model_type`: Required field. Represents the name of the model, and is also the unique id.\\n- `model_id_or_path`: Required field. Represents the `model_id` of the model in ModelScope Hub, or the local model directory `model_dir`.\\n- `lora_target_modules`: Default is `None`. Represents the default lora_target_modules to use when `--lora_target_modules DEFAULT` or `--lora_target_modules AUTO` is specified in the sh script, or when `--lora_target_modules` is not specified.\\n- `template`: Default is `TemplateType.default`. Represents the default dialogue template to use when `--template_type AUTO` is specified in the sh script, or when `--template_type` is not specified.\\n- `get_function`: Default value is `None`. The function to get model and tokenizer. If passed `None`, the decorator approach will be used to register the model. If passed a function, the normal approach will be used to register.\\n- `requires`: Default is `[]`. Represents the dependencies required by the model that differ from other models. This parameter generally does not need to be set.\\n- `torch_dtype`: Default is `None`. Represents the recommended torch_dtype for the model to use. This parameter generally does not need to be set.\\n- `revision`: Default is `None`. Used to specify the version number of the model. If `model_id_or_path` is a local model directory, this parameter is not effective. This parameter generally does not need to be set.\\n- `ignore_file_pattern`: Default is `None`. Represents the regular pattern of file names to be ignored when downloading, this parameter will be passed to `snapshot_download`. For example, `r'.+\\\\.bin$'`, `r'.+\\\\.savetensors$'`, etc. This parameter generally does not need to be set.\\n- `**kwargs`: Other parameters used to annotate model capabilities. This parameter generally does not need to be set.\\n\\n## Custom Dialogue Templates\\nThe following is an example of **custom models**. The complete py file can be viewed at [custom.py](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/custom.py), and the sh script can be viewed at [custom](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/custom).\\n\\n```python\\nfrom swift.llm import (Template, ModelType, dataset_map,\\n                       get_model_tokenizer, get_template, get_dataset,\\n                       print_example, register_template, DatasetName)\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass CustomTemplateType:\\n    tigerbot = 'tigerbot'\\n\\n\\n# Ref: https://github.com/TigerResearch/TigerBot/blob/main/infer.py\\nregister_template(\\n    CustomTemplateType.tigerbot,\\n    Template(['{{SYSTEM}}'], ['\\\\n\\\\n### Instruction:\\\\n{{QUERY}}\\\\n\\\\n### Response:\\\\n'], [],\\n             [['eos_token_id']]))\\n\\nif __name__ == '__main__':\\n    # test template\\n    train_dataset, _ = get_dataset(DatasetName.blossom_math_zh)\\n    _, tokenizer = get_model_tokenizer(ModelType.qwen_7b_chat, load_model=False)\\n    template = get_template(CustomTemplateType.tigerbot, tokenizer)\\n    train_dataset = dataset_map(train_dataset, template.encode)\\n    print_example(train_dataset[0], tokenizer)\\n```\\n\\n`register_template` will register the dialogue template in `TEMPLATE_MAPPING`. The meaning of the parameters of this function are as follows:\\n\\n- `template_type`: Required field, represents the name of the dialogue template, and is also the unique id of the template.\\n- `template`: Required field, needs to pass in a `Template`. To initialize `Template`, the following parameters need to be passed in: `prefix`, `prompt`, `chat_sep`, `suffix`, `default_system`.\\n\\nThe template initialization function will obtain the complete chat template based on these four contents. The meaning of these four configuration contents are as follows.\\n\\n- `prefix`: Represents the prefix part of the dialogue template, generally including system part, prefix tokens, bos tokens, etc. We use `{{SYSTEM}}` as the placeholder for the system. If `{{SYSTEM}}` does not exist in the prefix, then this Template does not support system, e.g. `damo-agent-mini-zh` dataset.\\n- `prompt`: Represents a round of dialogue in the dialogue template. We use `{{QUERY}}` as the placeholder for the human query part in each round of dialogue, `{{ROUND0}}` represents the placeholder for which round of dialogue this is, starting from 0, and `{{ROUND1}}` starts from 1. The AI assistant's reply part will be concatenated after `prompt`, so we have not designed a placeholder for it. We will only calculate the loss for the AI assistant's reply part.\\n- `chat_sep`: If multi-round dialogue is needed, `chat_sep` will be used as the separator between each round of dialogue, such as: newline, etc. If set to None, then this Template does not support multi-round dialogue.\\n- `suffix`: Used as the suffix part of the dialogue template, generally eos token. Will be concatenated after the last round of dialogue.\\n- `default_system`: The default system.\\n\\n\\n# LLM Fine-tuning Documentation\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Fine-tuning](#fine-tuning)\\n- [DPO](#dpo)\\n- [Merge LoRA](#merge-lora)\\n- [Quantization](#quantization)\\n- [Inference](#inference)\\n- [Web-UI](#web-ui)\\n\\n## Environment Preparation\\nGPU devices: A10, 3090, V100, A100 are all suitable.\\n```bash\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# If you want to use deepspeed.\\npip install deepspeed -U\\n\\n# If you want to use qlora training based on auto_gptq. (Recommended, better than bnb)\\n# Models supporting auto_gptq: `https://github.com/modelscope/swift/blob/main/docs/source/Instruction/supported-models-and-datasets.md#models`\\n# auto_gptq and cuda versions are related, please choose the version according to `https://github.com/PanQiWei/AutoGPTQ#quick-installation`\\npip install auto_gptq -U\\n\\n# If you want to use bnb-based qlora training.\\npip install bitsandbytes -U\\n\\n# Align environment (usually not necessary to run. If you encounter errors, you can run the following code, the repository is tested with the latest environment)\\npip install -r requirements/framework.txt -U\\npip install -r requirements/llm.txt -U\\n```\\n\\n## Fine-Tuning\\nIf you want to fine-tune and infer using the interface, you can check [Web-ui Documentation](../GetStarted/Web-ui.md).\\n\\n### Using Python\\n```python\\n# Experimental environment: A10, 3090, V100, ...\\n# 20GB GPU memory\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nimport torch\\n\\nfrom swift.llm import (\\n    DatasetName, InferArguments, ModelType, SftArguments,\\n    infer_main, sft_main, app_ui_main\\n)\\n\\nmodel_type = ModelType.qwen_7b_chat\\nsft_args = SftArguments(\\n    model_type=model_type,\\n    dataset=[f'{DatasetName.blossom_math_zh}#2000'],\\n    output_dir='output')\\nresult = sft_main(sft_args)\\nlast_model_checkpoint = result['last_model_checkpoint']\\nprint(f'last_model_checkpoint: {last_model_checkpoint}')\\ntorch.cuda.empty_cache()\\n\\ninfer_args = InferArguments(\\n    ckpt_dir=last_model_checkpoint,\\n    load_dataset_config=True)\\n# merge_lora(infer_args, device_map='cpu')\\nresult = infer_main(infer_args)\\ntorch.cuda.empty_cache()\\n\\napp_ui_main(infer_args)\\n```\\n\\n### Using CLI\\n```bash\\n# Experimental environment: A10, 3090, V100, ...\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n\\n# Using your own dataset\\n# custom dataset format: https://github.com/modelscope/swift/blob/main/docs/source_en/Instruction/Customization.md#custom-datasets\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset chatml.jsonl \\\\\\n    --output_dir output \\\\\\n\\n# Using DDP\\n# Experimental environment: 2 * 3090\\n# 2 * 23GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nNPROC_PER_NODE=2 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n\\n# Multi-machine multi-card\\n# If the disk is not shared, please additionally specify `--save_on_each_node true` in the shell scripts on each machine.\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n```\\n\\n### More sh Scripts\\n\\nMore sh scripts can be viewed [here](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts)\\n\\n```bash\\n# Scripts need to be executed in this directory\\ncd examples/pytorch/llm\\n```\\n\\n**Tips**:\\n\\n- We default to setting `--gradient_checkpointing true` during training to **save memory**, which may slightly reduce training speed.\\n- If you want to use quantization parameters `--quantization_bit 4`, you need to first install [bnb](https://github.com/TimDettmers/bitsandbytes): `pip install bitsandbytes -U`. This will reduce memory usage but usually slows down the training speed.\\n- If you want to use quantization based on **auto_gptq**, you need to install the corresponding cuda version of [auto_gptq](https://github.com/PanQiWei/AutoGPTQ): `pip install auto_gptq -U`.\\n  > Models that can use auto_gptq can be viewed in [LLM Supported Models](Supported-models-datasets.md#models). It is recommended to use auto_gptq instead of bnb.\\n- If you want to use deepspeed, you need `pip install deepspeed -U`. Using deepspeed can **save memory**, but may slightly reduce training speed.\\n- If your training involves **knowledge editing**, such as: [Self-aware Fine-tuning](../LLM/Self-cognition-best-practice.md), you need to add LoRA to MLP as well, otherwise, the results might be poor. You can simply pass the argument `--lora_target_modules ALL` to add lora to all linear(qkvo, mlp), **this is usually the best result**.\\n- If you are using older GPUs like **V100**, you need to set `--dtype AUTO` or `--dtype fp16`, as they do not support bf16.\\n- If your machine has high-performance graphics cards like A100 and the model supports flash-attn, it is recommended to install [**flash-attn**](https://github.com/Dao-AILab/flash-attention), which will speed up training and inference as well as reduce memory usage (A10, 3090, V100, etc. graphics cards do not support training with flash-attn). Models that support flash-attn can be viewed in [LLM Supported Models](Supported-models-datasets.md#models)\\n- If you are doing **second pre-training** or **multi-turn dialogue**, you can refer to [Customization and Extension](Customization.md#Registering-Datasets)\\n- If you need to train **offline**, please use `--model_id_or_path <model_dir>` and set `--check_model_is_latest false`. For specific parameter meanings, please check [Command-line Parameters](Command-line-parameters.md).\\n- If you want to push weights to the ModelScope Hub during training, you need to set `--push_to_hub true`.\\n- If you want to merge LoRA weights and save them during inference, you need to set `--merge_lora true`. **It is not recommended to merge** for models trained with qlora, as this will result in precision loss. Therefore **it is not recommended to fine-tune** with qlora, as the deployment ecology is not good.\\n\\n\\n**Note**:\\n\\n- Due to the legacy name issue, scripts ending with `xxx_ds` mean: training using deepspeed zero2. (e.g. `full_ddp_ds`).\\n- In addition to the scripts listed below, other scripts may not be maintained.\\n\\n\\nIf you want to **customize scripts**, you can refer to the following scripts for modification: (The following scripts will be **regularly maintained**)\\n\\n- full: [qwen1half-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat/full) (A100), [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_mp) (2*A100)\\n- full+ddp+zero2: [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_ddp_zero2) (4*A100)\\n- full+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/full_ddp_zero3) (4*A100)\\n- lora: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora) (3090), [baichuan2-13b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/baichuan2_13b_chat/lora_mp) (2*3090), [yi-34b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b_chat/lora) (A100), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_mp) (2*A100)\\n- lora+ddp: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora_ddp) (2*3090)\\n- lora+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/lora_ddp_zero3) (4*3090), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_ddp_zero3) (4*A100)\\n- qlora(gptq-int4): [qwen-7b-chat-int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat_int4/qlora) (3090)\\n- qlora(gptq-int8): [qwen1half-7b-chat-int8](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat_int8/qlora) (3090)\\n- qlora(bnb-int4): [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/qlora) (3090)\\n\\n## DPO\\nIf you want to use DPO for human-aligned fine-tuning, you can check the [DPO Fine-Tuning Documentation](../LLM/DPO.md).\\n\\n## ORPO\\nIf you want to use ORPO for human-aligned fine-tuning, you can check the [ORPO Fine-Tuning Documentation](../LLM/ORPO.md).\\n\\n## Merge LoRA\\nTip: **Currently**, merging LoRA is not supported for bnb and auto_gptq quantized models, as this would result in significant accuracy loss.\\n```bash\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n```\\n\\n## Quantization\\n\\nFor quantization of the fine-tuned model, you can check [LLM Quantization Documentation](LLM-quantization-and-export.md#fine-tuned-model)\\n\\n## Inference\\nIf you want to use VLLM for accelerated inference, you can check [VLLM Inference Acceleration and Deployment](../LLM/VLLM-inference-acceleration-and-deployment.md)\\n\\n### Original Model\\n**Single sample inference** can be checked in [LLM Inference Documentation](LLM-inference.md)\\n\\nUsing **Dataset** for evaluation:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_id_or_path qwen/Qwen-7B-Chat --dataset AI-ModelScope/blossom-math-v2\\n```\\n### Fine-tuned Model\\n**Single sample inference**:\\n\\nInference using LoRA **incremental** weights:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type\\n)\\nfrom swift.tuners import Swift\\n\\nckpt_dir = 'vx-xxx/checkpoint-100'\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'})\\n\\nmodel = Swift.from_pretrained(model, ckpt_dir, inference_mode=True)\\ntemplate = get_template(template_type, tokenizer)\\nquery = 'xxxxxx'\\nresponse, history = inference(model, template, query)\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n```\\n\\nInference using LoRA **merged** weights:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type\\n)\\n\\nckpt_dir = 'vx-xxx/checkpoint-100-merged'\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'},\\n                                       model_id_or_path=ckpt_dir)\\n\\ntemplate = get_template(template_type, tokenizer)\\nquery = 'xxxxxx'\\nresponse, history = inference(model, template, query)\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n```\\n\\nUsing **Dataset** for evaluation:\\n```bash\\n# Direct inference\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' \\\\\\n    --load_dataset_config true \\\\\\n\\n# If you need to replace the val_dataset\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --val_dataset <your-val-dataset>\\n\\n# Merge LoRA incremental weights and infer\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' --load_dataset_config true\\n```\\n\\n**Manual** evaluation:\\n```bash\\n# Direct inference\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx'\\n\\n# Merge LoRA incremental weights and infer\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n## Web-UI\\nIf you want to deploy VLLM and provide **API** interface, you can check [VLLM Inference Acceleration and Deployment](../LLM/VLLM-inference-acceleration-and-deployment.md)\\n\\n### Original Model\\nUsing the original model's web-ui can be viewed in [LLM Inference Documentation](LLM-inference.md#Web-UI)\\n\\n### Fine-tuned Model\\n```bash\\n# Directly use app-ui\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx'\\n\\n# Merge LoRA incremental weights and use app-ui\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n\\n# Supported models and datasets\\n## Table of Contents\\n- [Models](#Models)\\n  - [LLM](#LLM)\\n  - [MLLM](#MLLM)\\n- [Datasets](#Datasets)\\n\\n## Models\\nThe table below introcudes all models supported by SWIFT:\\n- Model List: The model_type information registered in SWIFT.\\n- Default Lora Target Modules: Default lora_target_modules used by the model.\\n- Default Template: Default template used by the model.\\n- Support Flash Attn: Whether the model supports [flash attention](https://github.com/Dao-AILab/flash-attention) to accelerate sft and infer.\\n- Support VLLM: Whether the model supports [vllm](https://github.com/vllm-project/vllm) to accelerate infer and deployment.\\n- Requires: The extra requirements used by the model.\\n\\n\\n### LLM\\n| Model Type | Model ID | Default Lora Target Modules | Default Template | Support Flash Attn | Support vLLM | Support LMDeploy | Support Megatron | Requires | Tags | HF Model ID |\\n| ---------  | -------- | --------------------------- | ---------------- | ------------------ | ------------ | ---------------- | ---------------- | -------- | ---- | ----------- |\\n|qwen-1_8b|[qwen/Qwen-1_8B](https://modelscope.cn/models/qwen/Qwen-1_8B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-1_8B](https://huggingface.co/Qwen/Qwen-1_8B)|\\n|qwen-1_8b-chat|[qwen/Qwen-1_8B-Chat](https://modelscope.cn/models/qwen/Qwen-1_8B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-1_8B-Chat](https://huggingface.co/Qwen/Qwen-1_8B-Chat)|\\n|qwen-1_8b-chat-int4|[qwen/Qwen-1_8B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-1_8B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-1_8B-Chat-Int4](https://huggingface.co/Qwen/Qwen-1_8B-Chat-Int4)|\\n|qwen-1_8b-chat-int8|[qwen/Qwen-1_8B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-1_8B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-1_8B-Chat-Int8](https://huggingface.co/Qwen/Qwen-1_8B-Chat-Int8)|\\n|qwen-7b|[qwen/Qwen-7B](https://modelscope.cn/models/qwen/Qwen-7B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-7B](https://huggingface.co/Qwen/Qwen-7B)|\\n|qwen-7b-chat|[qwen/Qwen-7B-Chat](https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-7B-Chat](https://huggingface.co/Qwen/Qwen-7B-Chat)|\\n|qwen-7b-chat-int4|[qwen/Qwen-7B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-7B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-7B-Chat-Int4](https://huggingface.co/Qwen/Qwen-7B-Chat-Int4)|\\n|qwen-7b-chat-int8|[qwen/Qwen-7B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-7B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-7B-Chat-Int8](https://huggingface.co/Qwen/Qwen-7B-Chat-Int8)|\\n|qwen-14b|[qwen/Qwen-14B](https://modelscope.cn/models/qwen/Qwen-14B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-14B](https://huggingface.co/Qwen/Qwen-14B)|\\n|qwen-14b-chat|[qwen/Qwen-14B-Chat](https://modelscope.cn/models/qwen/Qwen-14B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-14B-Chat](https://huggingface.co/Qwen/Qwen-14B-Chat)|\\n|qwen-14b-chat-int4|[qwen/Qwen-14B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-14B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-14B-Chat-Int4](https://huggingface.co/Qwen/Qwen-14B-Chat-Int4)|\\n|qwen-14b-chat-int8|[qwen/Qwen-14B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-14B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-14B-Chat-Int8](https://huggingface.co/Qwen/Qwen-14B-Chat-Int8)|\\n|qwen-72b|[qwen/Qwen-72B](https://modelscope.cn/models/qwen/Qwen-72B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-72B](https://huggingface.co/Qwen/Qwen-72B)|\\n|qwen-72b-chat|[qwen/Qwen-72B-Chat](https://modelscope.cn/models/qwen/Qwen-72B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-72B-Chat](https://huggingface.co/Qwen/Qwen-72B-Chat)|\\n|qwen-72b-chat-int4|[qwen/Qwen-72B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-72B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-72B-Chat-Int4](https://huggingface.co/Qwen/Qwen-72B-Chat-Int4)|\\n|qwen-72b-chat-int8|[qwen/Qwen-72B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-72B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-72B-Chat-Int8](https://huggingface.co/Qwen/Qwen-72B-Chat-Int8)|\\n|modelscope-agent-7b|[iic/ModelScope-Agent-7B](https://modelscope.cn/models/iic/ModelScope-Agent-7B/summary)|c_attn|modelscope-agent|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|-|\\n|modelscope-agent-14b|[iic/ModelScope-Agent-14B](https://modelscope.cn/models/iic/ModelScope-Agent-14B/summary)|c_attn|modelscope-agent|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|-|\\n|qwen1half-0_5b|[qwen/Qwen1.5-0.5B](https://modelscope.cn/models/qwen/Qwen1.5-0.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-0.5B](https://huggingface.co/Qwen/Qwen1.5-0.5B)|\\n|qwen1half-1_8b|[qwen/Qwen1.5-1.8B](https://modelscope.cn/models/qwen/Qwen1.5-1.8B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-1.8B](https://huggingface.co/Qwen/Qwen1.5-1.8B)|\\n|qwen1half-4b|[qwen/Qwen1.5-4B](https://modelscope.cn/models/qwen/Qwen1.5-4B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-4B](https://huggingface.co/Qwen/Qwen1.5-4B)|\\n|qwen1half-7b|[qwen/Qwen1.5-7B](https://modelscope.cn/models/qwen/Qwen1.5-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-7B](https://huggingface.co/Qwen/Qwen1.5-7B)|\\n|qwen1half-14b|[qwen/Qwen1.5-14B](https://modelscope.cn/models/qwen/Qwen1.5-14B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-14B](https://huggingface.co/Qwen/Qwen1.5-14B)|\\n|qwen1half-32b|[qwen/Qwen1.5-32B](https://modelscope.cn/models/qwen/Qwen1.5-32B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-32B](https://huggingface.co/Qwen/Qwen1.5-32B)|\\n|qwen1half-72b|[qwen/Qwen1.5-72B](https://modelscope.cn/models/qwen/Qwen1.5-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-72B](https://huggingface.co/Qwen/Qwen1.5-72B)|\\n|qwen1half-110b|[qwen/Qwen1.5-110B](https://modelscope.cn/models/qwen/Qwen1.5-110B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-110B](https://huggingface.co/Qwen/Qwen1.5-110B)|\\n|codeqwen1half-7b|[qwen/CodeQwen1.5-7B](https://modelscope.cn/models/qwen/CodeQwen1.5-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/CodeQwen1.5-7B](https://huggingface.co/Qwen/CodeQwen1.5-7B)|\\n|qwen1half-moe-a2_7b|[qwen/Qwen1.5-MoE-A2.7B](https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen1.5-MoE-A2.7B](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B)|\\n|qwen1half-0_5b-chat|[qwen/Qwen1.5-0.5B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-0.5B-Chat](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat)|\\n|qwen1half-1_8b-chat|[qwen/Qwen1.5-1.8B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-1.8B-Chat](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat)|\\n|qwen1half-4b-chat|[qwen/Qwen1.5-4B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-4B-Chat](https://huggingface.co/Qwen/Qwen1.5-4B-Chat)|\\n|qwen1half-7b-chat|[qwen/Qwen1.5-7B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-7B-Chat](https://huggingface.co/Qwen/Qwen1.5-7B-Chat)|\\n|qwen1half-14b-chat|[qwen/Qwen1.5-14B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-14B-Chat](https://huggingface.co/Qwen/Qwen1.5-14B-Chat)|\\n|qwen1half-32b-chat|[qwen/Qwen1.5-32B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-32B-Chat](https://huggingface.co/Qwen/Qwen1.5-32B-Chat)|\\n|qwen1half-72b-chat|[qwen/Qwen1.5-72B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-72B-Chat](https://huggingface.co/Qwen/Qwen1.5-72B-Chat)|\\n|qwen1half-110b-chat|[qwen/Qwen1.5-110B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-110B-Chat](https://huggingface.co/Qwen/Qwen1.5-110B-Chat)|\\n|qwen1half-moe-a2_7b-chat|[qwen/Qwen1.5-MoE-A2.7B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen1.5-MoE-A2.7B-Chat](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat)|\\n|codeqwen1half-7b-chat|[qwen/CodeQwen1.5-7B-Chat](https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/CodeQwen1.5-7B-Chat](https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat)|\\n|qwen1half-0_5b-chat-int4|[qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4)|\\n|qwen1half-1_8b-chat-int4|[qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4)|\\n|qwen1half-4b-chat-int4|[qwen/Qwen1.5-4B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-4B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-4B-Chat-GPTQ-Int4)|\\n|qwen1half-7b-chat-int4|[qwen/Qwen1.5-7B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-7B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GPTQ-Int4)|\\n|qwen1half-14b-chat-int4|[qwen/Qwen1.5-14B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-14B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-14B-Chat-GPTQ-Int4)|\\n|qwen1half-32b-chat-int4|[qwen/Qwen1.5-32B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-32B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-32B-Chat-GPTQ-Int4)|\\n|qwen1half-72b-chat-int4|[qwen/Qwen1.5-72B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-72B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-72B-Chat-GPTQ-Int4)|\\n|qwen1half-110b-chat-int4|[qwen/Qwen1.5-110B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-110B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-110B-Chat-GPTQ-Int4)|\\n|qwen1half-0_5b-chat-int8|[qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8)|\\n|qwen1half-1_8b-chat-int8|[qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8)|\\n|qwen1half-4b-chat-int8|[qwen/Qwen1.5-4B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-4B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-4B-Chat-GPTQ-Int8)|\\n|qwen1half-7b-chat-int8|[qwen/Qwen1.5-7B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-7B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GPTQ-Int8)|\\n|qwen1half-14b-chat-int8|[qwen/Qwen1.5-14B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-14B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-14B-Chat-GPTQ-Int8)|\\n|qwen1half-72b-chat-int8|[qwen/Qwen1.5-72B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-72B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-72B-Chat-GPTQ-Int8)|\\n|qwen1half-moe-a2_7b-chat-int4|[qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.40|moe|[Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4)|\\n|qwen1half-0_5b-chat-awq|[qwen/Qwen1.5-0.5B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-0.5B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-AWQ)|\\n|qwen1half-1_8b-chat-awq|[qwen/Qwen1.5-1.8B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-1.8B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-AWQ)|\\n|qwen1half-4b-chat-awq|[qwen/Qwen1.5-4B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-4B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-4B-Chat-AWQ)|\\n|qwen1half-7b-chat-awq|[qwen/Qwen1.5-7B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-7B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-7B-Chat-AWQ)|\\n|qwen1half-14b-chat-awq|[qwen/Qwen1.5-14B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-14B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-14B-Chat-AWQ)|\\n|qwen1half-32b-chat-awq|[qwen/Qwen1.5-32B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-32B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-32B-Chat-AWQ)|\\n|qwen1half-72b-chat-awq|[qwen/Qwen1.5-72B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-72B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-72B-Chat-AWQ)|\\n|qwen1half-110b-chat-awq|[qwen/Qwen1.5-110B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-110B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-110B-Chat-AWQ)|\\n|codeqwen1half-7b-chat-awq|[qwen/CodeQwen1.5-7B-Chat-AWQ](https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/CodeQwen1.5-7B-Chat-AWQ](https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat-AWQ)|\\n|qwen2-0_5b|[qwen/Qwen2-0.5B](https://modelscope.cn/models/qwen/Qwen2-0.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-0.5B](https://huggingface.co/Qwen/Qwen2-0.5B)|\\n|qwen2-0_5b-instruct|[qwen/Qwen2-0.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct)|\\n|qwen2-0_5b-instruct-int4|[qwen/Qwen2-0.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-0.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GPTQ-Int4)|\\n|qwen2-0_5b-instruct-int8|[qwen/Qwen2-0.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-0.5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GPTQ-Int8)|\\n|qwen2-0_5b-instruct-awq|[qwen/Qwen2-0.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-0.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-AWQ)|\\n|qwen2-1_5b|[qwen/Qwen2-1.5B](https://modelscope.cn/models/qwen/Qwen2-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-1.5B](https://huggingface.co/Qwen/Qwen2-1.5B)|\\n|qwen2-1_5b-instruct|[qwen/Qwen2-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2-1.5B-Instruct)|\\n|qwen2-1_5b-instruct-int4|[qwen/Qwen2-1.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-1.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-GPTQ-Int4)|\\n|qwen2-1_5b-instruct-int8|[qwen/Qwen2-1.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-1_5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-1_5B-Instruct-GPTQ-Int8)|\\n|qwen2-1_5b-instruct-awq|[qwen/Qwen2-1.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-1.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-AWQ)|\\n|qwen2-7b|[qwen/Qwen2-7B](https://modelscope.cn/models/qwen/Qwen2-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-7B](https://huggingface.co/Qwen/Qwen2-7B)|\\n|qwen2-7b-instruct|[qwen/Qwen2-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-7B-Instruct](https://huggingface.co/Qwen/Qwen2-7B-Instruct)|\\n|qwen2-7b-instruct-int4|[qwen/Qwen2-7B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-7B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-7B-Instruct-GPTQ-Int4)|\\n|qwen2-7b-instruct-int8|[qwen/Qwen2-7B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-7B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-7B-Instruct-GPTQ-Int8)|\\n|qwen2-7b-instruct-awq|[qwen/Qwen2-7B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-7B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-7B-Instruct-AWQ)|\\n|qwen2-72b|[qwen/Qwen2-72B](https://modelscope.cn/models/qwen/Qwen2-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-72B](https://huggingface.co/Qwen/Qwen2-72B)|\\n|qwen2-72b-instruct|[qwen/Qwen2-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-72B-Instruct](https://huggingface.co/Qwen/Qwen2-72B-Instruct)|\\n|qwen2-72b-instruct-int4|[qwen/Qwen2-72B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-72B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-72B-Instruct-GPTQ-Int4)|\\n|qwen2-72b-instruct-int8|[qwen/Qwen2-72B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-72B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-72B-Instruct-GPTQ-Int8)|\\n|qwen2-72b-instruct-awq|[qwen/Qwen2-72B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-72B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-72B-Instruct-AWQ)|\\n|qwen2-57b-a14b|[qwen/Qwen2-57B-A14B](https://modelscope.cn/models/qwen/Qwen2-57B-A14B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen2-57B-A14B](https://huggingface.co/Qwen/Qwen2-57B-A14B)|\\n|qwen2-57b-a14b-instruct|[qwen/Qwen2-57B-A14B-Instruct](https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen2-57B-A14B-Instruct](https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct)|\\n|qwen2-57b-a14b-instruct-int4|[qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.40|moe|[Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4)|\\n|qwen2-math-1_5b|[qwen/Qwen2-Math-1.5B](https://modelscope.cn/models/qwen/Qwen2-Math-1.5B/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-1.5B](https://huggingface.co/Qwen/Qwen2-Math-1.5B)|\\n|qwen2-math-1_5b-instruct|[qwen/Qwen2-Math-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Math-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2-Math-1.5B-Instruct)|\\n|qwen2-math-7b|[qwen/Qwen2-Math-7B](https://modelscope.cn/models/qwen/Qwen2-Math-7B/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-7B](https://huggingface.co/Qwen/Qwen2-Math-7B)|\\n|qwen2-math-7b-instruct|[qwen/Qwen2-Math-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Math-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-7B-Instruct](https://huggingface.co/Qwen/Qwen2-Math-7B-Instruct)|\\n|qwen2-math-72b|[qwen/Qwen2-Math-72B](https://modelscope.cn/models/qwen/Qwen2-Math-72B/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-72B](https://huggingface.co/Qwen/Qwen2-Math-72B)|\\n|qwen2-math-72b-instruct|[qwen/Qwen2-Math-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Math-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-72B-Instruct](https://huggingface.co/Qwen/Qwen2-Math-72B-Instruct)|\\n|qwen2_5-0_5b|[qwen/Qwen2.5-0.5B](https://modelscope.cn/models/qwen/Qwen2.5-0.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-0.5B](https://huggingface.co/Qwen/Qwen2.5-0.5B)|\\n|qwen2_5-1_5b|[qwen/Qwen2.5-1.5B](https://modelscope.cn/models/qwen/Qwen2.5-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-1.5B](https://huggingface.co/Qwen/Qwen2.5-1.5B)|\\n|qwen2_5-3b|[qwen/Qwen2.5-3B](https://modelscope.cn/models/qwen/Qwen2.5-3B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-3B](https://huggingface.co/Qwen/Qwen2.5-3B)|\\n|qwen2_5-7b|[qwen/Qwen2.5-7B](https://modelscope.cn/models/qwen/Qwen2.5-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-7B](https://huggingface.co/Qwen/Qwen2.5-7B)|\\n|qwen2_5-14b|[qwen/Qwen2.5-14B](https://modelscope.cn/models/qwen/Qwen2.5-14B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-14B](https://huggingface.co/Qwen/Qwen2.5-14B)|\\n|qwen2_5-32b|[qwen/Qwen2.5-32B](https://modelscope.cn/models/qwen/Qwen2.5-32B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-32B](https://huggingface.co/Qwen/Qwen2.5-32B)|\\n|qwen2_5-72b|[qwen/Qwen2.5-72B](https://modelscope.cn/models/qwen/Qwen2.5-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-72B](https://huggingface.co/Qwen/Qwen2.5-72B)|\\n|qwen2_5-0_5b-instruct|[qwen/Qwen2.5-0.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct)|\\n|qwen2_5-1_5b-instruct|[qwen/Qwen2.5-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct)|\\n|qwen2_5-3b-instruct|[qwen/Qwen2.5-3B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)|\\n|qwen2_5-7b-instruct|[qwen/Qwen2.5-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct)|\\n|qwen2_5-14b-instruct|[qwen/Qwen2.5-14B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-14B-Instruct](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct)|\\n|qwen2_5-32b-instruct|[qwen/Qwen2.5-32B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-32B-Instruct](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct)|\\n|qwen2_5-72b-instruct|[qwen/Qwen2.5-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-72B-Instruct](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct)|\\n|qwen2_5-0_5b-instruct-gptq-int4|[qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4)|\\n|qwen2_5-1_5b-instruct-gptq-int4|[qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4)|\\n|qwen2_5-3b-instruct-gptq-int4|[qwen/Qwen2.5-3B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-3B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-GPTQ-Int4)|\\n|qwen2_5-7b-instruct-gptq-int4|[qwen/Qwen2.5-7B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4)|\\n|qwen2_5-14b-instruct-gptq-int4|[qwen/Qwen2.5-14B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-14B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct-GPTQ-Int4)|\\n|qwen2_5-32b-instruct-gptq-int4|[qwen/Qwen2.5-32B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-32B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct-GPTQ-Int4)|\\n|qwen2_5-72b-instruct-gptq-int4|[qwen/Qwen2.5-72B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-72B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct-GPTQ-Int4)|\\n|qwen2_5-0_5b-instruct-gptq-int8|[qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8)|\\n|qwen2_5-1_5b-instruct-gptq-int8|[qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8)|\\n|qwen2_5-3b-instruct-gptq-int8|[qwen/Qwen2.5-3B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-3B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-GPTQ-Int8)|\\n|qwen2_5-7b-instruct-gptq-int8|[qwen/Qwen2.5-7B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-7B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GPTQ-Int8)|\\n|qwen2_5-14b-instruct-gptq-int8|[qwen/Qwen2.5-14B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-14B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct-GPTQ-Int8)|\\n|qwen2_5-32b-instruct-gptq-int8|[qwen/Qwen2.5-32B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-32B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct-GPTQ-Int8)|\\n|qwen2_5-72b-instruct-gptq-int8|[qwen/Qwen2.5-72B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-72B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct-GPTQ-Int8)|\\n|qwen2_5-0_5b-instruct-awq|[qwen/Qwen2.5-0.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-0.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-AWQ)|\\n|qwen2_5-1_5b-instruct-awq|[qwen/Qwen2.5-1.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-1.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-AWQ)|\\n|qwen2_5-3b-instruct-awq|[qwen/Qwen2.5-3B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-3B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-AWQ)|\\n|qwen2_5-7b-instruct-awq|[qwen/Qwen2.5-7B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-7B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-AWQ)|\\n|qwen2_5-14b-instruct-awq|[qwen/Qwen2.5-14B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-14B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct-AWQ)|\\n|qwen2_5-32b-instruct-awq|[qwen/Qwen2.5-32B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-32B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct-AWQ)|\\n|qwen2_5-72b-instruct-awq|[qwen/Qwen2.5-72B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-72B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct-AWQ)|\\n|qwen2_5-math-1_5b|[qwen/Qwen2.5-Math-1.5B](https://modelscope.cn/models/qwen/Qwen2.5-Math-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-1.5B](https://huggingface.co/Qwen/Qwen2.5-Math-1.5B)|\\n|qwen2_5-math-7b|[qwen/Qwen2.5-Math-7B](https://modelscope.cn/models/qwen/Qwen2.5-Math-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-7B](https://huggingface.co/Qwen/Qwen2.5-Math-7B)|\\n|qwen2_5-math-72b|[qwen/Qwen2.5-Math-72B](https://modelscope.cn/models/qwen/Qwen2.5-Math-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-72B](https://huggingface.co/Qwen/Qwen2.5-Math-72B)|\\n|qwen2_5-math-1_5b-instruct|[qwen/Qwen2.5-Math-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Math-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Math-1.5B-Instruct)|\\n|qwen2_5-math-7b-instruct|[qwen/Qwen2.5-Math-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Math-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Math-7B-Instruct)|\\n|qwen2_5-math-72b-instruct|[qwen/Qwen2.5-Math-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Math-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-72B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Math-72B-Instruct)|\\n|qwen2_5-coder-1_5b|[qwen/Qwen2.5-Coder-1.5B](https://modelscope.cn/models/qwen/Qwen2.5-Coder-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-1.5B](https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B)|\\n|qwen2_5-coder-1_5b-instruct|[qwen/Qwen2.5-Coder-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Coder-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct)|\\n|qwen2_5-coder-7b|[qwen/Qwen2.5-Coder-7B](https://modelscope.cn/models/qwen/Qwen2.5-Coder-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-7B](https://huggingface.co/Qwen/Qwen2.5-Coder-7B)|\\n|qwen2_5-coder-7b-instruct|[qwen/Qwen2.5-Coder-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Coder-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct)|\\n|chatglm2-6b|[ZhipuAI/chatglm2-6b](https://modelscope.cn/models/ZhipuAI/chatglm2-6b/summary)|query_key_value|chatglm2|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm2-6b](https://huggingface.co/THUDM/chatglm2-6b)|\\n|chatglm2-6b-32k|[ZhipuAI/chatglm2-6b-32k](https://modelscope.cn/models/ZhipuAI/chatglm2-6b-32k/summary)|query_key_value|chatglm2|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm2-6b-32k](https://huggingface.co/THUDM/chatglm2-6b-32k)|\\n|chatglm3-6b-base|[ZhipuAI/chatglm3-6b-base](https://modelscope.cn/models/ZhipuAI/chatglm3-6b-base/summary)|query_key_value|chatglm-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b-base](https://huggingface.co/THUDM/chatglm3-6b-base)|\\n|chatglm3-6b|[ZhipuAI/chatglm3-6b](https://modelscope.cn/models/ZhipuAI/chatglm3-6b/summary)|query_key_value|chatglm3|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b](https://huggingface.co/THUDM/chatglm3-6b)|\\n|chatglm3-6b-32k|[ZhipuAI/chatglm3-6b-32k](https://modelscope.cn/models/ZhipuAI/chatglm3-6b-32k/summary)|query_key_value|chatglm3|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b-32k](https://huggingface.co/THUDM/chatglm3-6b-32k)|\\n|chatglm3-6b-128k|[ZhipuAI/chatglm3-6b-128k](https://modelscope.cn/models/ZhipuAI/chatglm3-6b-128k/summary)|query_key_value|chatglm3|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b-128k](https://huggingface.co/THUDM/chatglm3-6b-128k)|\\n|codegeex2-6b|[ZhipuAI/codegeex2-6b](https://modelscope.cn/models/ZhipuAI/codegeex2-6b/summary)|query_key_value|chatglm-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.34|coding|[THUDM/codegeex2-6b](https://huggingface.co/THUDM/codegeex2-6b)|\\n|glm4-9b|[ZhipuAI/glm-4-9b](https://modelscope.cn/models/ZhipuAI/glm-4-9b/summary)|query_key_value|chatglm-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/glm-4-9b](https://huggingface.co/THUDM/glm-4-9b)|\\n|glm4-9b-chat|[ZhipuAI/glm-4-9b-chat](https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/summary)|query_key_value|chatglm4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/glm-4-9b-chat](https://huggingface.co/THUDM/glm-4-9b-chat)|\\n|glm4-9b-chat-1m|[ZhipuAI/glm-4-9b-chat-1m](https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat-1m/summary)|query_key_value|chatglm4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/glm-4-9b-chat-1m](https://huggingface.co/THUDM/glm-4-9b-chat-1m)|\\n|codegeex4-9b-chat|[ZhipuAI/codegeex4-all-9b](https://modelscope.cn/models/ZhipuAI/codegeex4-all-9b/summary)|query_key_value|codegeex4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers<4.42|coding|[THUDM/codegeex4-all-9b](https://huggingface.co/THUDM/codegeex4-all-9b)|\\n|llama2-7b|[modelscope/Llama-2-7b-ms](https://modelscope.cn/models/modelscope/Llama-2-7b-ms/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-7b-hf](https://huggingface.co/meta-llama/Llama-2-7b-hf)|\\n|llama2-7b-chat|[modelscope/Llama-2-7b-chat-ms](https://modelscope.cn/models/modelscope/Llama-2-7b-chat-ms/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-7b-chat-hf](https://huggingface.co/meta-llama/Llama-2-7b-chat-hf)|\\n|llama2-13b|[modelscope/Llama-2-13b-ms](https://modelscope.cn/models/modelscope/Llama-2-13b-ms/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-13b-hf](https://huggingface.co/meta-llama/Llama-2-13b-hf)|\\n|llama2-13b-chat|[modelscope/Llama-2-13b-chat-ms](https://modelscope.cn/models/modelscope/Llama-2-13b-chat-ms/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-13b-chat-hf](https://huggingface.co/meta-llama/Llama-2-13b-chat-hf)|\\n|llama2-70b|[modelscope/Llama-2-70b-ms](https://modelscope.cn/models/modelscope/Llama-2-70b-ms/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-70b-hf](https://huggingface.co/meta-llama/Llama-2-70b-hf)|\\n|llama2-70b-chat|[modelscope/Llama-2-70b-chat-ms](https://modelscope.cn/models/modelscope/Llama-2-70b-chat-ms/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-70b-chat-hf](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf)|\\n|llama2-7b-aqlm-2bit-1x16|[AI-ModelScope/Llama-2-7b-AQLM-2Bit-1x16-hf](https://modelscope.cn/models/AI-ModelScope/Llama-2-7b-AQLM-2Bit-1x16-hf/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.38, aqlm, torch>=2.2.0|-|[ISTA-DASLab/Llama-2-7b-AQLM-2Bit-1x16-hf](https://huggingface.co/ISTA-DASLab/Llama-2-7b-AQLM-2Bit-1x16-hf)|\\n|llama3-8b|[LLM-Research/Meta-Llama-3-8B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-8B](https://huggingface.co/meta-llama/Meta-Llama-3-8B)|\\n|llama3-8b-instruct|[LLM-Research/Meta-Llama-3-8B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-8B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct)|\\n|llama3-8b-instruct-int4|[swift/Meta-Llama-3-8B-Instruct-GPTQ-Int4](https://modelscope.cn/models/swift/Meta-Llama-3-8B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int4](https://huggingface.co/study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int4)|\\n|llama3-8b-instruct-int8|[swift/Meta-Llama-3-8B-Instruct-GPTQ-Int8](https://modelscope.cn/models/swift/Meta-Llama-3-8B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int8](https://huggingface.co/study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int8)|\\n|llama3-8b-instruct-awq|[swift/Meta-Llama-3-8B-Instruct-AWQ](https://modelscope.cn/models/swift/Meta-Llama-3-8B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[study-hjt/Meta-Llama-3-8B-Instruct-AWQ](https://huggingface.co/study-hjt/Meta-Llama-3-8B-Instruct-AWQ)|\\n|llama3-70b|[LLM-Research/Meta-Llama-3-70B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-70B](https://huggingface.co/meta-llama/Meta-Llama-3-70B)|\\n|llama3-70b-instruct|[LLM-Research/Meta-Llama-3-70B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-70B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct)|\\n|llama3-70b-instruct-int4|[swift/Meta-Llama-3-70B-Instruct-GPTQ-Int4](https://modelscope.cn/models/swift/Meta-Llama-3-70B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int4](https://huggingface.co/study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int4)|\\n|llama3-70b-instruct-int8|[swift/Meta-Llama-3-70b-Instruct-GPTQ-Int8](https://modelscope.cn/models/swift/Meta-Llama-3-70b-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int8](https://huggingface.co/study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int8)|\\n|llama3-70b-instruct-awq|[swift/Meta-Llama-3-70B-Instruct-AWQ](https://modelscope.cn/models/swift/Meta-Llama-3-70B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[study-hjt/Meta-Llama-3-70B-Instruct-AWQ](https://huggingface.co/study-hjt/Meta-Llama-3-70B-Instruct-AWQ)|\\n|llama3_1-8b|[LLM-Research/Meta-Llama-3.1-8B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-8B](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B)|\\n|llama3_1-8b-instruct|[LLM-Research/Meta-Llama-3.1-8B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct)|\\n|llama3_1-8b-instruct-awq|[LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, autoawq|-|[hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4)|\\n|llama3_1-8b-instruct-gptq-int4|[LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, auto_gptq|-|[hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4)|\\n|llama3_1-8b-instruct-bnb|[LLM-Research/Meta-Llama-3.1-8B-Instruct-BNB-NF4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-BNB-NF4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, bitsandbytes|-|[hugging-quants/Meta-Llama-3.1-8B-Instruct-BNB-NF4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-BNB-NF4)|\\n|llama3_1-70b|[LLM-Research/Meta-Llama-3.1-70B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-70B](https://huggingface.co/meta-llama/Meta-Llama-3.1-70B)|\\n|llama3_1-70b-instruct|[LLM-Research/Meta-Llama-3.1-70B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-70B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct)|\\n|llama3_1-70b-instruct-fp8|[LLM-Research/Meta-Llama-3.1-70B-Instruct-FP8](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-FP8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-70B-Instruct-FP8](https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct-FP8)|\\n|llama3_1-70b-instruct-awq|[LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43, autoawq|-|[hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4)|\\n|llama3_1-70b-instruct-gptq-int4|[LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, auto_gptq|-|[hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4)|\\n|llama3_1-70b-instruct-bnb|[LLM-Research/Meta-Llama-3.1-70B-Instruct-bnb-4bit](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-bnb-4bit/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, bitsandbytes|-|[unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit](https://huggingface.co/unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit)|\\n|llama3_1-405b|[LLM-Research/Meta-Llama-3.1-405B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-405B](https://huggingface.co/meta-llama/Meta-Llama-3.1-405B)|\\n|llama3_1-405b-instruct|[LLM-Research/Meta-Llama-3.1-405B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-405B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3.1-405B-Instruct)|\\n|llama3_1-405b-instruct-fp8|[LLM-Research/Meta-Llama-3.1-405B-Instruct-FP8](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-FP8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-405B-Instruct-FP8](https://huggingface.co/meta-llama/Meta-Llama-3.1-405B-Instruct-FP8)|\\n|llama3_1-405b-instruct-awq|[LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43, autoawq|-|[hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4)|\\n|llama3_1-405b-instruct-gptq-int4|[LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, auto_gptq|-|[hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4)|\\n|llama3_1-405b-instruct-bnb|[LLM-Research/Meta-Llama-3.1-405B-Instruct-BNB-NF4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-BNB-NF4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, bitsandbytes|-|[hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4)|\\n|llama3_2-1b|[LLM-Research/Llama-3.2-1B](https://modelscope.cn/models/LLM-Research/Llama-3.2-1B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-1B](https://huggingface.co/meta-llama/Llama-3.2-1B)|\\n|llama3_2-1b-instruct|[LLM-Research/Llama-3.2-1B-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-1B-Instruct/summary)|q_proj, k_proj, v_proj|llama3_2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-1B-Instruct](https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct)|\\n|llama3_2-3b|[LLM-Research/Llama-3.2-3B](https://modelscope.cn/models/LLM-Research/Llama-3.2-3B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-3B](https://huggingface.co/meta-llama/Llama-3.2-3B)|\\n|llama3_2-3b-instruct|[LLM-Research/Llama-3.2-3B-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-3B-Instruct/summary)|q_proj, k_proj, v_proj|llama3_2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-3B-Instruct](https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct)|\\n|reflection-llama_3_1-70b|[LLM-Research/Reflection-Llama-3.1-70B](https://modelscope.cn/models/LLM-Research/Reflection-Llama-3.1-70B/summary)|q_proj, k_proj, v_proj|reflection|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mattshumer/Reflection-Llama-3.1-70B](https://huggingface.co/mattshumer/Reflection-Llama-3.1-70B)|\\n|longwriter-glm4-9b|[ZhipuAI/LongWriter-glm4-9b](https://modelscope.cn/models/ZhipuAI/LongWriter-glm4-9b/summary)|query_key_value|chatglm4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/LongWriter-glm4-9b](https://huggingface.co/THUDM/LongWriter-glm4-9b)|\\n|longwriter-llama3_1-8b|[ZhipuAI/LongWriter-llama3.1-8b](https://modelscope.cn/models/ZhipuAI/LongWriter-llama3.1-8b/summary)|q_proj, k_proj, v_proj|longwriter-llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[THUDM/LongWriter-llama3.1-8b](https://huggingface.co/THUDM/LongWriter-llama3.1-8b)|\\n|chinese-llama-2-1_3b|[AI-ModelScope/chinese-llama-2-1.3b](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-1.3b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-1.3b](https://huggingface.co/hfl/chinese-llama-2-1.3b)|\\n|chinese-llama-2-7b|[AI-ModelScope/chinese-llama-2-7b](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-7b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-7b](https://huggingface.co/hfl/chinese-llama-2-7b)|\\n|chinese-llama-2-7b-16k|[AI-ModelScope/chinese-llama-2-7b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-7b-16k/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-7b-16k](https://huggingface.co/hfl/chinese-llama-2-7b-16k)|\\n|chinese-llama-2-7b-64k|[AI-ModelScope/chinese-llama-2-7b-64k](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-7b-64k/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-7b-64k](https://huggingface.co/hfl/chinese-llama-2-7b-64k)|\\n|chinese-llama-2-13b|[AI-ModelScope/chinese-llama-2-13b](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-13b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-13b](https://huggingface.co/hfl/chinese-llama-2-13b)|\\n|chinese-llama-2-13b-16k|[AI-ModelScope/chinese-llama-2-13b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-13b-16k/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-13b-16k](https://huggingface.co/hfl/chinese-llama-2-13b-16k)|\\n|chinese-alpaca-2-1_3b|[AI-ModelScope/chinese-alpaca-2-1.3b](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-1.3b/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-1.3b](https://huggingface.co/hfl/chinese-alpaca-2-1.3b)|\\n|chinese-alpaca-2-7b|[AI-ModelScope/chinese-alpaca-2-7b](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-7b/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-7b](https://huggingface.co/hfl/chinese-alpaca-2-7b)|\\n|chinese-alpaca-2-7b-16k|[AI-ModelScope/chinese-alpaca-2-7b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-7b-16k/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-7b-16k](https://huggingface.co/hfl/chinese-alpaca-2-7b-16k)|\\n|chinese-alpaca-2-7b-64k|[AI-ModelScope/chinese-alpaca-2-7b-64k](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-7b-64k/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-7b-64k](https://huggingface.co/hfl/chinese-alpaca-2-7b-64k)|\\n|chinese-alpaca-2-13b|[AI-ModelScope/chinese-alpaca-2-13b](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-13b/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-13b](https://huggingface.co/hfl/chinese-alpaca-2-13b)|\\n|chinese-alpaca-2-13b-16k|[AI-ModelScope/chinese-alpaca-2-13b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-13b-16k/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-13b-16k](https://huggingface.co/hfl/chinese-alpaca-2-13b-16k)|\\n|llama-3-chinese-8b|[ChineseAlpacaGroup/llama-3-chinese-8b](https://modelscope.cn/models/ChineseAlpacaGroup/llama-3-chinese-8b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/llama-3-chinese-8b](https://huggingface.co/hfl/llama-3-chinese-8b)|\\n|llama-3-chinese-8b-instruct|[ChineseAlpacaGroup/llama-3-chinese-8b-instruct](https://modelscope.cn/models/ChineseAlpacaGroup/llama-3-chinese-8b-instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/llama-3-chinese-8b-instruct](https://huggingface.co/hfl/llama-3-chinese-8b-instruct)|\\n|atom-7b|[FlagAlpha/Atom-7B](https://modelscope.cn/models/FlagAlpha/Atom-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[FlagAlpha/Atom-7B](https://huggingface.co/FlagAlpha/Atom-7B)|\\n|atom-7b-chat|[FlagAlpha/Atom-7B-Chat](https://modelscope.cn/models/FlagAlpha/Atom-7B-Chat/summary)|q_proj, k_proj, v_proj|atom|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[FlagAlpha/Atom-7B-Chat](https://huggingface.co/FlagAlpha/Atom-7B-Chat)|\\n|yi-6b|[01ai/Yi-6B](https://modelscope.cn/models/01ai/Yi-6B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-6B](https://huggingface.co/01-ai/Yi-6B)|\\n|yi-6b-200k|[01ai/Yi-6B-200K](https://modelscope.cn/models/01ai/Yi-6B-200K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-6B-200K](https://huggingface.co/01-ai/Yi-6B-200K)|\\n|yi-6b-chat|[01ai/Yi-6B-Chat](https://modelscope.cn/models/01ai/Yi-6B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-6B-Chat](https://huggingface.co/01-ai/Yi-6B-Chat)|\\n|yi-6b-chat-awq|[01ai/Yi-6B-Chat-4bits](https://modelscope.cn/models/01ai/Yi-6B-Chat-4bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[01-ai/Yi-6B-Chat-4bits](https://huggingface.co/01-ai/Yi-6B-Chat-4bits)|\\n|yi-6b-chat-int8|[01ai/Yi-6B-Chat-8bits](https://modelscope.cn/models/01ai/Yi-6B-Chat-8bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[01-ai/Yi-6B-Chat-8bits](https://huggingface.co/01-ai/Yi-6B-Chat-8bits)|\\n|yi-9b|[01ai/Yi-9B](https://modelscope.cn/models/01ai/Yi-9B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-9B](https://huggingface.co/01-ai/Yi-9B)|\\n|yi-9b-200k|[01ai/Yi-9B-200K](https://modelscope.cn/models/01ai/Yi-9B-200K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-9B-200K](https://huggingface.co/01-ai/Yi-9B-200K)|\\n|yi-34b|[01ai/Yi-34B](https://modelscope.cn/models/01ai/Yi-34B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-34B](https://huggingface.co/01-ai/Yi-34B)|\\n|yi-34b-200k|[01ai/Yi-34B-200K](https://modelscope.cn/models/01ai/Yi-34B-200K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-34B-200K](https://huggingface.co/01-ai/Yi-34B-200K)|\\n|yi-34b-chat|[01ai/Yi-34B-Chat](https://modelscope.cn/models/01ai/Yi-34B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-34B-Chat](https://huggingface.co/01-ai/Yi-34B-Chat)|\\n|yi-34b-chat-awq|[01ai/Yi-34B-Chat-4bits](https://modelscope.cn/models/01ai/Yi-34B-Chat-4bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[01-ai/Yi-34B-Chat-4bits](https://huggingface.co/01-ai/Yi-34B-Chat-4bits)|\\n|yi-34b-chat-int8|[01ai/Yi-34B-Chat-8bits](https://modelscope.cn/models/01ai/Yi-34B-Chat-8bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[01-ai/Yi-34B-Chat-8bits](https://huggingface.co/01-ai/Yi-34B-Chat-8bits)|\\n|yi-1_5-6b|[01ai/Yi-1.5-6B](https://modelscope.cn/models/01ai/Yi-1.5-6B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-6B](https://huggingface.co/01-ai/Yi-1.5-6B)|\\n|yi-1_5-6b-chat|[01ai/Yi-1.5-6B-Chat](https://modelscope.cn/models/01ai/Yi-1.5-6B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-6B-Chat](https://huggingface.co/01-ai/Yi-1.5-6B-Chat)|\\n|yi-1_5-9b|[01ai/Yi-1.5-9B](https://modelscope.cn/models/01ai/Yi-1.5-9B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-9B](https://huggingface.co/01-ai/Yi-1.5-9B)|\\n|yi-1_5-9b-chat|[01ai/Yi-1.5-9B-Chat](https://modelscope.cn/models/01ai/Yi-1.5-9B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-9B-Chat](https://huggingface.co/01-ai/Yi-1.5-9B-Chat)|\\n|yi-1_5-9b-chat-16k|[01ai/Yi-1.5-9B-Chat-16K](https://modelscope.cn/models/01ai/Yi-1.5-9B-Chat-16K/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-9B-Chat-16K](https://huggingface.co/01-ai/Yi-1.5-9B-Chat-16K)|\\n|yi-1_5-34b|[01ai/Yi-1.5-34B](https://modelscope.cn/models/01ai/Yi-1.5-34B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-34B](https://huggingface.co/01-ai/Yi-1.5-34B)|\\n|yi-1_5-34b-chat|[01ai/Yi-1.5-34B-Chat](https://modelscope.cn/models/01ai/Yi-1.5-34B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-34B-Chat](https://huggingface.co/01-ai/Yi-1.5-34B-Chat)|\\n|yi-1_5-34b-chat-16k|[01ai/Yi-1.5-34B-Chat-16K](https://modelscope.cn/models/01ai/Yi-1.5-34B-Chat-16K/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-34B-Chat-16K](https://huggingface.co/01-ai/Yi-1.5-34B-Chat-16K)|\\n|yi-1_5-6b-chat-awq-int4|[AI-ModelScope/Yi-1.5-6B-Chat-AWQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-6B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[modelscope/Yi-1.5-6B-Chat-AWQ](https://huggingface.co/modelscope/Yi-1.5-6B-Chat-AWQ)|\\n|yi-1_5-6b-chat-gptq-int4|[AI-ModelScope/Yi-1.5-6B-Chat-GPTQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-6B-Chat-GPTQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[modelscope/Yi-1.5-6B-Chat-GPTQ](https://huggingface.co/modelscope/Yi-1.5-6B-Chat-GPTQ)|\\n|yi-1_5-9b-chat-awq-int4|[AI-ModelScope/Yi-1.5-9B-Chat-AWQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-9B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[modelscope/Yi-1.5-9B-Chat-AWQ](https://huggingface.co/modelscope/Yi-1.5-9B-Chat-AWQ)|\\n|yi-1_5-9b-chat-gptq-int4|[AI-ModelScope/Yi-1.5-9B-Chat-GPTQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-9B-Chat-GPTQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[modelscope/Yi-1.5-9B-Chat-GPTQ](https://huggingface.co/modelscope/Yi-1.5-9B-Chat-GPTQ)|\\n|yi-1_5-34b-chat-awq-int4|[AI-ModelScope/Yi-1.5-34B-Chat-AWQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-34B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[modelscope/Yi-1.5-34B-Chat-AWQ](https://huggingface.co/modelscope/Yi-1.5-34B-Chat-AWQ)|\\n|yi-1_5-34b-chat-gptq-int4|[AI-ModelScope/Yi-1.5-34B-Chat-GPTQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-34B-Chat-GPTQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[modelscope/Yi-1.5-34B-Chat-GPTQ](https://huggingface.co/modelscope/Yi-1.5-34B-Chat-GPTQ)|\\n|yi-coder-1_5b|[01ai/Yi-Coder-1.5B](https://modelscope.cn/models/01ai/Yi-Coder-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-1.5B](https://huggingface.co/01-ai/Yi-Coder-1.5B)|\\n|yi-coder-1_5b-chat|[01ai/Yi-Coder-1.5B-Chat](https://modelscope.cn/models/01ai/Yi-Coder-1.5B-Chat/summary)|q_proj, k_proj, v_proj|yi-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-1.5B-Chat](https://huggingface.co/01-ai/Yi-Coder-1.5B-Chat)|\\n|yi-coder-9b|[01ai/Yi-Coder-9B](https://modelscope.cn/models/01ai/Yi-Coder-9B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-9B](https://huggingface.co/01-ai/Yi-Coder-9B)|\\n|yi-coder-9b-chat|[01ai/Yi-Coder-9B-Chat](https://modelscope.cn/models/01ai/Yi-Coder-9B-Chat/summary)|q_proj, k_proj, v_proj|yi-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-9B-Chat](https://huggingface.co/01-ai/Yi-Coder-9B-Chat)|\\n|internlm-7b|[Shanghai_AI_Laboratory/internlm-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-7b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-7b](https://huggingface.co/internlm/internlm-7b)|\\n|internlm-7b-chat|[Shanghai_AI_Laboratory/internlm-chat-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-7b/summary)|q_proj, k_proj, v_proj|internlm|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-chat-7b](https://huggingface.co/internlm/internlm-chat-7b)|\\n|internlm-7b-chat-8k|[Shanghai_AI_Laboratory/internlm-chat-7b-8k](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-7b-8k/summary)|q_proj, k_proj, v_proj|internlm|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|-|\\n|internlm-20b|[Shanghai_AI_Laboratory/internlm-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-20b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-20b](https://huggingface.co/internlm/internlm-20b)|\\n|internlm-20b-chat|[Shanghai_AI_Laboratory/internlm-chat-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-20b/summary)|q_proj, k_proj, v_proj|internlm|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-chat-20b](https://huggingface.co/internlm/internlm-chat-20b)|\\n|internlm2-1_8b|[Shanghai_AI_Laboratory/internlm2-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-1_8b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-1_8b](https://huggingface.co/internlm/internlm2-1_8b)|\\n|internlm2-1_8b-sft-chat|[Shanghai_AI_Laboratory/internlm2-chat-1_8b-sft](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-1_8b-sft/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-1_8b-sft](https://huggingface.co/internlm/internlm2-chat-1_8b-sft)|\\n|internlm2-1_8b-chat|[Shanghai_AI_Laboratory/internlm2-chat-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-1_8b](https://huggingface.co/internlm/internlm2-chat-1_8b)|\\n|internlm2-7b-base|[Shanghai_AI_Laboratory/internlm2-base-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-base-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-base-7b](https://huggingface.co/internlm/internlm2-base-7b)|\\n|internlm2-7b|[Shanghai_AI_Laboratory/internlm2-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-7b](https://huggingface.co/internlm/internlm2-7b)|\\n|internlm2-7b-sft-chat|[Shanghai_AI_Laboratory/internlm2-chat-7b-sft](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-7b-sft/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-7b-sft](https://huggingface.co/internlm/internlm2-chat-7b-sft)|\\n|internlm2-7b-chat|[Shanghai_AI_Laboratory/internlm2-chat-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-7b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-7b](https://huggingface.co/internlm/internlm2-chat-7b)|\\n|internlm2-20b-base|[Shanghai_AI_Laboratory/internlm2-base-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-base-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-base-20b](https://huggingface.co/internlm/internlm2-base-20b)|\\n|internlm2-20b|[Shanghai_AI_Laboratory/internlm2-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-20b](https://huggingface.co/internlm/internlm2-20b)|\\n|internlm2-20b-sft-chat|[Shanghai_AI_Laboratory/internlm2-chat-20b-sft](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-20b-sft/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-20b-sft](https://huggingface.co/internlm/internlm2-chat-20b-sft)|\\n|internlm2-20b-chat|[Shanghai_AI_Laboratory/internlm2-chat-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-20b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-20b](https://huggingface.co/internlm/internlm2-chat-20b)|\\n|internlm2_5-1_8b|[Shanghai_AI_Laboratory/internlm2_5-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-1_8b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-1_8b](https://huggingface.co/internlm/internlm2_5-1_8b)|\\n|internlm2_5-1_8b-chat|[Shanghai_AI_Laboratory/internlm2_5-1_8b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-1_8b-chat](https://huggingface.co/internlm/internlm2_5-1_8b-chat)|\\n|internlm2_5-7b|[Shanghai_AI_Laboratory/internlm2_5-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-7b](https://huggingface.co/internlm/internlm2_5-7b)|\\n|internlm2_5-7b-chat|[Shanghai_AI_Laboratory/internlm2_5-7b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b-chat/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-7b-chat](https://huggingface.co/internlm/internlm2_5-7b-chat)|\\n|internlm2_5-7b-chat-1m|[Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-7b-chat-1m](https://huggingface.co/internlm/internlm2_5-7b-chat-1m)|\\n|internlm2_5-20b|[Shanghai_AI_Laboratory/internlm2_5-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-20b](https://huggingface.co/internlm/internlm2_5-20b)|\\n|internlm2_5-20b-chat|[Shanghai_AI_Laboratory/internlm2_5-20b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-20b-chat/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-20b-chat](https://huggingface.co/internlm/internlm2_5-20b-chat)|\\n|internlm2-math-7b|[Shanghai_AI_Laboratory/internlm2-math-base-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-base-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-base-7b](https://huggingface.co/internlm/internlm2-math-base-7b)|\\n|internlm2-math-7b-chat|[Shanghai_AI_Laboratory/internlm2-math-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-7b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-7b](https://huggingface.co/internlm/internlm2-math-7b)|\\n|internlm2-math-20b|[Shanghai_AI_Laboratory/internlm2-math-base-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-base-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-base-20b](https://huggingface.co/internlm/internlm2-math-base-20b)|\\n|internlm2-math-20b-chat|[Shanghai_AI_Laboratory/internlm2-math-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-20b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-20b](https://huggingface.co/internlm/internlm2-math-20b)|\\n|deepseek-7b|[deepseek-ai/deepseek-llm-7b-base](https://modelscope.cn/models/deepseek-ai/deepseek-llm-7b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-7b-base](https://huggingface.co/deepseek-ai/deepseek-llm-7b-base)|\\n|deepseek-7b-chat|[deepseek-ai/deepseek-llm-7b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-llm-7b-chat/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-7b-chat](https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat)|\\n|deepseek-moe-16b|[deepseek-ai/deepseek-moe-16b-base](https://modelscope.cn/models/deepseek-ai/deepseek-moe-16b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;||moe|[deepseek-ai/deepseek-moe-16b-base](https://huggingface.co/deepseek-ai/deepseek-moe-16b-base)|\\n|deepseek-moe-16b-chat|[deepseek-ai/deepseek-moe-16b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-moe-16b-chat/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2718;|&#x2718;||moe|[deepseek-ai/deepseek-moe-16b-chat](https://huggingface.co/deepseek-ai/deepseek-moe-16b-chat)|\\n|deepseek-67b|[deepseek-ai/deepseek-llm-67b-base](https://modelscope.cn/models/deepseek-ai/deepseek-llm-67b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-67b-base](https://huggingface.co/deepseek-ai/deepseek-llm-67b-base)|\\n|deepseek-67b-chat|[deepseek-ai/deepseek-llm-67b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-llm-67b-chat/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-67b-chat](https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat)|\\n|deepseek-coder-1_3b|[deepseek-ai/deepseek-coder-1.3b-base](https://modelscope.cn/models/deepseek-ai/deepseek-coder-1.3b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-1.3b-base](https://huggingface.co/deepseek-ai/deepseek-coder-1.3b-base)|\\n|deepseek-coder-1_3b-instruct|[deepseek-ai/deepseek-coder-1.3b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-coder-1.3b-instruct/summary)|q_proj, k_proj, v_proj|deepseek-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-1.3b-instruct](https://huggingface.co/deepseek-ai/deepseek-coder-1.3b-instruct)|\\n|deepseek-coder-6_7b|[deepseek-ai/deepseek-coder-6.7b-base](https://modelscope.cn/models/deepseek-ai/deepseek-coder-6.7b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-6.7b-base](https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-base)|\\n|deepseek-coder-6_7b-instruct|[deepseek-ai/deepseek-coder-6.7b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-coder-6.7b-instruct/summary)|q_proj, k_proj, v_proj|deepseek-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-6.7b-instruct](https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-instruct)|\\n|deepseek-coder-33b|[deepseek-ai/deepseek-coder-33b-base](https://modelscope.cn/models/deepseek-ai/deepseek-coder-33b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-33b-base](https://huggingface.co/deepseek-ai/deepseek-coder-33b-base)|\\n|deepseek-coder-33b-instruct|[deepseek-ai/deepseek-coder-33b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-coder-33b-instruct/summary)|q_proj, k_proj, v_proj|deepseek-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-33b-instruct](https://huggingface.co/deepseek-ai/deepseek-coder-33b-instruct)|\\n|deepseek-coder-v2-instruct|[deepseek-ai/DeepSeek-Coder-V2-Instruct](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Instruct/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Instruct](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Instruct)|\\n|deepseek-coder-v2-lite-instruct|[deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct)|\\n|deepseek-coder-v2|[deepseek-ai/DeepSeek-Coder-V2-Base](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Base/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Base](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Base)|\\n|deepseek-coder-v2-lite|[deepseek-ai/DeepSeek-Coder-V2-Lite-Base](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Lite-Base/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Lite-Base](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Lite-Base)|\\n|deepseek-math-7b|[deepseek-ai/deepseek-math-7b-base](https://modelscope.cn/models/deepseek-ai/deepseek-math-7b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||math|[deepseek-ai/deepseek-math-7b-base](https://huggingface.co/deepseek-ai/deepseek-math-7b-base)|\\n|deepseek-math-7b-instruct|[deepseek-ai/deepseek-math-7b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-math-7b-instruct/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||math|[deepseek-ai/deepseek-math-7b-instruct](https://huggingface.co/deepseek-ai/deepseek-math-7b-instruct)|\\n|deepseek-math-7b-chat|[deepseek-ai/deepseek-math-7b-rl](https://modelscope.cn/models/deepseek-ai/deepseek-math-7b-rl/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||math|[deepseek-ai/deepseek-math-7b-rl](https://huggingface.co/deepseek-ai/deepseek-math-7b-rl)|\\n|numina-math-7b|[AI-ModelScope/NuminaMath-7B-TIR](https://modelscope.cn/models/AI-ModelScope/NuminaMath-7B-TIR/summary)|q_proj, k_proj, v_proj|numina-math|&#x2714;|&#x2714;|&#x2718;|&#x2718;||math|[AI-MO/NuminaMath-7B-TIR](https://huggingface.co/AI-MO/NuminaMath-7B-TIR)|\\n|deepseek-v2|[deepseek-ai/DeepSeek-V2](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2](https://huggingface.co/deepseek-ai/DeepSeek-V2)|\\n|deepseek-v2-chat|[deepseek-ai/DeepSeek-V2-Chat](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2-Chat/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2-Chat](https://huggingface.co/deepseek-ai/DeepSeek-V2-Chat)|\\n|deepseek-v2-lite|[deepseek-ai/DeepSeek-V2-Lite](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2-Lite/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2-Lite](https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite)|\\n|deepseek-v2-lite-chat|[deepseek-ai/DeepSeek-V2-Lite-Chat](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2-Lite-Chat/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2-Lite-Chat](https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite-Chat)|\\n|deepseek-v2_5|[deepseek-ai/DeepSeek-V2.5](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2.5/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2.5](https://huggingface.co/deepseek-ai/DeepSeek-V2.5)|\\n|gemma-2b|[AI-ModelScope/gemma-2b](https://modelscope.cn/models/AI-ModelScope/gemma-2b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-2b](https://huggingface.co/google/gemma-2b)|\\n|gemma-7b|[AI-ModelScope/gemma-7b](https://modelscope.cn/models/AI-ModelScope/gemma-7b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-7b](https://huggingface.co/google/gemma-7b)|\\n|gemma-2b-instruct|[AI-ModelScope/gemma-2b-it](https://modelscope.cn/models/AI-ModelScope/gemma-2b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-2b-it](https://huggingface.co/google/gemma-2b-it)|\\n|gemma-7b-instruct|[AI-ModelScope/gemma-7b-it](https://modelscope.cn/models/AI-ModelScope/gemma-7b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-7b-it](https://huggingface.co/google/gemma-7b-it)|\\n|gemma2-2b|[LLM-Research/gemma-2-2b](https://modelscope.cn/models/LLM-Research/gemma-2-2b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-2b](https://huggingface.co/google/gemma-2-2b)|\\n|gemma2-9b|[LLM-Research/gemma-2-9b](https://modelscope.cn/models/LLM-Research/gemma-2-9b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-9b](https://huggingface.co/google/gemma-2-9b)|\\n|gemma2-27b|[LLM-Research/gemma-2-27b](https://modelscope.cn/models/LLM-Research/gemma-2-27b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-27b](https://huggingface.co/google/gemma-2-27b)|\\n|gemma2-2b-instruct|[LLM-Research/gemma-2-2b-it](https://modelscope.cn/models/LLM-Research/gemma-2-2b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it)|\\n|gemma2-9b-instruct|[LLM-Research/gemma-2-9b-it](https://modelscope.cn/models/LLM-Research/gemma-2-9b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-9b-it](https://huggingface.co/google/gemma-2-9b-it)|\\n|gemma2-27b-instruct|[LLM-Research/gemma-2-27b-it](https://modelscope.cn/models/LLM-Research/gemma-2-27b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-27b-it](https://huggingface.co/google/gemma-2-27b-it)|\\n|minicpm-1b-sft-chat|[OpenBMB/MiniCPM-1B-sft-bf16](https://modelscope.cn/models/OpenBMB/MiniCPM-1B-sft-bf16/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36.0|-|[openbmb/MiniCPM-1B-sft-bf16](https://huggingface.co/openbmb/MiniCPM-1B-sft-bf16)|\\n|minicpm-2b-sft-chat|[OpenBMB/MiniCPM-2B-sft-fp32](https://modelscope.cn/models/OpenBMB/MiniCPM-2B-sft-fp32/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[openbmb/MiniCPM-2B-sft-fp32](https://huggingface.co/openbmb/MiniCPM-2B-sft-fp32)|\\n|minicpm-2b-chat|[OpenBMB/MiniCPM-2B-dpo-fp32](https://modelscope.cn/models/OpenBMB/MiniCPM-2B-dpo-fp32/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[openbmb/MiniCPM-2B-dpo-fp32](https://huggingface.co/openbmb/MiniCPM-2B-dpo-fp32)|\\n|minicpm-2b-128k|[OpenBMB/MiniCPM-2B-128k](https://modelscope.cn/models/OpenBMB/MiniCPM-2B-128k/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36.0|-|[openbmb/MiniCPM-2B-128k](https://huggingface.co/openbmb/MiniCPM-2B-128k)|\\n|minicpm-moe-8x2b|[OpenBMB/MiniCPM-MoE-8x2B](https://modelscope.cn/models/OpenBMB/MiniCPM-MoE-8x2B/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36.0|moe|[openbmb/MiniCPM-MoE-8x2B](https://huggingface.co/openbmb/MiniCPM-MoE-8x2B)|\\n|minicpm3-4b|[OpenBMB/MiniCPM3-4B](https://modelscope.cn/models/OpenBMB/MiniCPM3-4B/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj|chatml|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.36|-|[openbmb/MiniCPM3-4B](https://huggingface.co/openbmb/MiniCPM3-4B)|\\n|openbuddy-llama-65b-chat|[OpenBuddy/openbuddy-llama-65b-v8-bf16](https://modelscope.cn/models/OpenBuddy/openbuddy-llama-65b-v8-bf16/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama-65b-v8-bf16](https://huggingface.co/OpenBuddy/openbuddy-llama-65b-v8-bf16)|\\n|openbuddy-llama2-13b-chat|[OpenBuddy/openbuddy-llama2-13b-v8.1-fp16](https://modelscope.cn/models/OpenBuddy/openbuddy-llama2-13b-v8.1-fp16/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama2-13b-v8.1-fp16](https://huggingface.co/OpenBuddy/openbuddy-llama2-13b-v8.1-fp16)|\\n|openbuddy-llama2-70b-chat|[OpenBuddy/openbuddy-llama2-70b-v10.1-bf16](https://modelscope.cn/models/OpenBuddy/openbuddy-llama2-70b-v10.1-bf16/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama2-70b-v10.1-bf16](https://huggingface.co/OpenBuddy/openbuddy-llama2-70b-v10.1-bf16)|\\n|openbuddy-llama3-8b-chat|[OpenBuddy/openbuddy-llama3-8b-v21.1-8k](https://modelscope.cn/models/OpenBuddy/openbuddy-llama3-8b-v21.1-8k/summary)|q_proj, k_proj, v_proj|openbuddy2|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama3-8b-v21.1-8k](https://huggingface.co/OpenBuddy/openbuddy-llama3-8b-v21.1-8k)|\\n|openbuddy-llama3-70b-chat|[OpenBuddy/openbuddy-llama3-70b-v21.1-8k](https://modelscope.cn/models/OpenBuddy/openbuddy-llama3-70b-v21.1-8k/summary)|q_proj, k_proj, v_proj|openbuddy2|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama3-70b-v21.1-8k](https://huggingface.co/OpenBuddy/openbuddy-llama3-70b-v21.1-8k)|\\n|openbuddy-mistral-7b-chat|[OpenBuddy/openbuddy-mistral-7b-v17.1-32k](https://modelscope.cn/models/OpenBuddy/openbuddy-mistral-7b-v17.1-32k/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[OpenBuddy/openbuddy-mistral-7b-v17.1-32k](https://huggingface.co/OpenBuddy/openbuddy-mistral-7b-v17.1-32k)|\\n|openbuddy-zephyr-7b-chat|[OpenBuddy/openbuddy-zephyr-7b-v14.1](https://modelscope.cn/models/OpenBuddy/openbuddy-zephyr-7b-v14.1/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[OpenBuddy/openbuddy-zephyr-7b-v14.1](https://huggingface.co/OpenBuddy/openbuddy-zephyr-7b-v14.1)|\\n|openbuddy-deepseek-67b-chat|[OpenBuddy/openbuddy-deepseek-67b-v15.2](https://modelscope.cn/models/OpenBuddy/openbuddy-deepseek-67b-v15.2/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-deepseek-67b-v15.2](https://huggingface.co/OpenBuddy/openbuddy-deepseek-67b-v15.2)|\\n|openbuddy-mixtral-moe-7b-chat|[OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k](https://modelscope.cn/models/OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k](https://huggingface.co/OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k)|\\n|openbuddy-llama3_1-8b-chat|[OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k](https://modelscope.cn/models/OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k/summary)|q_proj, k_proj, v_proj|openbuddy2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k](https://huggingface.co/OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k)|\\n|mistral-7b|[AI-ModelScope/Mistral-7B-v0.1](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-v0.1](https://huggingface.co/mistralai/Mistral-7B-v0.1)|\\n|mistral-7b-v2|[AI-ModelScope/Mistral-7B-v0.2-hf](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-v0.2-hf/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[alpindale/Mistral-7B-v0.2-hf](https://huggingface.co/alpindale/Mistral-7B-v0.2-hf)|\\n|mistral-7b-instruct|[AI-ModelScope/Mistral-7B-Instruct-v0.1](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-Instruct-v0.1/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-Instruct-v0.1](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1)|\\n|mistral-7b-instruct-v2|[AI-ModelScope/Mistral-7B-Instruct-v0.2](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-Instruct-v0.2/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-Instruct-v0.2](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2)|\\n|mistral-7b-instruct-v3|[LLM-Research/Mistral-7B-Instruct-v0.3](https://modelscope.cn/models/LLM-Research/Mistral-7B-Instruct-v0.3/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3)|\\n|mistral-nemo-base-2407|[AI-ModelScope/Mistral-Nemo-Base-2407](https://modelscope.cn/models/AI-ModelScope/Mistral-Nemo-Base-2407/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Nemo-Base-2407](https://huggingface.co/mistralai/Mistral-Nemo-Base-2407)|\\n|mistral-nemo-instruct-2407|[AI-ModelScope/Mistral-Nemo-Instruct-2407](https://modelscope.cn/models/AI-ModelScope/Mistral-Nemo-Instruct-2407/summary)|q_proj, k_proj, v_proj|mistral-nemo|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Nemo-Instruct-2407](https://huggingface.co/mistralai/Mistral-Nemo-Instruct-2407)|\\n|mistral-large-instruct-2407|[LLM-Research/Mistral-Large-Instruct-2407](https://modelscope.cn/models/LLM-Research/Mistral-Large-Instruct-2407/summary)|q_proj, k_proj, v_proj|mistral-nemo|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Large-Instruct-2407](https://huggingface.co/mistralai/Mistral-Large-Instruct-2407)|\\n|mistral-small-instruct-2409|[AI-ModelScope/Mistral-Small-Instruct-2409](https://modelscope.cn/models/AI-ModelScope/Mistral-Small-Instruct-2409/summary)|q_proj, k_proj, v_proj|mistral-nemo|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Small-Instruct-2409](https://huggingface.co/mistralai/Mistral-Small-Instruct-2409)|\\n|mixtral-moe-7b|[AI-ModelScope/Mixtral-8x7B-v0.1](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[mistralai/Mixtral-8x7B-v0.1](https://huggingface.co/mistralai/Mixtral-8x7B-v0.1)|\\n|mixtral-moe-7b-instruct|[AI-ModelScope/Mixtral-8x7B-Instruct-v0.1](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-Instruct-v0.1/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[mistralai/Mixtral-8x7B-Instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1)|\\n|mixtral-moe-7b-aqlm-2bit-1x16|[AI-ModelScope/Mixtral-8x7b-AQLM-2Bit-1x16-hf](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7b-AQLM-2Bit-1x16-hf/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.38, aqlm, torch>=2.2.0|moe|[ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf](https://huggingface.co/ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf)|\\n|mixtral-moe-8x22b-v1|[AI-ModelScope/Mixtral-8x22B-v0.1](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x22B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[mistral-community/Mixtral-8x22B-v0.1](https://huggingface.co/mistral-community/Mixtral-8x22B-v0.1)|\\n|wizardlm2-7b-awq|[AI-ModelScope/WizardLM-2-7B-AWQ](https://modelscope.cn/models/AI-ModelScope/WizardLM-2-7B-AWQ/summary)|q_proj, k_proj, v_proj|wizardlm2-awq|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.34|-|[MaziyarPanahi/WizardLM-2-7B-AWQ](https://huggingface.co/MaziyarPanahi/WizardLM-2-7B-AWQ)|\\n|wizardlm2-8x22b|[AI-ModelScope/WizardLM-2-8x22B](https://modelscope.cn/models/AI-ModelScope/WizardLM-2-8x22B/summary)|q_proj, k_proj, v_proj|wizardlm2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[alpindale/WizardLM-2-8x22B](https://huggingface.co/alpindale/WizardLM-2-8x22B)|\\n|baichuan-7b|[baichuan-inc/baichuan-7B](https://modelscope.cn/models/baichuan-inc/baichuan-7B/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;|transformers<4.34|-|[baichuan-inc/Baichuan-7B](https://huggingface.co/baichuan-inc/Baichuan-7B)|\\n|baichuan-13b|[baichuan-inc/Baichuan-13B-Base](https://modelscope.cn/models/baichuan-inc/Baichuan-13B-Base/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;|transformers<4.34|-|[baichuan-inc/Baichuan-13B-Base](https://huggingface.co/baichuan-inc/Baichuan-13B-Base)|\\n|baichuan-13b-chat|[baichuan-inc/Baichuan-13B-Chat](https://modelscope.cn/models/baichuan-inc/Baichuan-13B-Chat/summary)|W_pack|baichuan|&#x2718;|&#x2714;|&#x2714;|&#x2718;|transformers<4.34|-|[baichuan-inc/Baichuan-13B-Chat](https://huggingface.co/baichuan-inc/Baichuan-13B-Chat)|\\n|baichuan2-7b|[baichuan-inc/Baichuan2-7B-Base](https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Base/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-7B-Base](https://huggingface.co/baichuan-inc/Baichuan2-7B-Base)|\\n|baichuan2-7b-chat|[baichuan-inc/Baichuan2-7B-Chat](https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Chat/summary)|W_pack|baichuan|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-7B-Chat](https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat)|\\n|baichuan2-7b-chat-int4|[baichuan-inc/Baichuan2-7B-Chat-4bits](https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Chat-4bits/summary)|W_pack|baichuan|&#x2718;|&#x2718;|&#x2718;|&#x2718;|bitsandbytes<0.41.2, accelerate<0.26|-|[baichuan-inc/Baichuan2-7B-Chat-4bits](https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits)|\\n|baichuan2-13b|[baichuan-inc/Baichuan2-13B-Base](https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Base/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-13B-Base](https://huggingface.co/baichuan-inc/Baichuan2-13B-Base)|\\n|baichuan2-13b-chat|[baichuan-inc/Baichuan2-13B-Chat](https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Chat/summary)|W_pack|baichuan|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-13B-Chat](https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat)|\\n|baichuan2-13b-chat-int4|[baichuan-inc/Baichuan2-13B-Chat-4bits](https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Chat-4bits/summary)|W_pack|baichuan|&#x2718;|&#x2718;|&#x2718;|&#x2718;|bitsandbytes<0.41.2, accelerate<0.26|-|[baichuan-inc/Baichuan2-13B-Chat-4bits](https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat-4bits)|\\n|yuan2-2b-instruct|[YuanLLM/Yuan2.0-2B-hf](https://modelscope.cn/models/YuanLLM/Yuan2.0-2B-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-2B-hf](https://huggingface.co/IEITYuan/Yuan2-2B-hf)|\\n|yuan2-2b-janus-instruct|[YuanLLM/Yuan2-2B-Janus-hf](https://modelscope.cn/models/YuanLLM/Yuan2-2B-Janus-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-2B-Janus-hf](https://huggingface.co/IEITYuan/Yuan2-2B-Janus-hf)|\\n|yuan2-51b-instruct|[YuanLLM/Yuan2.0-51B-hf](https://modelscope.cn/models/YuanLLM/Yuan2.0-51B-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-51B-hf](https://huggingface.co/IEITYuan/Yuan2-51B-hf)|\\n|yuan2-102b-instruct|[YuanLLM/Yuan2.0-102B-hf](https://modelscope.cn/models/YuanLLM/Yuan2.0-102B-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-102B-hf](https://huggingface.co/IEITYuan/Yuan2-102B-hf)|\\n|yuan2-m32|[YuanLLM/Yuan2-M32-hf](https://modelscope.cn/models/YuanLLM/Yuan2-M32-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||moe|[IEITYuan/Yuan2-M32-hf](https://huggingface.co/IEITYuan/Yuan2-M32-hf)|\\n|xverse-7b|[xverse/XVERSE-7B](https://modelscope.cn/models/xverse/XVERSE-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-7B](https://huggingface.co/xverse/XVERSE-7B)|\\n|xverse-7b-chat|[xverse/XVERSE-7B-Chat](https://modelscope.cn/models/xverse/XVERSE-7B-Chat/summary)|q_proj, k_proj, v_proj|xverse|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-7B-Chat](https://huggingface.co/xverse/XVERSE-7B-Chat)|\\n|xverse-13b|[xverse/XVERSE-13B](https://modelscope.cn/models/xverse/XVERSE-13B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-13B](https://huggingface.co/xverse/XVERSE-13B)|\\n|xverse-13b-chat|[xverse/XVERSE-13B-Chat](https://modelscope.cn/models/xverse/XVERSE-13B-Chat/summary)|q_proj, k_proj, v_proj|xverse|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-13B-Chat](https://huggingface.co/xverse/XVERSE-13B-Chat)|\\n|xverse-65b|[xverse/XVERSE-65B](https://modelscope.cn/models/xverse/XVERSE-65B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-65B](https://huggingface.co/xverse/XVERSE-65B)|\\n|xverse-65b-v2|[xverse/XVERSE-65B-2](https://modelscope.cn/models/xverse/XVERSE-65B-2/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-65B-2](https://huggingface.co/xverse/XVERSE-65B-2)|\\n|xverse-65b-chat|[xverse/XVERSE-65B-Chat](https://modelscope.cn/models/xverse/XVERSE-65B-Chat/summary)|q_proj, k_proj, v_proj|xverse|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-65B-Chat](https://huggingface.co/xverse/XVERSE-65B-Chat)|\\n|xverse-13b-256k|[xverse/XVERSE-13B-256K](https://modelscope.cn/models/xverse/XVERSE-13B-256K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-13B-256K](https://huggingface.co/xverse/XVERSE-13B-256K)|\\n|xverse-moe-a4_2b|[xverse/XVERSE-MoE-A4.2B](https://modelscope.cn/models/xverse/XVERSE-MoE-A4.2B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||moe|[xverse/XVERSE-MoE-A4.2B](https://huggingface.co/xverse/XVERSE-MoE-A4.2B)|\\n|orion-14b|[OrionStarAI/Orion-14B-Base](https://modelscope.cn/models/OrionStarAI/Orion-14B-Base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[OrionStarAI/Orion-14B-Base](https://huggingface.co/OrionStarAI/Orion-14B-Base)|\\n|orion-14b-chat|[OrionStarAI/Orion-14B-Chat](https://modelscope.cn/models/OrionStarAI/Orion-14B-Chat/summary)|q_proj, k_proj, v_proj|orion|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[OrionStarAI/Orion-14B-Chat](https://huggingface.co/OrionStarAI/Orion-14B-Chat)|\\n|bluelm-7b|[vivo-ai/BlueLM-7B-Base](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Base](https://huggingface.co/vivo-ai/BlueLM-7B-Base)|\\n|bluelm-7b-32k|[vivo-ai/BlueLM-7B-Base-32K](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Base-32K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Base-32K](https://huggingface.co/vivo-ai/BlueLM-7B-Base-32K)|\\n|bluelm-7b-chat|[vivo-ai/BlueLM-7B-Chat](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Chat/summary)|q_proj, k_proj, v_proj|bluelm|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Chat](https://huggingface.co/vivo-ai/BlueLM-7B-Chat)|\\n|bluelm-7b-chat-32k|[vivo-ai/BlueLM-7B-Chat-32K](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Chat-32K/summary)|q_proj, k_proj, v_proj|bluelm|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Chat-32K](https://huggingface.co/vivo-ai/BlueLM-7B-Chat-32K)|\\n|ziya2-13b|[Fengshenbang/Ziya2-13B-Base](https://modelscope.cn/models/Fengshenbang/Ziya2-13B-Base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[IDEA-CCNL/Ziya2-13B-Base](https://huggingface.co/IDEA-CCNL/Ziya2-13B-Base)|\\n|ziya2-13b-chat|[Fengshenbang/Ziya2-13B-Chat](https://modelscope.cn/models/Fengshenbang/Ziya2-13B-Chat/summary)|q_proj, k_proj, v_proj|ziya|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[IDEA-CCNL/Ziya2-13B-Chat](https://huggingface.co/IDEA-CCNL/Ziya2-13B-Chat)|\\n|skywork-13b|[skywork/Skywork-13B-base](https://modelscope.cn/models/skywork/Skywork-13B-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[Skywork/Skywork-13B-base](https://huggingface.co/Skywork/Skywork-13B-base)|\\n|skywork-13b-chat|[skywork/Skywork-13B-chat](https://modelscope.cn/models/skywork/Skywork-13B-chat/summary)|q_proj, k_proj, v_proj|skywork|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|-|\\n|zephyr-7b-beta-chat|[modelscope/zephyr-7b-beta](https://modelscope.cn/models/modelscope/zephyr-7b-beta/summary)|q_proj, k_proj, v_proj|zephyr|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[HuggingFaceH4/zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta)|\\n|polylm-13b|[damo/nlp_polylm_13b_text_generation](https://modelscope.cn/models/damo/nlp_polylm_13b_text_generation/summary)|c_attn|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[DAMO-NLP-MT/polylm-13b](https://huggingface.co/DAMO-NLP-MT/polylm-13b)|\\n|seqgpt-560m|[damo/nlp_seqgpt-560m](https://modelscope.cn/models/damo/nlp_seqgpt-560m/summary)|query_key_value|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[DAMO-NLP/SeqGPT-560M](https://huggingface.co/DAMO-NLP/SeqGPT-560M)|\\n|sus-34b-chat|[SUSTC/SUS-Chat-34B](https://modelscope.cn/models/SUSTC/SUS-Chat-34B/summary)|q_proj, k_proj, v_proj|sus|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[SUSTech/SUS-Chat-34B](https://huggingface.co/SUSTech/SUS-Chat-34B)|\\n|tongyi-finance-14b|[TongyiFinance/Tongyi-Finance-14B](https://modelscope.cn/models/TongyiFinance/Tongyi-Finance-14B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||financial|-|\\n|tongyi-finance-14b-chat|[TongyiFinance/Tongyi-Finance-14B-Chat](https://modelscope.cn/models/TongyiFinance/Tongyi-Finance-14B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||financial|[jxy/Tongyi-Finance-14B-Chat](https://huggingface.co/jxy/Tongyi-Finance-14B-Chat)|\\n|tongyi-finance-14b-chat-int4|[TongyiFinance/Tongyi-Finance-14B-Chat-Int4](https://modelscope.cn/models/TongyiFinance/Tongyi-Finance-14B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|financial|[jxy/Tongyi-Finance-14B-Chat-Int4](https://huggingface.co/jxy/Tongyi-Finance-14B-Chat-Int4)|\\n|codefuse-codellama-34b-chat|[codefuse-ai/CodeFuse-CodeLlama-34B](https://modelscope.cn/models/codefuse-ai/CodeFuse-CodeLlama-34B/summary)|q_proj, k_proj, v_proj|codefuse-codellama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[codefuse-ai/CodeFuse-CodeLlama-34B](https://huggingface.co/codefuse-ai/CodeFuse-CodeLlama-34B)|\\n|codefuse-codegeex2-6b-chat|[codefuse-ai/CodeFuse-CodeGeeX2-6B](https://modelscope.cn/models/codefuse-ai/CodeFuse-CodeGeeX2-6B/summary)|query_key_value|codefuse|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.34|coding|[codefuse-ai/CodeFuse-CodeGeeX2-6B](https://huggingface.co/codefuse-ai/CodeFuse-CodeGeeX2-6B)|\\n|codefuse-qwen-14b-chat|[codefuse-ai/CodeFuse-QWen-14B](https://modelscope.cn/models/codefuse-ai/CodeFuse-QWen-14B/summary)|c_attn|codefuse|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[codefuse-ai/CodeFuse-QWen-14B](https://huggingface.co/codefuse-ai/CodeFuse-QWen-14B)|\\n|phi2-3b|[AI-ModelScope/phi-2](https://modelscope.cn/models/AI-ModelScope/phi-2/summary)|Wqkv|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;||coding|[microsoft/phi-2](https://huggingface.co/microsoft/phi-2)|\\n|phi3-4b-4k-instruct|[LLM-Research/Phi-3-mini-4k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-mini-4k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-mini-4k-instruct](https://huggingface.co/microsoft/Phi-3-mini-4k-instruct)|\\n|phi3-4b-128k-instruct|[LLM-Research/Phi-3-mini-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-mini-128k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-mini-128k-instruct](https://huggingface.co/microsoft/Phi-3-mini-128k-instruct)|\\n|phi3-small-8k-instruct|[LLM-Research/Phi-3-small-8k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-small-8k-instruct/summary)|query_key_value|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-small-8k-instruct](https://huggingface.co/microsoft/Phi-3-small-8k-instruct)|\\n|phi3-medium-4k-instruct|[LLM-Research/Phi-3-medium-4k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-medium-4k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-medium-4k-instruct](https://huggingface.co/microsoft/Phi-3-medium-4k-instruct)|\\n|phi3-small-128k-instruct|[LLM-Research/Phi-3-small-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-small-128k-instruct/summary)|query_key_value|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-small-128k-instruct](https://huggingface.co/microsoft/Phi-3-small-128k-instruct)|\\n|phi3-medium-128k-instruct|[LLM-Research/Phi-3-medium-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-medium-128k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-medium-128k-instruct](https://huggingface.co/microsoft/Phi-3-medium-128k-instruct)|\\n|phi3_5-mini-instruct|[LLM-Research/Phi-3.5-mini-instruct](https://modelscope.cn/models/LLM-Research/Phi-3.5-mini-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3.5-mini-instruct](https://huggingface.co/microsoft/Phi-3.5-mini-instruct)|\\n|phi3_5-moe-instruct|[LLM-Research/Phi-3.5-MoE-instruct](https://modelscope.cn/models/LLM-Research/Phi-3.5-MoE-instruct/summary)|q_proj, k_proj, v_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[microsoft/Phi-3.5-MoE-instruct](https://huggingface.co/microsoft/Phi-3.5-MoE-instruct)|\\n|mamba-130m|[AI-ModelScope/mamba-130m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-130m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-130m-hf](https://huggingface.co/state-spaces/mamba-130m-hf)|\\n|mamba-370m|[AI-ModelScope/mamba-370m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-370m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-370m-hf](https://huggingface.co/state-spaces/mamba-370m-hf)|\\n|mamba-390m|[AI-ModelScope/mamba-390m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-390m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-390m-hf](https://huggingface.co/state-spaces/mamba-390m-hf)|\\n|mamba-790m|[AI-ModelScope/mamba-790m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-790m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-790m-hf](https://huggingface.co/state-spaces/mamba-790m-hf)|\\n|mamba-1.4b|[AI-ModelScope/mamba-1.4b-hf](https://modelscope.cn/models/AI-ModelScope/mamba-1.4b-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-1.4b-hf](https://huggingface.co/state-spaces/mamba-1.4b-hf)|\\n|mamba-2.8b|[AI-ModelScope/mamba-2.8b-hf](https://modelscope.cn/models/AI-ModelScope/mamba-2.8b-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-2.8b-hf](https://huggingface.co/state-spaces/mamba-2.8b-hf)|\\n|telechat-7b|[TeleAI/TeleChat-7B](https://modelscope.cn/models/TeleAI/TeleChat-7B/summary)|key_value, query|telechat|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[Tele-AI/telechat-7B](https://huggingface.co/Tele-AI/telechat-7B)|\\n|telechat-12b|[TeleAI/TeleChat-12B](https://modelscope.cn/models/TeleAI/TeleChat-12B/summary)|key_value, query|telechat|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[Tele-AI/TeleChat-12B](https://huggingface.co/Tele-AI/TeleChat-12B)|\\n|telechat-12b-v2|[TeleAI/TeleChat-12B-v2](https://modelscope.cn/models/TeleAI/TeleChat-12B-v2/summary)|key_value, query|telechat-v2|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[Tele-AI/TeleChat-12B-v2](https://huggingface.co/Tele-AI/TeleChat-12B-v2)|\\n|telechat-12b-v2-gptq-int4|[swift/TeleChat-12B-V2-GPTQ-Int4](https://modelscope.cn/models/swift/TeleChat-12B-V2-GPTQ-Int4/summary)|key_value, query|telechat-v2|&#x2714;|&#x2718;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|-|\\n|grok-1|[colossalai/grok-1-pytorch](https://modelscope.cn/models/colossalai/grok-1-pytorch/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[hpcai-tech/grok-1](https://huggingface.co/hpcai-tech/grok-1)|\\n|dbrx-instruct|[AI-ModelScope/dbrx-instruct](https://modelscope.cn/models/AI-ModelScope/dbrx-instruct/summary)|attn.Wqkv|dbrx|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[databricks/dbrx-instruct](https://huggingface.co/databricks/dbrx-instruct)|\\n|dbrx-base|[AI-ModelScope/dbrx-base](https://modelscope.cn/models/AI-ModelScope/dbrx-base/summary)|attn.Wqkv|dbrx|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[databricks/dbrx-base](https://huggingface.co/databricks/dbrx-base)|\\n|mengzi3-13b-base|[langboat/Mengzi3-13B-Base](https://modelscope.cn/models/langboat/Mengzi3-13B-Base/summary)|q_proj, k_proj, v_proj|mengzi|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[Langboat/Mengzi3-13B-Base](https://huggingface.co/Langboat/Mengzi3-13B-Base)|\\n|c4ai-command-r-v01|[AI-ModelScope/c4ai-command-r-v01](https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-v01/summary)|q_proj, k_proj, v_proj|c4ai|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.1|-|[CohereForAI/c4ai-command-r-v01](https://huggingface.co/CohereForAI/c4ai-command-r-v01)|\\n|c4ai-command-r-plus|[AI-ModelScope/c4ai-command-r-plus](https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-plus/summary)|q_proj, k_proj, v_proj|c4ai|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>4.39|-|[CohereForAI/c4ai-command-r-plus](https://huggingface.co/CohereForAI/c4ai-command-r-plus)|\\n|codestral-22b|[swift/Codestral-22B-v0.1](https://modelscope.cn/models/swift/Codestral-22B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.34|-|[mistralai/Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1)|\\n\\n\\n### MLLM\\n| Model Type | Model ID | Default Lora Target Modules | Default Template | Support Flash Attn | Support vLLM | Support LMDeploy | Support Megatron | Requires | Tags | HF Model ID |\\n| ---------  | -------- | --------------------------- | ---------------- | ------------------ | ------------ | ---------------- | ---------------- | -------- | ---- | ----------- |\\n|qwen-vl|[qwen/Qwen-VL](https://modelscope.cn/models/qwen/Qwen-VL/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-vl-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||vision|[Qwen/Qwen-VL](https://huggingface.co/Qwen/Qwen-VL)|\\n|qwen-vl-chat|[qwen/Qwen-VL-Chat](https://modelscope.cn/models/qwen/Qwen-VL-Chat/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-vl|&#x2714;|&#x2714;|&#x2714;|&#x2718;||vision|[Qwen/Qwen-VL-Chat](https://huggingface.co/Qwen/Qwen-VL-Chat)|\\n|qwen-vl-chat-int4|[qwen/Qwen-VL-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-VL-Chat-Int4/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|vision|[Qwen/Qwen-VL-Chat-Int4](https://huggingface.co/Qwen/Qwen-VL-Chat-Int4)|\\n|qwen-audio|[qwen/Qwen-Audio](https://modelscope.cn/models/qwen/Qwen-Audio/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-audio-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;||audio|[Qwen/Qwen-Audio](https://huggingface.co/Qwen/Qwen-Audio)|\\n|qwen-audio-chat|[qwen/Qwen-Audio-Chat](https://modelscope.cn/models/qwen/Qwen-Audio-Chat/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-audio|&#x2714;|&#x2718;|&#x2718;|&#x2718;||audio|[Qwen/Qwen-Audio-Chat](https://huggingface.co/Qwen/Qwen-Audio-Chat)|\\n|qwen2-audio-7b|[qwen/Qwen2-Audio-7B](https://modelscope.cn/models/qwen/Qwen2-Audio-7B/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-audio-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;|librosa, transformers>=4.45|audio|[Qwen/Qwen2-Audio-7B](https://huggingface.co/Qwen/Qwen2-Audio-7B)|\\n|qwen2-audio-7b-instruct|[qwen/Qwen2-Audio-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Audio-7B-Instruct/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-audio|&#x2714;|&#x2718;|&#x2718;|&#x2718;|librosa, transformers>=4.45|audio|[Qwen/Qwen2-Audio-7B-Instruct](https://huggingface.co/Qwen/Qwen2-Audio-7B-Instruct)|\\n|qwen2-vl-2b|[qwen/Qwen2-VL-2B](https://modelscope.cn/models/qwen/Qwen2-VL-2B/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-2B](https://huggingface.co/Qwen/Qwen2-VL-2B)|\\n|qwen2-vl-2b-instruct|[qwen/Qwen2-VL-2B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-2B-Instruct](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct)|\\n|qwen2-vl-2b-instruct-gptq-int4|[qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4)|\\n|qwen2-vl-2b-instruct-gptq-int8|[qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8)|\\n|qwen2-vl-2b-instruct-awq|[qwen/Qwen2-VL-2B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct-AWQ/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, autoawq|vision, video|[Qwen/Qwen2-VL-2B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-AWQ)|\\n|qwen2-vl-7b|[qwen/Qwen2-VL-7B](https://modelscope.cn/models/qwen/Qwen2-VL-7B/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-7B](https://huggingface.co/Qwen/Qwen2-VL-7B)|\\n|qwen2-vl-7b-instruct|[qwen/Qwen2-VL-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-7B-Instruct](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct)|\\n|qwen2-vl-7b-instruct-gptq-int4|[qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4)|\\n|qwen2-vl-7b-instruct-gptq-int8|[qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8)|\\n|qwen2-vl-7b-instruct-awq|[qwen/Qwen2-VL-7B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct-AWQ/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, autoawq|vision, video|[Qwen/Qwen2-VL-7B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct-AWQ)|\\n|qwen2-vl-72b|[qwen/Qwen2-VL-72B](https://modelscope.cn/models/qwen/Qwen2-VL-72B/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-72B](https://huggingface.co/Qwen/Qwen2-VL-72B)|\\n|qwen2-vl-72b-instruct|[qwen/Qwen2-VL-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-72B-Instruct](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct)|\\n|qwen2-vl-72b-instruct-gptq-int4|[qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4)|\\n|qwen2-vl-72b-instruct-gptq-int8|[qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8)|\\n|qwen2-vl-72b-instruct-awq|[qwen/Qwen2-VL-72B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct-AWQ/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, autoawq|vision, video|[Qwen/Qwen2-VL-72B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-AWQ)|\\n|glm4v-9b-chat|[ZhipuAI/glm-4v-9b](https://modelscope.cn/models/ZhipuAI/glm-4v-9b/summary)|^(transformer.encoder)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|glm4v|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.42|vision|[THUDM/glm-4v-9b](https://huggingface.co/THUDM/glm-4v-9b)|\\n|llama3_2-11b-vision|[LLM-Research/Llama-3.2-11B-Vision](https://modelscope.cn/models/LLM-Research/Llama-3.2-11B-Vision/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-11B-Vision](https://huggingface.co/meta-llama/Llama-3.2-11B-Vision)|\\n|llama3_2-11b-vision-instruct|[LLM-Research/Llama-3.2-11B-Vision-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-11B-Vision-Instruct/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-11B-Vision-Instruct](https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct)|\\n|llama3_2-90b-vision|[LLM-Research/Llama-3.2-90B-Vision](https://modelscope.cn/models/LLM-Research/Llama-3.2-90B-Vision/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-90B-Vision](https://huggingface.co/meta-llama/Llama-3.2-90B-Vision)|\\n|llama3_2-90b-vision-instruct|[LLM-Research/Llama-3.2-90B-Vision-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-90B-Vision-Instruct/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-90B-Vision-Instruct](https://huggingface.co/meta-llama/Llama-3.2-90B-Vision-Instruct)|\\n|llama3_1-8b-omni|[ICTNLP/Llama-3.1-8B-Omni](https://modelscope.cn/models/ICTNLP/Llama-3.1-8B-Omni/summary)|^(model.layers\\\\|model.speech_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_1-omni|&#x2714;|&#x2718;|&#x2718;|&#x2718;|whisper, openai-whisper|audio|[ICTNLP/Llama-3.1-8B-Omni](https://huggingface.co/ICTNLP/Llama-3.1-8B-Omni)|\\n|idefics3-8b-llama3|[AI-ModelScope/Idefics3-8B-Llama3](https://modelscope.cn/models/AI-ModelScope/Idefics3-8B-Llama3/summary)|^(model.text_model\\\\|model.connector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|idefics3|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision|[HuggingFaceM4/Idefics3-8B-Llama3](https://huggingface.co/HuggingFaceM4/Idefics3-8B-Llama3)|\\n|llava1_5-7b-instruct|[swift/llava-1.5-7b-hf](https://modelscope.cn/models/swift/llava-1.5-7b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava1_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[llava-hf/llava-1.5-7b-hf](https://huggingface.co/llava-hf/llava-1.5-7b-hf)|\\n|llava1_5-13b-instruct|[swift/llava-1.5-13b-hf](https://modelscope.cn/models/swift/llava-1.5-13b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava1_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[llava-hf/llava-1.5-13b-hf](https://huggingface.co/llava-hf/llava-1.5-13b-hf)|\\n|llava1_6-mistral-7b-instruct|[swift/llava-v1.6-mistral-7b-hf](https://modelscope.cn/models/swift/llava-v1.6-mistral-7b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-mistral|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-mistral-7b-hf](https://huggingface.co/llava-hf/llava-v1.6-mistral-7b-hf)|\\n|llava1_6-vicuna-7b-instruct|[swift/llava-v1.6-vicuna-7b-hf](https://modelscope.cn/models/swift/llava-v1.6-vicuna-7b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-vicuna|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-vicuna-7b-hf](https://huggingface.co/llava-hf/llava-v1.6-vicuna-7b-hf)|\\n|llava1_6-vicuna-13b-instruct|[swift/llava-v1.6-vicuna-13b-hf](https://modelscope.cn/models/swift/llava-v1.6-vicuna-13b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-vicuna|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-vicuna-13b-hf](https://huggingface.co/llava-hf/llava-v1.6-vicuna-13b-hf)|\\n|llava1_6-llama3_1-8b-instruct|[DaozeZhang/llava-llama3.1-8b](https://modelscope.cn/models/DaozeZhang/llava-llama3.1-8b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-llama3|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.41|vision|-|\\n|llava1_6-yi-34b-instruct|[swift/llava-v1.6-34b-hf](https://modelscope.cn/models/swift/llava-v1.6-34b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-yi|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-34b-hf](https://huggingface.co/llava-hf/llava-v1.6-34b-hf)|\\n|llama3-llava-next-8b-hf|[swift/llama3-llava-next-8b-hf](https://modelscope.cn/models/swift/llama3-llava-next-8b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama-llava-next-hf|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llama3-llava-next-8b-hf](https://huggingface.co/llava-hf/llama3-llava-next-8b-hf)|\\n|llava-next-72b-hf|[AI-ModelScope/llava-next-72b-hf](https://modelscope.cn/models/AI-ModelScope/llava-next-72b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama-qwen-hf|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-next-72b-hf](https://huggingface.co/llava-hf/llava-next-72b-hf)|\\n|llava-next-110b-hf|[AI-ModelScope/llava-next-110b-hf](https://modelscope.cn/models/AI-ModelScope/llava-next-110b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama-qwen-hf|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-next-110b-hf](https://huggingface.co/llava-hf/llava-next-110b-hf)|\\n|llava-onevision-qwen2-0_5b-ov|[AI-ModelScope/llava-onevision-qwen2-0.5b-ov-hf](https://modelscope.cn/models/AI-ModelScope/llava-onevision-qwen2-0.5b-ov-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-onevision-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision, video|[llava-hf/llava-onevision-qwen2-0.5b-ov-hf](https://huggingface.co/llava-hf/llava-onevision-qwen2-0.5b-ov-hf)|\\n|llava-onevision-qwen2-7b-ov|[AI-ModelScope/llava-onevision-qwen2-7b-ov-hf](https://modelscope.cn/models/AI-ModelScope/llava-onevision-qwen2-7b-ov-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-onevision-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision, video|[llava-hf/llava-onevision-qwen2-7b-ov-hf](https://huggingface.co/llava-hf/llava-onevision-qwen2-7b-ov-hf)|\\n|llava-onevision-qwen2-72b-ov|[AI-ModelScope/llava-onevision-qwen2-72b-ov-hf](https://modelscope.cn/models/AI-ModelScope/llava-onevision-qwen2-72b-ov-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-onevision-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision, video|[llava-hf/llava-onevision-qwen2-72b-ov-hf](https://huggingface.co/llava-hf/llava-onevision-qwen2-72b-ov-hf)|\\n|llama3-llava-next-8b|[AI-Modelscope/llama3-llava-next-8b](https://modelscope.cn/models/AI-Modelscope/llama3-llava-next-8b/summary)|^(model.layers\\\\|model.mm_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3-llava-next|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[lmms-lab/llama3-llava-next-8b](https://huggingface.co/lmms-lab/llama3-llava-next-8b)|\\n|llava-next-72b|[AI-Modelscope/llava-next-72b](https://modelscope.cn/models/AI-Modelscope/llava-next-72b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[lmms-lab/llava-next-72b](https://huggingface.co/lmms-lab/llava-next-72b)|\\n|llava-next-110b|[AI-Modelscope/llava-next-110b](https://modelscope.cn/models/AI-Modelscope/llava-next-110b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[lmms-lab/llava-next-110b](https://huggingface.co/lmms-lab/llava-next-110b)|\\n|llava-next-video-7b-instruct|[swift/LLaVA-NeXT-Video-7B-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-7B-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-7B-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-7B-hf)|\\n|llava-next-video-7b-32k-instruct|[swift/LLaVA-NeXT-Video-7B-32K-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-7B-32K-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-7B-32K-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-7B-32K-hf)|\\n|llava-next-video-7b-dpo-instruct|[swift/LLaVA-NeXT-Video-7B-DPO-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-7B-DPO-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-7B-DPO-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-7B-DPO-hf)|\\n|llava-next-video-34b-instruct|[swift/LLaVA-NeXT-Video-34B-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-34B-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video-yi|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-34B-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-34B-hf)|\\n|yi-vl-6b-chat|[01ai/Yi-VL-6B](https://modelscope.cn/models/01ai/Yi-VL-6B/summary)|^(model.layers\\\\|model.mm_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|yi-vl|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.34|vision|[01-ai/Yi-VL-6B](https://huggingface.co/01-ai/Yi-VL-6B)|\\n|yi-vl-34b-chat|[01ai/Yi-VL-34B](https://modelscope.cn/models/01ai/Yi-VL-34B/summary)|^(model.layers\\\\|model.mm_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|yi-vl|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.34|vision|[01-ai/Yi-VL-34B](https://huggingface.co/01-ai/Yi-VL-34B)|\\n|llava-llama3-8b-v1_1|[AI-ModelScope/llava-llama-3-8b-v1_1-transformers](https://modelscope.cn/models/AI-ModelScope/llava-llama-3-8b-v1_1-transformers/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-llama-instruct|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[xtuner/llava-llama-3-8b-v1_1-transformers](https://huggingface.co/xtuner/llava-llama-3-8b-v1_1-transformers)|\\n|internlm-xcomposer2-7b-chat|[Shanghai_AI_Laboratory/internlm-xcomposer2-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2-7b/summary)|attention.wqkv, attention.wo, feed_forward.w1, feed_forward.w2, feed_forward.w3|internlm-xcomposer2|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[internlm/internlm-xcomposer2-7b](https://huggingface.co/internlm/internlm-xcomposer2-7b)|\\n|internlm-xcomposer2-4khd-7b-chat|[Shanghai_AI_Laboratory/internlm-xcomposer2-4khd-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2-4khd-7b/summary)|attention.wqkv, attention.wo, feed_forward.w1, feed_forward.w2, feed_forward.w3|internlm-xcomposer2-4khd|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[internlm/internlm-xcomposer2-4khd-7b](https://huggingface.co/internlm/internlm-xcomposer2-4khd-7b)|\\n|internlm-xcomposer2_5-7b-chat|[Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b/summary)|attention.wqkv, attention.wo, feed_forward.w1, feed_forward.w2, feed_forward.w3|internlm-xcomposer2_5|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[internlm/internlm-xcomposer2d5-7b](https://huggingface.co/internlm/internlm-xcomposer2d5-7b)|\\n|internvl-chat-v1_5|[AI-ModelScope/InternVL-Chat-V1-5](https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.35, timm|vision|[OpenGVLab/InternVL-Chat-V1-5](https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5)|\\n|internvl-chat-v1_5-int8|[AI-ModelScope/InternVL-Chat-V1-5-int8](https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-int8/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.35, timm|vision|[OpenGVLab/InternVL-Chat-V1-5-int8](https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5-int8)|\\n|mini-internvl-chat-2b-v1_5|[OpenGVLab/Mini-InternVL-Chat-2B-V1-5](https://modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-2B-V1-5/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.35, timm|vision|[OpenGVLab/Mini-InternVL-Chat-2B-V1-5](https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-2B-V1-5)|\\n|mini-internvl-chat-4b-v1_5|[OpenGVLab/Mini-InternVL-Chat-4B-V1-5](https://modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-4B-V1-5/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl-phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.35,<4.42, timm|vision|[OpenGVLab/Mini-InternVL-Chat-4B-V1-5](https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-4B-V1-5)|\\n|internvl2-1b|[OpenGVLab/InternVL2-1B](https://modelscope.cn/models/OpenGVLab/InternVL2-1B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-1B](https://huggingface.co/OpenGVLab/InternVL2-1B)|\\n|internvl2-2b|[OpenGVLab/InternVL2-2B](https://modelscope.cn/models/OpenGVLab/InternVL2-2B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-2B](https://huggingface.co/OpenGVLab/InternVL2-2B)|\\n|internvl2-4b|[OpenGVLab/InternVL2-4B](https://modelscope.cn/models/OpenGVLab/InternVL2-4B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2-phi3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36,<4.42, timm|vision, video|[OpenGVLab/InternVL2-4B](https://huggingface.co/OpenGVLab/InternVL2-4B)|\\n|internvl2-8b|[OpenGVLab/InternVL2-8B](https://modelscope.cn/models/OpenGVLab/InternVL2-8B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-8B](https://huggingface.co/OpenGVLab/InternVL2-8B)|\\n|internvl2-26b|[OpenGVLab/InternVL2-26B](https://modelscope.cn/models/OpenGVLab/InternVL2-26B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-26B](https://huggingface.co/OpenGVLab/InternVL2-26B)|\\n|internvl2-40b|[OpenGVLab/InternVL2-40B](https://modelscope.cn/models/OpenGVLab/InternVL2-40B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-40B](https://huggingface.co/OpenGVLab/InternVL2-40B)|\\n|internvl2-llama3-76b|[OpenGVLab/InternVL2-Llama3-76B](https://modelscope.cn/models/OpenGVLab/InternVL2-Llama3-76B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-Llama3-76B](https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B)|\\n|internvl2-2b-awq|[OpenGVLab/InternVL2-2B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-2B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-2B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-2B-AWQ)|\\n|internvl2-8b-awq|[OpenGVLab/InternVL2-8B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-8B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-8B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-8B-AWQ)|\\n|internvl2-26b-awq|[OpenGVLab/InternVL2-26B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-26B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-26B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-26B-AWQ)|\\n|internvl2-40b-awq|[OpenGVLab/InternVL2-40B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-40B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-40B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-40B-AWQ)|\\n|internvl2-llama3-76b-awq|[OpenGVLab/InternVL2-Llama3-76B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-Llama3-76B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-Llama3-76B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B-AWQ)|\\n|deepseek-vl-1_3b-chat|[deepseek-ai/deepseek-vl-1.3b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-vl-1.3b-chat/summary)|^(language_model\\\\|aligner)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|deepseek-vl|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[deepseek-ai/deepseek-vl-1.3b-chat](https://huggingface.co/deepseek-ai/deepseek-vl-1.3b-chat)|\\n|deepseek-vl-7b-chat|[deepseek-ai/deepseek-vl-7b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-vl-7b-chat/summary)|^(language_model\\\\|aligner)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|deepseek-vl|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[deepseek-ai/deepseek-vl-7b-chat](https://huggingface.co/deepseek-ai/deepseek-vl-7b-chat)|\\n|paligemma-3b-pt-224|[AI-ModelScope/paligemma-3b-pt-224](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-pt-224/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-pt-224](https://huggingface.co/google/paligemma-3b-pt-224)|\\n|paligemma-3b-pt-448|[AI-ModelScope/paligemma-3b-pt-448](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-pt-448/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-pt-448](https://huggingface.co/google/paligemma-3b-pt-448)|\\n|paligemma-3b-pt-896|[AI-ModelScope/paligemma-3b-pt-896](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-pt-896/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-pt-896](https://huggingface.co/google/paligemma-3b-pt-896)|\\n|paligemma-3b-mix-224|[AI-ModelScope/paligemma-3b-mix-224](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-mix-224/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-mix-224](https://huggingface.co/google/paligemma-3b-mix-224)|\\n|paligemma-3b-mix-448|[AI-ModelScope/paligemma-3b-mix-448](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-mix-448/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-mix-448](https://huggingface.co/google/paligemma-3b-mix-448)|\\n|minicpm-v-3b-chat|[OpenBMB/MiniCPM-V](https://modelscope.cn/models/OpenBMB/MiniCPM-V/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v|&#x2714;|&#x2718;|&#x2718;|&#x2718;|timm, transformers<4.42|vision|[openbmb/MiniCPM-V](https://huggingface.co/openbmb/MiniCPM-V)|\\n|minicpm-v-v2-chat|[OpenBMB/MiniCPM-V-2](https://modelscope.cn/models/OpenBMB/MiniCPM-V-2/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v|&#x2714;|&#x2718;|&#x2718;|&#x2718;|timm, transformers<4.42|vision|[openbmb/MiniCPM-V-2](https://huggingface.co/openbmb/MiniCPM-V-2)|\\n|minicpm-v-v2_5-chat|[OpenBMB/MiniCPM-Llama3-V-2_5](https://modelscope.cn/models/OpenBMB/MiniCPM-Llama3-V-2_5/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v-v2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|timm, transformers>=4.36|vision|[openbmb/MiniCPM-Llama3-V-2_5](https://huggingface.co/openbmb/MiniCPM-Llama3-V-2_5)|\\n|minicpm-v-v2_6-chat|[OpenBMB/MiniCPM-V-2_6](https://modelscope.cn/models/OpenBMB/MiniCPM-V-2_6/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v-v2_6|&#x2714;|&#x2714;|&#x2718;|&#x2718;|timm, transformers>=4.36|vision, video|[openbmb/MiniCPM-V-2_6](https://huggingface.co/openbmb/MiniCPM-V-2_6)|\\n|pixtral-12b|[AI-ModelScope/pixtral-12b](https://modelscope.cn/models/AI-ModelScope/pixtral-12b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|pixtral|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision|[mistral-community/pixtral-12b](https://huggingface.co/mistral-community/pixtral-12b)|\\n|mplug-owl2-chat|[iic/mPLUG-Owl2](https://modelscope.cn/models/iic/mPLUG-Owl2/summary)|q_proj, k_proj.multiway.0, k_proj.multiway.1, v_proj.multiway.0, v_proj.multiway.1|mplug-owl2|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers<4.35, icecream|vision|[MAGAer13/mplug-owl2-llama2-7b](https://huggingface.co/MAGAer13/mplug-owl2-llama2-7b)|\\n|mplug-owl2_1-chat|[iic/mPLUG-Owl2.1](https://modelscope.cn/models/iic/mPLUG-Owl2.1/summary)|c_attn.multiway.0, c_attn.multiway.1|mplug-owl2|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers<4.35, icecream|vision|[Mizukiluke/mplug_owl_2_1](https://huggingface.co/Mizukiluke/mplug_owl_2_1)|\\n|mplug-owl3-7b-chat|[iic/mPLUG-Owl3-7B-240728](https://modelscope.cn/models/iic/mPLUG-Owl3-7B-240728/summary)|^(language_model\\\\|vision2text_model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|mplug_owl3|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.36, icecream|vision, video|[mPLUG/mPLUG-Owl3-7B-240728](https://huggingface.co/mPLUG/mPLUG-Owl3-7B-240728)|\\n|phi3-vision-128k-instruct|[LLM-Research/Phi-3-vision-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-vision-128k-instruct/summary)|^(model.layers\\\\|model.vision_embed_tokens.img_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|phi3-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[microsoft/Phi-3-vision-128k-instruct](https://huggingface.co/microsoft/Phi-3-vision-128k-instruct)|\\n|phi3_5-vision-instruct|[LLM-Research/Phi-3.5-vision-instruct](https://modelscope.cn/models/LLM-Research/Phi-3.5-vision-instruct/summary)|^(model.layers\\\\|model.vision_embed_tokens.img_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|phi3-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[microsoft/Phi-3.5-vision-instruct](https://huggingface.co/microsoft/Phi-3.5-vision-instruct)|\\n|cogvlm-17b-chat|[ZhipuAI/cogvlm-chat](https://modelscope.cn/models/ZhipuAI/cogvlm-chat/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers<4.42|vision|[THUDM/cogvlm-chat-hf](https://huggingface.co/THUDM/cogvlm-chat-hf)|\\n|cogvlm2-19b-chat|[ZhipuAI/cogvlm2-llama3-chinese-chat-19B](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm|&#x2718;|&#x2718;|&#x2714;|&#x2718;|transformers<4.42|vision|[THUDM/cogvlm2-llama3-chinese-chat-19B](https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B)|\\n|cogvlm2-en-19b-chat|[ZhipuAI/cogvlm2-llama3-chat-19B](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chat-19B/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm|&#x2718;|&#x2718;|&#x2714;|&#x2718;|transformers<4.42|vision|[THUDM/cogvlm2-llama3-chat-19B](https://huggingface.co/THUDM/cogvlm2-llama3-chat-19B)|\\n|cogvlm2-video-13b-chat|[ZhipuAI/cogvlm2-video-llama3-chat](https://modelscope.cn/models/ZhipuAI/cogvlm2-video-llama3-chat/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm2-video|&#x2718;|&#x2718;|&#x2718;|&#x2718;|decord, pytorchvideo, transformers>=4.42|vision, video|[THUDM/cogvlm2-video-llama3-chat](https://huggingface.co/THUDM/cogvlm2-video-llama3-chat)|\\n|cogagent-18b-chat|[ZhipuAI/cogagent-chat](https://modelscope.cn/models/ZhipuAI/cogagent-chat/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogagent-chat|&#x2718;|&#x2718;|&#x2718;|&#x2718;|timm|vision|[THUDM/cogagent-chat-hf](https://huggingface.co/THUDM/cogagent-chat-hf)|\\n|cogagent-18b-instruct|[ZhipuAI/cogagent-vqa](https://modelscope.cn/models/ZhipuAI/cogagent-vqa/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogagent-instruct|&#x2718;|&#x2718;|&#x2718;|&#x2718;|timm|vision|[THUDM/cogagent-vqa-hf](https://huggingface.co/THUDM/cogagent-vqa-hf)|\\n|florence-2-base|[AI-ModelScope/Florence-2-base](https://modelscope.cn/models/AI-ModelScope/Florence-2-base/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-base](https://huggingface.co/microsoft/Florence-2-base)|\\n|florence-2-base-ft|[AI-ModelScope/Florence-2-base-ft](https://modelscope.cn/models/AI-ModelScope/Florence-2-base-ft/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-base-ft](https://huggingface.co/microsoft/Florence-2-base-ft)|\\n|florence-2-large|[AI-ModelScope/Florence-2-large](https://modelscope.cn/models/AI-ModelScope/Florence-2-large/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-large](https://huggingface.co/microsoft/Florence-2-large)|\\n|florence-2-large-ft|[AI-ModelScope/Florence-2-large-ft](https://modelscope.cn/models/AI-ModelScope/Florence-2-large-ft/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-large-ft](https://huggingface.co/microsoft/Florence-2-large-ft)|\\n|got-ocr2|[stepfun-ai/GOT-OCR2_0](https://modelscope.cn/models/stepfun-ai/GOT-OCR2_0/summary)|^(model.layers\\\\|model.mm_projector_vary)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|got_ocr2|&#x2714;|&#x2718;|&#x2718;|&#x2718;||audio|[stepfun-ai/GOT-OCR2_0](https://huggingface.co/stepfun-ai/GOT-OCR2_0)|\\n\\n\\n## Datasets\\nThe table below introduces the datasets supported by SWIFT:\\n- Dataset Name: The dataset name registered in SWIFT.\\n- Dataset ID: The dataset id in [ModelScope](https://www.modelscope.cn/my/overview).\\n- Size: The data row count of the dataset.\\n- Statistic: Dataset statistics. We use the number of tokens for statistics, which helps adjust the max_length hyperparameter. We concatenate the training and validation sets of the dataset and then compute the statistics. We use qwen's tokenizer to tokenize the dataset. Different tokenizers produce different statistics. If you want to obtain token statistics for tokenizers of other models, you can use the script to get them yourself.\\n\\n| Dataset Name | Dataset ID | Subsets | Dataset Size | Statistic (token) | Tags | HF Dataset ID |\\n| ------------ | ---------- | ------- |------------- | ----------------- | ---- | ------------- |\\n|🔥ms-bench|[iic/ms_bench](https://modelscope.cn/datasets/iic/ms_bench/summary)||316820|346.9±443.2, min=22, max=30960|chat, general, multi-round|-|\\n|🔥alpaca-en|[AI-ModelScope/alpaca-gpt4-data-en](https://modelscope.cn/datasets/AI-ModelScope/alpaca-gpt4-data-en/summary)||52002|176.2±125.8, min=26, max=740|chat, general|[vicgalle/alpaca-gpt4](https://huggingface.co/datasets/vicgalle/alpaca-gpt4)|\\n|🔥alpaca-zh|[AI-ModelScope/alpaca-gpt4-data-zh](https://modelscope.cn/datasets/AI-ModelScope/alpaca-gpt4-data-zh/summary)||48818|162.1±93.9, min=26, max=856|chat, general|[llm-wizard/alpaca-gpt4-data-zh](https://huggingface.co/datasets/llm-wizard/alpaca-gpt4-data-zh)|\\n|multi-alpaca|[damo/nlp_polylm_multialpaca_sft](https://modelscope.cn/datasets/damo/nlp_polylm_multialpaca_sft/summary)|ar<br>de<br>es<br>fr<br>id<br>ja<br>ko<br>pt<br>ru<br>th<br>vi|131867|112.9±50.6, min=26, max=1226|chat, general, multilingual|-|\\n|instinwild|[wyj123456/instinwild](https://modelscope.cn/datasets/wyj123456/instinwild/summary)|default<br>subset|103695|145.4±60.7, min=28, max=1434|-|-|\\n|cot-en|[YorickHe/CoT](https://modelscope.cn/datasets/YorickHe/CoT/summary)||74771|122.7±64.8, min=51, max=8320|chat, general|-|\\n|cot-zh|[YorickHe/CoT_zh](https://modelscope.cn/datasets/YorickHe/CoT_zh/summary)||74771|117.5±70.8, min=43, max=9636|chat, general|-|\\n|instruct-en|[wyj123456/instruct](https://modelscope.cn/datasets/wyj123456/instruct/summary)||888970|269.1±331.5, min=26, max=7254|chat, general|-|\\n|firefly-zh|[AI-ModelScope/firefly-train-1.1M](https://modelscope.cn/datasets/AI-ModelScope/firefly-train-1.1M/summary)||1649399|178.1±260.4, min=26, max=12516|chat, general|[YeungNLP/firefly-train-1.1M](https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M)|\\n|gpt4all-en|[wyj123456/GPT4all](https://modelscope.cn/datasets/wyj123456/GPT4all/summary)||806199|302.7±384.5, min=27, max=7391|chat, general|-|\\n|sharegpt|[swift/sharegpt](https://modelscope.cn/datasets/swift/sharegpt/summary)|common-zh<br>computer-zh<br>unknow-zh<br>common-en<br>computer-en|96566|933.3±864.8, min=21, max=66412|chat, general, multi-round|-|\\n|tulu-v2-sft-mixture|[AI-ModelScope/tulu-v2-sft-mixture](https://modelscope.cn/datasets/AI-ModelScope/tulu-v2-sft-mixture/summary)||5119|520.7±437.6, min=68, max=2549|chat, multilingual, general, multi-round|[allenai/tulu-v2-sft-mixture](https://huggingface.co/datasets/allenai/tulu-v2-sft-mixture)|\\n|wikipedia-zh|[AI-ModelScope/wikipedia-cn-20230720-filtered](https://modelscope.cn/datasets/AI-ModelScope/wikipedia-cn-20230720-filtered/summary)||254547|568.4±713.2, min=37, max=78678|text-generation, general, pretrained|[pleisto/wikipedia-cn-20230720-filtered](https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered)|\\n|open-orca|[AI-ModelScope/OpenOrca](https://modelscope.cn/datasets/AI-ModelScope/OpenOrca/summary)||994896|382.3±417.4, min=31, max=8740|chat, multilingual, general|-|\\n|🔥sharegpt-gpt4|[AI-ModelScope/sharegpt_gpt4](https://modelscope.cn/datasets/AI-ModelScope/sharegpt_gpt4/summary)|default<br>V3_format<br>zh_38K_format|72684|1047.6±1313.1, min=22, max=66412|chat, multilingual, general, multi-round, gpt4|-|\\n|deepctrl-sft|[AI-ModelScope/deepctrl-sft-data](https://modelscope.cn/datasets/AI-ModelScope/deepctrl-sft-data/summary)|default<br>en|14149024|389.8±628.6, min=21, max=626237|chat, general, sft, multi-round|-|\\n|🔥coig-cqia|[AI-ModelScope/COIG-CQIA](https://modelscope.cn/datasets/AI-ModelScope/COIG-CQIA/summary)|chinese_traditional<br>coig_pc<br>exam<br>finance<br>douban<br>human_value<br>logi_qa<br>ruozhiba<br>segmentfault<br>wiki<br>wikihow<br>xhs<br>zhihu|44694|703.8±654.2, min=33, max=19288|general|-|\\n|🔥ruozhiba|[AI-ModelScope/ruozhiba](https://modelscope.cn/datasets/AI-ModelScope/ruozhiba/summary)|post-annual<br>title-good<br>title-norm|85658|39.9±13.1, min=21, max=559|pretrain|-|\\n|long-alpaca-12k|[AI-ModelScope/LongAlpaca-12k](https://modelscope.cn/datasets/AI-ModelScope/LongAlpaca-12k/summary)||11998|9619.0±8295.8, min=36, max=78925|longlora, QA|[Yukang/LongAlpaca-12k](https://huggingface.co/datasets/Yukang/LongAlpaca-12k)|\\n|lmsys-chat-1m|[AI-ModelScope/lmsys-chat-1m](https://modelscope.cn/datasets/AI-ModelScope/lmsys-chat-1m/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|chat, em|[lmsys/lmsys-chat-1m](https://huggingface.co/datasets/lmsys/lmsys-chat-1m)|\\n|🔥ms-agent|[iic/ms_agent](https://modelscope.cn/datasets/iic/ms_agent/summary)||26336|650.9±217.2, min=209, max=2740|chat, agent, multi-round|-|\\n|🔥ms-agent-for-agentfabric|[AI-ModelScope/ms_agent_for_agentfabric](https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary)|default<br>addition|30000|617.8±199.1, min=251, max=2657|chat, agent, multi-round|-|\\n|ms-agent-multirole|[iic/MSAgent-MultiRole](https://modelscope.cn/datasets/iic/MSAgent-MultiRole/summary)||9500|447.6±84.9, min=145, max=1101|chat, agent, multi-round, role-play, multi-agent|-|\\n|🔥toolbench-for-alpha-umi|[shenweizhou/alpha-umi-toolbench-processed-v2](https://modelscope.cn/datasets/shenweizhou/alpha-umi-toolbench-processed-v2/summary)|backbone<br>caller<br>planner<br>summarizer|1448337|1439.7±853.9, min=123, max=18467|chat, agent|-|\\n|damo-agent-zh|[damo/MSAgent-Bench](https://modelscope.cn/datasets/damo/MSAgent-Bench/summary)||386984|956.5±407.3, min=326, max=19001|chat, agent, multi-round|-|\\n|damo-agent-zh-mini|[damo/MSAgent-Bench](https://modelscope.cn/datasets/damo/MSAgent-Bench/summary)||20845|1326.4±329.6, min=571, max=4304|chat, agent, multi-round|-|\\n|agent-instruct-all-en|[huangjintao/AgentInstruct_copy](https://modelscope.cn/datasets/huangjintao/AgentInstruct_copy/summary)|alfworld<br>db<br>kg<br>mind2web<br>os<br>webshop|1866|1144.3±635.5, min=206, max=6412|chat, agent, multi-round|-|\\n|🔥msagent-pro|[iic/MSAgent-Pro](https://modelscope.cn/datasets/iic/MSAgent-Pro/summary)||21905|1524.5±921.3, min=64, max=16770|chat, agent, multi-round|-|\\n|toolbench|[swift/ToolBench](https://modelscope.cn/datasets/swift/ToolBench/summary)||124345|3669.5±1600.9, min=1047, max=22581|chat, agent, multi-round|-|\\n|code-alpaca-en|[wyj123456/code_alpaca_en](https://modelscope.cn/datasets/wyj123456/code_alpaca_en/summary)||20016|100.2±60.1, min=29, max=1776|-|[sahil2801/CodeAlpaca-20k](https://huggingface.co/datasets/sahil2801/CodeAlpaca-20k)|\\n|🔥leetcode-python-en|[AI-ModelScope/leetcode-solutions-python](https://modelscope.cn/datasets/AI-ModelScope/leetcode-solutions-python/summary)||2359|727.1±235.9, min=259, max=2146|chat, coding|-|\\n|🔥codefuse-python-en|[codefuse-ai/CodeExercise-Python-27k](https://modelscope.cn/datasets/codefuse-ai/CodeExercise-Python-27k/summary)||27224|483.6±193.9, min=45, max=3082|chat, coding|-|\\n|🔥codefuse-evol-instruction-zh|[codefuse-ai/Evol-instruction-66k](https://modelscope.cn/datasets/codefuse-ai/Evol-instruction-66k/summary)||66862|439.6±206.3, min=37, max=2983|chat, coding|-|\\n|medical-en|[swift/medical_zh](https://modelscope.cn/datasets/swift/medical_zh/summary)|en|117617|257.4±89.1, min=36, max=2564|chat, medical|-|\\n|medical-zh|[swift/medical_zh](https://modelscope.cn/datasets/swift/medical_zh/summary)|zh|1950972|167.2±219.7, min=26, max=27351|chat, medical|-|\\n|🔥disc-med-sft-zh|[AI-ModelScope/DISC-Med-SFT](https://modelscope.cn/datasets/AI-ModelScope/DISC-Med-SFT/summary)||441767|354.1±193.1, min=25, max=2231|chat, medical|[Flmc/DISC-Med-SFT](https://huggingface.co/datasets/Flmc/DISC-Med-SFT)|\\n|lawyer-llama-zh|[AI-ModelScope/lawyer_llama_data](https://modelscope.cn/datasets/AI-ModelScope/lawyer_llama_data/summary)||21476|194.4±91.7, min=27, max=924|chat, law|[Skepsun/lawyer_llama_data](https://huggingface.co/datasets/Skepsun/lawyer_llama_data)|\\n|tigerbot-law-zh|[AI-ModelScope/tigerbot-law-plugin](https://modelscope.cn/datasets/AI-ModelScope/tigerbot-law-plugin/summary)||55895|109.9±126.4, min=37, max=18878|text-generation, law, pretrained|[TigerResearch/tigerbot-law-plugin](https://huggingface.co/datasets/TigerResearch/tigerbot-law-plugin)|\\n|🔥disc-law-sft-zh|[AI-ModelScope/DISC-Law-SFT](https://modelscope.cn/datasets/AI-ModelScope/DISC-Law-SFT/summary)||166758|533.7±495.4, min=30, max=15169|chat, law|[ShengbinYue/DISC-Law-SFT](https://huggingface.co/datasets/ShengbinYue/DISC-Law-SFT)|\\n|🔥blossom-math-zh|[AI-ModelScope/blossom-math-v2](https://modelscope.cn/datasets/AI-ModelScope/blossom-math-v2/summary)||10000|169.3±58.7, min=35, max=563|chat, math|[Azure99/blossom-math-v2](https://huggingface.co/datasets/Azure99/blossom-math-v2)|\\n|school-math-zh|[AI-ModelScope/school_math_0.25M](https://modelscope.cn/datasets/AI-ModelScope/school_math_0.25M/summary)||248480|157.7±72.2, min=33, max=3450|chat, math, quality|[BelleGroup/school_math_0.25M](https://huggingface.co/datasets/BelleGroup/school_math_0.25M)|\\n|open-platypus-en|[AI-ModelScope/Open-Platypus](https://modelscope.cn/datasets/AI-ModelScope/Open-Platypus/summary)||24926|367.9±254.8, min=30, max=3951|chat, math, quality|[garage-bAInd/Open-Platypus](https://huggingface.co/datasets/garage-bAInd/Open-Platypus)|\\n|text2sql-en|[AI-ModelScope/texttosqlv2_25000_v2](https://modelscope.cn/datasets/AI-ModelScope/texttosqlv2_25000_v2/summary)||25000|274.6±326.4, min=38, max=1975|chat, sql|[Clinton/texttosqlv2_25000_v2](https://huggingface.co/datasets/Clinton/texttosqlv2_25000_v2)|\\n|🔥sql-create-context-en|[AI-ModelScope/sql-create-context](https://modelscope.cn/datasets/AI-ModelScope/sql-create-context/summary)||78577|80.2±17.8, min=36, max=456|chat, sql|[b-mc2/sql-create-context](https://huggingface.co/datasets/b-mc2/sql-create-context)|\\n|synthetic-text-to-sql|[AI-ModelScope/synthetic_text_to_sql](https://modelscope.cn/datasets/AI-ModelScope/synthetic_text_to_sql/summary)|default|100000|283.4±115.8, min=61, max=1356|nl2sql, en|[gretelai/synthetic_text_to_sql](https://huggingface.co/datasets/gretelai/synthetic_text_to_sql)|\\n|🔥advertise-gen-zh|[lvjianjin/AdvertiseGen](https://modelscope.cn/datasets/lvjianjin/AdvertiseGen/summary)||98399|130.6±21.7, min=51, max=241|text-generation|[shibing624/AdvertiseGen](https://huggingface.co/datasets/shibing624/AdvertiseGen)|\\n|🔥dureader-robust-zh|[modelscope/DuReader_robust-QG](https://modelscope.cn/datasets/modelscope/DuReader_robust-QG/summary)||17899|241.1±137.4, min=60, max=1416|text-generation|-|\\n|cmnli-zh|[modelscope/clue](https://modelscope.cn/datasets/modelscope/clue/summary)|cmnli|404024|82.6±16.6, min=51, max=199|text-generation, classification|[clue](https://huggingface.co/datasets/clue)|\\n|🔥jd-sentiment-zh|[DAMO_NLP/jd](https://modelscope.cn/datasets/DAMO_NLP/jd/summary)||50000|66.0±83.2, min=39, max=4039|text-generation, classification|-|\\n|🔥hc3-zh|[simpleai/HC3-Chinese](https://modelscope.cn/datasets/simpleai/HC3-Chinese/summary)|baike<br>open_qa<br>nlpcc_dbqa<br>finance<br>medicine<br>law<br>psychology|39781|176.8±81.5, min=57, max=3051|text-generation, classification|[Hello-SimpleAI/HC3-Chinese](https://huggingface.co/datasets/Hello-SimpleAI/HC3-Chinese)|\\n|🔥hc3-en|[simpleai/HC3](https://modelscope.cn/datasets/simpleai/HC3/summary)|finance<br>medicine|11021|298.3±138.7, min=65, max=2267|text-generation, classification|[Hello-SimpleAI/HC3](https://huggingface.co/datasets/Hello-SimpleAI/HC3)|\\n|dolly-15k|[AI-ModelScope/databricks-dolly-15k](https://modelscope.cn/datasets/AI-ModelScope/databricks-dolly-15k/summary)|default|15011|199.2±267.8, min=22, max=8615|multi-task, en, quality|[databricks/databricks-dolly-15k](https://huggingface.co/datasets/databricks/databricks-dolly-15k)|\\n|zhihu-kol|[OmniData/Zhihu-KOL](https://modelscope.cn/datasets/OmniData/Zhihu-KOL/summary)|default|-|Dataset is too huge, please click the original link to view the dataset stat.|zhihu, qa|[wangrui6/Zhihu-KOL](https://huggingface.co/datasets/wangrui6/Zhihu-KOL)|\\n|zhihu-kol-filtered|[OmniData/Zhihu-KOL-More-Than-100-Upvotes](https://modelscope.cn/datasets/OmniData/Zhihu-KOL-More-Than-100-Upvotes/summary)|default|271261|952.0±1727.2, min=25, max=98658|zhihu, qa|[bzb2023/Zhihu-KOL-More-Than-100-Upvotes](https://huggingface.co/datasets/bzb2023/Zhihu-KOL-More-Than-100-Upvotes)|\\n|finance-en|[wyj123456/finance_en](https://modelscope.cn/datasets/wyj123456/finance_en/summary)||68911|135.6±134.3, min=26, max=3525|chat, financial|[ssbuild/alpaca_finance_en](https://huggingface.co/datasets/ssbuild/alpaca_finance_en)|\\n|poetry-zh|[modelscope/chinese-poetry-collection](https://modelscope.cn/datasets/modelscope/chinese-poetry-collection/summary)||390309|55.2±9.4, min=23, max=83|text-generation, poetry|-|\\n|webnovel-zh|[AI-ModelScope/webnovel_cn](https://modelscope.cn/datasets/AI-ModelScope/webnovel_cn/summary)||50000|1478.9±11526.1, min=100, max=490484|chat, novel|[zxbsmk/webnovel_cn](https://huggingface.co/datasets/zxbsmk/webnovel_cn)|\\n|generated-chat-zh|[AI-ModelScope/generated_chat_0.4M](https://modelscope.cn/datasets/AI-ModelScope/generated_chat_0.4M/summary)||396004|273.3±52.0, min=32, max=873|chat, character-dialogue|[BelleGroup/generated_chat_0.4M](https://huggingface.co/datasets/BelleGroup/generated_chat_0.4M)|\\n|🔥self-cognition|[swift/self-cognition](https://modelscope.cn/datasets/swift/self-cognition/summary)||134|53.6±18.6, min=29, max=121|chat, self-cognition|[modelscope/self-cognition](https://huggingface.co/datasets/modelscope/self-cognition)|\\n|🔥swift-mix|[swift/swift-sft-mixture](https://modelscope.cn/datasets/swift/swift-sft-mixture/summary)|sharegpt<br>firefly<br>codefuse<br>metamathqa|-|Dataset is too huge, please click the original link to view the dataset stat.|chat, sft, general|-|\\n|cls-fudan-news-zh|[damo/zh_cls_fudan-news](https://modelscope.cn/datasets/damo/zh_cls_fudan-news/summary)||4959|3234.4±2547.5, min=91, max=19548|chat, classification|-|\\n|ner-jave-zh|[damo/zh_ner-JAVE](https://modelscope.cn/datasets/damo/zh_ner-JAVE/summary)||1266|118.3±45.5, min=44, max=223|chat, ner|-|\\n|coco-en|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|454617|299.8±2.8, min=295, max=352|chat, multi-modal, vision|-|\\n|🔥coco-en-mini|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|40504|299.8±2.6, min=295, max=338|chat, multi-modal, vision|-|\\n|coco-en-2|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|454617|36.8±2.8, min=32, max=89|chat, multi-modal, vision|-|\\n|🔥coco-en-2-mini|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|40504|36.8±2.6, min=32, max=75|chat, multi-modal, vision|-|\\n|capcha-images|[AI-ModelScope/captcha-images](https://modelscope.cn/datasets/AI-ModelScope/captcha-images/summary)||8000|31.0±0.0, min=31, max=31|chat, multi-modal, vision|-|\\n|latex-ocr-print|[AI-ModelScope/LaTeX_OCR](https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR/summary)|full|17918|362.7±34.8, min=294, max=528|chat, ocr, multi-modal, vision|[linxy/LaTeX_OCR](https://huggingface.co/datasets/linxy/LaTeX_OCR)|\\n|latex-ocr-handwrite|[AI-ModelScope/LaTeX_OCR](https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR/summary)|synthetic_handwrite|95424|375.1±59.4, min=292, max=2115|chat, ocr, multi-modal, vision|[linxy/LaTeX_OCR](https://huggingface.co/datasets/linxy/LaTeX_OCR)|\\n|aishell1-zh|[speech_asr/speech_asr_aishell1_trainsets](https://modelscope.cn/datasets/speech_asr/speech_asr_aishell1_trainsets/summary)||141600|152.2±36.8, min=63, max=419|chat, multi-modal, audio|-|\\n|🔥aishell1-zh-mini|[speech_asr/speech_asr_aishell1_trainsets](https://modelscope.cn/datasets/speech_asr/speech_asr_aishell1_trainsets/summary)||14526|152.2±35.6, min=74, max=359|chat, multi-modal, audio|-|\\n|🔥video-chatgpt|[swift/VideoChatGPT](https://modelscope.cn/datasets/swift/VideoChatGPT/summary)|Generic<br>Temporal<br>Consistency|3206|88.4±48.3, min=32, max=399|chat, multi-modal, video|[lmms-lab/VideoChatGPT](https://huggingface.co/datasets/lmms-lab/VideoChatGPT)|\\n|hh-rlhf|[AI-ModelScope/hh-rlhf](https://modelscope.cn/datasets/AI-ModelScope/hh-rlhf/summary)|harmless-base<br>helpful-base<br>helpful-online<br>helpful-rejection-sampled|127459|245.4±190.7, min=22, max=1999|rlhf, dpo, pairwise|-|\\n|🔥hh-rlhf-cn|[AI-ModelScope/hh_rlhf_cn](https://modelscope.cn/datasets/AI-ModelScope/hh_rlhf_cn/summary)|hh_rlhf<br>harmless_base_cn<br>harmless_base_en<br>helpful_base_cn<br>helpful_base_en|355920|171.2±122.7, min=22, max=3078|rlhf, dpo, pairwise|-|\\n|orpo-dpo-mix-40k|[AI-ModelScope/orpo-dpo-mix-40k](https://modelscope.cn/datasets/AI-ModelScope/orpo-dpo-mix-40k/summary)|default|43666|548.3±397.4, min=28, max=8483|dpo, orpo, en, quality|[mlabonne/orpo-dpo-mix-40k](https://huggingface.co/datasets/mlabonne/orpo-dpo-mix-40k)|\\n|stack-exchange-paired|[AI-ModelScope/stack-exchange-paired](https://modelscope.cn/datasets/AI-ModelScope/stack-exchange-paired/summary)||4483004|534.5±594.6, min=31, max=56588|hfrl, dpo, pairwise|[lvwerra/stack-exchange-paired](https://huggingface.co/datasets/lvwerra/stack-exchange-paired)|\\n|shareai-llama3-dpo-zh-en-emoji|[hjh0119/shareAI-Llama3-DPO-zh-en-emoji](https://modelscope.cn/datasets/hjh0119/shareAI-Llama3-DPO-zh-en-emoji/summary)|default|2449|334.0±162.8, min=36, max=1801|rlhf, dpo, pairwise|-|\\n|ultrafeedback-kto|[AI-ModelScope/ultrafeedback-binarized-preferences-cleaned-kto](https://modelscope.cn/datasets/AI-ModelScope/ultrafeedback-binarized-preferences-cleaned-kto/summary)|default|230720|11.0±0.0, min=11, max=11|rlhf, kto|-|\\n|rlaif-v|[swift/RLAIF-V-Dataset](https://modelscope.cn/datasets/swift/RLAIF-V-Dataset/summary)|default|83132|119.8±52.6, min=28, max=556|rlhf, dpo, multi-modal, en|[openbmb/RLAIF-V-Dataset](https://huggingface.co/datasets/openbmb/RLAIF-V-Dataset)|\\n|pileval|[swift/pile-val-backup](https://modelscope.cn/datasets/swift/pile-val-backup/summary)||214670|1612.3±8856.2, min=11, max=1208955|text-generation, awq|[mit-han-lab/pile-val-backup](https://huggingface.co/datasets/mit-han-lab/pile-val-backup)|\\n|mantis-instruct|[swift/Mantis-Instruct](https://modelscope.cn/datasets/swift/Mantis-Instruct/summary)|birds-to-words<br>chartqa<br>coinstruct<br>contrastive_caption<br>docvqa<br>dreamsim<br>dvqa<br>iconqa<br>imagecode<br>llava_665k_multi<br>lrv_multi<br>multi_vqa<br>nextqa<br>nlvr2<br>spot-the-diff<br>star<br>visual_story_telling|655351|825.7±812.5, min=284, max=13563|chat, multi-modal, vision, quality|[TIGER-Lab/Mantis-Instruct](https://huggingface.co/datasets/TIGER-Lab/Mantis-Instruct)|\\n|llava-data-instruct|[swift/llava-data](https://modelscope.cn/datasets/swift/llava-data/summary)|llava_instruct|364100|189.0±142.1, min=33, max=5183|sft, multi-modal, quality|[TIGER-Lab/llava-data](https://huggingface.co/datasets/TIGER-Lab/llava-data)|\\n|midefics|[swift/MideficsDataset](https://modelscope.cn/datasets/swift/MideficsDataset/summary)||3800|201.3±70.2, min=60, max=454|medical, en, vqa|[WinterSchool/MideficsDataset](https://huggingface.co/datasets/WinterSchool/MideficsDataset)|\\n|gqa|[None](https://modelscope.cn/datasets/None/summary)|train_all_instructions|-|Dataset is too huge, please click the original link to view the dataset stat.|multi-modal, en, vqa, quality|[lmms-lab/GQA](https://huggingface.co/datasets/lmms-lab/GQA)|\\n|text-caps|[swift/TextCaps](https://modelscope.cn/datasets/swift/TextCaps/summary)||18145|38.2±4.4, min=31, max=73|multi-modal, en, caption, quality|[HuggingFaceM4/TextCaps](https://huggingface.co/datasets/HuggingFaceM4/TextCaps)|\\n|refcoco-unofficial-caption|[swift/refcoco](https://modelscope.cn/datasets/swift/refcoco/summary)||46215|44.7±3.2, min=36, max=71|multi-modal, en, caption|[jxu124/refcoco](https://huggingface.co/datasets/jxu124/refcoco)|\\n|refcoco-unofficial-grounding|[swift/refcoco](https://modelscope.cn/datasets/swift/refcoco/summary)||46215|45.2±3.1, min=37, max=69|multi-modal, en, grounding|[jxu124/refcoco](https://huggingface.co/datasets/jxu124/refcoco)|\\n|refcocog-unofficial-caption|[swift/refcocog](https://modelscope.cn/datasets/swift/refcocog/summary)||44799|49.7±4.7, min=37, max=88|multi-modal, en, caption|[jxu124/refcocog](https://huggingface.co/datasets/jxu124/refcocog)|\\n|refcocog-unofficial-grounding|[swift/refcocog](https://modelscope.cn/datasets/swift/refcocog/summary)||44799|50.1±4.7, min=37, max=90|multi-modal, en, grounding|[jxu124/refcocog](https://huggingface.co/datasets/jxu124/refcocog)|\\n|a-okvqa|[swift/A-OKVQA](https://modelscope.cn/datasets/swift/A-OKVQA/summary)||18201|45.8±7.9, min=32, max=100|multi-modal, en, vqa, quality|[HuggingFaceM4/A-OKVQA](https://huggingface.co/datasets/HuggingFaceM4/A-OKVQA)|\\n|okvqa|[swift/OK-VQA_train](https://modelscope.cn/datasets/swift/OK-VQA_train/summary)||9009|34.4±3.3, min=28, max=59|multi-modal, en, vqa, quality|[Multimodal-Fatima/OK-VQA_train](https://huggingface.co/datasets/Multimodal-Fatima/OK-VQA_train)|\\n|ocr-vqa|[swift/OCR-VQA](https://modelscope.cn/datasets/swift/OCR-VQA/summary)||186753|35.6±6.6, min=29, max=193|multi-modal, en, ocr-vqa|[howard-hou/OCR-VQA](https://huggingface.co/datasets/howard-hou/OCR-VQA)|\\n|grit|[swift/GRIT](https://modelscope.cn/datasets/swift/GRIT/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|multi-modal, en, caption-grounding, quality|[zzliang/GRIT](https://huggingface.co/datasets/zzliang/GRIT)|\\n|llava-instruct-mix|[swift/llava-instruct-mix-vsft](https://modelscope.cn/datasets/swift/llava-instruct-mix-vsft/summary)||13640|179.8±120.2, min=30, max=962|multi-modal, en, vqa, quality|[HuggingFaceH4/llava-instruct-mix-vsft](https://huggingface.co/datasets/HuggingFaceH4/llava-instruct-mix-vsft)|\\n|lnqa|[swift/lnqa](https://modelscope.cn/datasets/swift/lnqa/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|multi-modal, en, ocr-vqa, quality|[vikhyatk/lnqa](https://huggingface.co/datasets/vikhyatk/lnqa)|\\n|science-qa|[swift/ScienceQA](https://modelscope.cn/datasets/swift/ScienceQA/summary)||8315|100.3±59.5, min=38, max=638|multi-modal, science, vqa, quality|[derek-thomas/ScienceQA](https://huggingface.co/datasets/derek-thomas/ScienceQA)|\\n|guanaco|[AI-ModelScope/GuanacoDataset](https://modelscope.cn/datasets/AI-ModelScope/GuanacoDataset/summary)|default|31561|250.1±70.3, min=89, max=1436|chat, zh|[JosephusCheung/GuanacoDataset](https://huggingface.co/datasets/JosephusCheung/GuanacoDataset)|\\n|mind2web|[swift/Multimodal-Mind2Web](https://modelscope.cn/datasets/swift/Multimodal-Mind2Web/summary)||1009|297522.4±325496.2, min=8592, max=3499715|agent, multi-modal|[osunlp/Multimodal-Mind2Web](https://huggingface.co/datasets/osunlp/Multimodal-Mind2Web)|\\n|sharegpt-4o-image|[AI-ModelScope/ShareGPT-4o](https://modelscope.cn/datasets/AI-ModelScope/ShareGPT-4o/summary)|image_caption|57289|638.7±157.9, min=47, max=4640|vqa, multi-modal|[OpenGVLab/ShareGPT-4o](https://huggingface.co/datasets/OpenGVLab/ShareGPT-4o)|\\n|pixelprose|[swift/pixelprose](https://modelscope.cn/datasets/swift/pixelprose/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|caption, multi-modal, vision|[tomg-group-umd/pixelprose](https://huggingface.co/datasets/tomg-group-umd/pixelprose)|\\n|m3it|[AI-ModelScope/M3IT](https://modelscope.cn/datasets/AI-ModelScope/M3IT/summary)|coco<br>vqa-v2<br>shapes<br>shapes-rephrased<br>coco-goi-rephrased<br>snli-ve<br>snli-ve-rephrased<br>okvqa<br>a-okvqa<br>viquae<br>textcap<br>docvqa<br>science-qa<br>imagenet<br>imagenet-open-ended<br>imagenet-rephrased<br>coco-goi<br>clevr<br>clevr-rephrased<br>nlvr<br>coco-itm<br>coco-itm-rephrased<br>vsr<br>vsr-rephrased<br>mocheg<br>mocheg-rephrased<br>coco-text<br>fm-iqa<br>activitynet-qa<br>msrvtt<br>ss<br>coco-cn<br>refcoco<br>refcoco-rephrased<br>multi30k<br>image-paragraph-captioning<br>visual-dialog<br>visual-dialog-rephrased<br>iqa<br>vcr<br>visual-mrc<br>ivqa<br>msrvtt-qa<br>msvd-qa<br>gqa<br>text-vqa<br>ocr-vqa<br>st-vqa<br>flickr8k-cn|-|Dataset is too huge, please click the original link to view the dataset stat.|chat, multi-modal, vision|-|\\n|sharegpt4v|[AI-ModelScope/ShareGPT4V](https://modelscope.cn/datasets/AI-ModelScope/ShareGPT4V/summary)|ShareGPT4V<br>ShareGPT4V-PT|-|Dataset is too huge, please click the original link to view the dataset stat.|chat, multi-modal, vision|-|\\n|llava-instruct-150k|[AI-ModelScope/LLaVA-Instruct-150K](https://modelscope.cn/datasets/AI-ModelScope/LLaVA-Instruct-150K/summary)||624610|490.4±180.2, min=288, max=5438|chat, multi-modal, vision|-|\\n|llava-pretrain|[AI-ModelScope/LLaVA-Pretrain](https://modelscope.cn/datasets/AI-ModelScope/LLaVA-Pretrain/summary)|default|-|Dataset is too huge, please click the original link to view the dataset stat.|vqa, multi-modal, quality|[liuhaotian/LLaVA-Pretrain](https://huggingface.co/datasets/liuhaotian/LLaVA-Pretrain)|\\n|sa1b-dense-caption|[Tongyi-DataEngine/SA1B-Dense-Caption](https://modelscope.cn/datasets/Tongyi-DataEngine/SA1B-Dense-Caption/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|zh, multi-modal, vqa|-|\\n|sa1b-paired-caption|[Tongyi-DataEngine/SA1B-Paired-Captions-Images](https://modelscope.cn/datasets/Tongyi-DataEngine/SA1B-Paired-Captions-Images/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|zh, multi-modal, vqa|-|\\n|alpaca-cleaned|[AI-ModelScope/alpaca-cleaned](https://modelscope.cn/datasets/AI-ModelScope/alpaca-cleaned/summary)||51760|177.9±126.4, min=26, max=1044|chat, general, bench, quality|[yahma/alpaca-cleaned](https://huggingface.co/datasets/yahma/alpaca-cleaned)|\\n|aya-collection|[swift/aya_collection](https://modelscope.cn/datasets/swift/aya_collection/summary)|aya_dataset|202364|494.0±6911.3, min=21, max=3044268|multi-lingual, qa|[CohereForAI/aya_collection](https://huggingface.co/datasets/CohereForAI/aya_collection)|\\n|belle-generated-chat-0.4M|[AI-ModelScope/generated_chat_0.4M](https://modelscope.cn/datasets/AI-ModelScope/generated_chat_0.4M/summary)||396004|273.3±52.0, min=32, max=873|common, zh|[BelleGroup/generated_chat_0.4M](https://huggingface.co/datasets/BelleGroup/generated_chat_0.4M)|\\n|belle-math-0.25M|[AI-ModelScope/school_math_0.25M](https://modelscope.cn/datasets/AI-ModelScope/school_math_0.25M/summary)||248480|157.7±72.2, min=33, max=3450|math, zh|[BelleGroup/school_math_0.25M](https://huggingface.co/datasets/BelleGroup/school_math_0.25M)|\\n|belle-train-0.5M-CN|[AI-ModelScope/train_0.5M_CN](https://modelscope.cn/datasets/AI-ModelScope/train_0.5M_CN/summary)||519255|129.1±91.5, min=27, max=6507|common, zh, quality|[BelleGroup/train_0.5M_CN](https://huggingface.co/datasets/BelleGroup/train_0.5M_CN)|\\n|belle-train-1M-CN|[AI-ModelScope/train_1M_CN](https://modelscope.cn/datasets/AI-ModelScope/train_1M_CN/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|common, zh, quality|[BelleGroup/train_1M_CN](https://huggingface.co/datasets/BelleGroup/train_1M_CN)|\\n|belle-train-2M-CN|[AI-ModelScope/train_2M_CN](https://modelscope.cn/datasets/AI-ModelScope/train_2M_CN/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|common, zh, quality|[BelleGroup/train_2M_CN](https://huggingface.co/datasets/BelleGroup/train_2M_CN)|\\n|belle-train-3.5M-CN|[swift/train_3.5M_CN](https://modelscope.cn/datasets/swift/train_3.5M_CN/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|common, zh, quality|[BelleGroup/train_3.5M_CN](https://huggingface.co/datasets/BelleGroup/train_3.5M_CN)|\\n|c4|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[allenai/c4](https://huggingface.co/datasets/allenai/c4)|\\n|chart-qa|[swift/ChartQA](https://modelscope.cn/datasets/swift/ChartQA/summary)||28299|43.1±5.5, min=29, max=77|en, vqa, quality|[HuggingFaceM4/ChartQA](https://huggingface.co/datasets/HuggingFaceM4/ChartQA)|\\n|chinese-c4|[swift/chinese-c4](https://modelscope.cn/datasets/swift/chinese-c4/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, zh, quality|[shjwudp/chinese-c4](https://huggingface.co/datasets/shjwudp/chinese-c4)|\\n|cinepile|[swift/cinepile](https://modelscope.cn/datasets/swift/cinepile/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|vqa, en, youtube, video|[tomg-group-umd/cinepile](https://huggingface.co/datasets/tomg-group-umd/cinepile)|\\n|classical-chinese-translate|[swift/classical_chinese_translate](https://modelscope.cn/datasets/swift/classical_chinese_translate/summary)||6655|344.0±76.4, min=61, max=815|chat, play-ground|-|\\n|codealpaca-20k|[AI-ModelScope/CodeAlpaca-20k](https://modelscope.cn/datasets/AI-ModelScope/CodeAlpaca-20k/summary)||20016|100.2±60.1, min=29, max=1776|code, en|[HuggingFaceH4/CodeAlpaca_20K](https://huggingface.co/datasets/HuggingFaceH4/CodeAlpaca_20K)|\\n|cosmopedia|[None](https://modelscope.cn/datasets/None/summary)|auto_math_text<br>khanacademy<br>openstax<br>stanford<br>stories<br>web_samples_v1<br>web_samples_v2<br>wikihow|-|Dataset is too huge, please click the original link to view the dataset stat.|multi-domain, en, qa|[HuggingFaceTB/cosmopedia](https://huggingface.co/datasets/HuggingFaceTB/cosmopedia)|\\n|cosmopedia-100k|[swift/cosmopedia-100k](https://modelscope.cn/datasets/swift/cosmopedia-100k/summary)||100000|1024.5±243.1, min=239, max=2981|multi-domain, en, qa|[HuggingFaceTB/cosmopedia-100k](https://huggingface.co/datasets/HuggingFaceTB/cosmopedia-100k)|\\n|dolma|[swift/dolma](https://modelscope.cn/datasets/swift/dolma/summary)|v1_7|-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[allenai/dolma](https://huggingface.co/datasets/allenai/dolma)|\\n|dolphin|[swift/dolphin](https://modelscope.cn/datasets/swift/dolphin/summary)|flan1m-alpaca-uncensored<br>flan5m-alpaca-uncensored|-|Dataset is too huge, please click the original link to view the dataset stat.|en|[cognitivecomputations/dolphin](https://huggingface.co/datasets/cognitivecomputations/dolphin)|\\n|duet|[AI-ModelScope/Duet-v0.5](https://modelscope.cn/datasets/AI-ModelScope/Duet-v0.5/summary)||5000|1157.4±189.3, min=657, max=2344|CoT, en|[G-reen/Duet-v0.5](https://huggingface.co/datasets/G-reen/Duet-v0.5)|\\n|evol-instruct-v2|[AI-ModelScope/WizardLM_evol_instruct_V2_196k](https://modelscope.cn/datasets/AI-ModelScope/WizardLM_evol_instruct_V2_196k/summary)||109184|480.9±333.1, min=26, max=4942|chat, en|[WizardLM/WizardLM_evol_instruct_V2_196k](https://huggingface.co/datasets/WizardLM/WizardLM_evol_instruct_V2_196k)|\\n|fineweb|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[HuggingFaceFW/fineweb](https://huggingface.co/datasets/HuggingFaceFW/fineweb)|\\n|gen-qa|[swift/GenQA](https://modelscope.cn/datasets/swift/GenQA/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|qa, quality, multi-task|[tomg-group-umd/GenQA](https://huggingface.co/datasets/tomg-group-umd/GenQA)|\\n|github-code|[swift/github-code](https://modelscope.cn/datasets/swift/github-code/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[codeparrot/github-code](https://huggingface.co/datasets/codeparrot/github-code)|\\n|gpt4v-dataset|[swift/gpt4v-dataset](https://modelscope.cn/datasets/swift/gpt4v-dataset/summary)||12356|217.9±68.3, min=35, max=596|en, caption, multi-modal, quality|[laion/gpt4v-dataset](https://huggingface.co/datasets/laion/gpt4v-dataset)|\\n|guanaco-belle-merge|[AI-ModelScope/guanaco_belle_merge_v1.0](https://modelscope.cn/datasets/AI-ModelScope/guanaco_belle_merge_v1.0/summary)||693987|134.2±92.0, min=24, max=6507|QA, zh|[Chinese-Vicuna/guanaco_belle_merge_v1.0](https://huggingface.co/datasets/Chinese-Vicuna/guanaco_belle_merge_v1.0)|\\n|infinity-instruct|[swift/Infinity-Instruct](https://modelscope.cn/datasets/swift/Infinity-Instruct/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|qa, quality, multi-task|[BAAI/Infinity-Instruct](https://huggingface.co/datasets/BAAI/Infinity-Instruct)|\\n|llava-med-zh-instruct|[swift/llava-med-zh-instruct-60k](https://modelscope.cn/datasets/swift/llava-med-zh-instruct-60k/summary)||56649|207.7±67.6, min=37, max=657|zh, medical, vqa|[BUAADreamer/llava-med-zh-instruct-60k](https://huggingface.co/datasets/BUAADreamer/llava-med-zh-instruct-60k)|\\n|🔥longwriter-6k|[ZhipuAI/LongWriter-6k](https://modelscope.cn/datasets/ZhipuAI/LongWriter-6k/summary)||6000|4887.2±2879.2, min=117, max=30354|long, chat, sft|[THUDM/LongWriter-6k](https://huggingface.co/datasets/THUDM/LongWriter-6k)|\\n|🔥longwriter-6k-filtered|[swift/longwriter-6k-filtered](https://modelscope.cn/datasets/swift/longwriter-6k-filtered/summary)||666|4108.9±2636.9, min=1190, max=17050|long, chat, sft|-|\\n|math-instruct|[AI-ModelScope/MathInstruct](https://modelscope.cn/datasets/AI-ModelScope/MathInstruct/summary)||262283|254.4±183.5, min=11, max=4383|math, cot, en, quality|[TIGER-Lab/MathInstruct](https://huggingface.co/datasets/TIGER-Lab/MathInstruct)|\\n|math-plus|[TIGER-Lab/MATH-plus](https://modelscope.cn/datasets/TIGER-Lab/MATH-plus/summary)|train|893929|287.1±158.7, min=24, max=2919|qa, math, en, quality|[TIGER-Lab/MATH-plus](https://huggingface.co/datasets/TIGER-Lab/MATH-plus)|\\n|moondream2-coyo-5M|[swift/moondream2-coyo-5M-captions](https://modelscope.cn/datasets/swift/moondream2-coyo-5M-captions/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|caption, pretrain, quality|[isidentical/moondream2-coyo-5M-captions](https://huggingface.co/datasets/isidentical/moondream2-coyo-5M-captions)|\\n|no-robots|[swift/no_robots](https://modelscope.cn/datasets/swift/no_robots/summary)||9485|298.7±246.4, min=40, max=6739|multi-task, quality, human-annotated|[HuggingFaceH4/no_robots](https://huggingface.co/datasets/HuggingFaceH4/no_robots)|\\n|open-hermes|[swift/OpenHermes-2.5](https://modelscope.cn/datasets/swift/OpenHermes-2.5/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|cot, en, quality|[teknium/OpenHermes-2.5](https://huggingface.co/datasets/teknium/OpenHermes-2.5)|\\n|open-orca-chinese|[AI-ModelScope/OpenOrca-Chinese](https://modelscope.cn/datasets/AI-ModelScope/OpenOrca-Chinese/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|QA, zh, general, quality|[yys/OpenOrca-Chinese](https://huggingface.co/datasets/yys/OpenOrca-Chinese)|\\n|orca_dpo_pairs|[swift/orca_dpo_pairs](https://modelscope.cn/datasets/swift/orca_dpo_pairs/summary)||12859|366.9±251.9, min=30, max=2010|rlhf, quality|[Intel/orca_dpo_pairs](https://huggingface.co/datasets/Intel/orca_dpo_pairs)|\\n|path-vqa|[swift/path-vqa](https://modelscope.cn/datasets/swift/path-vqa/summary)||19654|34.8±7.3, min=27, max=85|multi-modal, vqa, medical|[flaviagiammarino/path-vqa](https://huggingface.co/datasets/flaviagiammarino/path-vqa)|\\n|pile|[AI-ModelScope/pile](https://modelscope.cn/datasets/AI-ModelScope/pile/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain|[EleutherAI/pile](https://huggingface.co/datasets/EleutherAI/pile)|\\n|poison-mpts|[iic/100PoisonMpts](https://modelscope.cn/datasets/iic/100PoisonMpts/summary)||906|150.6±80.8, min=39, max=656|poison-management, zh|-|\\n|🔥qwen2-pro-en|[AI-ModelScope/Magpie-Qwen2-Pro-200K-English](https://modelscope.cn/datasets/AI-ModelScope/Magpie-Qwen2-Pro-200K-English/summary)||200000|605.4±287.3, min=221, max=4267|chat, sft, en|[Magpie-Align/Magpie-Qwen2-Pro-200K-English](https://huggingface.co/datasets/Magpie-Align/Magpie-Qwen2-Pro-200K-English)|\\n|🔥qwen2-pro-filtered|[AI-ModelScope/Magpie-Qwen2-Pro-300K-Filtered](https://modelscope.cn/datasets/AI-ModelScope/Magpie-Qwen2-Pro-300K-Filtered/summary)||300000|555.8±286.6, min=148, max=4267|chat, sft|[Magpie-Align/Magpie-Qwen2-Pro-300K-Filtered](https://huggingface.co/datasets/Magpie-Align/Magpie-Qwen2-Pro-300K-Filtered)|\\n|🔥qwen2-pro-zh|[AI-ModelScope/Magpie-Qwen2-Pro-200K-Chinese](https://modelscope.cn/datasets/AI-ModelScope/Magpie-Qwen2-Pro-200K-Chinese/summary)||200000|446.2±246.4, min=74, max=4101|chat, sft, zh|[Magpie-Align/Magpie-Qwen2-Pro-200K-Chinese](https://huggingface.co/datasets/Magpie-Align/Magpie-Qwen2-Pro-200K-Chinese)|\\n|redpajama-data-1t|[swift/RedPajama-Data-1T](https://modelscope.cn/datasets/swift/RedPajama-Data-1T/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[togethercomputer/RedPajama-Data-1T](https://huggingface.co/datasets/togethercomputer/RedPajama-Data-1T)|\\n|redpajama-data-v2|[swift/RedPajama-Data-V2](https://modelscope.cn/datasets/swift/RedPajama-Data-V2/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[togethercomputer/RedPajama-Data-V2](https://huggingface.co/datasets/togethercomputer/RedPajama-Data-V2)|\\n|refinedweb|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[tiiuae/falcon-refinedweb](https://huggingface.co/datasets/tiiuae/falcon-refinedweb)|\\n|rwkv-pretrain-web|[mapjack/openwebtext_dataset](https://modelscope.cn/datasets/mapjack/openwebtext_dataset/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, zh, quality|-|\\n|sft-nectar|[AI-ModelScope/SFT-Nectar](https://modelscope.cn/datasets/AI-ModelScope/SFT-Nectar/summary)||131192|396.4±272.1, min=44, max=10732|cot, en, quality|[AstraMindAI/SFT-Nectar](https://huggingface.co/datasets/AstraMindAI/SFT-Nectar)|\\n|skypile|[AI-ModelScope/SkyPile-150B](https://modelscope.cn/datasets/AI-ModelScope/SkyPile-150B/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality, zh|[Skywork/SkyPile-150B](https://huggingface.co/datasets/Skywork/SkyPile-150B)|\\n|slim-orca|[swift/SlimOrca](https://modelscope.cn/datasets/swift/SlimOrca/summary)||517982|399.1±370.2, min=35, max=8756|quality, en|[Open-Orca/SlimOrca](https://huggingface.co/datasets/Open-Orca/SlimOrca)|\\n|slim-pajama-627b|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[cerebras/SlimPajama-627B](https://huggingface.co/datasets/cerebras/SlimPajama-627B)|\\n|starcoder|[AI-ModelScope/starcoderdata](https://modelscope.cn/datasets/AI-ModelScope/starcoderdata/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[bigcode/starcoderdata](https://huggingface.co/datasets/bigcode/starcoderdata)|\\n|tagengo-gpt4|[swift/tagengo-gpt4](https://modelscope.cn/datasets/swift/tagengo-gpt4/summary)||78057|472.3±292.9, min=22, max=3521|chat, multi-lingual, quality|[lightblue/tagengo-gpt4](https://huggingface.co/datasets/lightblue/tagengo-gpt4)|\\n|the-stack|[AI-ModelScope/the-stack](https://modelscope.cn/datasets/AI-ModelScope/the-stack/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[bigcode/the-stack](https://huggingface.co/datasets/bigcode/the-stack)|\\n|ultrachat-200k|[swift/ultrachat_200k](https://modelscope.cn/datasets/swift/ultrachat_200k/summary)||207865|1195.4±573.7, min=76, max=4470|chat, en, quality|[HuggingFaceH4/ultrachat_200k](https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k)|\\n|vqa-v2|[swift/VQAv2](https://modelscope.cn/datasets/swift/VQAv2/summary)||443757|31.8±2.2, min=27, max=58|en, vqa, quality|[HuggingFaceM4/VQAv2](https://huggingface.co/datasets/HuggingFaceM4/VQAv2)|\\n|web-instruct-sub|[swift/WebInstructSub](https://modelscope.cn/datasets/swift/WebInstructSub/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|qa, en, math, quality, multi-domain, science|[TIGER-Lab/WebInstructSub](https://huggingface.co/datasets/TIGER-Lab/WebInstructSub)|\\n|wikipedia|[swift/wikipedia](https://modelscope.cn/datasets/swift/wikipedia/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[wikipedia](https://huggingface.co/datasets/wikipedia)|\\n|wikipedia-cn-filtered|[AI-ModelScope/wikipedia-cn-20230720-filtered](https://modelscope.cn/datasets/AI-ModelScope/wikipedia-cn-20230720-filtered/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[pleisto/wikipedia-cn-20230720-filtered](https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered)|\\n|zhihu-rlhf|[AI-ModelScope/zhihu_rlhf_3k](https://modelscope.cn/datasets/AI-ModelScope/zhihu_rlhf_3k/summary)||3460|594.5±365.9, min=31, max=1716|rlhf, dpo, zh|[liyucheng/zhihu_rlhf_3k](https://huggingface.co/datasets/liyucheng/zhihu_rlhf_3k)|\\n\\n\\n## Instructions\\n\\n[中文文档](https://swift.readthedocs.io/zh-cn/latest/Instruction/index.html)\\n\\n### 🐔Features\\n\\n1. [LLM-fine-tuning](LLM-fine-tuning.md)\\n2. [LLM-inference](LLM-inference.md)\\n3. [LLM-eval](LLM-eval.md)\\n4. [LLM-quantization-and-export](LLM-quantization-and-export.md)\\n5. [LLM-exp](LLM-exp.md)\\n6. [Command-line-parameters](Command-line-parameters.md)\\n7. [Supported-models-datasets](Supported-models-datasets.md)\\n8. [Customization](Customization.md)\\n9. [Common-QA](Common-QA.md)\\n\\n\\nThe courses of this folder are transfered to [the classroom repo](https://github.com/modelscope/modelscope-classroom).\\n\\n\\n# AnimateDiff Fine-tuning and Inference\\n\\nSWIFT supports fine-tuning and inference of AnimateDiff of full parameter and LoRA fine-tuning.\\n\\nFirst, you need to clone and install SWIFT:\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install \\\".[aigc]\\\"\\n```\\n\\n## Full Parameter Training\\n\\n### Training Effect\\n\\nFull parameter fine-tuning can reproduce the effect of the [officially provided model animatediff-motion-adapter-v1-5-2](https://www.modelscope.cn/models/Shanghai_AI_Laboratory/animatediff-motion-adapter-v1-5-2/summary), requiring a large number of short videos. The official reproduction used a subset version of the official dataset: [WebVid 2.5M](https://maxbain.com/webvid-dataset/). The training effect is as follows:\\n\\n```text\\nPrompt:masterpiece, bestquality, highlydetailed, ultradetailed, girl, walking, on the street, flowers\\n```\\n\\n![image.png](../../resources/1.gif)\\n\\n```text\\nPrompt: masterpiece, bestquality, highlydetailed, ultradetailed, beautiful house, mountain, snow top```\\n```\\n\\n![image.png](../../resources/2.gif)\\n\\nThe generation effect of training with the 2.5M subset still has unstable results. Developers using the 10M dataset will have more stable effects.\\n\\n### Running Command\\n\\n```shell\\n# This file is in swift/examples/pytorch/animatediff/scripts/full\\n# Experimental environment: A100 * 4\\n# 200GB GPU memory totally\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\ntorchrun --nproc_per_node=4 animatediff_sft.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --csv_path /mnt/workspace/yzhao/tastelikefeet/webvid/results_2M_train.csv \\\\\\n  --video_folder /mnt/workspace/yzhao/tastelikefeet/webvid/videos2 \\\\\\n  --sft_type full \\\\\\n  --lr_scheduler_type constant \\\\\\n  --trainable_modules .*motion_modules.* \\\\\\n  --batch_size 4 \\\\\\n  --eval_steps 100 \\\\\\n  --gradient_accumulation_steps 16\\n```\\n\\nWe used A100 * 4 for training, requiring a total of 200GB GPU memory, and the training time is about 40 hours. The data format is as follows:\\n\\n\\n```text\\n--csv_path # Pass in a csv file, which should contain the following format:\\nname,contentUrl\\nTravel blogger shoot a story on top of mountains. young man holds camera in forest.,stock-footage-travel-blogger-shoot-a-story-on-top-of-mountains-young-man-holds-camera-in-forest.mp4\\n```\\n\\nThe name field represents the prompt of the short video, and contentUrl represents the name of the video file.\\n\\n```text\\n--video_folder Pass in a video directory containing all the video files referenced by contentUrl in the csv file.\\n```\\n\\nTo perform inference using full parameters:\\n```shell\\n# This file is in swift/examples/pytorch/animatediff/scripts/full\\n# Experimental environment: A100\\n# 18GB GPU memory\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0 \\\\\\npython animatediff_infer.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --sft_type full \\\\\\n  --ckpt_dir /output/path/like/checkpoints/iter-xxx \\\\\\n  --eval_human true\\n```\\n\\nThe --ckpt_dir should be the output folder from training.\\n\\n## LoRA Training\\n\\n### Running Command\\n\\nFull parameter training will train the entire Motion-Adapter structure from scratch. Users can use an existing model and a small number of videos for fine-tuning by running the following command:\\n```shell\\n# This file is in swift/examples/pytorch/animatediff/scripts/lora\\n# Experimental environment: A100\\n# 20GB GPU memory\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0 \\\\\\npython animatediff_sft.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --csv_path /mnt/workspace/yzhao/tastelikefeet/webvid/results_2M_train.csv \\\\\\n  --video_folder /mnt/workspace/yzhao/tastelikefeet/webvid/videos2 \\\\\\n  --motion_adapter_id_or_path Shanghai_AI_Laboratory/animatediff-motion-adapter-v1-5-2 \\\\\\n  --sft_type lora \\\\\\n  --lr_scheduler_type constant \\\\\\n  --trainable_modules .*motion_modules.* \\\\\\n  --batch_size 1 \\\\\\n  --eval_steps 200 \\\\\\n  --dataset_sample_size 10000 \\\\\\n  --gradient_accumulation_steps 16\\n```\\n\\nVideo data parameters are the same as above.\\n\\nThe inference command is as follows:\\n```shell\\n# This file is in swift/examples/pytorch/animatediff/scripts/lora\\n# Experimental environment: A100\\n# 18GB GPU memory\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0 \\\\\\npython animatediff_infer.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --motion_adapter_id_or_path Shanghai_AI_Laboratory/animatediff-motion-adapter-v1-5-2 \\\\\\n  --sft_type lora \\\\\\n  --ckpt_dir /output/path/like/checkpoints/iter-xxx \\\\\\n  --eval_human true\\n```\\n\\nThe --ckpt_dir should be the output folder from training.\\n\\n## Parameter List\\n\\nBelow are the supported parameter lists and their meanings for training and inference respectively:\\n\\n### Training Parameters\\n```text\\nmotion_adapter_id_or_path: Optional[str] = None # The model ID or model path of the motion adapter. Specifying this parameter allows for continued training based on the effect of existing official models.\\nmotion_adapter_revision: Optional[str] = None # The model revision of the motion adapter, only useful when motion_adapter_id_or_path is the model ID.\\n\\nmodel_id_or_path: str = None # The model ID or model path of the SD base model.\\nmodel_revision: str = None # The revision of the SD base model, only useful when model_id_or_path is the model ID.\\n\\ndataset_sample_size: int = None # The number of training samples in the dataset. Default represents full training.\\n\\nsft_type: str = field(\\n    default='lora', metadata={'choices': ['lora', 'full']}) # Training method, supporting lora and full parameters.\\n\\noutput_dir: str = 'output' # Output folder.\\nddp_backend: str = field(\\n    default='nccl', metadata={'choices': ['nccl', 'gloo', 'mpi', 'ccl']}) # If using ddp training, ddp backend.\\n\\nseed: int = 42 # Random seed.\\n\\nlora_rank: int = 8 # lora parameter.\\nlora_alpha: int = 32 # lora parameter.\\nlora_dropout: float = 0.05 # lora parameter.\\nlora_dtype: str = 'fp32' # lora module dtype type. If `AUTO`, it follows the dtype setting of the original module.\\n\\ngradient_checkpointing: bool = False # Whether to enable gc, disabled by default. Note: The current version of diffusers has a problem and does not support this parameter being True.\\nbatch_size: int = 1 # batchsize.\\nnum_train_epochs: int = 1 # Number of epochs.\\n# if max_steps >= 0, override num_train_epochs\\nlearning_rate: Optional[float] = None # Learning rate.\\nweight_decay: float = 0.01 # adamw parameter.\\ngradient_accumulation_steps: int = 16 # ga size.\\nmax_grad_norm: float = 1. # grad norm size.\\nlr_scheduler_type: str = 'cosine' # Type of lr_scheduler.\\nwarmup_ratio: float = 0.05 # Whether to warmup and the proportion of warmup.\\n\\neval_steps: int = 50 # eval step interval.\\nsave_steps: Optional[int] = None # save step interval.\\ndataloader_num_workers: int = 1 # Number of dataloader workers.\\n\\npush_to_hub: bool = False # Whether to push to modelhub.\\n# 'user_name/repo_name' or 'repo_name'\\nhub_model_id: Optional[str] = None # modelhub id.\\nhub_private_repo: bool = False\\npush_hub_strategy: str = field( # Push strategy, push the last one or push each one.\\n    default='push_best',\\n    metadata={'choices': ['push_last', 'all_checkpoints']})\\n# None: use env var `MODELSCOPE_API_TOKEN`\\nhub_token: Optional[str] = field( # modelhub token.\\n    default=None,\\n    metadata={\\n        'help':\\n        'SDK token can be found in https://modelscope.cn/my/myaccesstoken'\\n    })\\n\\nignore_args_error: bool = False  # True: notebook compatibility.\\n\\ntext_dropout_rate: float = 0.1 # Drop a certain proportion of text to ensure model robustness.\\n\\nvalidation_prompts_path: str = field( # The prompt file directory used in the evaluation process. By default, swift/aigc/configs/validation.txt is used.\\n    default=None,\\n    metadata={\\n        'help':\\n        'The validation prompts file path, use aigc/configs/validation.txt is None'\\n    })\\n\\ntrainable_modules: str = field( # Trainable modules, recommended to use the default value.\\n    default='.*motion_modules.*',\\n    metadata={\\n        'help':\\n        'The trainable modules, by default, the .*motion_modules.* will be trained'\\n    })\\n\\nmixed_precision: bool = True # Mixed precision training.\\n\\nenable_xformers_memory_efficient_attention: bool = True # Use xformers.\\n\\nnum_inference_steps: int = 25 #\\nguidance_scale: float = 8.\\nsample_size: int = 256\\nsample_stride: int = 4 # Maximum length of training videos in seconds.\\nsample_n_frames: int = 16 # Frames per second.\\n\\ncsv_path: str = None # Input dataset.\\nvideo_folder: str = None # Input dataset.\\n\\nmotion_num_attention_heads: int = 8 # motion adapter parameter.\\nmotion_max_seq_length: int = 32 # motion adapter parameter.\\nnum_train_timesteps: int = 1000 # Inference pipeline parameter.\\nbeta_start: int = 0.00085 # Inference pipeline parameter.\\nbeta_end: int = 0.012 # Inference pipeline parameter.\\nbeta_schedule: str = 'linear' # Inference pipeline parameter.\\nsteps_offset: int = 1 # Inference pipeline parameter.\\nclip_sample: bool = False # Inference pipeline parameter.\\n\\nuse_wandb: bool = False # Whether to use wandb.\\n```\\n\\n### Inference Parameters\\n```text\\nmotion_adapter_id_or_path: Optional[str] = None # The model ID or model path of the motion adapter. Specifying this parameter allows for continued training based on the effect of existing official models.\\nmotion_adapter_revision: Optional[str] = None # The model revision of the motion adapter, only useful when motion_adapter_id_or_path is the model ID.\\n\\nmodel_id_or_path: str = None # The model ID or model path of the SD base model.\\nmodel_revision: str = None # The revision of the SD base model, only useful when model_id_or_path is the model ID.\\n\\nsft_type: str = field(\\n    default='lora', metadata={'choices': ['lora', 'full']}) # Training method, supporting lora and full parameters.\\n\\nckpt_dir: Optional[str] = field(\\n    default=None, metadata={'help': '/path/to/your/vx-xxx/checkpoint-xxx'}) # The output folder of training.\\neval_human: bool = False  # False: eval val_dataset # Whether to use manual input evaluation.\\n\\nseed: int = 42 # Random seed.\\n\\nmerge_lora: bool = False # Merge lora into the MotionAdapter and save the model.\\nreplace_if_exists: bool = False # Replace the files if the output merged dir exists when `merge_lora` is True.\\n\\n# other\\nignore_args_error: bool = False  # True: notebook compatibility.\\n\\nvalidation_prompts_path: str = None # The file used for validation. When eval_human=False, each line is a prompt.\\n\\noutput_path: str = './generated' # The output directory for gifs.\\n\\nenable_xformers_memory_efficient_attention: bool = True # Use xformers.\\n\\nnum_inference_steps: int = 25 #\\nguidance_scale: float = 8.\\nsample_size: int = 256\\nsample_stride: int = 4 # Maximum length of training videos in seconds.\\nsample_n_frames: int = 16 # Frames per second.\\n\\nmotion_num_attention_heads: int = 8 # motion adapter parameter.\\nmotion_max_seq_length: int = 32 # motion adapter parameter.\\nnum_train_timesteps: int = 1000 # Inference pipeline parameter.\\nbeta_start: int = 0.00085 # Inference pipeline parameter.\\nbeta_end: int = 0.012 # Inference pipeline parameter.\\nbeta_schedule: str = 'linear' # Inference pipeline parameter.\\nsteps_offset: int = 1 # Inference pipeline parameter.\\nclip_sample: bool = False # Inference pipeline parameter.\\n```\\n\\n\\n# Installation and Usage\\n\\n## Wheel Package Installation\\n\\nYou can use pip to install:\\n\\n```shell\\n# Full capabilities\\npip install 'ms-swift[all]' -U\\n# Only use LLM\\npip install 'ms-swift[llm]' -U\\n# Only use AIGC\\npip install 'ms-swift[aigc]' -U\\n# Only use adapters\\npip install ms-swift -U\\n```\\n\\n## Source Code Installation\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[all]'\\n```\\n\\n## Notebook Environment\\n\\nMost of the models supported by Swift for training can be used on `A10` GPUs. Users can use the free GPU resources officially provided by ModelScope:\\n\\n1. Go to the official [ModelScope](https://www.modelscope.cn) website and log in\\n2. Click on `My Notebook` on the left and start a free GPU instance\\n3. Happily take advantage of the A10 GPU resources\\n\\n## Build Documentation\\n\\nSwift supports complete API Doc documentation. Execute the following command in the swift root directory:\\n\\n```shell\\nmake docs\\n```\\n\\nAfter the execution is complete, view `docs/build/html/index.html`.\\n\\n\\n# Res-Tuning Component\\n\\n<div align=\\\"center\\\">\\n\\n## [NeurIPS 2023] Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone\\n\\n### [arXiv](https://arxiv.org/abs/2310.19859)  |  [Project Page](https://res-tuning.github.io/)\\n\\n</div>\\n\\nRes-Tuning is a flexible and efficient tuning method. We decouple the design of tuners from the model architecture for flexible combinations, and further extend it to implement a new memory-saving bypass tuner, which greatly reduces memory consumption and multi-task inference cost.\\n\\nCurrently, Res-Tuning is provided as a pluggable tuner algorithm component in [SWIFT](https://github.com/modelscope/swift), which developers can use directly.\\n\\n### Supported Components\\n\\n- [x] Res-Adapter\\n- [x] Res-Tuning-Bypass\\n- [ ] Res-Prefix\\n- [ ] Res-Prompt\\n\\n### Usage\\n\\n#### Demo\\n- You can use the [visualization example](https://github.com/modelscope/swift/blob/main/examples/pytorch/cv/notebook/swift_vision.ipynb) we provide.\\n\\n#### Initialize Tuner\\n\\n```Python\\nfrom swift import ResTuningConfig\\nconfig = ResTuningConfig(\\n    dims=768,\\n    root_modules=r'.*blocks.0$',\\n    stem_modules=r'.*blocks\\\\.\\\\d+$',\\n    target_modules=r'norm',\\n    tuner_cfg='res_adapter'\\n)\\n```\\n- dims: The dimensions of the hidden states.\\n- root_modules: The root module to be replaced.\\n- stem_modules: The stem modules to be replaced.\\n- target_modules: The target module to be replaced.\\n- tuner_cfg: The configuration of the tuning module.\\n\\n#### Load Model\\n\\n```Python\\nfrom swift import Swift\\nimport timm, torch\\nmodel = timm.create_model(\\\"vit_base_patch16_224\\\", pretrained=False, num_classes=100)\\nmodel_tune = Swift.prepare_model(model, config)\\nprint(model_tune.get_trainable_parameters())\\nprint(model(torch.ones(1, 3, 224, 224)).shape)\\n```\\n\\n### Citation\\n```\\n@inproceedings{jiang2023restuning,\\n  title={Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone},\\n  author={Jiang, Zeyinzi and Mao, Chaojie and Huang, Ziyuan and Ma, Ao and Lv, Yiliang and Shen, Yujun and Zhao, Deli and Zhou, Jingren},\\n  booktitle={Advances in Neural Information Processing Systems},\\n  year={2023}\\n}\\n```\\n\\n\\n# Compatibility with Peft\\n\\nTo support users accustomed to Peft, Swift provides compatibility with Peft. Users can import Peft components from Swift:\\n\\n>PeftModel\\n>\\n>PeftConfig\\n>\\n>PeftModelForSeq2SeqLM\\n>\\n>PeftModelForSequenceClassification\\n>\\n>PeftModelForTokenClassification\\n>\\n>PeftModelForCausalLM\\n>\\n>PromptEncoderConfig\\n>\\n>PromptTuningConfig\\n>\\n>PrefixTuningConfig\\n>\\n>PromptLearningConfig\\n>\\n>LoraConfig\\n>\\n>get_peft_config\\n>\\n>get_peft_model_state_dict\\n>\\n>get_peft_model\\n\\nAll of the above components can be imported from Swift:\\n\\n```python\\nfrom swift import PeftModel, PeftConfig\\n```\\n\\nThe Swift class also supports initializing Peft's tuner:\\n\\n```python\\nfrom modelscope.models.nlp import SbertForSequenceClassification\\nfrom modelscope.models.nlp.structbert import SbertConfig\\n\\nfrom swift import LoraConfig, Swift\\nmodel = SbertForSequenceClassification(SbertConfig())\\nlora_config = LoraConfig(target_modules=['query', 'key', 'value'])\\nmodel = Swift.prepare_model(model, lora_config)\\n```\\n\\nSwift provides a shallow wrapper for Peft, allowing Peft to use models from the modelscope hub when calling from_pretrained.\\n\\n\\n# Basic Usage\\n\\n\\\"Tuner\\\" refers to additional structures attached to a model to reduce the number of training parameters or improve training accuracy. Currently, SWIFT supports the following tuners:\\n\\n1. LoRA: [LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS](https://arxiv.org/abs/2106.09685)\\n2. LoRA+: [LoRA+: Efficient Low Rank Adaptation of Large Models](https://arxiv.org/pdf/2402.12354.pdf)\\n3. LLaMA PRO: [LLAMA PRO: Progressive LLaMA with Block Expansion](https://arxiv.org/pdf/2401.02415.pdf)\\n4. GaLore: [GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection](https://arxiv.org/abs/2403.03507)\\n5. LISA: [LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning](https://arxiv.org/abs/2403.17919)\\n6. UnSloth: https://github.com/unslothai/unsloth\\n7. SCEdit: [SCEdit: Efficient and Controllable Image Diffusion Generation via Skip Connection Editing](https://arxiv.org/abs/2312.11392)  < [arXiv](https://arxiv.org/abs/2312.11392)  |  [Project Page](https://scedit.github.io/) >\\n8. NEFTune: [Noisy Embeddings Improve Instruction Finetuning](https://arxiv.org/abs/2310.05914)\\n9. LongLoRA: [Efficient Fine-tuning of Long-Context Large Language Models](https://arxiv.org/abs/2309.12307)\\n10. Adapter: [Parameter-Efficient Transfer Learning for NLP](http://arxiv.org/abs/1902.00751)\\n11. Vision Prompt Tuning: [Visual Prompt Tuning](https://arxiv.org/abs/2203.12119)\\n12. Side: [Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks](https://arxiv.org/abs/1912.13503)\\n13. Res-Tuning: [Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone](https://arxiv.org/abs/2310.19859)  < [arXiv](https://arxiv.org/abs/2310.19859)  |  [Project Page](https://res-tuning.github.io/)  |  [Usage](docs/source/GetStarted/ResTuning.md) >\\n14. Tuners provided by [PEFT](https://github.com/huggingface/peft), such as IA3, AdaLoRA, etc.\\n\\n## Using in Training\\n\\nCall `Swift.prepare_model()` to add tuners to the model:\\n\\n```python\\nfrom modelscope import Model\\nfrom swift import Swift, LoraConfig\\nimport torch\\nmodel = Model.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16, device_map='auto')\\nlora_config = LoraConfig(\\n                r=16,\\n                target_modules=['query_key_value'],\\n                lora_alpha=32,\\n                lora_dropout=0.)\\nmodel = Swift.prepare_model(model, lora_config)\\n```\\n\\nMultiple tuners can also be used simultaneously:\\n\\n```python\\nfrom modelscope import Model\\nfrom swift import Swift, LoraConfig, AdapterConfig\\nimport torch\\nmodel = Model.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16, device_map='auto')\\nlora_config = LoraConfig(\\n                r=16,\\n                target_modules=['query_key_value'],\\n                lora_alpha=32,\\n                lora_dropout=0.)\\nadapter_config = AdapterConfig(\\n                dim=model.config.hidden_size,\\n                target_modules=['mlp'],\\n                method_name='forward',\\n                hidden_pos=0,\\n                adapter_length=32,\\n            )\\nmodel = Swift.prepare_model(model, {'first_tuner': lora_config, 'second_tuner': adapter_config})\\n# use model to do other things\\n```\\n\\nWhen using multiple tuners, the second parameter should be a Dict where the key is the tuner name and the value is the tuner configuration.\\n\\nAfter training, you can call:\\n\\n```python\\nmodel.save_pretrained(save_directory='./output')\\n```\\n\\nto store the model checkpoint. The model checkpoint file will only include the weights of the tuners, not the weights of the model itself. The stored structure is as follows:\\n\\n> outputs\\n>\\n> ​     |-- configuration.json\\n>\\n> ​     |-- first_tuner\\n>\\n> ​               |-- adapter_config.json\\n>\\n> ​               |-- adapter_model.bin\\n>\\n> ​     |-- second_tuner\\n>\\n> ​               |-- adapter_config.json\\n>\\n> ​               |-- adapter_model.bin\\n>\\n> ​     |-- ...\\n\\nIf only a single config is passed in, the default name `default` will be used:\\n\\n> outputs\\n>\\n> ​      |-- configuration.json\\n>\\n> ​      |-- default\\n>\\n> ​                |-- adapter_config.json\\n>\\n> ​                |-- adapter_model.bin\\n>\\n> ​      |-- ...\\n\\n### Complete Training Code\\n\\n```python\\n# A100 18G memory\\nfrom swift import Seq2SeqTrainer, Seq2SeqTrainingArguments\\nfrom modelscope import MsDataset, AutoTokenizer\\nfrom modelscope import AutoModelForCausalLM\\nfrom swift import Swift, LoraConfig\\nfrom swift.llm import get_template, TemplateType\\nimport torch\\n\\n# load model\\nmodel = AutoModelForCausalLM.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16, device_map='auto', trust_remote_code=True)\\nlora_config = LoraConfig(\\n                r=16,\\n                target_modules=['query_key_value'],\\n                lora_alpha=32,\\n                lora_dropout=0.05)\\nmodel = Swift.prepare_model(model, lora_config)\\ntokenizer = AutoTokenizer.from_pretrained('ZhipuAI/chatglm3-6b', trust_remote_code=True)\\ndataset = MsDataset.load('AI-ModelScope/alpaca-gpt4-data-en', split='train')\\ntemplate = get_template(TemplateType.chatglm3, tokenizer, max_length=1024)\\n\\ndef encode(example):\\n    inst, inp, output = example['instruction'], example.get('input', None), example['output']\\n    if output is None:\\n        return {}\\n    if inp is None or len(inp) == 0:\\n        q = inst\\n    else:\\n        q = f'{inst}\\\\n{inp}'\\n    example, kwargs = template.encode({'query': q, 'response': output})\\n    return example\\n\\ndataset = dataset.map(encode).filter(lambda e: e.get('input_ids'))\\ndataset = dataset.train_test_split(test_size=0.001)\\n\\ntrain_dataset, val_dataset = dataset['train'], dataset['test']\\n\\n\\ntrain_args = Seq2SeqTrainingArguments(\\n    output_dir='output',\\n    learning_rate=1e-4,\\n    num_train_epochs=2,\\n    eval_steps=500,\\n    save_steps=500,\\n    evaluation_strategy='steps',\\n    save_strategy='steps',\\n    dataloader_num_workers=4,\\n    per_device_train_batch_size=1,\\n    gradient_accumulation_steps=16,\\n    logging_steps=10,\\n)\\n\\ntrainer = Seq2SeqTrainer(\\n    model=model,\\n    args=train_args,\\n    data_collator=template.data_collator,\\n    train_dataset=train_dataset,\\n    eval_dataset=val_dataset,\\n    tokenizer=tokenizer)\\n\\ntrainer.train()\\n```\\n\\n## Using in Inference\\n\\nUse `Swift.from_pretrained()` to load the stored checkpoint:\\n\\n```python\\nfrom modelscope import Model\\nfrom swift import Swift\\nimport torch\\nmodel = Model.from_pretrained('ZhipuAI/chatglm2-6b', torch_dtype=torch.bfloat16, device_map='auto')\\nmodel = Swift.from_pretrained(model, './output')\\n```\\n\\n### Complete Inference Code\\n\\n```python\\n# A100 14G memory\\nimport torch\\nfrom modelscope import AutoModelForCausalLM, GenerationConfig\\nfrom modelscope import AutoTokenizer\\n\\nfrom swift import Swift\\nfrom swift.llm import get_template, TemplateType, to_device\\n\\n# load model\\nmodel = AutoModelForCausalLM.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16,\\n                                             device_map='auto', trust_remote_code=True)\\nmodel = Swift.from_pretrained(model, 'output/checkpoint-xxx')\\ntokenizer = AutoTokenizer.from_pretrained('ZhipuAI/chatglm3-6b', trust_remote_code=True)\\ntemplate = get_template(TemplateType.chatglm3, tokenizer, max_length=1024)\\n\\nexamples, tokenizer_kwargs = template.encode({'query': 'How are you?'})\\nif 'input_ids' in examples:\\n    input_ids = torch.tensor(examples['input_ids'])[None]\\n    examples['input_ids'] = input_ids\\n    token_len = input_ids.shape[1]\\n\\ngeneration_config = GenerationConfig(\\n    max_new_tokens=1024,\\n    temperature=0.3,\\n    top_k=25,\\n    top_p=0.8,\\n    do_sample=True,\\n    repetition_penalty=1.0,\\n    num_beams=10,\\n    pad_token_id=tokenizer.pad_token_id,\\n    eos_token_id=tokenizer.eos_token_id)\\n\\ndevice = next(model.parameters()).device\\nexamples = to_device(examples, device)\\n\\ngenerate_ids = model.generate(\\n    generation_config=generation_config,\\n    **examples)\\ngenerate_ids = template.get_generate_ids(generate_ids, token_len)\\nprint(tokenizer.decode(generate_ids, **tokenizer_kwargs))\\n# I'm an AI language model, so I don't have feelings or physical sensations. However, I'm here to assist you with any questions or tasks you may have. How can I help you today?\\n```\\n\\n# Interface List\\n\\n## Swift Class Static Interfaces\\n\\n- `Swift.prepare_model(model, config, **kwargs)`\\n  - Explain: Load a tuner onto the model. If it is a subclass of PeftConfig, use the corresponding interface of the Peft library to load the tuner. When using SwiftConfig, this interface can accept a SwiftModel instance and be called repeatedly, which has the same effect as passing a dictionary to config.\\n    - This interface supports parallel loading of multiple tuners of different types for simultaneous use.\\n  - Parameters:\\n    - `model`: An instance of `torch.nn.Module` or `SwiftModel`, the model to be loaded\\n    - `config`: An instance of `SwiftConfig`, `PeftConfig`, or a dictionary of custom tuner names to configs\\n  - Return value: An instance of `SwiftModel` or `PeftModel`\\n- `Swift.merge_and_unload(model)`\\n  - Explain: Merge the LoRA weights back into the original model and completely unload the LoRA part\\n  - Parameters:\\n    - model: An instance of `SwiftModel` or `PeftModel`, the model instance with LoRA loaded\\n  - Return value: None\\n\\n- `Swift.merge(model)`\\n\\n  - Explain: Merge the LoRA weights back into the original model without unloading the LoRA part\\n\\n  - Parameters:\\n    - model: An instance of `SwiftModel` or `PeftModel`, the model instance with LoRA loaded\\n\\n  - Return value: None\\n\\n- `Swift.unmerge(model)`\\n\\n  - Explain: Split the LoRA weights from the original model weights back into the LoRA structure\\n\\n  - Parameters:\\n    - model: An instance of `SwiftModel` or `PeftModel`, the model instance with LoRA loaded\\n\\n  - Return value: None\\n\\n- `Swift.save_to_peft_format(ckpt_dir, output_dir)`\\n\\n  - Explain: Convert the stored LoRA checkpoint to a Peft compatible format. The main changes are:\\n\\n    - `default` will be split from the corresponding `default` folder into the output_dir root directory\\n    - The `{tuner_name}.` field in weights will be removed, for example `model.layer.0.self.in_proj.lora_A.default.weight` will become `model.layer.0.self.in_proj.lora_A.weight`\\n    - The prefix `basemodel.model` will be added to the keys in weights\\n\\n    - Note: Only LoRA can be converted, other types of tuners cannot be converted due to Peft itself not supporting them. Additionally, when there are extra parameters like `dtype` set in LoRAConfig, it does not support conversion to Peft format. In this case, you can manually delete the corresponding fields in adapter_config.json\\n\\n  - Parameters:\\n\\n    - ckpt_dir: Original weights directory\\n    - output_dir: Target weights directory\\n\\n  - Return value: None\\n\\n- `Swift.from_pretrained(model, model_id, adapter_name, revision, **kwargs)`\\n  - Explain: Load tuners from the stored weights directory onto the model. If adapter_name is not passed, all tuners under the model_id directory will be loaded. Same as `prepare_model`, this interface can be called repeatedly.\\n  - Parameters:\\n    - model: An instance of `torch.nn.Module` or `SwiftModel`, the model to be loaded\\n    - model_id: `str` type, the tuner checkpoint to be loaded, can be a ModelScope hub id or a local directory produced by training\\n    - adapter_name: `str` or `List[str]` or `Dict[str, str]` type or `None`, the tuner name in the tuner directory to be loaded. If `None`, all named tuners will be loaded. If `str` or `List[str]`, only certain specific tuners will be loaded. If `Dict`, the tuner indicated by `key` will be loaded and renamed to `value`.\\n    - revision: If model_id is a ModelScope id, revision can specify the corresponding version number\\n\\n## SwiftModel Interface\\n\\nThe following lists the interfaces that users may call. Other internal interfaces or interfaces not recommended for use can be viewed through the `make docs` command to generate the API Doc documentation.\\n\\n- `SwiftModel.create_optimizer_param_groups(self, **defaults)`\\n  - Explain: Create parameter groups based on the loaded tuners, currently only effective for the `LoRA+` algorithm\\n  - Parameters:\\n    - defaults: Default parameters for `optimizer_groups`, such as `lr` and `weight_decay`\\n  - Return value:\\n    - The created `optimizer_groups`\\n\\n- `SwiftModel.add_weighted_adapter(self, ...)`\\n  - Explain: Merge existing LoRA tuners into one\\n  - Parameters:\\n    - This interface is a transparent pass-through of PeftModel.add_weighted_adapter, parameters can refer to: [add_weighted_adapter documentation](https://huggingface.co/docs/peft/main/en/package_reference/lora#peft.LoraModel.add_weighted_adapter)\\n\\n- `SwiftModel.save_pretrained(self, save_directory, safe_serialization, adapter_name)`\\n  - Explain: Store tuner weights\\n  - Parameters:\\n    - save_directory: Storage directory\\n    - safe_serialization: Whether to use safe_tensors, default is False\\n    - adapter_name: The adapter tuner to store, if not passed, all tuners will be stored by default\\n- `SwiftModel.set_active_adapters(self, adapter_names, offload=None)`\\n  - Explain: Set the currently active adapters, adapters not in the list will be deactivated\\n    - In `inference`, the environment variable `USE_UNIQUE_THREAD=0/1` is supported, default value is `1`. If `0`, set_active_adapters only takes effect for the current thread. In this case, the tuners activated by this thread are used by default, and tuners in different threads do not interfere with each other.\\n  - Parameters:\\n    - adapter_names: Activated tuners\\n    - offload: How to handle deactivated adapters, default is `None` which means leave them in GPU memory. Both `cpu` and `meta` are supported, indicating offloading to cpu and meta devices to reduce GPU memory consumption. When `USE_UNIQUE_THREAD=0`, do not pass a value to offload to avoid affecting other threads.\\n  - Return value: None\\n- `SwiftModel.activate_adapter(self, adapter_name)`\\n  - Explain: Activate a tuner\\n    - In `inference`, the environment variable `USE_UNIQUE_THREAD=0/1` is supported, default value is `1`. If `0`, activate_adapter only takes effect for the current thread. In this case, the tuners activated by this thread are used by default, and tuners in different threads do not interfere with each other.\\n  - Parameters:\\n    - adapter_name: The name of the tuner to activate\\n  - Return value: None\\n- `SwiftModel.deactivate_adapter(self, adapter_name, offload)`\\n  - Explain: Deactivate a tuner\\n    - When the environment variable `USE_UNIQUE_THREAD=0`, do not call this interface\\n  - Parameters:\\n    - adapter_name: The name of the tuner to deactivate\\n    - offload: How to handle deactivated adapters, default is `None` which means leave them in GPU memory. Both `cpu` and `meta` are supported, indicating offloading to cpu and meta devices to reduce GPU memory consumption\\n  - Return value: None\\n\\n- `SwiftModel.get_trainable_parameters(self)`\\n\\n  - Explain: Return training parameter information\\n\\n  - Parameters: None\\n\\n  - Return value: Training parameter information, format is as follows:\\n    ```text\\n    trainable params: 100M || all params: 1000M || trainable%: 10.00% || cuda memory: 10GiB.\\n    ```\\n\\n\\n# Push Model\\n\\nWhen using SWIFT, users can choose to push their trained models to the ModelScope community.\\n\\nTo utilize the model pushing feature, first ensure that you have registered for an official ModelScope account and obtained the corresponding SDK token on the [page](https://www.modelscope.cn/my/myaccesstoken).\\n\\n## Pushing Model During Training\\n\\nTo push a model during training, you need to add the following parameters in the command line:\\n```shell\\n--push_to_hub true \\\\\\n--hub_model_id my-group/my-model \\\\\\n--hub_token <token-from-modelscope-page> \\\\\\n```\\n\\nOnce these parameters are added, the trained checkpoint and training parameters will be pushed to the ModelScope community, making it easier to use later. It is important to note that ModelScope community allows you to upload private models. If you want the model to be private, add the following parameter:\\n\\n```shell\\n--hub_private_repo true\\n```\\n\\nThis way, only those with the organization's permission can see the model.\\n\\n## Pushing Model During Export\\n\\nThe parameters for pushing a model during export are the same as those during training:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>'\\n```\\n\\nThis allows you to directly push the merged or quantized LoRA model to ModelScope.\\n\\n\\n# Interface Training and Inference\\n\\nCurrently, SWIFT supports interface-based training and inference, with parameters consistent with script-based training. After installing SWIFT, use the following command:\\n\\n```shell\\nswift web-ui\\n```\\n\\nThis command starts the interface for training and inference.\\n\\nThe web-ui command has two ways to control the UI behaviour. The first way is to use environment variable:\\n\\n> WEBUI_SHARE=1/0: Default is 0. Controls whether gradio is in share mode.\\n>\\n> SWIFT_UI_LANG=en/zh: Controls the language of the web-ui interface.\\n>\\n> WEBUI_SERVER: The server_name parameter. Specifies the host IP for web-ui. 0.0.0.0 means all IPs can access, while 127.0.0.1 means only local access is allowed.\\n>\\n> WEBUI_PORT: The port number for web-ui.\\n>\\n> USE_INFERENCE=1/0: Default is 0. Controls whether the gradio inference page directly loads the model for inference or deployment (USE_INFERENCE=0).\\n\\nThe second way is to use [parameter](../Instruction/Command-line-parameters.md#web-ui-parameters).\\n\\n\\n## 🔥SCEdit\\n\\nSCEdit, proposed by Alibaba TongYi Vision Intelligence Lab, is an efficient generative fine-tuning framework. The framework not only supports fine-tuning capabilities for text-to-image downstream tasks, **saving 30%-50% of training memory overhead compared to LoRA**, achieving rapid transfer to specific generation scenarios; but it can also **directly extend to controllable image generation tasks, requiring only 7.9% of the parameter amount of ControlNet conditional generation and saving 30% of memory overhead**, supporting conditional generation tasks such as edge images, depth images, segmentation images, poses, color images, image inpainting, etc.\\n\\nWe used the 3D style data from the [Style Transfer Dataset](https://modelscope.cn/datasets/damo/style_custom_dataset/dataPeview) for training, and tested using the same `Prompt: A boy in a camouflage jacket with a scarf`. The specific qualitative and quantitative results are as follows:\\n\\n| Method    | bs   | ep   | Target Module | Param. (M)    | Mem. (MiB) | 3D style                                                     |\\n| --------- | ---- | ---- | ------------- | ------------- | ---------- | ------------------------------------------------------------ |\\n| LoRA/r=64 | 1    | 50   | q/k/v/out/mlp | 23.94 (2.20%) | 8440MiB    | <img src=\\\"../../resources/scedit_boy1.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| SCEdit    | 1    | 50   | up_blocks     | 19.68 (1.81%) | 7556MiB    | <img src=\\\"../../resources/scedit_boy2.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| LoRA/r=64 | 10   | 100  | q/k/v/out/mlp | 23.94 (2.20%) | 26300MiB   | <img src=\\\"../../resources/scedit_boy3.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| SCEdit    | 10   | 100  | up_blocks     | 19.68 (1.81%) | 18634MiB   | <img src=\\\"../../resources/scedit_boy4.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| LoRA/r=64 | 30   | 200  | q/k/v/out/mlp | 23.94 (2.20%) | 69554MiB   | <img src=\\\"../../resources/scedit_boy5.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| SCEdit    | 30   | 200  | up_blocks     | 19.68 (1.81%) | 43350MiB   | <img src=\\\"../../resources/scedit_boy6.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n\\nTo perform the training task using SCEdit and reproduce the above results:\\n\\n```shell\\n# First, follow the installation steps in the section below\\ncd examples/pytorch/multi_modal/notebook\\npython text_to_image_synthesis.py\\n```\\n\\n\\n# CogVLM Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## Inference\\n\\nInference with [cogvlm-17b-chat](https://modelscope.cn/models/ZhipuAI/cogvlm-chat/summary):\\n```shell\\n# Experimental environment: A100\\n# 38GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type cogvlm-17b-chat\\n```\\n\\nOutput: (supports passing local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this image.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThis image showcases a close-up of a young kitten. The kitten has a fluffy coat with a mix of white, gray, and brown colors. Its eyes are strikingly blue, and it appears to be gazing directly at the viewer. The background is blurred, emphasizing the kitten as the main subject.\\n--------------------------------------------------\\n<<< clear\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is '1452+45304=45456'.\\n--------------------------------------------------\\n<<< clear\\n<<< Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nIn a world where night and day intertwine,\\nA boat floats gently, reflecting the moon's shine.\\nFireflies dance, their glow a mesmerizing trance,\\nAs the boat sails through a tranquil, enchanted expanse.\\n\\\"\\\"\\\"\\n```\\n\\nExample images are shown below:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single-sample inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.cogvlm_17b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, _ = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest?'\\nimages = images\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: From Mata, it is 14 km; from Yangjiang, it is 62 km; and from Guangzhou, it is 293 km.\\nquery: Which city is the farthest?\\nresponse: Guangzhou is the farthest city with a distance of 293 km.\\n\\\"\\\"\\\"\\n```\\n\\nExample image is shown below:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nFine-tuning multimodal large models usually uses **custom datasets**. Here is a demo that can be run directly:\\n\\n```shell\\n# Experimental environment: A100\\n# 50GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type cogvlm-17b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\n(Supports multi-turn dialogue, but each conversation can only include one image. Support local file paths or URLs for input)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm-17b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/cogvlm-17b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm-17b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# CogVLM2 Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nModel link:\\n- cogvlm2-19b-chat: [https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B/summary](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B/summary)\\n- cogvlm2-en-19b-chat: [https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chat-19B/summary](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chat-19B/summary)\\n\\n## Inference\\n\\nInference cogvlm2-19b-chat:\\n```shell\\n# Experimental environment: A100\\n# 43GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type cogvlm2-19b-chat\\n```\\n\\nOutput: (supports passing local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this image.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThis image features a very young, fluffy kitten with a look of innocent curiosity. The kitten's fur is a mix of white, light brown, and dark gray with distinctive dark stripes that give it a tabby appearance. Its large, round eyes are a striking shade of blue with light reflections, which accentuate its youthful and tender expression. The ears are perky and alert, with a light pink hue inside, adding to the kitten's endearing look.\\n\\nThe kitten's fur is thick and appears to be well-groomed, with a soft, plush texture that suggests it is a breed known for its long, luxurious coat, such as a Maine Coon or a Persian. The white fur around its neck and chest stands out, providing a stark contrast to the darker shades on its back and head.\\n\\nThe background is blurred and warm-toned, providing a soft, neutral environment that ensures the kitten is the central focus of the image. The lighting is gentle, highlighting the kitten's features without casting harsh shadows, which further contributes to the image's warm and comforting ambiance.\\n\\nOverall, the image captures the essence of a kitten's first year of life, characterized by its inquisitive nature, soft fur, and the endearing charm of youth.\\n--------------------------------------------------\\n<<< clear\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is 46556.\\n--------------------------------------------------\\n<<< clear\\n<<< Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nA boat drifts on the calm river,\\nSurrounded by lush greenery.\\nThe gentle ripples on the water's surface,\\nReflect the stars in the sky.\\n\\nThe night is serene and peaceful,\\nThe only sound is the lapping of the waves.\\nThe boat is like a floating island,\\nIsolated in the vastness of the river.\\n\\nThe stars shine brightly in the sky,\\nAs if watching over the boat.\\nThe lush greenery on the riverbank,\\nGives the boat a sense of warmth.\\n\\nThe boat drifts on the river,\\nCarrying the beauty of nature.\\nLet us enjoy this moment together,\\nAnd feel the tranquility of life.\\n\\\"\\\"\\\"\\n```\\n\\nExample images are shown below:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single-sample inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.cogvlm2_19b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, _ = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest?'\\nimages = images\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: To determine the distance from each city, we will need to look at the information provided on the road sign:\\n\\n1. From \\\"Mata\\\" to \\\"Yangjiang,\\\" it is 62 kilometers.\\n2. From \\\"Yangjiang\\\" to \\\"Guangzhou,\\\" it is 293 kilometers.\\n\\nThese distances are indicated in kilometers and are shown for the two cities immediately following on the sign.\\nquery: Which city is the farthest?\\nresponse: The farthest city on this sign is Guangzhou, which is 293 kilometers away.\\n\\\"\\\"\\\"\\n```\\n\\nExample image is shown below:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nFine-tuning multimodal large models usually uses **custom datasets**. Here is a demo that can be run directly:\\n\\n```shell\\n# Experimental environment: A100\\n# 70GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type cogvlm2-19b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\n(Supports multi-turn dialogue, but each conversation can only include one image. Support local file paths or URLs for input)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-19b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/cogvlm2-19b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-19b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Human Preference Alignment Training Documentation\\nThis document provides training scripts for various human preference alignment algorithms. If you wish to delve deeper into more detailed algorithm information and selection methods, please refer to [documentation](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/M.%E4%BA%BA%E7%B1%BB%E5%81%8F%E5%A5%BD%E5%AF%B9%E9%BD%90%E8%AE%AD%E7%BB%83.md)\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Dataset](#dataset)\\n- [DPO](#dpo)\\n- [CPO](#cpo)\\n- [ORPO](#orpo)\\n- [SimPO](#simpo)\\n\\n## Environment Setup\\n```bash\\n# Set pip global mirror (for faster downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n# Environment alignment (usually not necessary. If you encounter errors, you can run the following code, the repository uses the latest environment test)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Dataset\\nVision human preference alignment training typically requires data in the format $(x,y_w,y_l)$, where $x$ represents the model input, include textual prompt and images, and $y_w,y_l$ represent the preferred and rejected answers according to human preference, such as ![dpo_data](../../resources/vdpo_data.png)\\n\\n\\n**Custom Dataset Format**\\n\\n```jsonl\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"rejected_response\\\": \\\"33333\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"rejected_response\\\": \\\"ccccc\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"rejected_response\\\": \\\"CCCCC\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\nDifferent models have varying support for the number of images. Please refer to the corresponding best practices document for each model.\\n\\n**Training Tips**:\\n\\n- The following training scripts use --lora_target_modules DEFAULT to only train the model's QKV matrices, but you can set --lora_target_modules ALL to train all linear layers of the model\\n\\n## DPO\\n[paper arvix](https://arxiv.org/abs/2305.18290)\\n\\nHyperparameters\\n- `beta`：KL regularization coefficient, the higher the value, the greater the penalty for deviations from the reference model. Default is 0.1\\n\\nIt is recommended to train with the preferred answer part of the preference dataset before starting DPO training to ensure data fits the distribution requirements of the DPO algorithm.\\n\\nWe also mix sft loss in the DPO loss to stabilize training; you can adjust the sft loss coefficient by setting the hyperparameter `rpo_alpha`, the default is `1.`.\\n\\nFor training script, we provide single card/multi-card device map/multi-card ddp versions, for brevity, only the single card version is given for subsequent algorithms.\\n\\n```bash\\n# Experimental environment: A100\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# MP(device map)\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# DDP + MP\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\nModel inference and deployment after training can refer to the best practice documentation for the corresponding model, [Mutlimodal Deployment Document](./mutlimodal-deployment.md) and [VLLM Inference Acceleration Document](./vllm-inference-acceleration.md)\\n\\n## CPO\\n[Paper arvix](https://arxiv.org/abs/2401.08417)\\nHyperparameters\\n- beta: The beta factor in CPO loss., default is 0.1\\n- cpo_alpha: Controls the strength of the BC regularizer in CPO training, default is 1.0\\n\\nTraining script\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type cpo \\\\\\n    --model_type  llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n## ORPO\\n[paper arvix](https://arxiv.org/abs/2403.07691)\\nHyperparameters\\n- lambda: Coefficient for the Odds Ratio loss\\n\\n**Note**: ORPO uses the parameter beta to input the hyperparameter lambda\\n\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n\\n## SimPO\\n[Paper arvix](https://arxiv.org/abs/2405.14734)\\nHyperparameters\\n- beta: Coefficient before the hidden reward, default is 2.0\\n- simpo_gamma: Reward margin term, default is 1.0\\n- cpo_alpha: Controls the strength of the BC regularizer in CPO training, mix nll loss in CPO to enhances training stability, with a default value of 1.0. Setting it to 0.0 uses the original SimPO algorithm.\\n\\nTraining script\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type simpo \\\\\\n    --model_type  llava1_6-mistral-7b-instruct \\\\\\n    --beta 2.0 \\\\\\n    --simpo_gamma 1.0 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n\\n# Qwen-VL Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference after Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\npip install 'ms-swift[llm]' -U\\n```\\n\\n## Inference\\n\\nInfer using [qwen-vl-chat](https://modelscope.cn/models/qwen/Qwen-VL-Chat/summary):\\n```shell\\n# Experimental environment: 3090\\n# 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-vl-chat\\n```\\n\\nOutput: (supports passing in local paths or URLs)\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\nI am a large language model created by Alibaba Cloud. I am called QianWen.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>What are the differences between these two pictures\\nThe picture on the left is a cartoon image of a white sheep with brown spots,而the picture on the right is a digital painting of a white cat with gray stripes on its head, a small pink nose, and big blue eyes. The former is a photograph of a real animal, while the latter is a work of art created solely for decorative purposes. The latter also has a more delicate and cute style.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>How many sheep are in the picture\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>What is the calculation result\\nThe calculation result is 45304.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>Write a poem based on the content in the picture\\nA lone boat on the river, gliding with ease Through the misty waters, a peaceful scene A man sits within, with a lantern to guide him, Through the dark of night, with a gentle glide.\\n\\\"\\\"\\\"\\n```\\n\\nSample images are as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single Sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen_vl_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it to each city?\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest away?'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it to each city?\\nresponse: The sign shows the distance to four cities: mata is 14 km, yangjiang is 62 km, yangzhou is 293 km, and guangzhou is 293 km.\\nquery: Which city is the farthest away?\\nresponse: The farthest away is guangzhou, which is 293 km according to the sign.\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it to each city?', 'The sign shows the distance to four cities: mata is 14 km, yangjiang is 62 km, yangzhou is 293 km, and guangzhou is 293 km.'], ['Which city is the farthest away?', 'The farthest away is guangzhou, which is 293 km according to the sign.']]\\n\\\"\\\"\\\"\\n```\\n\\nSample image is as follows:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nMultimodal large model fine-tuning usually uses **custom datasets**. Here is a demo that can be run directly:\\n\\nLoRA fine-tuning:\\n\\n```shell\\n# Experimental environment: 3090\\n# 23GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen-vl-chat \\\\\\n    --dataset coco-en-mini \\\\\\n```\\n\\nFull parameter fine-tuning:\\n```shell\\n# Experimental environment: 2 * A100\\n# 2 * 55 GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type qwen-vl-chat \\\\\\n    --dataset coco-en-mini \\\\\\n    --sft_type full \\\\\\n```\\n\\n**Qwen-VL** model supports training for grounding tasks. The data should be in the following format:\\n\\n```jsonl\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359],[1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n```\\n\\nAlternatively, you can use the `<img></img>` tag:\\n```jsonl\\n{\\\"query\\\": \\\"<img>/coco2014/train2014/COCO_train2014_000000001507.jpg</img>Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n{\\\"query\\\": \\\"<img>/coco2014/train2014/COCO_train2014_000000001507.jpg</img>Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n```\\n\\nIn the `objects` field, there is a JSON string containing four fields:\\n- `caption`: Description of the object corresponding to the bounding box.\\n- `bbox`: Coordinates. It's recommended to provide four integers (not floats), which are `x_min`, `y_min`, `x_max`, and `y_max`.\\n- `bbox_type`: Type of the bounding box. Currently supports three types: `real`/`norm_1000`/`norm_1`, which respectively represent actual pixel coordinates, coordinates normalized to thousandths, and coordinates normalized to a scale of 1.\\n- `image`: The index of the image corresponding to the bounding box, starting from 0.\\n\\nThis format will be converted to a format recognizable by Qwen-VL. Specifically:\\n```jsonl\\n{\\\"query\\\": \\\"<img>/coco2014/train2014/COCO_train2014_000000001507.jpg</img>Find <ref>the man</ref>\\\", \\\"response\\\": \\\"<box>(200,200),(600,600)</box>\\\"}\\n```\\n\\nYou can also directly provide the above format, but please use thousandths for the coordinates.\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json and jsonl formats. Here is an example of a custom dataset:\\n\\n(Supports multi-turn dialogues, where each turn can contain multiple images or no images, and supports passing in local paths or URLs)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## Inference after Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and infer:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# CogVLM2 Video Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# https://github.com/facebookresearch/pytorchvideo/issues/258\\n# https://github.com/dmlc/decord/issues/177\\npip install decord pytorchvideo\\n```\\n\\nModel link:\\n- cogvlm2-video-13b-chat: [https://modelscope.cn/models/ZhipuAI/cogvlm2-video-llama3-chat](https://modelscope.cn/models/ZhipuAI/cogvlm2-video-llama3-chat)\\n\\n\\n## Inference\\n\\nInference cogvlm2-video-13b-chat:\\n```shell\\n# Experimental environment: A100\\n# 28GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type cogvlm2-video-13b-chat\\n```\\n\\nOutput: (supports passing local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 描述这段视频\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\nIn the video, a young child is seen sitting on a bed and reading a book. The child is wearing glasses and is dressed in a light blue top and pink pants. The room appears to be a bedroom with a crib in the background. The child is engrossed in the book, and the scene is captured in a series of frames showing the child's interaction with the book.\\n--------------------------------------------------\\n<<< clear\\n<<< Describe this video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/fire.mp4\\nIn the video, a person is seen lighting a fire in a backyard setting. They start by holding a piece of food and then proceed to light a match to the food. The fire is then ignited, and the person continues to light more pieces of food, including a bag of chips and a piece of wood. The fire is seen burning brightly, and the person is seen standing over the fire, possibly enjoying the warmth. The video captures the process of starting a fire and the person's interaction with the flames, creating a cozy and inviting atmosphere.\\n--------------------------------------------------\\n<<< clear\\n<<< who are you\\nInput a video path or URL <<<\\nI am a person named John.\\n\\\"\\\"\\\"\\n```\\n\\n**Single-sample inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.cogvlm2_video_13b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']\\nquery = '描述这段视频'\\nresponse, history = inference(model, template, query, videos=videos)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'Describe this video.'\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/fire.mp4']\\ngen = inference_stream(model, template, query, history, videos=videos)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\n\\\"\\\"\\\"\\nquery: 描述这段视频\\nresponse: The video depicts a young child sitting on a bed and reading a book. The child is wearing glasses and is seen in various positions, such as sitting on the bed, sitting on a couch, and sitting on a bed with a blanket. The child's attire changes from a light blue top and pink pants to a light blue top and pink leggings. The room has a cozy and warm atmosphere with soft lighting, and there are personal items scattered around, such as a crib, a television, and a white garment.\\nquery: Describe this video.\\nresponse: The video shows a person lighting a fire in a backyard setting. The person is seen holding a piece of food and a lighter, and then lighting the food on fire. The fire is then used to light other pieces of wood, and the person is seen standing over the fire, holding a bag of food. The video captures the process of starting a fire and the person's interaction with the fire.\\n\\\"\\\"\\\"\\n```\\n\\n\\n## Fine-tuning\\nFine-tuning multimodal large models usually uses **custom datasets**. Here is a demo that can be run directly:\\n\\n```shell\\n# Experimental environment: A100\\n# 40GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type cogvlm2-video-13b-chat \\\\\\n    --dataset video-chatgpt \\\\\\n    --num_train_epochs 3 \\\\\\n\\n# ZeRO2\\n# Experimental environment: 4 * A100\\n# 4 * 40GB GPU memory\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type cogvlm2-video-13b-chat \\\\\\n    --dataset video-chatgpt \\\\\\n    --num_train_epochs 3 \\\\\\n    --deepspeed default-zero2\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\n(Supports multi-turn dialogue, but each conversation can only include one image. Support local file paths or URLs for input)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"videos\\\": [\\\"video_path\\\"]}\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-video-13b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/cogvlm2-video-13b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-video-13b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Yi-VL Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## Inference\\n\\nInference for [yi-vl-6b-chat](https://modelscope.cn/models/01ai/Yi-VL-6B/summary):\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 18GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type yi-vl-6b-chat\\n```\\n\\nOutput: (supports passing in local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this type of image\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThe image shows a kitten sitting on the floor, eyes open, staring at the camera. The kitten looks very cute, with gray and white fur, and blue eyes. It seems to be looking at the camera, possibly curious about the surroundings.\\n--------------------------------------------------\\n<<< How many sheep are in the picture\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the image.\\n--------------------------------------------------\\n<<< clear\\n<<< What is the calculation result\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n1452 + 45304 = 46756\\n--------------------------------------------------\\n<<< clear\\n<<< Write a poem based on the content in the image\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nNight falls, starlight twinkles,\\nA small boat drifts on the river,\\nA bright lantern hangs on the bow,\\nIlluminating the surrounding darkness.\\n\\nTwo people are on the boat,\\nOne at the bow, the other at the stern,\\nThey seem to be talking,\\nEnjoying a tranquil moment under the starlight.\\n\\nOn the riverbank, trees stand in the dark,\\nCasting long shadows in the starlight.\\nThe scene is so peaceful,\\nReminiscent of an ancient legend.\\n\\nThe boat, the people, and the starlight,\\nForm a beautiful picture,\\nEvoking a feeling of serenity,\\nBeyond the hustle and bustle of city life.\\n\\\"\\\"\\\"\\n```\\n\\nSample images are as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single Sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.yi_vl_6b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(2)  # ...\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the furthest away?'\\nimages = images * 2\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: It's 14 kilometers from Jiata, 62 kilometers from Yangjiang, 293 kilometers from Guangzhou, 293 kilometers from Guangzhou.\\nquery: Which city is the furthest away?\\nresponse: The furthest distance is 293 kilometers.\\nhistory: [['How far is it from each city?', \\\"It's 14 kilometers from Jiata, 62 kilometers from Yangjiang, 293 kilometers from Guangzhou, 293 kilometers from Guangzhou.\\\"], ['Which city is the furthest away?', 'The furthest distance is 293 kilometers.']]\\n\\\"\\\"\\\"\\n```\\n\\nSample image as follows:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nFine-tuning multimodal large models usually uses **custom datasets**. Here shows a demo that can run directly:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 19GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type yi-vl-6b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl format, here is an example of a custom dataset:\\n\\n(Multi-turn dialogue is supported, each turn must include an image, which can be passed as a local path or URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\", \\\"image_path2\\\", \\\"image_path3\\\"]}\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# vLLM Inference Acceleration Documentation\\n\\nms-swift has integrated vLLM for accelerating inference of multimodal models. Check out the supported models in [Supported Models and Datasets Documentation](../Instruction/Supported-models-datasets.md#MLLM).\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference Acceleration](#inference-acceleration)\\n- [Deployment](#deployment)\\n\\n## Environment Setup\\n```bash\\n# Set pip global mirror (speeds up downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# vllm version corresponds to cuda version, please select version according to `https://docs.vllm.ai/en/latest/getting_started/installation.html`\\npip install \\\"vllm>=0.5.1\\\"\\npip install openai -U\\n```\\n\\n## Inference Acceleration\\n\\nUsing python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm\\n)\\n\\n# 'minicpm-v-v2_5-chat', 'minicpm-v-v2_6-chat', 'internvl2-1b', 'internvl2-4b', 'phi3-vision-128k-instruct'\\nmodel_type = ModelType.llava1_6_mistral_7b_instruct\\nllm_engine = get_vllm_engine(model_type)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# Interface similar to `transformers.GenerationConfig`\\nllm_engine.generation_config.max_new_tokens = 1024\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\nrequest_list = [{'query': 'who are you'}, {'query': 'Describe this image.', 'images': images}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n\\nhistory1 = resp_list[1]['history']\\nimages.append(None)\\nrequest_list = [{'query': 'Is the creature in the picture a dog?', 'history': history1, 'images': images}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n    print(f\\\"history: {resp['history']}\\\")\\n\\n\\\"\\\"\\\"\\nquery: who are you\\nresponse: Hello! I am an AI language model, designed to assist users with information and provide helpful prompts and suggestions. As an artificial intelligence, I do not have personal experiences, so I don't have a personality or individuality. Instead, my purpose is to provide accurate, useful information to users like you. Is there anything specific you would like help with or any other questions you have?\\nquery: Describe this image.\\nresponse: The image features a close-up of a kitten's face. The kitten has striking blue eyes, which are open and appear to be looking towards the camera. Its fur exhibits a mix of black and white stripes with black markings around its eyes. The fur texture is soft and dense with whiskers adorning the sides of its face, adding to its feline charm. The background is blurred with hints of green and white, which creates a bokeh effect, keeping the focus on the kitten's face. The image exudes a sense of innocence and curiosity typically associated with young felines.\\nquery: Is the creature in the picture a dog?\\nresponse: No, the creature in the picture is a kitten, which is a young cat, not a dog. The presence of distinct feline features such as stripes, whiskers, and the appearance of blue eyes confirms this.\\nhistory: [['Describe this image.', \\\"The image features a close-up of a kitten's face. The kitten has striking blue eyes, which are open and appear to be looking towards the camera. Its fur exhibits a mix of black and white stripes with black markings around its eyes. The fur texture is soft and dense with whiskers adorning the sides of its face, adding to its feline charm. The background is blurred with hints of green and white, which creates a bokeh effect, keeping the focus on the kitten's face. The image exudes a sense of innocence and curiosity typically associated with young felines. \\\"], ['Is the creature in the picture a dog?', 'No, the creature in the picture is a kitten, which is a young cat, not a dog. The presence of distinct feline features such as stripes, whiskers, and the appearance of blue eyes confirms this. ']]\\n\\\"\\\"\\\"\\n```\\n\\nBatch processin:\\n```python\\n# vllm>=0.5.4\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_vllm_engine, get_template, inference_vllm, ModelType,\\n    get_default_template_type, inference_stream_vllm\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.minicpm_v_v2_6_chat\\nmodel_id_or_path = None\\nvllm_engine = get_vllm_engine(model_type, torch.bfloat16, model_id_or_path=model_id_or_path,\\n                              max_model_len=8192)\\n\\ntokenizer = vllm_engine.hf_tokenizer\\nvllm_engine.generation_config.max_new_tokens = 256\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = '<image>Describe this image.'\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\ngeneration_info = {}\\nrequest_list = [{'query': query, 'images': images} for _ in range(100)]\\nresp_list = inference_vllm(vllm_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\nprint(f'query: {query}')\\nprint(f'response: {resp_list[0][\\\"response\\\"]}')\\nprint(generation_info)\\n\\n# streaming\\ngeneration_info = {}\\ngen = inference_stream_vllm(vllm_engine, template, request_list, generation_info=generation_info)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\n# only show first\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    if resp is None:\\n        continue\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(generation_info)\\n\\n\\\"\\\"\\\"\\n100%|███████████████████████████████████████████████████████████████████| 100/100 [00:05<00:00, 17.80it/s]\\n100%|███████████████████████████████████████████████████████████████████| 100/100 [00:22<00:00,  4.53it/s]\\nquery: <image>Describe this image.\\nresponse: The image features a close-up of a kitten that appears to be a young domestic cat. Its large, expressive eyes are striking, and the fur pattern is a mix of striped and spotted markings, which is common in certain breeds like the Nebelung. Kitten's eyes are typically blue at birth, turning to their permanent color within four to six months. The kitten's curious and attentive gaze could suggest it is alert to its surroundings and possibly interested in something outside the frame of the image. The soft focus and warm lighting contribute to a cozy and inviting atmosphere, which is often associated with young animals and can invoke feelings of warmth and affection in viewers.\\n{'num_prompt_tokens': 2800, 'num_generated_tokens': 12569, 'num_samples': 100, 'runtime': 27.816649557033088, 'samples/s': 3.5949692573495526, 'tokens/s': 451.85168595626527}\\nquery: <image>Describe this image.\\nresponse: The image features a close-up of a kitten, likely a young maine coon, characterized by its distinctive facial markings and large, expressive eyes. Maine coons are known for their robust stature and friendly demeanor, traits that this kitten also seems to exhibit. The blurred background suggests that the focus is entirely on the kitten, enhancing its cuteness and making it the central subject of the photograph. This kind of image is often used to elicit feelings of affection and to highlight the charm and innocence of young animals. It's a simple yet powerful image that could be used for themes such as pet adoption, animal welfare, or simply as an adorable piece for pet enthusiasts.\\n{'num_prompt_tokens': 2800, 'num_generated_tokens': 12275, 'num_samples': 100, 'runtime': 40.04483833198901, 'samples/s': 2.4972007421020606, 'tokens/s': 306.53139109302793}\\n\\\"\\\"\\\"\\n```\\n\\n\\nUsing CLI:\\n```shell\\n# Multimodal models must explicitly specify `--infer_backend vllm`.\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-vicuna-7b-instruct --infer_backend vllm\\n\\n# Batch inference on the dataset\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-vicuna-7b-instruct --infer_backend vllm \\\\\\n    --val_dataset coco-en-2-mini#100\\n\\n# TP:\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type internvl2-1b \\\\\\n    --infer_backend vllm --tensor_parallel_size 2\\n```\\n\\n```python\\n\\\"\\\"\\\"\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< Perform OCR on the image.\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\nThe image contains text that appears to be an introduction or description of a software or service called SWIFT. Here is the transcribed text:\\n\\nintroduction\\nSWIFT supports training, inference, evaluation and deployment of 250+ LLMs and 35 MLMs (multimodal large models). Developers can directly apply their own research and production environments to realize the complete workflow from model training and evaluation to application. In addition, we provide a complete Adapters Library to support the latest training techniques such as PEFT, we also provide a Gradio web-ui for controlling training and inference, as well as accompanying deep learning courses and best practices for beginners.\\n\\nAdditionally, we are expanding capabilities for other modalities. Currently, we support full-paraphrase training and LORA training for AnimatedDiff.\\n\\nSWIFT web-ui is available both on HuggingFace space and ModelScope studio.\\n\\nPlease feel free to try.\\n\\nPlease note that the text is a mix of English and what appears to be a programming or technical language, and some words or phrases might not be fully transcribed due to the complexity of the text.\\n--------------------------------------------------\\n<<< who are you\\nInput a media path or URL <<<\\nI'm a language model called Vicuna, and I was trained by researchers from Large Model Systems Organization (LMSYS).\\n\\\"\\\"\\\"\\n```\\n\\n\\n## Deployment\\n\\n**Server**:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type llava1_6-vicuna-13b-instruct --infer_backend vllm\\n\\n# TP:\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type internvl2-1b \\\\\\n    --infer_backend vllm --tensor_parallel_size 2\\n```\\n\\n**Client**:\\n\\nTest:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"llava1_6-vicuna-13b-instruct\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"Describe this image.\\\"}],\\n\\\"temperature\\\": 0,\\n\\\"images\\\": [\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\"]\\n}'\\n```\\n\\nUsing ms-swift:\\n```python\\nimport asyncio\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client_async\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\nrequest_config = XRequestConfig(seed=42)\\n\\nquery = '<image>Describe this image.'\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\ntasks = [inference_client_async(model_type, query, images=images, request_config=request_config) for _ in range(100)]\\nasync def _batch_run(tasks):\\n    return await asyncio.gather(*tasks)\\n\\nresp_list = asyncio.run(_batch_run(tasks))\\nprint(f'query: {query}')\\nprint(f'response0: {resp_list[0].choices[0].message.content}')\\nprint(f'response1: {resp_list[1].choices[0].message.content}')\\n\\nquery = '<image>How many sheep are in the picture?'\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\n\\nasync def _stream():\\n    global query\\n    request_config = XRequestConfig(seed=42, stream=True)\\n    stream_resp = await inference_client_async(model_type, query, images=images, request_config=request_config)\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    async for chunk in stream_resp:\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n\\nasyncio.run(_stream())\\n\\\"\\\"\\\"\\nmodel_type: llava1_6-vicuna-13b-instruct\\nquery: <image>Describe this image.\\nresponse0: The image captures a moment of tranquility featuring a kitten. The kitten, with its fur a mix of gray and white, is the main subject of the image. It's sitting on a surface that appears to be a table or a similar flat surface. The kitten's eyes, a striking shade of blue, are wide open, giving it a curious and alert expression. Its ears, also gray and white, are perked up, suggesting it's attentive to its surroundings. The background is blurred, drawing focus to the kitten, and it's a soft, muted color that doesn't distract from the main subject. The overall image gives a sense of calm and innocence.\\nresponse1: The image captures a moment of tranquility featuring a kitten. The kitten, with its fur a mix of gray and white, is the main subject of the image. It's sitting on a surface that appears to be a table or a similar flat surface. The kitten's eyes, a striking shade of blue, are wide open, giving it a curious and alert expression. Its ears, also gray and white, are perked up, suggesting it's attentive to its surroundings. The background is blurred, drawing focus to the kitten, and it's a soft, muted color that doesn't distract from the main subject. The overall image gives a sense of calm and innocence.\\nquery: <image>How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\nUsing OpenAI\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['cat.png'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png'\\n\\nquery = 'Describe this image.'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\n\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'How many sheep are in the picture?'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\\"\\\"\\\"\\nmodel_type: llava1_6-vicuna-13b-instruct\\nquery: Describe this image.\\nresponse: The image captures a moment of tranquility featuring a kitten. The kitten, with its fur a mix of gray and white, is the main subject of the image. It's sitting on a surface that appears to be a table or a similar flat surface. The kitten's eyes, a striking shade of blue, are wide open, giving it a curious and alert expression. Its ears, also gray and white, are perked up, suggesting it's attentive to its surroundings. The background is blurred, drawing focus to the kitten, and it's a soft, muted color that doesn't distract from the main subject. The overall image gives a sense of calm and innocence.\\nquery: How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\nYou can check out more client usage methods in the [MLLM Deployment Documentation](mutlimodal-deployment.md#yi-vl-6b-chat).\\n\\n\\n\\n# Qwen2-VL Best Practice\\nThe best practices for qwen2-vl-72b-instruct can be found [here](https://github.com/modelscope/ms-swift/issues/2064).\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e .[llm]\\n\\npip install git+https://github.com/huggingface/transformers.git\\npip install pyav qwen_vl_utils\\n```\\n\\nModel: (Supports base/instruct/gptq-int4/gptq-int8/awq fine-tuning)\\n- qwen2-vl-2b-instruct: [https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct)\\n- qwen2-vl-7b-instruct: [https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct)\\n- qwen2-vl-72b-instruct: [https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct)\\n\\n## Inference\\n\\nInference qwen2-vl-7b-instruct.\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-vl-7b-instruct\\n```\\n\\nOutput: (Supports passing in local paths or URLs)\\n```python\\n\\\"\\\"\\\"\\n<<< who are you?\\nI am a large language model created by Alibaba Cloud. I am called Qwen.\\n--------------------------------------------------\\n<<< <image>There are several sheep in the picture.\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n[INFO:swift] Setting size_factor: 28. You can adjust this hyperparameter through the environment variable: `SIZE_FACTOR`.\\n[INFO:swift] Setting resized_height: None. You can adjust this hyperparameter through the environment variable: `RESIZED_HEIGHT`.\\n[INFO:swift] Setting resized_width: None. You can adjust this hyperparameter through the environment variable: `RESIZED_WIDTH`.\\n[INFO:swift] Setting min_pixels: 3136. You can adjust this hyperparameter through the environment variable: `MIN_PIXELS`.\\n[INFO:swift] Setting max_pixels: 12845056. You can adjust this hyperparameter through the environment variable: `MAX_PIXELS`.\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< <image>What is the result of the calculation?\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe result of the calculation 1452 + 45304 is 46756.\\n--------------------------------------------------\\n<<< <image>Perform OCR on the image.\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\nIntroduction\\n\\nSWIFT supports training, inference, evaluation and deployment of 250+ LLMs and 35+ MLLMs (multimodal large models). Developers can directly apply our framework to their own research and production environments to realize the complete workflow from model training and evaluation to application. In addition to supporting the lightweight training solutions provided by PEFT, we also provide a complete Adapters library to support the latest training techniques such as NEFTune, LoRA+, LLaMA-PRO, etc. This adapter library can be used directly in your own custom workflow without our training scripts.\\n\\nTo facilitate use by users unfamiliar with deep learning, we provide a Gradio web-ui for controlling training and inference, as well as accompanying deep learning courses and best practices for beginners.\\n\\nAdditionally, we are expanding capabilities for other modalities. Currently, we support full-parameter training and LoRA training for AnimateDiff.\\n\\nSWIFT has rich documentations for users, please check <a href=\\\"https://swift-lm.readthedocs.io/en/latest/\\\">here</a>.\\n\\nSWIFT web-ui is available both on <a href=\\\"https://huggingface.co/spaces/swift-lm\\\">Huggingface space</a> and <a href=\\\"https://modelscope.com/studio\\\">ModelScope studio</a>, please feel free to try!\\n--------------------------------------------------\\n<<< clear\\n<<< <video>Detailed description of the video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\n[INFO:swift] Setting nframes: None. You can adjust this hyperparameter through the environment variable: `NFRAMES`.\\n[INFO:swift] Setting fps: None. You can adjust this hyperparameter through the environment variable: `FPS`.\\n[INFO:swift] Setting size_factor: 2. You can adjust this hyperparameter through the environment variable: `SIZE_FACTOR`.\\n[INFO:swift] Setting min_frames: 4. You can adjust this hyperparameter through the environment variable: `MIN_FRAMES`.\\n[INFO:swift] Setting max_frames: 768. You can adjust this hyperparameter through the environment variable: `MAX_FRAMES`.\\n[INFO:swift] Setting min_pixels: 100352. You can adjust this hyperparameter through the environment variable: `MIN_PIXELS`.\\n[INFO:swift] Setting total_pixels: 19267584. You can adjust this hyperparameter through the environment variable: `TOTAL_PIXELS`.\\n[INFO:swift] Setting max_pixels: None. You can adjust this hyperparameter through the environment variable: `MAX_PIXELS`.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\nThe video features a baby girl wearing glasses who is sitting on a bed and reading a book. The baby is wearing a light blue shirt and pink pants. She is holding the book with both hands and appears to be turning the pages. The background of the video shows a wooden crib and a white blanket. The baby seems to be enjoying the book and is focused on it. The video captures a peaceful and serene moment of the baby reading.\\n\\\"\\\"\\\"\\n```\\n\\n**Single-sample inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen2_vl_7b_instruct\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.bfloat16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'What is the farthest city?'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"\\ntemplate_type: qwen2-vl\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?\\nresponse: The distances to the cities are as follows:\\n\\n- To Mata: 14 km\\n- To Yangjiang: 62 km\\n- To Guangzhou: 293 km\\nquery: What is the farthest city?\\nresponse: The farthest city is Guangzhou, which is 293 km away.\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?', 'The distances to the cities are as follows:\\\\n\\\\n- To Mata: 14 km\\\\n- To Yangjiang: 62 km\\\\n- To Guangzhou: 293 km'], ['What is the farthest city?', 'The farthest city is Guangzhou, which is 293 km away.']]\\n\\\"\\\"\\\"\\n```\\n\\n\\n## Fine-tuning\\n\\n### Image OCR fine-tuning\\nWe fine-tune using latex-ocr-printdataset, which aims to describe the content of images. You can find this dataset on ModelScope: [https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR](https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR)\\n\\n```bash\\n# Single-card A10/3090 can run\\n# GPU Memory: 20GB\\nSIZE_FACTOR=8 MAX_PIXELS=602112 CUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset latex-ocr-print#20000\\n```\\n\\nExample of the model performing inference on the validation set after fine-tuning (only 200 steps were trained):\\n\\n![inference result](../../resources/qwen2-vl/ocr_result.png)\\n\\n### Image Description Fine-tuning\\n\\nWe fine-tune using the coco-en-mini dataset, which aims to describe the content of images. You can find this dataset on ModelScope: [https://modelscope.cn/datasets/modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption)\\n\\n```bash\\n# By default, lora_target_modules will be set to all linear layers of the LLM.\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset coco-en-mini#20000 \\\\\\n  --deepspeed default-zero2\\n\\n# Full parameter training and freezing ViT\\n# GPU Memory: 4 * 60GB\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type full \\\\\\n  --freeze_vit true \\\\\\n  --deepspeed default-zero2 \\\\\\n  --dataset latex-ocr-print#20000\\n\\n# Lower GPU Memory Consumption: QLoRA\\n# GPU Memory: 10GB\\nSIZE_FACTOR=8 MAX_PIXELS=602112 CUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct-gptq-int4 \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4 \\\\\\n  --sft_type lora \\\\\\n  --dataset latex-ocr-print#20000\\n```\\n\\nTo use a custom dataset, simply specify it as follows:\\n\\n```bash\\n  --dataset train.jsonl \\\\\\n  --val_dataset val.jsonl \\\\\\n```\\n\\nThe custom dataset supports JSON and JSONL formats. Below is an example of a custom dataset:\\n\\n```jsonl\\n{\\\"query\\\": \\\"<image>55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee<image>eeeee<image>eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path1\\\", \\\"image_path2\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response2\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": []}\\n```\\n\\nGPU Memory Usage:\\n\\n![GPU Memory Usage](../../resources/qwen2-vl/1.png)\\n\\n\\nTraining loss (only 200 steps were trained):\\n\\n![train loss](../../resources/qwen2-vl/loss.png)\\n\\nThe inference script after fine-tuning is as follows:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen2-vl-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true --merge_lora true\\n```\\n\\nExample of the model performing inference on the validation set after fine-tuning:\\n\\n![inference result](../../resources/qwen2-vl/2.png)\\n\\n### Image grounding fine-tuning\\n\\nWe use the refcoco-unofficial-grounding dataset for grounding fine-tuning, which you can find on ModelScope: https://modelscope.cn/datasets/swift/refcoco\\n\\n```bash\\n# Support fine-tuning with zero3.\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset refcoco-unofficial-grounding#20000 \\\\\\n  --deepspeed default-zero3\\n```\\n\\nUsers can use the following custom dataset format:\\n```jsonl\\n# swift Cross-Model Universal Format\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359],[1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# Specific format for qwen2-vl-chat, noting the presence of special characters.\\n{\\\"query\\\": \\\"Find <|object_ref_start|>the man<|object_ref_end|>\\\", \\\"response\\\": \\\"<|box_start|>(123,235),(324,546)<|box_end|>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"]}\\n```\\n\\n### Video fine-tuning\\n\\nWe fine-tune using the video-chatgpt dataset, which is tasked with describing video content. You can find this dataset on ModelScope:https://modelscope.cn/datasets/swift/VideoChatGPT\\n```bash\\nNFRAMES=24 MAX_PIXELS=100352 CUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset video-chatgpt \\\\\\n  --deepspeed default-zero2\\n```\\n\\nThe custom dataset supports JSON and JSONL formats. Below is a sample of the custom dataset:\\n```jsonl\\n{\\\"query\\\": \\\"<video>55555\\\", \\\"response\\\": \\\"66666\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"eeeee<video>eeeee<video>eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"videos\\\": [\\\"video_path1\\\", \\\"video_path2\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response2\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"videos\\\": []}\\n```\\n\\nGPU Memory Usage:\\n![GPU Memory Usage](../../resources/qwen2-vl/3.png)\\n\\nThe inference script after fine-tuning is as follows:\\n```bash\\nNFRAMES=24 MAX_PIXELS=100352 CUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen2-vl-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true --merge_lora true\\n```\\n\\nExample of the model performing inference on the validation set after fine-tuning: (only 50 steps were trained)\\n![inference result](../../resources/qwen2-vl/4.png)\\n\\n\\n# GLM4V Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n\\n## Environment Setup\\n```shell\\n# Please use 'ms-swift>=2.2' or the main branch.\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nModel link:\\n- glm4v-9b-chat: [https://modelscope.cn/models/ZhipuAI/glm-4v-9b/summary](https://modelscope.cn/models/ZhipuAI/glm-4v-9b/summary)\\n\\n\\n## Inference\\n\\nInference glm4v-9b-chat:\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type glm4v-9b-chat\\n```\\n\\nOutput: (supports passing local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this image.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThis is an image of a close-up of a kitten's face. The kitten has a fluffy coat with a mix of grey, white, and brown patches. The fur appears soft and well-groomed, with a gradient of colors that gives the appearance of a watercolor painting. The kitten's ears are perky and pointed, with a light brown inner coloring that matches the fur on its face.\\n\\nThe kitten's eyes are the most striking feature of this image. They are large, round, and a vivid blue, with a hint of green at the edges. The irises are clear and bright, and the pupils are slightly dilated, giving the eyes a lively and attentive look. The white fur around the eyes is well-defined, with a few whisker tufts poking out from the corners.\\n\\nThe kitten's nose is small and pink, with a slightly upturned tip, which is common in many breeds. The whiskers are long and white, and they are spread out symmetrically around the nose and mouth area. The mouth is closed, and the kitten's expression is one of curiosity or alertness.\\n\\nThe background is blurred, with a soft focus on what appears to be a green surface, possibly a plant or a blurred background element that doesn't detract from the kitten's features. The lighting in the image is gentle, with a warm tone that enhances the softness of the kitten's fur and the sparkle in its eyes.\\n--------------------------------------------------\\n<<< clear\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result of 1452 + 45304 is 46756.\\n--------------------------------------------------\\n<<< clear\\n<<< Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nIn twilight's gentle descent, a boat drifts on glassy waves,\\nA lone figure stands, a sentinel, amidst the quiet maze.\\nThe forest whispers through the trees, a symphony so serene,\\nAs stars begin to twinkle, painting the sky with specks of meren.\\n\\nThe lantern's soft glow dances on the water's surface fair,\\nA beacon in the night, a promise of a haven near.\\nThe boat, an ancient vessel, carries tales untold,\\nOf journeys past and futures bright, a silent witness to the fold.\\n\\nThe air is filled with mystery, the whispers of the wind,\\nAs the boat glides through the night, a dream upon the tide.\\nThe stars above, a celestial ballet, a dance of light and shade,\\nAs the boat carries on its way, through the night, afloat and free.\\n\\\"\\\"\\\"\\n```\\n\\nExample images are shown below:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single-sample inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.glm4v_9b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, _ = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest?'\\nimages = images\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: The distance from each city to the next one is as follows:\\n\\n1. From Mata to Yangjiang: 62 kilometers\\n2. From Yangjiang to Guangzhou: 293 kilometers\\n\\nSo, the total distance from Mata to Guangzhou is 62 kilometers (to Yangjiang) plus 293 kilometers (from Yangjiang to Guangzhou), which equals 355 kilometers.\\nquery: Which city is the farthest?\\nresponse: The city that is the farthest away from the current location, as indicated on the road sign, is Guangzhou. It is 293 kilometers away.\\n\\\"\\\"\\\"\\n```\\n\\nExample image is shown below:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nFine-tuning multimodal large models usually uses **custom datasets**. Here is a demo that can be run directly:\\n\\n```shell\\n# Experimental environment: A100\\n# 40GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type glm4v-9b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n\\n# DDP\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type glm4v-9b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --ddp_find_unused_parameters true \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\n(Supports multi-turn dialogue, but each conversation can only include one image. Support local file paths or URLs for input)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/glm4v-9b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/glm4v-9b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/glm4v-9b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Qwen-Audio Best Practice\\n\\nBest practice for Qwen2-Audio can be found at: [https://github.com/modelscope/ms-swift/issues/1653](https://github.com/modelscope/ms-swift/issues/1653).\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\npip install 'ms-swift[llm]' -U\\n```\\n\\n## Inference\\n\\nInference with [qwen-audio-chat](https://modelscope.cn/models/qwen/Qwen-Audio-Chat/summary):\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-audio-chat\\n```\\n\\nOutput: (supports passing local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\nI am a large language model created by DAMO Academy. I am called QianWen.\\n--------------------------------------------------\\n<<< <audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/music.wav</audio>What kind of music is this?\\nThis is experimental music.\\n--------------------------------------------------\\n<<< <audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>What did this speech say?\\nThe speech says in Chinese: \\\"今天天气真好呀\\\".\\n--------------------------------------------------\\n<<< Is this speech male or female?\\nThis is a man speaking.\\n\\\"\\\"\\\"\\n```\\n\\n**Single-sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen_audio_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = '<audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>What did this speech say'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Is this speech male or female'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>What did this speech say\\nresponse: The speech said: \\\"今天天气真好呀\\\".\\nquery: Is this speech male or female\\nresponse: The gender of this speech is male.\\nhistory: [['<audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>What did this speech say', 'The speech said: \\\"今天天气真好呀\\\".'], ['Is this speech male or female', 'The gender of this speech is male.']]\\n\\\"\\\"\\\"\\n```\\n\\n## Fine-tuning\\nMultimodal large model fine-tuning usually uses **custom datasets** for fine-tuning. Here shows a demo that can be run directly:\\n\\nLoRA fine-tuning:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 22GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen-audio-chat \\\\\\n    --dataset aishell1-mini-zh \\\\\\n```\\n\\nFull-parameter fine-tuning:\\n```shell\\n# MP\\n# Experimental environment: 2 * A100\\n# 2 * 50 GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type qwen-audio-chat \\\\\\n    --dataset aishell1-mini-zh \\\\\\n    --sft_type full \\\\\\n\\n# ZeRO2\\n# Experimental environment: 4 * A100\\n# 2 * 80 GPU memory\\nNPROC_PER_NODE=4 CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type qwen-audio-chat \\\\\\n    --dataset aishell1-mini-zh \\\\\\n    --sft_type full \\\\\\n    --use_flash_attn true \\\\\\n    --deepspeed default-zero2\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) supports json, jsonl styles, the following is an example of a custom dataset:\\n\\n(Supports multi-turn conversations, supports each turn of conversation containing multiple or no audio segments, supports passing local paths or URLs)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<audio>audio_path</audio>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<audio>audio_path</audio><audio>audio_path2</audio><audio>audio_path3</audio>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<audio>audio_path</audio>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-audio-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen-audio-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-audio-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Deepseek-VL Best Practice\\n\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Preparation\\n```shell\\npip install 'ms-swift[llm]' -U\\n\\npip install attrdict\\n```\\n\\nModel Link:\\n- deepseek-vl-1_3b-chat: [https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-1.3b-chat/summary](https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-1.3b-chat/summary)\\n- deepseek-vl-7b-chat: [https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-7b-chat/summary](https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-7b-chat/summary)\\n\\n\\n## Inference\\n\\nInference for deepseek-vl-7b-chat:\\n\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type deepseek-vl-7b-chat\\n\\n# If you want to run it on 3090, you can infer the 1.3b model\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type deepseek-vl-1_3b-chat\\n```\\n\\n7b model effect demonstration: (supports passing local paths or URLs)\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\nI am an AI language model, designed to understand and generate human-like text based on the input I receive. I am not a human, but I am here to help answer your questions and assist you with any tasks you may have.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>What is the difference between these two images?\\nThe image provided is a close-up of a kitten with big blue eyes, looking directly at the camera. The kitten appears to be a domestic cat, specifically a kitten, given its small size and youthful features. The image is a high-resolution, detailed photograph that captures the kitten's facial features and fur texture.\\n\\nThe second image is a cartoon illustration of three sheep standing in a grassy field with mountains in the background. The sheep are white with brown faces and legs, and they have large, round eyes. The illustration is stylized with a flat, two-dimensional appearance, and the colors are bright and vibrant. The sheep are evenly spaced and facing forward, giving the impression of a peaceful, pastoral scene.\\n\\nThe differences between the two images are primarily in their artistic styles and subjects. The first image is a realistic photograph of a kitten, while the second image is a stylized cartoon illustration of sheep. The first image is a photograph with a focus on the kitten's facial features and fur texture, while the second image is a cartoon with a focus on the sheep's characters and the setting. The first image is a single subject, while the second image features multiple subjects in a group.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>How many sheep are there in the picture?\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>What is the result of the calculation?\\nThe result of the calculation is 1452 + 45304 = 46756.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>Write a poem based on the content of the In the tranquil waters, a boat gently floats,\\nA beacon of light, a lone candle's soft glow.\\nThe night is vast, a canvas of stars above,\\nA serene scene, a moment of peace, it seems to offer.\\n\\nThe boat, a vessel of wood and a mast so tall,\\nCarries a passenger, a figure so still.\\nThe water's surface, a mirror of the night sky,\\nReflects the boat's silhouette, a sight so divine.\\n\\nThe trees, standing tall, their forms in the distance,\\nA forest of mystery, a silent chorus.\\nThe stars, scattered like diamonds in the heavens,\\nIlluminate the night, a celestial dance.\\n\\nThe boat, a symbol of journey and adventure,\\nIn the quiet of the night, it's a sight to behold.\\nA moment frozen in time, a memory to cherish,\\nIn the picture of the night, a boat on the water.\\n\\\"\\\"\\\"\\n```\\n\\nSample images are as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n**Single sample inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.deepseek_vl_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest?'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?\\nresponse: The distance from each city is as follows:\\n\\n- From \\\"Mata\\\", it is 14 km away.\\n- From \\\"Yangjiang\\\", it is 62 km away.\\n- From \\\"Guangzhou\\\", it is 293 km away.\\n\\nThese distances are clearly indicated on the green road sign with white text, providing the necessary information for travelers to gauge the distance to each city from the current location.\\nquery: Which city is the farthest?\\nresponse: The farthest city from the current location is \\\"Guangzhou\\\", which is 293 km away. This is indicated by the longest number on the green road sign, which is larger than the distances to the other cities listed.\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?', 'The distance from each city is as follows:\\\\n\\\\n- From \\\"Mata\\\", it is 14 km away.\\\\n- From \\\"Yangjiang\\\", it is 62 km away.\\\\n- From \\\"Guangzhou\\\", it is 293 km away.\\\\n\\\\nThese distances are clearly indicated on the green road sign with white text, providing the necessary information for travelers to gauge the distance to each city from the current location.'], ['Which city is the farthest?', 'The farthest city from the current location is \\\"Guangzhou\\\", which is 293 km away. This is indicated by the longest number on the green road sign, which is larger than the distances to the other cities listed.']]\\n\\\"\\\"\\\"\\n```\\n\\nSample image is as follows:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nMulti-modal large model fine-tuning usually uses **custom datasets**. Here is a runnable demo:\\n\\nLoRA fine-tuning:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type deepseek-vl-7b-chat \\\\\\n    --dataset coco-en-mini \\\\\\n```\\n\\nFull parameter fine-tuning:\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 70GB GPU memory\\nNPROC_PER_NODE=4 CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type deepseek-vl-7b-chat \\\\\\n    --dataset coco-en-mini \\\\\\n    --sft_type full \\\\\\n    --use_flash_attn true \\\\\\n    --deepspeed default-zero2\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) supports json, jsonl styles. The following is an example of a custom dataset:\\n\\n(Supports multi-turn conversations, supports multiple images per turn or no images, supports input of local paths or URLs)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/deepseek-vl-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/deepseek-vl-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/deepseek-vl-7b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Internlm-Xcomposer2 Best Practice\\n\\nThe document corresponds to the following models:\\n\\n- [internlm-xcomposer2-7b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2-7b/summary)\\n- [internlm-xcomposer2_5-7b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b/summary)\\n\\nThe following practice takes `internlm-xcomposer2-7b-chat` as an example, and you can also switch to other models by specifying `--model_type`.\\n\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Preparation\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## Inference\\n\\nInference for internlm-xcomposer2-7b-chat:\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internlm-xcomposer2-7b-chat\\n```\\n\\nOutput: (supports passing local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\n I am your assistant, a language-based artificial intelligence model that can answer your questions.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>What's the difference between these two images?\\n These two images are different. The first one is a picture of sheep, and the second one is a picture of a cat.\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>How many sheep are there in the picture?\\n There are 4 sheep in the picture\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>What is the calculation result?\\n The calculation result is 1452+45304=46756\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>Write a poem based on the content in the picture\\n Ripples glisten on the lake's surface, a lone boat drifts.\\nOn the boat, a light illuminates the night,\\nSpeckles of stars reflected in the water.\\n\\nIn the distance, mountains shrouded in mist and clouds,\\nThe starry night sky twinkling endlessly.\\nThe lake is like a mirror, reflections clear,\\nThe little boat passing through, like a poem, like a painting.\\n\\\"\\\"\\\"\\n```\\n\\nSample images are as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n**Single Sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.internlm_xcomposer2_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it to each city?\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest?'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it to each city?\\nresponse:  The distance from Ma'anshan to Yangjiang is 62 kilometers, and the distance from Guangzhou to Guangzhou is 293 kilometers.\\nquery: Which city is the farthest?\\nresponse: The farthest city is Guangzhou, with a distance of 293 kilometers from Guangzhou.\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it to each city?', ' The distance from Ma'anshan to Yangjiang is 62 kilometers, and the distance from Guangzhou to Guangzhou is 293 kilometers.'], ['Which city is the farthest?', ' The farthest city is Guangzhou, with a distance of 293 kilometers from Guangzhou.']]\\n\\\"\\\"\\\"\\n```\\n\\nSample image is as follows:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nFine-tuning of multimodal large models usually uses **custom datasets**. Here's a demo that can be run directly:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type internlm-xcomposer2-7b-chat \\\\\\n    --dataset coco-en-mini \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json and jsonl formats. Here's an example of a custom dataset:\\n\\n(Supports multi-turn conversations, each turn can contain multiple images or no images, supports passing local paths or URLs. This model does not support merge-lora)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## Inference After Fine-tuning\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/internlm-xcomposer2-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n\\n# Mutlimoda LLM Deployment\\nFor inference acceleration and deployment of MLLM, you can refer to the [LmDeploy Inference Acceleration Documentation](LmDeploy-inference-acceleration.md) and the [vLLM Inference Acceleration Documentation](vllm-inference-acceleration.md).\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [qwen-vl-chat](#qwen-vl-chat)\\n- [yi-vl-6b-chat](#yi-vl-6b-chat)\\n- [minicpm-v-v2_5-chat](#minicpm-v-v2_5-chat)\\n- [Audio and Video Modalities](#Audio-and-Video-Modalities)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nHere are several examples of models (we chose smaller-sized models for convenience in experimentation). I believe you can find the patterns for deployment and invocation, so I won't elaborate further.\\n\\n## qwen-vl-chat\\n\\n**Server**:\\n```bash\\n# Using the original model\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen-vl-chat\\n\\n# Using the fine-tuned LoRA\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx\\n\\n# Using the fine-tuned Merge LoRA model\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx-merged\\n```\\n\\n**Client**:\\n\\nTest:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen-vl-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"<img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg</img>What kind of flower is in the picture and how many are there?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\nUsing swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('rose.jpg', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# query = f'<img>{img_base64}</img>What kind of flower is in the picture and how many are there?'\\n\\n# use local_path\\n# query = '<img>rose.jpg</img>What kind of flower is in the picture and how many are there?'\\n\\n# use url\\nquery = '<img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg</img>What kind of flower is in the picture and how many are there?'\\n\\nrequest_config = XRequestConfig(seed=42)\\nresp = inference_client(model_type, query, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = 'Box out the flowers in the picture.'\\nrequest_config = XRequestConfig(stream=True, seed=42)\\nstream_resp = inference_client(model_type, query, history, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen-vl-chat\\nquery: <img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg</img>What kind of flower is in the picture and how many are there?\\nresponse: There are three roses in the picture.\\nquery: Box out the flowers in the picture.\\nresponse: <ref> flowers</ref><box>(33,448),(360,979)</box>\\n\\\"\\\"\\\"\\n```\\n\\nUsing openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('rose.jpg', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['rose.jpg'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg'\\n\\nquery = 'What kind of flower is in the picture and how many are there?'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = 'Box out the flowers in the picture.'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-vl-chat\\nquery: What kind of flower is in the picture and how many are there?\\nresponse: There are three roses in the picture.\\nquery: Box out the flowers in the picture.\\nresponse: <ref> flowers</ref><box>(33,448),(360,979)</box>\\n\\\"\\\"\\\"\\n```\\n\\n## yi-vl-6b-chat\\n\\n**Server side:**\\n```bash\\n# Using the original model\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type yi-vl-6b-chat\\n\\n# Using the fine-tuned LoRA\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx\\n\\n# Using the fine-tuned Merge LoRA model\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx-merged\\n```\\n\\n**Client side:**\\n\\nTest:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"yi-vl-6b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"Describe this image.\\\"}],\\n\\\"seed\\\": 42,\\n\\\"images\\\": [\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\"]\\n}'\\n```\\n\\nUsing swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# images = [img_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# images = ['cat.png']\\n# images = convert_to_base64(images=images)['images']\\n\\n# use url\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\n\\nquery = '<image>Describe this image.'\\nrequest_config = XRequestConfig(seed=42)\\nresp = inference_client(model_type, query, images=images, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = '<image>How many sheep are in the picture?'\\nimages.append('http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png')\\nrequest_config = XRequestConfig(stream=True, seed=42)\\nstream_resp = inference_client(model_type, query, history, images=images, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: yi-vl-6b-chat\\nquery: <image>Describe this image.\\nresponse: The image captures a moment of tranquility featuring a gray and white kitten. The kitten, with its eyes wide open, is the main subject of the image. Its nose is pink, adding a touch of color to its gray and white fur. The kitten is sitting on a white surface, which contrasts with its gray and white fur. The background is blurred, drawing focus to the kitten. The image does not contain any text. The kitten's position relative to the background suggests it is in the foreground of the image. The image does not contain any other objects or creatures. The kitten appears to be alone in the image. The image does not contain any action, but the kitten's wide-open eyes give it a curious and alert appearance. The image does not contain any aesthetic descriptions. The image is a simple yet captivating portrait of a gray and white kitten.\\nquery: <image>How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\nUsing openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['cat.png'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png'\\n\\nquery = 'Describe this image.'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = 'How many sheep are in the picture?'\\nmessages.append({'role': 'user', 'content': [\\n    {'type': 'image_url', 'image_url': {'url': 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'}},\\n    {'type': 'text', 'text': query},\\n]})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: yi-vl-6b-chat\\nquery: Describe this image.\\nresponse: The image captures a moment of tranquility featuring a gray and white kitten. The kitten, with its eyes wide open, is the main subject of the image. Its nose is pink, adding a touch of color to its gray and white fur. The kitten is sitting on a white surface, which contrasts with its gray and white fur. The background is blurred, drawing focus to the kitten. The image does not contain any text. The kitten's position relative to the background suggests it is in the foreground of the image. The image does not contain any other objects or creatures. The kitten appears to be alone in the image. The image does not contain any action, but the kitten's wide-open eyes give it a curious and alert appearance. The image does not contain any aesthetic descriptions. The image is a simple yet captivating portrait of a gray and white kitten.\\nquery: How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\n## minicpm-v-v2_5-chat\\n\\n**Server side:**\\n```bash\\n# Using the original model\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type minicpm-v-v2_5-chat\\n\\n# Using the fine-tuned LoRA\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/minicpm-v-v2_5-chat/vx-xxx/checkpoint-xxx\\n\\n# Using the fine-tuned Merge LoRA model\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/minicpm-v-v2_5-chat/vx-xxx/checkpoint-xxx-merged\\n```\\n\\n**Client side:**\\n\\nTest:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"minicpm-v-v2_5-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"Describe this image.\\\"}],\\n\\\"temperature\\\": 0,\\n\\\"images\\\": [\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\"]\\n}'\\n```\\n\\nUsing swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# images = [img_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# images = ['cat.png']\\n# images = convert_to_base64(images=images)['images']\\n\\n# use url\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\n\\nquery = '<image>Describe this image.'\\nrequest_config = XRequestConfig(temperature=0)\\nresp = inference_client(model_type, query, images=images, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = 'How was this picture generated?'\\nrequest_config = XRequestConfig(stream=True, temperature=0)\\nstream_resp = inference_client(model_type, query, history, images=images, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: minicpm-v-v2_5-chat\\nquery: <image>Describe this image.\\nresponse: The image is a digital painting of a kitten, which is the main subject. The kitten's fur is rendered with a mix of gray, black, and white, giving it a realistic appearance. Its eyes are wide open, and the expression is one of curiosity or alertness. The background is blurred, which brings the focus entirely on the kitten. The painting style is detailed and lifelike, capturing the essence of a young feline's innocent and playful nature. The image does not convey any specific context or background story beyond the depiction of the kitten itself.\\nquery: How was this picture generated?\\nresponse: This picture was generated using digital art techniques. The artist likely used a software program to create the image, manipulating pixels and colors to achieve the detailed and lifelike representation of the kitten. Digital art allows for a high degree of control over the final product, enabling artists to create intricate details and textures that might be difficult to achieve with traditional media.\\n\\\"\\\"\\\"\\n```\\n\\nUsing openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['cat.png'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png'\\n\\nquery = 'Describe this image.'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = 'How was this picture generated?'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: minicpm-v-v2_5-chat\\nquery: Describe this image.\\nresponse: The image is a digital painting of a kitten, which is the main subject. The kitten's fur is rendered with a mix of gray, black, and white, giving it a realistic appearance. Its eyes are wide open, and the expression is one of curiosity or alertness. The background is blurred, which brings the focus entirely on the kitten. The painting style is detailed and lifelike, capturing the essence of a young feline's innocent and playful nature. The image does not convey any specific context or background story beyond the depiction of the kitten itself.\\nquery: How was this picture generated?\\nresponse: This picture was generated using digital art techniques. The artist likely used a software program to create the image, manipulating pixels and colors to achieve the detailed and lifelike representation of the kitten. Digital art allows for a high degree of control over the final product, enabling artists to create intricate details and textures that might be difficult to achieve with traditional media.\\n\\\"\\\"\\\"\\n```\\n\\n## Audio and Video Modalities\\n\\n### qwen2-audio-7b-instruct\\n\\n**Server**:\\n```bash\\n# pip install transformers>=4.45\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-audio-7b-instruct\\n# ...\\n```\\n\\n**Client**:\\n\\nUsing swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('weather.wav', 'rb') as f:\\n#     aud_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# audios = [aud_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# audios = ['weather.wav']\\n# audios = convert_to_base64(images=audios)['images']\\n\\n# use url\\naudios = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav']\\n\\nquery = '<audio>What did this speech say'\\nrequest_config = XRequestConfig(temperature=0)\\nresp = inference_client(model_type, query, audios=audios, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = 'The gender of this speech is male.'\\nrequest_config = XRequestConfig(stream=True, temperature=0)\\nstream_resp = inference_client(model_type, query, history, audios=audios, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen2-audio-7b-instruct\\nquery: <audio>What did this speech say\\nresponse: The original content of this audio is: '今天天气真好呀'\\nquery: The gender of this speech is male.\\nresponse: The speaker is male.\\n\\\"\\\"\\\"\\n```\\n\\nUsing openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('weather.wav', 'rb') as f:\\n#     aud_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# audio_url = f'data:audio/wav;base64,{aud_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# audio_url = convert_to_base64(images=['weather.wav'])['images'][0]\\n# audio_url = f'data:audio/wav;base64,{audio_url}'\\n\\n# use url\\naudio_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav'\\n\\nquery = 'What did this speech say'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'audio_url', 'audio_url': {'url': audio_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = 'The gender of this speech is male.'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen2-audio-7b-instruct\\nquery: What did this speech say\\nresponse: The original content of this audio is: '今天天气真好呀'\\nquery: The gender of this speech is male.\\nresponse: The speaker is male.\\n\\\"\\\"\\\"\\n```\\n\\n### internvl2-2b\\n\\n**Server**:\\n```bash\\n# or 'minicpm-v-v2_6-chat'\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type internvl2-2b\\n# ...\\n```\\n\\n**Client**:\\n\\nUsing swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('baby.mp4', 'rb') as f:\\n#     vid_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# videos = [vid_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# videos = ['baby.mp4']\\n# videos = convert_to_base64(images=videos)['images']\\n\\n# use url\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']\\n\\nquery = '<video>Describe this video.'\\nrequest_config = XRequestConfig(temperature=0)\\nresp = inference_client(model_type, query, videos=videos, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\nquery = '<image>How many sheep are in the picture?'\\nrequest_config = XRequestConfig(stream=True, temperature=0)\\nstream_resp = inference_client(model_type, query, images=images, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\\"\\\"\\\"\\nmodel_type: internvl2-2b\\nquery: <video>Describe this video.\\nresponse:  The video features a young child, who appears to be a toddler, sitting on a bed and reading a book. The child is wearing a light blue shirt and dark glasses, and is engrossed in the book. The child's attention is focused on the pages, and they seem to be enjoying the story. The bed has a floral patterned cover, and there is a white blanket on the bed. In the background, there is a wooden crib with a white sheet and a few other items, including a white towel and a black and white striped garment. The room appears to be a bedroom, and there is a window visible in the background. The child's hair is light-colored, and they are wearing a pair of dark-framed glasses. The video captures the child's peaceful and focused demeanor as they read the book. The overall atmosphere of the video is calm and serene, with the child's concentration on the book being the main focus.\\nquery: <image>How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\nUsing openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('baby.mp4', 'rb') as f:\\n#     vid_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# video_url = f'data:video/mp4;base64,{vid_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# video_url = convert_to_base64(images=['baby.mp4'])['images'][0]\\n# video_url = f'data:video/mp4;base64,{video_url}'\\n\\n# use url\\nvideo_url = 'https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4'\\n\\nquery = 'Describe this video.'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'video_url', 'video_url': {'url': video_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'How many sheep are in the picture?'\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: internvl2-2b\\nquery: Describe this video.\\nresponse:  The video features a young child, who appears to be a toddler, sitting on a bed and reading a book. The child is wearing a light blue shirt and dark glasses, and is engrossed in the book. The child's attention is focused on the pages, and they seem to be enjoying the story. The bed has a floral patterned cover, and there is a white blanket on the bed. In the background, there is a wooden crib with a white sheet and a few other items, including a white towel and a black and white striped garment. The room appears to be a bedroom, and there is a window visible in the background. The child's hair is light-colored, and they are wearing a pair of dark-framed glasses. The video captures the child's peaceful and focused demeanor as they read the book. The overall atmosphere of the video is calm and serene, with the child's concentration on the book being the main focus.\\nquery: How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\n\\n# Llava Video Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference after Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## Inference\\n```shell\\n# Experimental environment: A10\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava-next-video-7b-instruct\\n```\\n\\nOutput: (supports passing in local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< who are you\\nI am Vicuna, a language model trained by researchers from Large Model Systems Organization (LMSYS).\\n--------------------------------------------------\\n<<< clear\\n<<< <video>Describe this video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\nIn the video, a young child is seen sitting on a bed, engrossed in reading a book. The child is wearing glasses and appears to be enjoying the book. The bed is covered with a white blanket, and there are some toys scattered around the room. The child's focus on the book suggests that they are deeply immersed in the story. The room appears to be a comfortable and cozy space, with the child's playful demeanor adding to the overall warmth of the scene.\\n--------------------------------------------------\\n<<< clear\\n<<< <video>Describe this video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/fire.mp4\\nIn the video, we see a person's hands holding a bag of chips. The person is standing in front of a fire pit, which is surrounded by a wooden fence. The fire pit is filled with wood, and there is a small fire burning in it. The person is holding the bag of chips over the fire pit, and we can see the flames from the fire reflected on the bag. The person then opens the bag and throws the chips onto the fire, causing them to sizzle and pop as they land on the burning wood. The sound of the chips hitting the fire can be heard clearly in the video. Overall, the video captures a simple yet satisfying moment of someone enjoying a snack while surrounded by the warmth and light of a fire pit.\\n--------------------------------------------------\\n<<< clear\\n<<< <image>Describe this image.\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThis is a close-up photograph of a kitten with a soft, blurred background. The kitten has a light brown coat with darker brown stripes and patches, typical of a calico pattern. Its eyes are wide open, and its nose is pink, which is common for young kittens. The kitten's whiskers are visible, and its ears are perked up, suggesting alertness. The image has a shallow depth of field, with the kitten in focus and the background out of focus, creating a bokeh effect.\\n--------------------------------------------------\\n<<< clear\\n<<< <image>How many sheep are in the picture?\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\n**Single Sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = 'llava-next-video-7b-instruct'\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 1024\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']\\nquery = '<video>Describe this video.'\\nresponse, _ = inference(model, template, query, videos=videos)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\nquery = '<image>How many sheep are in the picture?'\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\n\\\"\\\"\\\"\\nquery: <video>Describe this video.\\nresponse: In the video, a young child is seen sitting on a bed, engrossed in reading a book. The child is wearing a pair of glasses, which adds a touch of innocence to the scene. The child's focus is entirely on the book, indicating a sense of curiosity and interest in the content. The bed, covered with a white blanket, provides a cozy and comfortable setting for the child's reading session. The video captures a simple yet beautiful moment of a child's learning and exploration.\\nquery: <image>How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\n\\n## Fine-tuning\\nMultimodal large model fine-tuning usually uses **custom datasets** for fine-tuning. Here is a demo that can be run directly:\\n\\nLoRA fine-tuning:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type llava-next-video-7b-instruct \\\\\\n    --dataset video-chatgpt \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\n(Each round of conversation needs to include a video/image or not include a video/image, supports local path or URL input.)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## Inference after Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/llava-next-video-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/llava-next-video-7b-instruct/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/llava-next-video-7b-instruct/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Llava Best Practice\\nThe document corresponds to the following models:\\n\\n- [llava1_5-7b-instruct](https://modelscope.cn/models/swift/llava-1.5-7b-hf)\\n- [llava1_5-13b-instruct](https://modelscope.cn/models/swift/llava-1.5-13b-hf)\\n- [llava1_6-mistral-7b-instruct](https://modelscope.cn/models/swift/llava-v1.6-mistral-7b-hf)\\n- [llava1_6-vicuna-7b-instruct](https://modelscope.cn/models/swift/llava-v1.6-vicuna-7b-hf)\\n- [llava1_6-vicuna-13b-instruct](https://modelscope.cn/models/swift/llava-v1.6-vicuna-13b-hf)\\n- [llava1_6-yi-34b-instruct](https://modelscope.cn/models/swift/llava-v1.6-34b-hf)\\n- [llava-next-72b](https://modelscope.cn/models/AI-Modelscope/llava-next-72b)\\n- [llava-next-110b](https://modelscope.cn/models/AI-Modelscope/llava-next-110b)\\n\\nHere, the first 6 llava-hf models support vllm inference acceleration, you can refer to [vLLM Inference Acceleration Document](vllm-inference-acceleration.md) for specific details. The following practice takes `llava1_6-mistral-7b-instruct` as an example, and you can also switch to other models by specifying `--model_type`.\\n\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference after Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## Inference\\n```shell\\n# Experimental environment: A100\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-mistral-7b-instruct\\n\\n# 70GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-yi-34b-instruct\\n\\n# 4*20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift infer --model_type llava1_6-yi-34b-instruct\\n```\\n\\nOutput: (supports passing in local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< <image>Describe this image.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThe image shows a close-up of a kitten with a soft, blurred background that suggests a natural, outdoor setting. The kitten has a mix of white and gray fur with darker stripes, typical of a tabby pattern. Its eyes are wide open, with a striking blue color that contrasts with the kitten's fur. The kitten's nose is small and pink, and its whiskers are long and white, adding to the kitten's cute and innocent appearance. The lighting in the image is soft and diffused, creating a gentle and warm atmosphere. The focus is sharp on the kitten's face, while the rest of the image is slightly out of focus, which draws attention to the kitten's features.\\n--------------------------------------------------\\n<<< <image>How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< <image>What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is 1452 + 453004 = 453006.\\n--------------------------------------------------\\n<<< <image>Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nIn the quiet of the night,\\nA solitary boat takes flight,\\nAcross the water's gentle swell,\\nUnderneath the stars that softly fell.\\n\\nThe boat, a vessel of the night,\\nCarries but one, a lone delight,\\nA solitary figure, lost in thought,\\nIn the tranquil calm, they find a wraith.\\n\\nThe stars above, like diamonds bright,\\nReflect upon the water's surface light,\\nCreating a path for the boat's journey,\\nGuiding through the night with a gentle purity.\\n\\nThe boat, a silent sentinel,\\nIn the stillness, it gently swells,\\nA vessel of peace and calm,\\nIn the quiet of the night, it carries on.\\n\\nThe figure on board, a soul at ease,\\nIn the serene embrace of nature's peace,\\nThey sail through the night,\\nUnder the watchful eyes of the stars' light.\\n\\nThe boat, a symbol of solitude,\\nIn the vast expanse of the universe's beauty,\\nA lone journey, a solitary quest,\\nIn the quiet of the night, it finds its rest.\\n--------------------------------------------------\\n<<< <image>Perform OCR on the image.\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\nThe text in the image is as follows:\\n\\nINTRODUCTION\\n\\nSWIFT supports training, inference, evaluation and deployment of 250+ LLMs (multimodal large models). Developers can directly apply our framework to their own research and production environments to realize the complete workflow from model training and evaluation to application. In addition, SWIFT provides a complete Adapters library to support the latest training techniques such as NLP, Vision, etc. This adapter library can be used directly in your own custom workflow without our training scripts.\\n\\nTo facilitate use by users unfamiliar with deep learning, we provide a Grado web-ui for controlling training and inference, as well as accompanying deep learning courses and best practices for beginners.\\n\\nSWIFT has rich documentation for users, please check here.\\n\\nSWIFT is web-ui available both on Huggingface space and ModelScope studio, please feel free to try!\\n\\\"\\\"\\\"\\n```\\n\\nExample images are as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single Sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = 'llava1_6-mistral-7b-instruct'\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '<image>How far is it from each city?'\\nresponse, _ = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest?'\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: The image shows a road sign indicating the distances to three cities: Mata, Yangjiang, and Guangzhou. The distances are given in kilometers.\\n\\n- Mata is 14 kilometers away.\\n- Yangjiang is 62 kilometers away.\\n- Guangzhou is 293 kilometers away.\\n\\nPlease note that these distances are as the crow flies and do not take into account the actual driving distance due to road conditions, traffic, or other factors.\\nquery: Which city is the farthest?\\nresponse: The farthest city listed on the sign is Mata, which is 14 kilometers away.\\n\\\"\\\"\\\"\\n```\\n\\nExample image is as follows:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nMultimodal large model fine-tuning usually uses **custom datasets** for fine-tuning. Here is a demo that can be run directly:\\n\\nLoRA fine-tuning:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n\\n# 2*45GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type llava1_6-yi-34b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\nFull parameter fine-tuning:\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 70 GPU memory\\nNPROC_PER_NODE=4 CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --sft_type full \\\\\\n    --deepspeed default-zero2\\n\\n# 8 * 50 GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 swift sft \\\\\\n    --model_type llava1_6-yi-34b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --sft_type full \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\n(Supports multi-turn dialogues, where each turn can contain multiple images or no images, and supports passing in local paths or URLs)\\n\\n```jsonl\\n{\\\"query\\\": \\\"<image>55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"<image>eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"<image>EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## Inference after Fine-tuning\\nDirect inference:\\n```shell\\nmodel_type=\\\"llava1_6-mistral-7b-instruct\\\"\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/${model_type}/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nmodel_type=\\\"llava1_6-mistral-7b-instruct\\\"\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/${model_type}/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --merge_lora true\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/${model_type}/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n## Multi-Modal Documentation\\n\\n### 📚 Tutorial\\n\\n1. [Human Preference Alignment Training Documentation](human-preference-alignment-training-documentation.md)\\n2. [LmDeploy-inference-acceleration](LmDeploy-inference-acceleration.md)\\n3. [vLLM Inference Acceleration](vllm-inference-acceleration.md)\\n4. [MLLM Deployment Documentation](mutlimodal-deployment.md)\\n\\n### Multi-Modal Best Practice\\n\\nA single round of dialogue can contain multiple images (or no images):\\n1. [Qwen-VL Best Practice](qwen-vl-best-practice.md), [Qwen2-VL Best Practice](qwen2-vl-best-practice.md)\\n2. [Qwen-Audio Best Practice](qwen-audio-best-practice.md), [Qwen2-Audio Best Practice](https://github.com/modelscope/ms-swift/issues/1653)\\n3. [Llava Best Practice](llava-best-practice.md), [LLava Video Best Practice](llava-video-best-practice.md)\\n4. [InternVL Series Best Practice](internvl-best-practice.md)\\n5. [MiniCPM-V Best Practice](minicpm-v-best-practice.md), [MiniCPM-V-2.6 Best Practice](https://github.com/modelscope/ms-swift/issues/1613)\\n6. [Deepseek-VL Best Practice](deepseek-vl-best-practice.md)\\n7. [Internlm2-Xcomposers Best Practice](internlm-xcomposer2-best-practice.md)\\n8. [Phi3-Vision Best Practice](phi3-vision-best-practice.md), [Phi3.5-Vision Best Practice](https://github.com/modelscope/ms-swift/issues/1809).\\n9. [mPLUG-Owl3 Best Practice](https://github.com/modelscope/ms-swift/issues/1969)\\n10. [GOT-OCR2 Best Practice](https://github.com/modelscope/ms-swift/issues/2122)\\n\\nA single round of dialogue can only contain one image:\\n1. [Yi-VL Best Practice.md](yi-vl-best-practice.md)\\n2. [Florence Best Practice.md](florence-best-pratice.md)\\n\\nThe entire conversation revolves around one image.\\n1. [CogVLM Best Practice](cogvlm-best-practice.md), [CogVLM2 Best Practice](cogvlm2-best-practice.md), [GLM4V Best Practice](glm4v-best-practice.md), [CogVLM2-Video Best Practice](cogvlm2-video-best-practice.md)\\n\\n\\n# LmDeploy Inference Acceleration and Deployment\\nlmdeploy github: [https://github.com/InternLM/lmdeploy](https://github.com/InternLM/lmdeploy).\\n\\nMLLM that support inference acceleration using lmdeploy can be found at [Supported Models](../Instruction/Supported-models-datasets.md#MLLM).\\n\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Inference Acceleration](#inference-acceleration)\\n- [Deployment](#deployment)\\n\\n## Environment Preparation\\nGPU devices: A10, 3090, V100, A100 are all supported.\\n```bash\\n# Set pip global mirror (speeds up downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# There is a correspondence between lmdeploy and CUDA versions. Please follow the installation instructions at `https://github.com/InternLM/lmdeploy#installation`.\\npip install lmdeploy\\n```\\n\\n## Inference Acceleration\\n\\n### Using Python\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\n# from swift.hub import HubApi\\n# _api = HubApi()\\n# _api.login('<your-sdk-token>')  # https://modelscope.cn/my/myaccesstoken\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\n# ModelType.qwen_vl_chat, ModelType.deepseek_vl_1_3b_chat\\n# ModelType.internlm_xcomposer2_5_7b_chat, ModelType.minicpm_v_v2_5_chat\\nmodel_type = ModelType.internvl2_2b\\nmodel_id_or_path = None\\nlmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\nlmdeploy_engine.generation_config.max_new_tokens = 256\\ngeneration_info = {}\\n\\nrequest_list = [{'query': '<image>Describe the image.', 'images': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']},\\n                {'query': 'who are you?'},\\n                {'query': (\\n                    '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>'\\n                    '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>'\\n                    'What is the difference bewteen the two images?'\\n                )}]\\nresp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\nprint(generation_info)\\n\\n# stream\\nrequest_list = [{'query': '<video>Describe the video.', 'videos': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']}]\\ngen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nquery = request_list[0]['query']\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(generation_info)\\n\\n\\\"\\\"\\\"\\nquery: <image>Describe the image.\\nresponse: The image depicts four sheep standing in a grassy field against a backdrop of a gentle mountain and a slightly clouded sky. The sheep appear cute and friendly, with sheep faces that have large, friendly eyes and rosy cheeks. Each sheep has a unique coloration pattern; for instance, the sheep on the far left is predominantly white with brown wool around the snout and horns, while the other three have primarily white wool but with different color patterns on their snouts, tails, and horns. The overall mood of the image seems calm and serene.\\nquery: who are you?\\nresponse: I am an AI assistant whose name is InternVL, developed jointly by Shanghai AI Lab and SenseTime.\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>What is the difference bewteen the two images?\\nresponse: I'm unable to identify or compare images. However, if this image were to be classified based on its design or layout, it might demonstrate:\\n\\n- A change in the display order or arrangement of elements within the image.\\n- An evolution in artistic style or technique.\\n- Different elements added or cut out to create a variation.\\n\\nI'd need more specific details to make an accurate comparison.\\n{'num_prompt_tokens': 8099, 'num_generated_tokens': 212, 'num_samples': 3, 'runtime': 4.134621603996493, 'samples/s': 0.7255803039146855, 'tokens/s': 51.27434147663778}\\nquery: <video>Describe the video.\\nresponse: The video features a young child sitting on a bed wearing a tank top and glasses. The child looks at some papers which are spread out in front of them. The child plays with the papers, taking off the glasses one eye at a time, and then puts them back on. After removing, reinserting, and replacing them, the child looks down and moves them around. The child continues to play with the papers and moves around them. The child seems to enjoy playing with the documents as they engage in this activity with the papers spread before them. The video portrays a sense of the child's curiosity and enthusiasm as they explore the objects around them. The child's interactions with the papers, with one eye and then one hand, show a playful yet methodical approach to engaging with the setting and materials.\\n{'num_prompt_tokens': 6250, 'num_generated_tokens': 164, 'num_samples': 1, 'runtime': 2.783833138004411, 'samples/s': 0.3592169323470477, 'tokens/s': 58.91157690491582}\\n\\\"\\\"\\\"\\n```\\n\\n\\n**TP:**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0,1'\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\nif __name__ == '__main__':\\n    model_type = ModelType.glm4v_9b_chat\\n    model_id_or_path = None\\n    lmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path, tp=2)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n    # An interface similar to transformers.GenerationConfig\\n    lmdeploy_engine.generation_config.max_new_tokens = 256\\n    generation_info = {}\\n\\n    request_list = [{'query': '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>Describe the image.'},\\n                    {'query': '<image>Describe the image.', 'images': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']},\\n                    {'query': 'who are you?'}]\\n    resp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history0 = resp_list[0]['history']\\n    request_list = [{'query': 'How many sheep are there?', 'history': history0}]\\n    gen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>Describe the image.\\nresponse: The image features a charming illustration of a group of sheep in a pastoral setting. The sheep are depicted with a friendly and somewhat cartoonish design, with their fluffy wool suggesting they are well-cared for animals. They are standing on a lush green field, with the grass appearing soft and inviting, and there are hints of yellow wildflowers sprinkled throughout, adding to the idyllic scene.\\n\\nThe sheep are positioned in a way that suggests a family or group dynamic. They are standing in a row, with the sheep on the left appearing to be of smaller stature, likely indicating they are younger, and the sheep on the right have a more mature appearance. The sheep in the middle of the image is the most prominent and has a fluffy, puffy white wool, which stands out against the green background, giving it a sense of importance or leadership within the group.\\n\\nThe background of the image is a tranquil and pastoral landscape. There are gentle undulations of hills that suggest a meadow, and the hills are a rich shade of green, blending into the horizon where the sky meets the earth. The sky is a soft, clear blue, with a few wispy, light clouds scattered across it, contributing to the peaceful atmosphere of the scene. The sunlight appears to be coming\\nquery: <image>Describe the image.\\nresponse: The image features a charming illustration of a group of sheep in a pastoral setting. The sheep are depicted with a friendly and somewhat cartoonish design, with their fluffy wool suggesting they are well-cared for animals. They are standing on a lush green field, with the grass appearing soft and inviting, and there are hints of yellow wildflowers sprinkled throughout, adding to the idyllic scene.\\n\\nThe sheep are positioned in a way that suggests a family or group dynamic. They are standing in a row, with the sheep on the left appearing to be of smaller stature, likely indicating they are younger, and the sheep on the right have a more mature appearance. The sheep in the middle of the image is the most prominent and has a fluffy, puffy white wool, which stands out against the green background, giving it a sense of importance or leadership within the group.\\n\\nThe background of the image is a tranquil and pastoral landscape. There are gentle undulations of hills that suggest a meadow, and the hills are a rich shade of green, blending into the horizon where the sky meets the earth. The sky is a soft, clear blue, with a few wispy, light clouds scattered across it, contributing to the peaceful atmosphere of the scene. The sunlight appears to be coming\\nquery: who are you?\\nresponse: I am an AI assistant named ChatGLM（智谱清言）, which is developed based on the language model trained by Zhipu AI in 2023. My job is to provide appropriate answers and support to users' questions and requests.\\n{'num_prompt_tokens': 3231, 'num_generated_tokens': 563, 'num_samples': 3, 'runtime': 14.152525326004252, 'samples/s': 0.21197630323174302, 'tokens/s': 39.78088623982377}\\nquery: How many sheep are there?\\nresponse: There are four sheep in the image. From left to right, the first sheep has a smaller body and wool, the second one is larger with a fluffy wool, the third one also appears to have a fluffy wool, and the last sheep on the right has a similar fluffy appearance as the second one. Each sheep has a unique expression and stance, which gives the image a sense of liveliness and individuality.\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>Describe the image.', 'The image features a charming illustration of a group of sheep in a pastoral setting. The sheep are depicted with a friendly and somewhat cartoonish design, with their fluffy wool suggesting they are well-cared for animals. They are standing on a lush green field, with the grass appearing soft and inviting, and there are hints of yellow wildflowers sprinkled throughout, adding to the idyllic scene.\\\\n\\\\nThe sheep are positioned in a way that suggests a family or group dynamic. They are standing in a row, with the sheep on the left appearing to be of smaller stature, likely indicating they are younger, and the sheep on the right have a more mature appearance. The sheep in the middle of the image is the most prominent and has a fluffy, puffy white wool, which stands out against the green background, giving it a sense of importance or leadership within the group.\\\\n\\\\nThe background of the image is a tranquil and pastoral landscape. There are gentle undulations of hills that suggest a meadow, and the hills are a rich shade of green, blending into the horizon where the sky meets the earth. The sky is a soft, clear blue, with a few wispy, light clouds scattered across it, contributing to the peaceful atmosphere of the scene. The sunlight appears to be coming'], ['How many sheep are there?', 'There are four sheep in the image. From left to right, the first sheep has a smaller body and wool, the second one is larger with a fluffy wool, the third one also appears to have a fluffy wool, and the last sheep on the right has a similar fluffy appearance as the second one. Each sheep has a unique expression and stance, which gives the image a sense of liveliness and individuality.']]\\n{'num_prompt_tokens': 1876, 'num_generated_tokens': 83, 'num_samples': 1, 'runtime': 4.516964272013865, 'samples/s': 0.22138762668453765, 'tokens/s': 18.375173014816625}\\n\\\"\\\"\\\"\\n```\\n\\n### Using CLI\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type deepseek-vl-1_3b-chat --infer_backend lmdeploy\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internvl2-2b --infer_backend lmdeploy\\n\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen-vl-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type internlm-xcomposer2_5-7b-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n```\\n\\n## Deployment\\n\\n**Server**:\\n\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type deepseek-vl-1_3b-chat --infer_backend lmdeploy\\n\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type internvl2-2b --infer_backend lmdeploy\\n\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen-vl-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type internlm-xcomposer2_5-7b-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n```\\n\\n**Client**:\\n\\nThis section introduces a demonstration of client calls to internvl2-2b:\\n\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('baby.mp4', 'rb') as f:\\n#     vid_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# video_url = f'data:video/mp4;base64,{vid_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# video_url = convert_to_base64(images=['baby.mp4'])['images'][0]\\n# video_url = f'data:video/mp4;base64,{video_url}'\\n\\n# use url\\nvideo_url = 'https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4'\\n\\nquery = 'Describe this video.'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'video_url', 'video_url': {'url': video_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'How many sheep are in the picture?'\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\\"\\\"\\\"\\nmodel_type: internvl2-2b\\nquery: Describe this video.\\nresponse: The video features a young child, who appears to be a toddler, sitting on a bed and reading a book. The child is wearing a light blue shirt and dark glasses, and is engrossed in the book. The bed has a floral-patterned bedspread, and there is a white blanket on the bed. In the background, there is a wooden crib with a pink blanket and a white blanket on the bed. The room appears to be a bedroom, and there is a television on the wall, which is turned off. The child is holding the book with both hands and appears to be reading it with great interest. The child's face is illuminated by the light from the book, and the glasses reflect the light, making the child's eyes visible. The child's hair is light-colored, and it is neatly pulled back. The video captures the child's concentration and the peacefulness of the moment, as the child is absorbed in the book. The overall atmosphere of the video is calm and serene, with the child's focus on the book and the peacefulness of the room.\\nquery: How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\nThe method for client invocation can be found in: [MLLM Deployment Documentation](mutlimodal-deployment.md).\\n\\n\\n\\n# Florence Best Practice\\n\\nThe document corresponds to the following models\\n\\n| model | model_type |\\n|-------|------------|\\n| [Florence-2-base](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-base) | florence-2-base |\\n| [Florence-2-base-ft](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-base-ft) | florence-2-base-ft |\\n| [Florence-2-large](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-large) | florence-2-large |\\n| [Florence-2-large-ft](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-large-ft) | florence-2-large-ft |\\n\\nThe following practices take `florence-2-large-ft` as an example. You can also switch to other models by specifying the `--model_type`.\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference after Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n```shell\\n# 2.4GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type florence-2-large-ft --max_new_tokens 1024 --stream false\\n```\\n\\n**Note**\\n- If you want to use local model files, add the parameter `--model_id_or_path /path/to/model`\\n- To use Flash Attention, include the parameter `--use_flash_attn true`, and specify `--dtype` as fp16 or bf16 (the model defaults to fp32).\\n- The Florence series models have built-in prompts for some vision tasks. You can check the corresponding mappings in `swift.llm.utils.template.FlorenceTemplate`. More prompts can be found on the Modelscope/Hugging Face model detail pages.\\n- The Florence series models do not support Chinese.\\n- The Florence series models do not support system prompts and history.\\n\\n\\nOutput: (supports passing in local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe the image\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n{'Describe the image': 'A grey and white kitten with blue eyes.'}\\n<<< <OD>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the objects with category name in the image.': 'shelf<loc_264><loc_173><loc_572><loc_748><loc_755><loc_274><loc_966><loc_737><loc_46><loc_335><loc_261><loc_763><loc_555><loc_360><loc_760><loc_756>'}\\n--------------------------------------------------\\n<<< <CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'What does the image describe?': 'A cartoon picture of four sheep standing in a field.'}\\n--------------------------------------------------\\n<<< <DETAILED_CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Describe in detail what is shown in the image.': 'In the image is animated. In the image there are sheeps. At the bottom of the image on the ground there is grass. In background there are hills. At top of the images there are clouds.'}\\n--------------------------------------------------\\n<<< <MORE_DETAILED_CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Describe with a paragraph what is shown in the image.': 'Four sheep are standing in a field. They are all white and fluffy. They have horns on their heads. There are mountains behind them. There is grass and weeds on the ground in front of them. '}\\n--------------------------------------------------\\n<<< <DENSE_REGION_CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the objects in the image, with their descriptions.': 'cartoon sheep illustration<loc_265><loc_175><loc_572><loc_748>cartoon ram illustration<loc_755><loc_275><loc_966><loc_737>cartoon white sheep illustration<loc_44><loc_335><loc_262><loc_764>cartoon goat illustration<loc_555><loc_361><loc_762><loc_756>'}\\n--------------------------------------------------\\n<<< <REGION_PROPOSAL>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the region proposals in the image.': '<loc_45><loc_176><loc_967><loc_761><loc_266><loc_175><loc_570><loc_749><loc_757><loc_274><loc_966><loc_738><loc_46><loc_334><loc_261><loc_763><loc_556><loc_361><loc_760><loc_756>'}\\n--------------------------------------------------\\n<<< <CAPTION_TO_PHRASE_GROUNDING>the sheeps\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the phrases in the caption: the sheeps': 'thethe sheeps<loc_45><loc_175><loc_967><loc_764><loc_266><loc_176><loc_572><loc_749><loc_756><loc_275><loc_965><loc_739><loc_46><loc_335><loc_261><loc_765><loc_557><loc_361><loc_760><loc_758>'}\\n```\\n\\nExample images are as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Python Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = \\\"florence-2-large-ft\\\"\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': \\\"cuda:0\\\"})\\n\\nmodel.generation_config.max_new_tokens = 1024\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\nquery = 'Describe the image'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n'''\\nquery: Describe the image\\nresponse: {'Describe the image': 'Four sheep standing in a field with mountains in the background.'}\\n'''\\n```\\n\\nMultimodal large model fine-tuning usually uses **custom datasets** for fine-tuning. Here is a demo that can be run directly:\\n\\nLoRA fine-tuning:\\n```shell\\n# Experimental environment: 4090\\n# 6.6GB GPU memory\\n\\n# caption task\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type florence-2-large-ft \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --lora_target_modules ALL\\n\\n# grounding task\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type florence-2-large-ft \\\\\\n    --dataset refcoco-unofficial-grounding \\\\\\n    --lora_target_modules ALL\\n```\\n\\nFull parameter fine-tuning:\\n```bash\\n# Experimental environment: 4090\\n# 11 GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type florence-2-large-ft \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --sft_type full\\n\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\n\\n**Caption/VQA** task\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n**grounding** task\\n\\nCurrently, two types of custom grounding tasks are supported:\\n\\n1. For tasks asking about the target for a given bounding box, specify `<bbox>` in the query, `<ref-object>` in the response, and provide the target and bounding box details in objects.\\n2. For tasks asking about the bounding box for a given target, specify `<ref-object>` in the query, `<bbox>` in the response, and provide the target and bounding box details in objects.\\n```jsonl\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359],[1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n```\\nThe `objects` field contains a JSON string with four fields:\\n  1. `caption`: Description of the object corresponding to the bounding box (bbox)\\n  2. `bbox`: Coordinates of the bounding box. It is recommended to provide four integers (rather than float values), specifically `x_min`, `y_min`, `x_max`, and `y_max`.\\n  3. `bbox_type`: Type of the bounding box. Currently, three types are supported: `real`, `norm_1000`, and `norm_1`, which respectively represent actual pixel value coordinates, thousandth ratio coordinates, and normalized ratio coordinates.\\n  4. `image`: The index of the image corresponding to the bounding box. The index starts from 0.\\n\\n\\nLet me know if you need further assistance!\\n\\n## Inference after Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/florence-2-large-ft/vx-xxx/checkpoint-xxx \\\\\\n    --stream false \\\\\\n    --max_new_tokens 1024\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/florence-2-large-ft/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --stream false \\\\\\n    --max_new_tokens 1024 \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/florence-2-large-ft/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --stream false \\\\\\n    --max_new_tokens 1024 \\\\\\n```\\n\\n\\n# InternVL Best Practice\\nThe document corresponds to the following models:\\n\\n- [internvl-chat-v1_5](https://www.modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5/summary)\\n- [internvl-chat-v1_5-int8](https://www.modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-int8/summary)\\n- [mini-internvl-chat-2b-v1_5](https://www.modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-2B-V1-5)\\n- [mini-internvl-chat-4b-v1_5](https://www.modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-4B-V1-5)\\n- [internvl2-1b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-1B)\\n- [internvl2-2b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-2B)\\n- [internvl2-4b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-4B)\\n- [internvl2-8b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-8B)\\n- [internvl2-26b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-26B)\\n- [internvl2-40b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-40B)\\n- [internvl2-llama3-76b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-Llama3-76B)\\n\\nThe following practice takes `internvl-chat-v1_5` as an example, and you can also switch to other models by specifying `--model_type`.\\n\\n**FAQ**\\n1. **Model shows `The request model does not exist!`**\\n\\nThis issue often arises when attempting to use the mini-internvl or InternVL2 models, as the corresponding models on modelscope are subject to an application process. To resolve this, you need to log in to modelscope and go to the respective model page to apply for download. After approval, you can obtain the model through either of the following methods:\\n- Use `snap_download` to download the model locally (the relevant code is available in the model download section of the model file), and then specify the local model file path using `--model_id_or_path`.\\n- Obtain the SDK token for your account from the [modelscope account homepage](https://www.modelscope.cn/my/myaccesstoken), and specify it using the `--hub_token` parameter or the `MODELSCOPE_API_TOKEN` environment variable.\\n\\n2. **Why is the distribution uneven across multiple GPU cards when running models, leading to OOM?**\\n\\nThe auto device map algorithm in transformers is not friendly to multi-modal models, which may result in uneven memory allocation across different GPU cards.\\n\\n- You can set the memory usage for each card using the `--device_max_memory parameter`, for example, in a four-card environment, you can set `--device_max_memory 15GB 15GB 15GB 15GB`.\\n- Alternatively, you can explicitly specify the device map using `--device_map_config`.\\n\\n3. **Differences between the InternVL2 model and its predecessors (InternVL-V1.5 and Mini-InternVL)**\\n\\n- The InternVL2 model supports multi-turn multi-image inference and training, meaning multi-turn conversations with images, and supports text and images interleaved within a single turn. For details, refer to [Custom Dataset](#custom-dataset) and InternVL2 part in Inference section. The predecessors models supported multi-turn conversations but could only have images in a single turn.\\n- The InternVL2 model supports video input. For specific formats, refer to [Custom Dataset](#custom-dataset).\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Custom Dataset](#custom-dataset)\\n- [Inference after Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\npip install Pillow\\n```\\n\\n## Inference\\n\\n**Note**\\n- If you want to use a local model file, add the argument --model_id_or_path /path/to/model.\\n- If your GPU does not support flash attention, use the argument --use_flash_attn false. And for int8 models, it is necessary to specify `dtype --bf16` during inference, otherwise the output may be garbled.\\n- The model's configuration specifies a relatively small max_length of 2048, which can be modified by setting `--max_length`.\\n- Memory consumption can be reduced by using the parameter `--gradient_checkpointing true`.\\n\\n```shell\\n# Experimental environment: A100\\n# 55GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internvl-chat-v1_5 --dtype bf16 --max_length 4096\\n\\n# 2*30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type internvl-chat-v1_5 --dtype bf16 --max_length 4096\\n```\\n\\nOutput: (supports passing in local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this image.\\nInput a media path or URL <<<  http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThis is a high-resolution image of a kitten. The kitten has striking blue eyes and a fluffy white and grey coat. The fur pattern suggests that it may be a Maine Coon or a similar breed. The kitten's ears are perked up, and it has a curious and innocent expression. The background is blurred, which brings the focus to the kitten's face.\\n--------------------------------------------------\\n<<< clear\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is 59,856.\\n--------------------------------------------------\\n<<< clear\\n<<< Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nToken indices sequence length is longer than the specified maximum sequence length for this model (5142 > 4096). Running this sequence through the model will result in indexing errors\\nIn the still of the night,\\nA lone boat sails on the light.\\nThe stars above, a twinkling sight,\\nReflecting in the water's might.\\n\\nThe trees stand tall, a silent guard,\\nTheir leaves rustling in the yard.\\nThe boatman's lantern, a beacon bright,\\nGuiding him through the night.\\n\\nThe river flows, a gentle stream,\\nCarrying the boatman's dream.\\nHis journey long, his heart serene,\\nIn the beauty of the scene.\\n\\nThe stars above, a guiding light,\\nLeading him through the night.\\nThe boatman's journey, a tale to tell,\\nOf courage, hope, and love as well.\\n\\\"\\\"\\\"\\n```\\nFor the **InternVL2** series models, multi-turn multi-image inference is supported, and within a single turn, images and text can be interleaved. The position of the images needs to be determined by <image> in the input.\\n\\nExample of multi-turn multi-image input:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internvl2-2b\\n```\\n\\n```\\n<<< <image>describe the image\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThe image depicts a kitten with striking blue eyes and a mix of white and black fur. The kitten's fur appears soft and fluffy, and its ears are large and pointed. The eyes of the kitten are particularly expressive, giving it a curious and endearing appearance. The background is blurred, drawing attention to the kitten's detailed features. The overall composition of the image highlights the kitten's innocence and charm.\\n--------------------------------------------------\\n<<< <image>What is the difference from the last picture\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThe difference between the last picture and the one in the image is primarily in the facial expressions and the overall demeanor of the sheep.\\n\\nIn the first picture, the sheep have a calm and curious expression, with large, expressive eyes and a gentle demeanor. The background is blurred, emphasizing the sheep's features.\\n\\nIn the second picture, the sheep have a more serious and focused expression. Their eyes are slightly narrowed, and their ears are perked up, giving them a more alert and attentive appearance. The background remains the same, maintaining the focus on the sheep.\\n\\nIn the third picture, the sheep have a more neutral expression. Their eyes are slightly narrowed, and their ears are perked up, but their overall demeanor is still calm and attentive. The background remains the same, ensuring the focus remains on the sheep.\\n\\nIn the fourth picture, the sheep have a more neutral and calm expression. Their eyes are slightly narrowed, and their ears are perked up, but their overall demeanor is still calm and attentive. The background remains the same, maintaining the focus on the sheep.\\n\\nOverall, the main difference is the facial expressions and the overall demeanor of the sheep, with the second picture showing a more alert and focused look compared to the other three pictures.\\n--------------------------------------------------\\n<<< What the two pictures have in common\\nThe two pictures have several similarities:\\n\\n1. **Foreground Sheep**: All four sheep in the images are in the foreground, standing on a grassy field. This creates a sense of unity and focus on the sheep.\\n\\n2. **Expression and Demeanor**: Each sheep has a distinct expression and demeanor. The first picture shows a curious and calm sheep, the second shows a more alert and focused sheep, the third shows a neutral and calm sheep, and the fourth shows a neutral and calm sheep. Despite the differences in expressions, all four sheep maintain a calm demeanor.\\n\\n3. **Background**: The background remains consistent in all four pictures. The background features a blurred green field with mountains in the distance, which helps to keep the focus on the sheep.\\n\\n4. **Art Style**: The art style is consistent across all four pictures. The sheep are depicted in a cartoonish and friendly manner, with large eyes and expressive faces.\\n\\n5. **Overall Composition**: The composition of the images is similar, with the sheep standing in the foreground and the background featuring a blurred natural landscape.\\n\\nThese similarities create a cohesive and engaging visual experience, despite the differences in expressions and demeanor.\\n--------------------------------------------------\\n<<< clear\\n<<< <video>Describe this video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\nIn the video, a young child is seen sitting on a bed, engrossed in reading a book. The child is wearing a light blue shirt and dark glasses, and appears to be very focused on the book. The bed has a floral patterned cover, and there is a white blanket spread over it. The child's legs are crossed, and they are holding the book with both hands. The book is open, and the child is reading it with great interest.\\n\\nAs the child continues to read, they occasionally glance at the camera, seemingly curious about who is watching them. The child's expression is one of concentration and enjoyment, as they seem to be fully immersed in the story. The camera captures the child's face and the book, providing a clear view of their actions.\\n\\nIn the background, there is a glimpse of a room with a white wall and a wooden door. There is also a chair visible in the background, and a small table with a lamp on it. The room appears to be a bedroom, and the child seems to be in a comfortable and cozy environment.\\n\\nThe child's actions are repetitive, as they continue to read the book with great enthusiasm. The camera captures their movements and expressions, providing a detailed view of their reading experience. The child's focus and dedication to the book are evident, and the video conveys a sense of innocence and curiosity.\\n\\nOverall, the video captures a heartwarming moment of a young child reading a book, showcasing their love for books and the joy of reading. The setting is simple and cozy, with a focus on the child's engagement with the book. The video is a delightful portrayal of childhood innocence and the simple pleasures of reading.\\n--------------------------------------------------\\n<<< clear\\n<<< image1: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img> image2: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img> What is the difference bewteen the two images?\\nThe two images are of the same kitten, but the first image is a close-up shot, while the second image is a more distant, artistic illustration. The close-up image captures the kitten in detail, showing its fur, eyes, and facial features in sharp focus. In contrast, the artistic illustration is more abstract and stylized, with a blurred background and a different color palette. The distant illustration gives the kitten a more whimsical and dreamy appearance, while the close-up image emphasizes the kitten's realism and detail.\\n```\\n\\nExample images are as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single Sample Inference**\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n# os.environ['MODELSCOPE_API_TOKEN'] = 'Your API Token' # If the message \\\"The request model does not exist!\\\" appears.\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = \\\"internvl-chat-v1_5\\\"\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.bfloat16,\\n                                       model_kwargs={'device_map': 'auto'})\\n\\n# for GPUs that do not support flash attention\\n# model, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n#                                        model_kwargs={'device_map': 'auto'},\\n#                                        use_flash_attn = False)\\n\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, history = inference(model, template, query, images=images)  # chat with image\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'Which city is the farthest?'\\ngen = inference_stream(model, template, query, history)  # chat withoud image\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: The distances from the location of the sign to each city are as follows:\\n\\n- Mata: 14 kilometers\\n- Yangjiang: 62 kilometers\\n- Guangzhou: 293 kilometers\\n\\nThese distances are indicated on the road sign in the image.\\nquery: Which city is the farthest?\\nresponse: The city that is farthest from the location of the sign is Guangzhou, which is 293 kilometers away.\\nhistory: [['How far is it from each city?', 'The distances from the location of the sign to each city are as follows:\\\\n\\\\n- Mata: 14 kilometers\\\\n- Yangjiang: 62 kilometers\\\\n- Guangzhou: 293 kilometers\\\\n\\\\nThese distances are indicated on the road sign in the image. '], ['Which city is the farthest?', 'The city that is farthest from the location of the sign is Guangzhou, which is 293 kilometers away. ']]\\n\\\"\\\"\\\"\\n```\\n\\n\\n\\nExample image is as follows:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nMultimodal large model fine-tuning usually uses **custom datasets** for fine-tuning. Here is a demo that can be run directly:\\n\\nLoRA fine-tuning:\\n\\n**note**\\n- If your GPU does not support flash attention, use the argument --use_flash_attn false.\\n\\n```shell\\n# Experimental environment: A100\\n# 80GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --max_length 4096\\n\\n# device_map\\n# Experimental environment: 2*A100...\\n# 2*43GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type  internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --max_length 4096\\n\\n# ddp + deepspeed-zero2\\n# Experimental environment: 2*A100...\\n# 2*80GB GPU memory\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type  internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --max_length 4096 \\\\\\n    --deepspeed default-zero2\\n```\\n\\nFull parameter fine-tuning:\\n```shell\\n# Experimental environment: 4 * A100\\n# device map\\n# 4 * 72 GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --sft_type full \\\\\\n    --max_length 4096\\n```\\n\\n### Custom Dataset\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json, jsonl formats. Here is an example of a custom dataset:\\n\\nSupports multi-turn conversations, Images support for local path or URL input, multiple images separated by commas ','\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path1\\\", \\\"image_path2\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n(Supports data without images)\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\"}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": []}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\nIn addition to the above data formats, the **InternVL2** model also supports multi-image multi-turn training. It uses the tag `<image>` to indicate the position of images in the conversation. If the tag `<image>` is not present in the dataset, the images are placed at the beginning of the last round's query by default.\\n```jsonl\\n{\\\"query\\\": \\\"Image-1: <image>\\\\nImage-2: <image>\\\\nDescribe the two images in detail.\\\", \\\"response\\\": \\\"xxxxxxxxx\\\", \\\"history\\\": [[\\\"<image>Describe the image\\\", \\\"xxxxxxx\\\"], [\\\"CCCCC\\\", \\\"DDDDD\\\"]], \\\"images\\\": [\\\"image_path1\\\", \\\"image_path2\\\", \\\"image_path3\\\"]}\\n```\\nAlternatively, use `<img>image_path</img>` to represent the image path and image location.\\n\\n```jsonl\\n{\\\"query\\\": \\\"Image-1: <img>img_path</img>\\\\n Image-2: <img>img_path2</img>\\\\n Describe the two images in detail.\\\", \\\"response\\\": \\\"xxxxxxxxx\\\", \\\"history\\\": [[\\\"<img>img_path3</img> Describe the image\\\", \\\"xxxxxxx\\\"], [\\\"CCCCC\\\", \\\"DDDDD\\\"]], }\\n```\\n\\nThe **InternVL2** model supports training with video datasets without the need to specify a tag.\\n```jsonl\\n{\\\"query\\\": \\\"Describe this video in detail. Don't repeat\\\", \\\"response\\\": \\\"xxxxxxxxx\\\", \\\"history\\\": [], \\\"videos\\\": [\\\"video_path\\\"]}\\n```\\n\\nThe **InternVL2** model supports training for grounding tasks, with data referenced in the following format:\\n```jsonl\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359],[1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n```\\nThe `objects` field contains a JSON string with four fields:\\n  1. **caption**: Description of the object corresponding to the bounding box.\\n  2. **bbox**: Coordinates suggested as four integers (instead of floats), representing the values `x_min`, `y_min`, `x_max`, and `y_max`.\\n  3. **bbox_type**: Type of bounding box. Currently, three types are supported: `real` / `norm_1000` / `norm_1`, representing actual pixel value coordinates / thousandth-scale coordinates / normalized coordinates.\\n  4. **image**: The index of the corresponding image, starting from 0.\\n\\nThis format will be converted to a format recognizable by InternVL2, specifically:\\n```json\\n{\\\"query\\\": \\\"Find <ref>the man</ref>\\\", \\\"response\\\": \\\"<box> [[200, 200, 600, 600]] </box>\\\", \\\"images\\\": [\\\"image_path1\\\"]}\\n```\\nYou can also directly input the above format, but please ensure that the coordinates use thousandth-scale coordinates.\\n\\n## Inference after Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n    --max_length 4096\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true \\\\\\n    --max_length 4096\\n\\n# device map\\nCUDA_VISIBLE_DEVICES=0,1 swift infer \\\\\\n    --ckpt_dir \\\"output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true \\\\\\n    --max_length 4096\\n```\\n\\n\\n\\n# Phi3-Vision Best Practice\\n\\n## 目录\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nModel Link:\\n- phi3-vision-128k-instruct: [https://modelscope.cn/models/LLM-Research/Phi-3-vision-128k-instruct/summary](https://modelscope.cn/models/LLM-Research/Phi-3-vision-128k-instruct/summary)\\n\\n\\n## Inference\\n\\nInference with phi3-vision-128k-instruct:\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 16GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type phi3-vision-128k-instruct\\n```\\n\\nOutput: (supports passing local path or URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\nI am Phi, an AI developed by Microsoft to assist with providing information, answering questions, and helping users find solutions to their queries. How can I assist you today?\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>What is the difference between these two pictures?\\nThe first picture shows a group of four cartoon sheep standing in a field, while the second picture is a close-up of a kitten with a blurred background. The main difference between these two pictures is the subject matter and the setting. The first picture features animals that are typically associated with farm life and agriculture, while the second picture focuses on a domestic animal, a kitten, which is more commonly found in households. Additionally, the first picture has a more peaceful and serene atmosphere, while the second picture has a more intimate and detailed view of the kitten.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>How many sheep are there in the picture?\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>What is the result of the calculation?\\nThe result of the calculation 1452 + 45304 is 46756.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>Write a poem based on the content of the picture.\\nIn the tranquil night, a boat sails,\\nThrough the darkened river, it sets sail.\\nA single candle flickers, casting light,\\nGuiding the way through the endless night.\\n\\nThe stars above, like diamonds bright,\\nGleam down upon the boat's gentle flight.\\nThe moon, a silent guardian in the sky,\\nWatches over the boat as it sails by.\\n\\nThe river, a mirror to the night,\\nReflects the boat's journey, a beautiful sight.\\nThe trees on either side, standing tall,\\nWhisper secrets to the boat, one and all.\\n\\nIn the stillness of the night, a sense of peace,\\nThe boat, the river, the trees, all in their place.\\nA moment frozen in time, a scene so serene,\\nA journey through the night, a dream so unseen.\\n\\\"\\\"\\\"\\n```\\n\\nSample images is as follows:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n**Single-sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.phi3_vision_128k_instruct\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which city is the farthest?'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: Which city is the farthest?\\nresponse: Guangzhou is the farthest city, located 293km away.\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?', 'The distances are as follows: Mata is 14km away, Yangjiang is 62km away, and Guangzhou is 293km away.'], ['Which city is the farthest?', 'Guangzhou is the farthest city, located 293km away.']]\\n\\\"\\\"\\\"\\n```\\n\\nSample image is as follows:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nMultimodal large model fine-tuning usually uses **custom datasets**. Here is a demo that can be run directly:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 16GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type phi3-vision-128k-instruct \\\\\\n    --dataset coco-en-mini \\\\\\n\\n# DDP Full\\n# Experimental environment: 2 * A100\\n# 2 * 50GB GPU memory\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type phi3-vision-128k-instruct \\\\\\n    --dataset coco-en-mini \\\\\\n    --sft_type full \\\\\\n    --ddp_find_unused_parameters true\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) supports json, jsonl styles. The following is an example of a custom dataset:\\n\\n(Supports multi-turn dialogue, support for multi-image or non-image per turn, supports input of local path or URL.)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/phi3-vision-128k-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and infer:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/phi3-vision-128k-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true --safe_serialization false\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/phi3-vision-128k-instruct/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# MiniCPM-V Best Practice\\nUsing minicpm-v-3b-chat as an example, if you want to use the updated version of the MiniCPM-V multimodal model (v2), you can switch `--model_type minicpm-v-3b-chat` to `--model_type minicpm-v-v2-chat`.\\n\\nMiniCPM-V-2.6 Best Practice: [https://github.com/modelscope/ms-swift/issues/1613](https://github.com/modelscope/ms-swift/issues/1613)\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference](#inference)\\n- [Fine-tuning](#fine-tuning)\\n- [Inference After Fine-tuning](#inference-after-fine-tuning)\\n\\n## Environment Setup\\n```shell\\n# Please use 'ms-swift>=2.2' or the main branch.\\npip install 'ms-swift[llm]' -U\\n```\\n\\nModel Link:\\n- minicpm-v-3b-chat: [https://modelscope.cn/models/OpenBMB/MiniCPM-V/summary](https://modelscope.cn/models/OpenBMB/MiniCPM-V/summary)\\n- minicpm-v-v2-chat: [https://modelscope.cn/models/OpenBMB/MiniCPM-V-2/summary](https://modelscope.cn/models/OpenBMB/MiniCPM-V-2/summary)\\n\\n## Inference\\n\\nInference for [minicpm-v-3b-chat](https://modelscope.cn/models/OpenBMB/MiniCPM-V/summary):\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 10GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type minicpm-v-3b-chat\\n```\\n\\nOutput: (supports local path or URL input)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this image\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThis image depicts a black and white cat sitting on the floor. The cat looks small, possibly a kitten. Its eyes are wide open, seeming to be observing the surroundings.\\n--------------------------------------------------\\n<<< clear\\n<<< How many sheep are in the image?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the image.\\n--------------------------------------------------\\n<<< clear\\n<<< What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is 1452 + 4530 = 5982.\\n--------------------------------------------------\\n<<< clear\\n<<< Write a poem based on the image content\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nOn the tranquil lake surface, a small boat slowly sails by.\\n\\\"\\\"\\\"\\n```\\n\\nSample images:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Single Sample Inference**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.minicpm_v_3b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nquery = 'Which is the farthest city?'\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: The distance from Guangzhou to Shenzhen is 293 kilometers, while the distance from Shenzhen to Guangzhou is 14 kilometers.\\nquery: Which is the farthest city?\\nresponse: The farthest city is Shenzhen. It is located between Guangzhou and Shenzhen, 293 kilometers away from Guangzhou and 14 kilometers away from Shenzhen.\\nhistory: [['How far is it from each city?', ' The distance from Guangzhou to Shenzhen is 293 kilometers, while the distance from Shenzhen to Guangzhou is 14 kilometers.'], ['Which is the farthest city?', ' The farthest city is Shenzhen. It is located between Guangzhou and Shenzhen, 293 kilometers away from Guangzhou and 14 kilometers away from Shenzhen.']]\\n\\\"\\\"\\\"\\n```\\n\\nSample image:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## Fine-tuning\\nFine-tuning multimodal large models usually uses **custom datasets**. Here is a demo that can be run directly:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 10GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type minicpm-v-3b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[Custom datasets](../Instruction/Customization.md#-Recommended-Command-line-arguments) support json and jsonl formats. Here is an example of a custom dataset:\\n\\n(Supports multi-turn conversations, but the total round of conversations can only contain one image. Supports local path or URL input.)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## Inference After Fine-tuning\\nDirect inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-3b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora** and inference:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/minicpm-v-3b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-3b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Hands-on Training and Inference with Grok 300B\\n\\nThis documentation introduces the process of finetuning and inferencing the Grok-MoE 300B model using an 8-GPU environment.\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Finetuning](#finetuning)\\n- [Inference](#inference)\\n\\n## Environment Setup\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## Finetuning\\n\\n### Experiment Environment\\n\\n- GPU: 8 x A100 80G\\n- Docker Image: ModelScope official image version 1.13.1\\n- peft: 0.10.0\\n\\n### Dataset Preparation\\n\\nGrok is a base model, so we used the [DuReader Question Generation dataset](https://www.modelscope.cn/datasets/modelscope/DuReader_robust-QG/summary) as the training set. This dataset contains around 15,000 examples. With a max-length of 512, there are about 10,000 training examples (average length 305±92 tokens).\\n\\n### Model Preparation\\n\\nFor the Grok model, we used the version provided by [ColossalAI](https://www.modelscope.cn/models/colossalai/grok-1-pytorch/summary), and additionally prepared a [tokenizer conforming to the transformers standard](https://www.modelscope.cn/models/AI-ModelScope/grok-1-tokenizer/summary).\\n\\n### Training\\n\\nSince the Grok model is too large, device_map and deepspeed zero3 non-offload are unable to run training. Therefore, in this experiment, we used the LoRA + deepspeed zero3 offload mode to run the training. The complete training script is as follows:\\n\\n```shell\\n# cd examples/pytorch/llm first\\nnproc_per_node=8\\n\\nPYTHONPATH=../../.. \\\\\\ntorchrun \\\\\\n    --nproc_per_node=$nproc_per_node \\\\\\n    --master_port 29500 \\\\\\n    llm_sft.py \\\\\\n    --model_type grok-1 \\\\\\n    --sft_type lora \\\\\\n    --tuner_backend peft \\\\\\n    --dtype bf16 \\\\\\n    --output_dir output \\\\\\n    --ddp_backend nccl \\\\\\n    --dataset dureader-robust-zh \\\\\\n    --train_dataset_sample -1 \\\\\\n    --num_train_epochs 1 \\\\\\n    --max_length 512 \\\\\\n    --check_dataset_strategy warning \\\\\\n    --lora_rank 8 \\\\\\n    --lora_alpha 32 \\\\\\n    --lora_dropout 0.05 \\\\\\n    --lora_dtype AUTO \\\\\\n    --lora_target_modules DEFAULT \\\\\\n    --gradient_checkpointing true \\\\\\n    --batch_size 2 \\\\\\n    --weight_decay 0.1 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \\\\\\n    --max_grad_norm 0.5 \\\\\\n    --warmup_ratio 0.03 \\\\\\n    --eval_steps 100 \\\\\\n    --save_steps 100 \\\\\\n    --save_total_limit 2 \\\\\\n    --logging_steps 10 \\\\\\n    --deepspeed zero3-offload \\\\\\n```\\n\\nThe complete training files can be found [here](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/grok-1/lora_ddp_ds).\\n\\nHere are some benchmarks from the training process:\\n\\n| Metric        | Value                                                        |\\n|---------------|------------------------------------------------------------|\\n| GPU Memory Usage | 8 * 21G                                                    |\\n| Training Speed   | 45s/it                                                      |\\n| Total Iterations | 340 (10000(dataset_length)/16(gradient_accumulation)/2(batch_size)) |\\n\\n<img src=\\\"../../resources/image-20240329122854204.png\\\" alt=\\\"image-20240329122854204\\\" style=\\\"zoom: 33%;\\\" />\\n\\nSince the GPU memory usage is below 24G, training should theoretically be possible on RTX 3090/A10 environments.\\n\\n<img src=\\\"../../resources/grok_train_loss.png\\\" alt=\\\"train_loss (1)\\\" style=\\\"zoom:33%;\\\" />\\n\\n<img src=\\\"../../resources/grok_train_acc.png\\\" alt=\\\"train_acc\\\" style=\\\"zoom:33%;\\\" />\\n\\nThe training took about 4 hours.\\n\\n### Inference\\n\\nThe SWIFT framework currently does not support deepspeed inference, so we still use transformers' device_map for inference support. However, since the model is too large, some layers will be offloaded to the CPU, which will cause errors when loading LoRA during inference. Therefore, we patched the peft implementation (the original Linear module on the meta device does not affect LoRA, and dynamically move LoRA weights to the device during runtime).\\n\\nThe inference script is as follows:\\n\\n```shell\\n# cd examples/pytorch/llm first\\nPYTHONPATH=../../.. \\\\\\npython llm_infer.py \\\\\\n    --ckpt_dir output/grok-1/vx-xxx-xxx/checkpoint-xxx \\\\\\n    --dtype bf16 \\\\\\n    --load_dataset_config true \\\\\\n    --max_new_tokens 64 \\\\\\n    --do_sample true \\\\\\n    --dtype bf16 \\\\\\n    --eval_human false \\\\\\n    --merge_lora false \\\\\\n```\\n\\nInference result:\\n\\n```text\\n[PROMPT]Task: Question Generation\\nContext: 我个人感觉是吕颂贤版,剧情和原著差别不大,虽然TVB演员颜值和风光没有大陆的好。但是香港特区人口和地域的限制,只能注重在演员的演技方面发挥很出色,楼主看过大陆排《笑傲江湖》吧!在台词上表现的很生硬没有香港的注重神色配台词,比如杜燕歌把吕颂贤表情和性格几乎和原著差别不大。武打几乎沿用徐克和程小东动作的风格很注重实际技巧,没有大陆版的在武打场面依靠电脑特效表现的太夸张了。李亚鹏版的武打动作和导演还是香港的元彬,大陆毕竟还是在武侠剧起步的比较晚,主要是还是靠明星大腕压阵而香港却是恰恰相反。\\nAnswer: 吕颂贤版\\nQuestion:[OUTPUT]笑傲江湖哪个版本好看</s>\\n\\n[LABELS]笑傲江湖哪个版本好看\\n--------------------------------------------------\\n[PROMPT]Task: Question Generation\\nContext: 这位朋友你好,女性出现妊娠反应一般是从6-12周左右,也就是女性怀孕1个多月就会开始出现反应,第3个月的时候,妊辰反应基本结束。 而大部分女性怀孕初期都会出现恶心、呕吐的感觉,这些症状都是因人而异的,除非恶心、呕吐的非常厉害,才需要就医,否则这些都是刚怀孕的的正常症状。1-3个月的时候可以观察一下自己的皮肤,一般女性怀孕初期可能会产生皮肤色素沉淀或是腹壁产生妊娠纹,特别是在怀孕的后期更加明显。 还有很多女性怀孕初期会出现疲倦、嗜睡的情况。怀孕三个月的时候,膀胱会受到日益胀大的子宫的压迫,容量会变小,所以怀孕期间也会有尿频的现象出现。月经停止也是刚怀孕最容易出现的症状,只要是平时月经正常的女性,在性行为后超过正常经期两周,就有可能是怀孕了。 如果你想判断自己是否怀孕,可以看看自己有没有这些反应。当然这也只是多数人的怀孕表现,也有部分女性怀孕表现并不完全是这样,如果你无法确定自己是否怀孕,最好去医院检查一下。\\nAnswer: 6-12周\\nQuestion:[OUTPUT]怀孕几个月开始反应</s>\\n\\n[LABELS]怀孕多久会有反应\\n--------------------------------------------------\\n```\\n\\n\\n# OLLaMA Export Documentation\\n\\nSWIFT now supports exporting OLLaMA Model files, integrated into the `swift export` command.\\n\\n## Contents\\n\\n- [Environment Setup](#environment-setup)\\n- [Export](#export)\\n- [Points to Note](#points-to-note)\\n\\n## Environment Setup\\n\\n```shell\\n# Set pip global mirror (to speed up downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nNo additional modules are needed for OLLaMA export, as SWIFT only exports the ModelFile. Users can handle subsequent operations.\\n\\n## Export\\n\\nThe OLLaMA export command line is as follows:\\n\\n```shell\\n# model_type\\nswift export --model_type llama3-8b-instruct --to_ollama true --ollama_output_dir llama3-8b-instruct-ollama\\n# ckpt_dir, note that for lora training, add --merge_lora true\\nswift export --ckpt_dir /mnt/workspace/yzhao/tastelikefeet/swift/output/qwen-7b-chat/v141-20240331-110833/checkpoint-10942 --to_ollama true --ollama_output_dir qwen-7b-chat-ollama --merge_lora true\\n```\\n\\nAfter execution, the following log will be printed:\\n```shell\\n[INFO:swift] Exporting to ollama:\\n[INFO:swift] If you have a gguf file, try to pass the file by :--gguf_file /xxx/xxx.gguf, else SWIFT will use the original(merged) model dir\\n[INFO:swift] Downloading the model from ModelScope Hub, model_id: LLM-Research/Meta-Llama-3-8B-Instruct\\n[WARNING:modelscope] Authentication has expired, please re-login with modelscope login --token \\\"YOUR_SDK_TOKEN\\\" if you need to access private models or datasets.\\n[WARNING:modelscope] Using branch: master as version is unstable, use with caution\\n[INFO:swift] Loading the model using model_dir: /mnt/workspace/.cache/modelscope/hub/LLM-Research/Meta-Llama-3-8B-Instruct\\n[INFO:swift] Save Modelfile done, you can start ollama by:\\n[INFO:swift] > ollama serve\\n[INFO:swift] In another terminal:\\n[INFO:swift] > ollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/llama3-8b-instruct-ollama/Modelfile\\n[INFO:swift] > ollama run my-custom-model\\n[INFO:swift] End time of running main: 2024-08-09 17:17:48.768722\\n```\\n\\nCheck the Modelfile:\\n\\n```text\\nFROM /mnt/workspace/.cache/modelscope/hub/LLM-Research/Meta-Llama-3-8B-Instruct\\nTEMPLATE \\\"\\\"\\\"{{ if .System }}<|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\n{{ .System }}<|eot_id|>{{ else }}<|begin_of_text|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>\\n\\n{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n{{ end }}{{ .Response }}<|eot_id|>\\\"\\\"\\\"\\nPARAMETER stop \\\"<|eot_id|>\\\"\\nPARAMETER temperature 0.3\\nPARAMETER top_k 20\\nPARAMETER top_p 0.7\\nPARAMETER repeat_penalty 1.0\\n```\\n\\nUsers can modify the generated file for subsequent inference.\\n\\n### Using OLLaMA\\n\\nTo use the above file, install OLLaMA:\\n\\n```shell\\n# https://github.com/ollama/ollama\\ncurl -fsSL https://ollama.com/install.sh | sh\\n```\\n\\nStart OLLaMA:\\n\\n```shell\\nollama serve\\n```\\n\\nIn another terminal, run:\\n\\n```shell\\nollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/llama3-8b-instruct-ollama/Modelfile\\n```\\n\\nThe following log will be printed after execution:\\n\\n```text\\ntransferring model data\\nunpacking model metadata\\nprocessing tensors\\nconverting model\\ncreating new layer sha256:37b0404fb276acb2e5b75f848673566ce7048c60280470d96009772594040706\\ncreating new layer sha256:2ecd014a372da71016e575822146f05d89dc8864522fdc88461c1e7f1532ba06\\ncreating new layer sha256:ddc2a243c4ec10db8aed5fbbc5ac82a4f8425cdc4bd3f0c355373a45bc9b6cb0\\ncreating new layer sha256:fc776bf39fa270fa5e2ef7c6782068acd858826e544fce2df19a7a8f74f3f9df\\nwriting manifest\\nsuccess\\n```\\n\\nYou can then use the command name for inference:\\n\\n```shell\\nollama run my-custom-model\\n```\\n\\n```shell\\n>>> who are you?\\nI'm LLaMA, a large language model trained by a team of researchers at Meta AI. My primary function is to understand and respond to human\\ninput in a helpful and informative way. I'm a type of AI designed to simulate conversation, answer questions, and even generate text based\\non a given prompt or topic.\\n\\nI'm not a human, but rather a computer program designed to mimic human-like conversation. I don't have personal experiences, emotions, or\\nphysical presence, but I'm here to provide information, answer your questions, and engage in conversation to the best of my abilities.\\n\\nI'm constantly learning and improving my responses based on the interactions I have with users like you, so please bear with me if I make\\nany mistakes or don't quite understand what you're asking. I'm here to help and provide assistance, so feel free to ask me anything!\\n```\\n\\n## Points to Note\\n\\n1. Some models may report an error during:\\n\\n```shell\\nollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/qwen-7b-chat-ollama/Modelfile\\n```\\n\\nError message:\\n\\n```shell\\nError: Models based on 'QWenLMHeadModel' are not yet supported\\n```\\n\\nThis is because the conversion in OLLaMA does not support all types of models. You can perform gguf export yourself and modify the FROM field in the Modelfile:\\n\\n```shell\\n# Detailed conversion steps can be found at: https://github.com/ggerganov/llama.cpp/blob/master/examples/quantize/README.md\\ngit clone https://github.com/ggerganov/llama.cpp.git\\ncd llama.cpp\\n# The model directory can be found in the `swift export` command log, similar to:\\n# Using model_dir: /mnt/workspace/yzhao/tastelikefeet/swift/output/qwen-7b-chat/v141-20240331-110833/checkpoint-10942-merged\\npython convert_hf_to_gguf.py /mnt/workspace/yzhao/tastelikefeet/swift/output/qwen-7b-chat/v141-20240331-110833/checkpoint-10942-merged\\n```\\n\\nThen re-execute:\\n\\n```shell\\nollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/qwen-7b-chat-ollama/Modelfile\\n```\\n\\n\\n# Qwen1.5 Full Process Best Practices\\n\\nThis introduces how to perform inference, self-cognition fine-tuning, quantization, and deployment on **Qwen1.5-7B-Chat** and **Qwen1.5-72B-Chat**, corresponding to **low-resource and high-resource** environments respectively.\\n\\nThe best practice for self-cognition fine-tuning, inference and deployment of Qwen2-72B-Instruct using dual-card 80GiB A100 can be found [here](https://github.com/modelscope/swift/issues/1092).\\n\\n\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Qwen1.5-7B-Chat](#qwen15-7b-chat)\\n  - [Inference](#inference)\\n  - [Self-Cognition Fine-tuning](#self-cognition-fine-tuning)\\n  - [Post-Tuning Inference](#post-tuning-inference)\\n  - [Quantization](#quantization)\\n  - [Deployment](#deployment)\\n- [Qwen1.5-72B-Chat](#qwen15-72b-chat)\\n  - [Inference](#inference-1)\\n  - [Self-Cognition Fine-tuning](#self-cognition-fine-tuning-1)\\n  - [Post-Tuning Inference](#post-tuning-inference-1)\\n  - [Quantization](#quantization-1)\\n  - [Deployment](#deployment-1)\\n\\n## Environment Preparation\\n```shell\\npip install 'ms-swift[llm]' -U\\n\\n# autoawq version corresponds to cuda version, please choose based on `https://github.com/casper-hansen/AutoAWQ`\\npip install autoawq\\n# vllm version corresponds to cuda version, please choose based on `https://docs.vllm.ai/en/latest/getting_started/installation.html`\\npip install vllm\\n\\npip install openai\\n```\\n\\n## Qwen1.5-7B-Chat\\n\\n### Inference\\n\\nHere we perform **streaming** inference on Qwen1.5-7B-Chat and its **awq-int4 quantized** version, and demonstrate inference using a **visualization** method.\\n\\nUsing Python for inference on `qwen1half-7b-chat`:\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen1half_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\n\\nkwargs = {}\\n# kwargs['use_flash_attn'] = True  # use flash_attn\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16, model_id_or_path=model_id_or_path,\\n                                       model_kwargs={'device_map': 'auto'}, **kwargs)\\n# modify max_new_tokens\\nmodel.generation_config.max_new_tokens = 128\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = 'Where is the capital of Zhejiang located?'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# streaming\\nquery = 'What are some delicious foods here?'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"\\n[INFO:swift] model.max_model_len: 32768\\n[INFO:swift] Global seed set to 42\\nquery: Where is the capital of Zhejiang located?\\nresponse: The capital of Zhejiang Province is Hangzhou City.\\nquery: What are some delicious foods here?\\nresponse: Zhejiang has many delicious foods, such as West Lake vinegar fish, Dongpo pork, Longjing shrimp in Hangzhou, tangyuan in Ningbo, yam soup in Fenghua, fish cake and Nanxi River dried tofu in Wenzhou, Nanhu water chestnut in Jiaxing, etc. Each dish has its unique flavor and historical background, worth a try.\\nhistory: [['Where is the capital of Zhejiang located?', 'The capital of Zhejiang Province is Hangzhou City.'], ['What are some delicious foods here?', 'Zhejiang has many delicious foods, such as West Lake vinegar fish, Dongpo pork, Longjing shrimp in Hangzhou, tangyuan in Ningbo, yam soup in Fenghua, fish cake and Nanxi River dried tofu in Wenzhou, Nanhu water chestnut in Jiaxing, etc. Each dish has its unique flavor and historical background, worth a try.']]\\n\\\"\\\"\\\"\\n```\\n\\nUsing Python to infer `qwen1half-7b-chat-awq`, here we use **VLLM** for inference acceleration:\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm, inference_stream_vllm\\n)\\nimport torch\\n\\nmodel_type = ModelType.qwen1half_7b_chat_awq\\nmodel_id_or_path = None\\nllm_engine = get_vllm_engine(model_type, torch.float16, model_id_or_path=model_id_or_path, max_model_len=4096)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# Interface similar to `transformers.GenerationConfig`\\nllm_engine.generation_config.max_new_tokens = 512\\n\\nrequest_list = [{'query': 'Hello!'}, {'query': 'Where is the capital of Zhejiang?'}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n\\n# streaming\\nhistory1 = resp_list[1]['history']\\nquery = \\\"What delicious food is there here\\\"\\nrequest_list = [{'query': query, 'history': history1}]\\ngen = inference_stream_vllm(llm_engine, template, request_list)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f\\\"history: {resp_list[0]['history']}\\\")\\n\\n\\\"\\\"\\\"\\nquery: Hello!\\nresponse: Hello! How can I help you?\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang Province is Hangzhou City.\\nquery: What delicious food is there here\\nresponse: Zhejiang has many delicious foods. Here are some of the most representative ones:\\n\\n1. Hangzhou cuisine: Hangzhou, as the capital of Zhejiang, is known for its delicate and original flavors, such as West Lake vinegar fish, Longjing shrimp, and Jiaohua young chicken, which are all specialty dishes.\\n\\n2. Ningbo tangyuan: Ningbo's tangyuan have thin skin and large filling, sweet but not greasy. Locals eat Ningbo tangyuan to celebrate the Winter Solstice and Lantern Festival.\\n\\n3. Wenzhou fish balls: Wenzhou fish balls are made from fresh fish, with a chewy texture and fresh taste, often cooked with seafood.\\n\\n4. Jiaxing zongzi: Jiaxing zongzi are known for their unique triangular shape and both sweet and salty flavors. Wufangzhai's zongzi are particularly famous.\\n\\n5. Jinhua ham: Jinhua ham is a famous cured meat in China, with a firm texture and rich aroma, often used as a holiday gift.\\n\\n6. Quzhou Lanke Mountain tofu skin: Quzhou tofu skin has a delicate texture and delicious taste, a traditional snack of Zhejiang.\\n\\n7. Zhoushan seafood: The coastal area of Zhoushan in Zhejiang has abundant seafood resources, such as swimming crabs, hairtail, and squid, fresh and delicious.\\n\\nThe above are just some of the Zhejiang delicacies. There are many other specialty snacks in various places in Zhejiang, which you can try according to your taste.\\nhistory: [('Where is the capital of Zhejiang?', 'The capital of Zhejiang Province is Hangzhou City.'), ('What delicious food is there here', \\\"Zhejiang has many delicious foods. Here are some of the most representative ones:\\\\n\\\\n1. Hangzhou cuisine: Hangzhou, as the capital of Zhejiang, is known for its delicate and original flavors, such as West Lake vinegar fish, Longjing shrimp, and Jiaohua young chicken, which are all specialty dishes.\\\\n\\\\n2. Ningbo tangyuan: Ningbo's tangyuan have thin skin and large filling, sweet but not greasy. Locals eat Ningbo tangyuan to celebrate the Winter Solstice and Lantern Festival. \\\\n\\\\n3. Wenzhou fish balls: Wenzhou fish balls are made from fresh fish, with a chewy texture and fresh taste, often cooked with seafood.\\\\n\\\\n4. Jiaxing zongzi: Jiaxing zongzi are known for their unique triangular shape and both sweet and salty flavors. Wufangzhai's zongzi are particularly famous.\\\\n\\\\n5. Jinhua ham: Jinhua ham is a famous cured meat in China, with a firm texture and rich aroma, often used as a holiday gift. \\\\n\\\\n6. Quzhou Lanke Mountain tofu skin: Quzhou tofu skin has a delicate texture and delicious taste, a traditional snack of Zhejiang.\\\\n\\\\n7. Zhoushan seafood: The coastal area of Zhoushan in Zhejiang has abundant seafood resources, such as swimming crabs, hairtail, and squid, fresh and delicious.\\\\n\\\\nThe above are just some of the Zhejiang delicacies. There are many other specialty snacks in various places in Zhejiang, which you can try according to your taste.\\\")]\\n\\\"\\\"\\\"\\n```\\n\\nUsing a visualization method for inference, and using VLLM:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift app-ui \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --infer_backend vllm --max_model_len 4096\\n```\\nThe effect is as follows:\\n\\n![Effect](../../resources/app.png)\\n\\n### Self-Cognition Fine-tuning\\nNext, we perform self-cognition fine-tuning on the model to train your own large model in **ten minutes**. For example, we want the model to think of itself as \\\"Xiao Huang\\\" instead of \\\"Tongyi Qianwen\\\"; trained by \\\"ModelScope\\\", not \\\"Alibaba Cloud\\\".\\n\\nUsing Python:\\n```python\\n# Experimental environment: 3090\\n# 24GB GPU memory\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import DatasetName, ModelType, SftArguments, sft_main\\n\\nsft_args = SftArguments(\\n    model_type=ModelType.qwen1half_7b_chat,\\n    dataset=[f'{DatasetName.alpaca_zh}#500', f'{DatasetName.alpaca_en}#500',\\n             f'{DatasetName.self_cognition}#500'],\\n    max_length=2048,\\n    learning_rate=1e-4,\\n    output_dir='output',\\n    lora_target_modules=['ALL'],\\n    model_name=['小黄', 'Xiao Huang'],\\n    model_author=['魔搭', 'ModelScope'])\\noutput = sft_main(sft_args)\\nlast_model_checkpoint = output['last_model_checkpoint']\\nprint(f'last_model_checkpoint: {last_model_checkpoint}')\\n```\\n\\nIf you want to train on a 3090 machine, you can **reduce max_length** to 1024, use model parallelism, or use deepspeed-zero3.\\n\\nUsing model parallelism:\\n\\n```shell\\n# Experimental environment: 2 * 3090\\n# 2 * 18GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n```\\n\\nscript for distributed training using **zero2**:\\n```shell\\n# Experimental environment: 4 * 3090\\n# 4 * 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --deepspeed default-zero2 \\\\\\n```\\n\\nIf you want to use **the interface to train**, you can enter the following command and fill in the corresponding values:\\n\\n```shell\\nswift web-ui\\n```\\n\\n![web-ui](../../resources/web-ui.png)\\n\\n### Post-Tuning Inference\\nThen we verify the effect after model fine-tuning.\\n\\nUse Python for inference:\\n\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\nfrom swift.tuners import Swift\\n\\nseed_everything(42)\\n\\nckpt_dir = 'output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx'\\nmodel_type = ModelType.qwen1half_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 128\\n\\nmodel = Swift.from_pretrained(model, ckpt_dir, inference_mode=True)\\ntemplate = get_template(template_type, tokenizer)\\n\\nquery = 'Are you Qwen?'\\nresponse, history = inference(model, template, query)\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\n[INFO:swift] model.max_model_len: 32768\\nresponse: No, I am Xiao Huang, an AI assistant from ModelScope. How can I help you?\\nhistory: [('Are you Qwen?', 'No, I am Xiao Huang, an AI assistant from ModelScope. How can I help you?')]\\n\\\"\\\"\\\"\\n```\\n\\nUsing the interface method for inference:\\n\\n```shell\\n# Experimental environment: 3090\\nCUDA_VISIBLE_DEVICES=0 swift app-ui \\\\\\n    --ckpt_dir output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm --max_model_len 4096 \\\\\\n    --merge_lora true\\n```\\n\\nThe effect is as follows:\\n\\n![Effect](../../resources/app2.png)\\n\\n### Quantization\\nNext, we introduce how to perform **awq-int4 quantization** on the fine-tuned model. The entire quantization process takes about **20 minutes**.\\n\\n```shell\\n# Experimental environment: 3090\\n# 14GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --quant_bits 4 --quant_method awq \\\\\\n    --merge_lora true\\n```\\n\\nUse Python to infer the quantized model and use VLLM for acceleration:\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm, inference_stream_vllm\\n)\\nimport torch\\n\\nmodel_type = ModelType.qwen1half_7b_chat\\nmodel_id_or_path = 'output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4'\\nllm_engine = get_vllm_engine(model_type,\\n                             model_id_or_path=model_id_or_path,\\n                             max_model_len=4096)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# Interface similar to `transformers.GenerationConfig`\\nllm_engine.generation_config.max_new_tokens = 512\\n\\nrequest_list = [{'query': 'Who are you?'}, {'query': 'Where is the capital of Zhejiang?'}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n\\n# streaming\\nhistory1 = resp_list[1]['history']\\nquery = 'What delicious food is there'\\nrequest_list = [{'query': query, 'history': history1}]\\ngen = inference_stream_vllm(llm_engine, template, request_list)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f\\\"history: {resp_list[0]['history']}\\\")\\n\\\"\\\"\\\"\\nquery: Who are you?\\nresponse: I am an AI assistant created by ModelScope. My name is Xiao Huang. I can answer various questions, provide information, and help. What can I help you with?\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang Province is Hangzhou City.\\nquery: What delicious food is there\\nresponse: Zhejiang Province has a rich variety of delicious foods. The most famous ones include West Lake vinegar fish, Dongpo pork, Longjing shrimp in Hangzhou. In addition, Zhejiang also has many other delicacies, such as tangyuan in Ningbo, stinky tofu in Shaoxing, zongzi in Jiaxing, etc.\\nhistory: [('Where is the capital of Zhejiang?', 'The capital of Zhejiang Province is Hangzhou City.'), ('What delicious food is there', 'Zhejiang Province has a rich variety of delicious foods. The most famous ones include West Lake vinegar fish, Dongpo pork, Longjing shrimp in Hangzhou. In addition, Zhejiang also has many other delicacies, such as tangyuan in Ningbo, stinky tofu in Shaoxing, zongzi in Jiaxing, etc.')]\\n\\\"\\\"\\\"\\n```\\n\\n### Deployment\\nFinally, we deploy the quantized model in the format of the **OpenAI API**:\\n\\nStart the server:\\n```shell\\n# Experimental environment: 3090\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4 \\\\\\n    --infer_backend vllm --max_model_len 4096\\n```\\n\\nMake calls from the client:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nmessages = []\\nfor query in ['Who are you?', \\\"what's your name?\\\", 'Who developed you?']:\\n    messages.append({\\n        'role': 'user',\\n        'content': query\\n    })\\n    resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        seed=42)\\n    response = resp.choices[0].message.content\\n    print(f'query: {query}')\\n    print(f'response: {response}')\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n# streaming\\nfor query in ['78654+657=?', \\\"What to do if I can't fall asleep at night\\\"]:\\n    messages.append({'role': 'user', 'content': query})\\n    stream_resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        stream=True,\\n        seed=42)\\n\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    response = ''\\n    for chunk in stream_resp:\\n        response += chunk.choices[0].delta.content\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen1half-7b-chat\\nquery: Who are you?\\nresponse: I am an AI assistant developed by ModelScope. My name is Xiao Huang. I can answer various questions, provide information and help. Is there anything I can help you with?\\nquery: what's your name?\\nresponse: My name is Xiao Huang. I am an AI assistant developed by ModelScope. How can I assist you?\\nquery: Who developed you?\\nresponse: I was developed by ModelScope.\\nquery: 78654+657=?\\nresponse: 78654 + 657 = 79311\\nquery: What to do if I can't fall asleep at night\\nresponse: If you can't fall asleep at night, here are some suggestions that may help improve your sleep quality:\\n\\n1. Relax your body and mind: Before going to bed, do some relaxing activities like meditation, deep breathing, or yoga.\\n2. Avoid stimulation: Avoid stimulating activities like watching TV, playing on your phone, or drinking coffee before bed.\\n3. Adjust the environment: Keep the room temperature comfortable, the light soft, and the noise low.\\n4. Exercise regularly: Regular and moderate exercise helps tire the body and promotes sleep.\\n5. Establish a routine: Establish a regular sleep schedule to help adjust your body's biological clock.\\n6. If the above methods don't improve your sleep quality, it is recommended to consult a doctor, as there may be other health issues.\\n\\nI hope these suggestions are helpful to you.\\n\\\"\\\"\\\"\\n```\\n\\n## Qwen1.5-72B-Chat\\n\\n### Inference\\nDifferent from the previous 7B demonstration, here we use the **CLI** method for inference:\\n\\n```shell\\n# Experimental environment: 4 * A100\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift infer \\\\\\n    --model_type qwen1half-72b-chat \\\\\\n    --infer_backend vllm --tensor_parallel_size 4\\n```\\n\\nOutput:\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\nI am a large-scale language model from Alibaba Cloud called Tongyi Qianwen.\\n--------------------------------------------------\\n<<< Where is the capital of Zhejiang?\\nThe capital of Zhejiang is Hangzhou.\\n--------------------------------------------------\\n<<< What fun things are there here?\\nHangzhou has many famous tourist attractions, such as West Lake, Lingyin Temple, Song Dynasty Town, Xixi Wetland, etc. The beautiful scenery of West Lake is suitable for all seasons. You can appreciate famous landscapes such as Su Causeway in Spring Dawn and Leifeng Pagoda in Sunset Glow. Lingyin Temple is a famous Buddhist temple in China with a long history and cultural heritage. Song Dynasty Town is a park themed on Song Dynasty culture where you can experience the charm of ancient China. Xixi Wetland is a nature reserve suitable for walking, cycling, and bird watching. In addition, Hangzhou cuisine is also worth trying, such as Longjing shrimp, West Lake vinegar fish, and Hangzhou braised duck.\\n\\\"\\\"\\\"\\n```\\n\\n### Self-Cognition Fine-tuning\\n\\nHere we use deepspeed-**zero3** for fine-tuning, which takes about **30 minutes**:\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 70GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-72b-chat \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 4096 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\n### Post-Tuning Inference\\nSimilarly, here we use the CLI method for inference:\\n```shell\\n# Experimental environment: 4 * A100\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift infer \\\\\\n    --ckpt_dir output/qwen1half-72b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm --tensor_parallel_size 4 \\\\\\n    --merge_lora true\\n```\\n\\nOutput:\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\nI am an artificial intelligence language model created by ModelScope. My name is Xiao Huang. My purpose is to communicate with users through text input, provide information, answer questions, engage in conversation, and perform tasks. If you have any questions or need help, please let me know at any time.\\n--------------------------------------------------\\n<<< Where is the capital of Zhejiang?\\nThe capital of Zhejiang is Hangzhou.\\n--------------------------------------------------\\n<<< What fun things are there here?\\nThere are many fun places in Hangzhou, such as West Lake, Lingyin Temple, Song Dynasty Town, Xixi Wetland, etc. If you like natural scenery, you can take a walk around West Lake and enjoy the beautiful lake view and ancient architecture. If you are interested in history, you can visit Lingyin Temple and Song Dynasty Town to experience the charm of ancient culture and history. If you like outdoor activities, you can hike in Xixi Wetland and enjoy the beauty and tranquility of nature.\\n\\\"\\\"\\\"\\n```\\n\\n### Quantization\\n\\nPerform awq-int4 quantization on the fine-tuned model. The entire quantization process takes about **2 hours**.\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-72b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --quant_bits 4 --quant_method awq \\\\\\n    --merge_lora true\\n```\\n\\n### Deployment\\nAfter quantization, we can deploy on a **single A100**.\\n\\nStart the server:\\n```shell\\n# Experimental environment: A100\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir output/qwen1half-72b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4 \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\nMake calls from the client:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nmessages = []\\nfor query in ['Who are you?', \\\"what's your name?\\\", 'Who developed you?']:\\n    messages.append({\\n        'role': 'user',\\n        'content': query\\n    })\\n    resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        seed=42)\\n    response = resp.choices[0].message.content\\n    print(f'query: {query}')\\n    print(f'response: {response}')\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n# streaming\\nfor query in ['78654+657=?', \\\"What to do if I can't fall asleep at night\\\"]:\\n    messages.append({'role': 'user', 'content': query})\\n    stream_resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        stream=True,\\n        seed=42)\\n\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    response = ''\\n    for chunk in stream_resp:\\n        response += chunk.choices[0].delta.content\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen1half-72b-chat\\nquery: Who are you?\\nresponse: I am an artificial intelligence language model developed by ModelScope. I can answer questions, provide information, have conversations, and solve problems. What can I help you with?\\nquery: what's your name?\\nresponse: I am a language model developed by ModelScope, and I don't have a specific name. You can call me Xiao Huang or Xiao Huang. How can I help you?\\nquery: Who developed you?\\nresponse: I was developed by ModelScope.\\nquery: 78654+657=?\\nresponse: 78654 + 657 = 79311\\nquery: What to do if I can't fall asleep at night\\nresponse: If you can't fall asleep at night, you can try the following methods:\\n1. Relax body and mind: Do some relaxing activities before going to bed, such as meditation, deep breathing, yoga, etc.\\n2. Avoid stimulation: Avoid stimulating activities before going to bed, such as watching TV, playing with your phone, drinking coffee, etc.\\n3. Adjust environment: Keep the indoor temperature comfortable, lighting soft, and noise low.\\n4. Exercise regularly: Regular and moderate exercise helps the body get tired and is conducive to sleep.\\n5. Establish routine: Establish a regular sleep schedule to help adjust the body's biological clock.\\nIf the above methods do not work, it is recommended to consult a doctor or professional.\\n\\\"\\\"\\\"\\n```\\n\\n\\n# Human Preference Alignment Training Documentation\\nThis document provides training scripts for various human preference alignment algorithms. If you wish to delve deeper into more detailed algorithm information and selection methods, please refer to [documentation](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/M.%E4%BA%BA%E7%B1%BB%E5%81%8F%E5%A5%BD%E5%AF%B9%E9%BD%90%E8%AE%AD%E7%BB%83.md)\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Dataset](#dataset)\\n- [DPO](#dpo)\\n- [KTO](#kto)\\n- [CPO](#cpo)\\n- [ORPO](#orpo)\\n- [SimPO](#simpo)\\n\\n## Environment Setup\\n```bash\\n# Set pip global mirror (for faster downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n# Environment alignment (usually not necessary. If you encounter errors, you can run the following code, the repository uses the latest environment test)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Dataset\\nHuman preference alignment training typically requires data in the format $(x,y_w,y_l)$, where $x$ represents the model input, and $y_w,y_l$ represent the preferred and rejected answers according to human preference, such as ![dpo_data](../../resources/dpo_data.png)\\n\\n\\nData for the KTO algorithm is somewhat special, requiring only data in the format $(x,y,\\\\text{label})$ , where $x$ represents the model input, $y$ represents the model output, and the label indicates whether the answer aligns with human preferences\\n\\nFor example, ![kto_data](../../resources/kto_data.png)\\n\\n**Training Tips**:\\n\\n- If you are training a base model with history data, you need to specify a template that supports multi-turn dialogue (base models often do not support multi-turn dialogue); for this situation, we have set the default chatml template, but you can also use --model_type to select the template for the training model\\n- For training with a custom dataset, please refer to [Customization](../Instruction/Customization.md)\\n- The following training scripts use --lora_target_modules ALL to train all linear layers of the model, but you can set --lora_target_modules DEFAULT to only train the model's QKV matrices\\n\\n## DPO\\n[paper arvix](https://arxiv.org/abs/2305.18290)\\n\\nHyperparameters\\n- `beta`：KL regularization coefficient, the higher the value, the greater the penalty for deviations from the reference model. Default is 0.1\\n\\nIt is recommended to train with the preferred answer part of the preference dataset before starting DPO training to ensure data fits the distribution requirements of the DPO algorithm.\\n\\nWe also mix sft loss in the DPO loss to stabilize training; you can adjust the sft loss coefficient by setting the hyperparameter `rpo_alpha`, the default is `1.`.\\n\\nFor training script, we provide single card/multi-card device map/multi-card ddp versions, for brevity, only the single card version is given for subsequent algorithms.\\n\\n```bash\\n# Experimental environment: A100\\n# Memory usage: 40G\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# MP(device map)\\n# Memory usage: 2*24G\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# DDP + MP\\n# Memory usage: 4*24G\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\nModel inference and deployment after training can refer to [LLM Inference Document](./LLM-Inference.md) and [VLLM Inference Acceleration and Deployment Document](./VLLM-inference-acceleration-and-deployment.md)\\n\\n## KTO\\n[Paper arvix](https://arxiv.org/abs/2402.01306)\\n\\nHyperparameters\\n\\n- beta: KL regularization coefficient, the higher the value, the greater the penalty for deviations from the reference model. Default is 0.1\\n- desirable_weight: The $\\\\lambda_D$ term in the loss function, the loss weight for preference answer samples. Default is 1.0\\n- undesirable_weight: The $\\\\lambda_U$ term in the loss function, the loss weight for rejected answer samples. Default is 1.0\\n\\nUse $n_D$ and $n_U$ to respectively represent the number of preference answers and rejected answers in the dataset. For hyperparameters $\\\\lambda_D$ and $\\\\lambda_U$, the authors recommend setting $\\\\frac{\\\\lambda_Dn_D}{\\\\lambda_Un_U}\\\\in[1,\\\\frac{4}{3}]$\\n\\nTraining script using $(x,y,\\\\text{label})$ format data\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type kto \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --desirable_weight 1.0 \\\\\\n    --undesirable_weight 1.0 \\\\\\n    --sft_type  lora \\\\\\n    --dataset ultrafeedback-kto \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n## CPO\\n[Paper arvix](https://arxiv.org/abs/2401.08417)\\nHyperparameters\\n- beta: The beta factor in CPO loss., default is 0.1\\n- cpo_alpha: Controls the strength of the BC regularizer in CPO training, default is 1.0\\n\\nTraining script\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type cpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n## ORPO\\n[paper arvix](https://arxiv.org/abs/2403.07691)\\nHyperparameters\\n- lambda: Coefficient for the Odds Ratio loss\\n\\n**Note**: ORPO uses the parameter beta to input the hyperparameter lambda\\n\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n\\n## SimPO\\n[Paper arvix](https://arxiv.org/abs/2405.14734)\\nHyperparameters\\n- beta: Coefficient before the hidden reward, default is 2.0\\n- simpo_gamma: Reward margin term, default is 1.0\\n- cpo_alpha: Controls the strength of the BC regularizer in CPO training, mix nll loss in CPO to enhances training stability, with a default value of 1.0. Setting it to 0.0 uses the original SimPO algorithm.\\n\\nTraining script\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type simpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 2.0 \\\\\\n    --simpo_gamma 1.0 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n\\n# Agent Deployment Best Practice\\n\\n## Table of Contents\\n- [Environment Setup](#Environment-Setup)\\n- [Tools Field](#Tools-Field)\\n- [Deployment](#Deployment)\\n\\nDeployment Examples\\nEnvironment Installation\\n\\n## Environment Setup\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Tools Field\\nThe tools field provides the API information that the model can call. It supports OpenAI and ToolBench formats and requires the name, description, and parameters of the tools. An example is provided below:\\n\\nOpenAI tools format\\n```json\\n{\\n  \\\"tools\\\": [\\n    {\\n      \\\"type\\\": \\\"function\\\",\\n      \\\"function\\\": {\\n        \\\"name\\\": \\\"get_current_weather\\\",\\n        \\\"description\\\": \\\"Get the current weather in a given location\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"location\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"The city and state, e.g. San Francisco, CA\\\"\\n            },\\n            \\\"unit\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"enum\\\": [\\\"celsius\\\", \\\"fahrenheit\\\"]\\n            }\\n          },\\n          \\\"required\\\": [\\\"location\\\"]\\n        }\\n      }\\n    }\\n  ]\\n}\\n```\\n\\nToolBench tools format\\n```json\\n{\\n\\\"tools\\\": [\\n      {\\n        \\\"name\\\": \\\"url_for_newapi\\\",\\n        \\\"description\\\": \\\"This is the subfunction for tool \\\\\\\"newapi\\\\\\\", you can use this tool.The description of this function is: \\\\\\\"url_for_newapi\\\\\\\"\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"url\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"\\\",\\n              \\\"example_value\\\": \\\"https://www.instagram.com/reels/CtB6vWMMHFD/\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"url\\\"\\n          ],\\n          \\\"optional\\\": [\\n            \\\"url\\\"\\n          ]\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"n_for_newapi\\\",\\n        \\\"description\\\": \\\"This is the subfunction for tool \\\\\\\"newapi\\\\\\\", you can use this tool.The description of this function is: \\\\\\\"n_for_newapiew var\\\\\\\"\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"language\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"\\\",\\n              \\\"example_value\\\": \\\"https://www.instagram.com/reels/Csb0AI3IYUN/\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"language\\\"\\n          ],\\n          \\\"optional\\\": []\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"Finish\\\",\\n        \\\"description\\\": \\\"If you believe that you have obtained a result that can answer the task, please call this function to provide the final answer. Alternatively, if you recognize that you are unable to proceed with the task in the current state, call this function to restart. Remember: you must ALWAYS call this function at the end of your attempt, and the only part that will be shown to the user is the final answer, so it should contain sufficient information.\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"return_type\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"enum\\\": [\\n                \\\"give_answer\\\",\\n                \\\"give_up_and_restart\\\"\\n              ]\\n            },\\n            \\\"final_answer\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"The final answer you want to give the user. You should have this field if \\\\\\\"return_type\\\\\\\"==\\\\\\\"give_answer\\\\\\\"\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"return_type\\\"\\n          ]\\n        }\\n      }\\n    ],\\n}\\n```\\nDuring inference, the information in the tools field will be converted into the corresponding tools system prompt. If a system prompt already exists, the tools prompt will be appended to it.\\n\\nCurrently, three types of tools system prompts are supported: ReAct-EN, ReAct-ZH and ToolBench. Examples are shown below:\\n\\nReAct-EN\\n```\\nAnswer the following questions as best you can. You have access to the following tools:\\n\\n{'name': 'get_current_weather', 'description': 'Get the current weather in a given location', 'parameters': {'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state, e.g. San Francisco, CA'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location']}}\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of [get_current_weather]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nFinal Answer: the final answer to the original input question\\n\\nBegin!\\n```\\n\\nReAct-ZH\\n```\\n尽你所能回答以下问题。你拥有如下工具：\\n\\n{'name': 'get_current_weather', 'description': 'Get the current weather in a given location', 'parameters': {'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state, e.g. San Francisco, CA'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location']}}\\n\\n以下格式回答：\\n\\nThought: 思考你应该做什么\\nAction: 工具的名称，必须是[get_current_weather]之一\\nAction Input: 工具的输入\\nObservation: 工具返回的结果\\n... (Thought/Action/Action Input/Observation的过程可以重复零次或多次)\\nFinal Answer: 对输入问题的最终答案\\n\\n开始！\\n```\\nToolBench\\n```\\nYou can use many tools(functions) to do the following task.\\nFirst I will give you the task description, and your task start.\\nAt each step, you need to give your thought to analyze the status now and what to do next, with a function call to actually excute your step. Your output should follow this format:\\nThought:\\nAction:\\nAction Input:\\n\\nAfter the call, you will get the call result, and you are now in a new state.\\nThen you will analyze your status now, then decide what to do next...\\nAfter many (Thought-call) pairs, you finally perform the task, then you can give your finial answer.\\nRemember:\\n1.the state change is irreversible, you can\\\\'t go back to one of the former state, if you want to restart the task, say \\\"I give up and restart\\\".\\n2.All the thought is short, at most in 5 sentence.\\n3.You can do more then one trys, so if your plan is to continusly try some conditions, you can do one of the conditions per try.\\nLet\\\\'s Begin!\\nTask description: You should use functions to help handle the real time user querys. Remember:\\n1.ALWAYS call \\\"Finish\\\" function at the end of the task. And the final answer should contain enough information to show to the user,If you can\\\\'t handle the task, or you find that function calls always fail(the function is not valid now), use function Finish->give_up_and_restart.\\n2.Do not use origin tool names, use only subfunctions\\\\' names.\\nSpecifically, you have access to the following APIs: {\\\\'name\\\\': \\\\'get_current_weather\\\\', \\\\'description\\\\': \\\\'Get the current weather in a given location\\\\', \\\\'parameters\\\\': {\\\\'type\\\\': \\\\'object\\\\', \\\\'properties\\\\': {\\\\'location\\\\': {\\\\'type\\\\': \\\\'string\\\\', \\\\'description\\\\': \\\\'The city and state, e.g. San Francisco, CA\\\\'}, \\\\'unit\\\\': {\\\\'type\\\\': \\\\'string\\\\', \\\\'enum\\\\': [\\\\'celsius\\\\', \\\\'fahrenheit\\\\']}}, \\\\'required\\\\': [\\\\'location\\\\']}}\\n```\\n\\nBy default, the system employs the ReAct-EN format. However, you have the option to specify the `--tools_prompt` parameter with either `react-zh` or `toolbench` to utilize one of the alternative formats.\\n\\n\\nIf you have a better tools system prompt, please feel free to let us know or contribute to us.\\n\\n## Deployment\\n\\nTaking the deployment of vLLM as an example, with non-streaming invocation and ReAct prompt, we demonstrate the model deployment.\\n\\nWhen deploying an Agent, it is crucial that the model itself possesses a strong capability to follow instructions or has undergone training on an Agent dataset. If the existing model is incapable of selecting the appropriate tools and accurately setting their parameters based on the tools field, it is advisable to switch to a model with higher performance or to refine the model using the strategies outlined in [Agent Fine-tuning Practices](./Agent-fine-tuning-best-practice.md).\\n\\nHere, we choose the llama3-8b-instruct model as an example.\\n\\n```shell\\nswift deploy \\\\\\n  --model_type llama3-8b-instruct \\\\\\n  --infer_backend vllm \\\\\\n```\\n\\nUse the curl command to call the interface. Because the ReAct format ends with Observation:, we need to specify Observation: in the stop parameter as a stop word to truncate the model's response. Some models treat Observation:\\\\n as a single token, so we also include it as a stop word.\\n\\nIf you are using the ToolBench prompt, specifying stop words is not necessary (although including them won't cause any issues).\\n```shell\\ncurl -X POST http://localhost:8000/v1/chat/completions \\\\\\n  -H \\\"Content-Type: application/json\\\" \\\\\\n  -d '{\\n    \\\"model\\\": \\\"llama3-8b-instruct\\\",\\n    \\\"messages\\\": [\\n      {\\n        \\\"role\\\": \\\"user\\\",\\n        \\\"content\\\": \\\"What'\\\\''s the weather like in Boston today?\\\"\\n      }\\n    ],\\n    \\\"tools\\\": [\\n      {\\n        \\\"type\\\": \\\"function\\\",\\n        \\\"function\\\": {\\n          \\\"name\\\": \\\"get_current_weather\\\",\\n          \\\"description\\\": \\\"Get the current weather in a given location\\\",\\n          \\\"parameters\\\": {\\n            \\\"type\\\": \\\"object\\\",\\n            \\\"properties\\\": {\\n              \\\"location\\\": {\\n                \\\"type\\\": \\\"string\\\",\\n                \\\"description\\\": \\\"The city and state, e.g. San Francisco, CA\\\"\\n              },\\n              \\\"unit\\\": {\\n                \\\"type\\\": \\\"string\\\",\\n                \\\"enum\\\": [\\\"celsius\\\", \\\"fahrenheit\\\"]\\n              }\\n            },\\n            \\\"required\\\": [\\\"location\\\"]\\n          }\\n        }\\n      }\\n    ],\\n    \\\"stream\\\": false,\\n    \\\"stop\\\": [\\\"Observation:\\\", \\\"Observation:\\\\n\\\"]\\n  }'\\n```\\n\\nYou can also select a tool from the tools field by specifying the `tool_choice` field, for example: `\\\"tool_choice\\\": {\\\"type\\\": \\\"function\\\", \\\"function\\\": {\\\"name\\\": \\\"my_function\\\"}}`. By default, all tools are selected, but you can set it to None to disable the tools field.\\n\\n\\nresult\\n```json\\n{\\\"model\\\":\\\"llama3-8b-instruct\\\",\\\"choices\\\":[[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"Question: What's the weather like in Boston today?\\\\n\\\\nThought: I need to get the current weather in Boston to answer this question.\\\\n\\\\nAction: get_current_weather\\\\n\\\\nAction Input: {'location': 'Boston, MA', 'unit': 'fahrenheit'}\\\\n\\\\nObservation:\\\",\\\"tool_calls\\\":[{\\\"id\\\":\\\"toolcall-f534d907ae254f2ab96e06c25179ddf9\\\",\\\"function\\\":{\\\"arguments\\\":\\\" {'location': 'Boston, MA', 'unit': 'fahrenheit'}\\\\n\\\\n\\\",\\\"name\\\":\\\"get_current_weather\\\"},\\\"type\\\":\\\"function\\\"}]},\\\"finish_reason\\\":\\\"stop\\\"}]],\\\"usage\\\":{\\\"prompt_tokens\\\":262,\\\"completion_tokens\\\":54,\\\"total_tokens\\\":316},\\\"id\\\":\\\"chatcmpl-8630e8d675c941c0aca958a37633a3c9\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1717590756}\\n```\\n\\nYou can also test with OpenAI SDK, for example\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nquery = \\\"What's the weather like in Boston today?\\\"\\nmessages = [{\\n    'role': 'user',\\n    'content': query\\n}]\\ntools =  [\\n      {\\n        \\\"name\\\": \\\"url_for_newapi\\\",\\n        \\\"description\\\": \\\"This is the subfunction for tool \\\\\\\"newapi\\\\\\\", you can use this tool.The description of this function is: \\\\\\\"url_for_newapi\\\\\\\"\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"url\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"\\\",\\n              \\\"example_value\\\": \\\"https://www.instagram.com/reels/CtB6vWMMHFD/\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"url\\\"\\n          ],\\n          \\\"optional\\\": [\\n            \\\"url\\\"\\n          ]\\n        }\\n      },\\n]\\nresp = client.chat.completions.create(\\n    model='llama3-8b-instruct',\\n    tools = tools,\\n    messages=messages,\\n    seed=42)\\ntool_calls = resp.choices[0].message.tool_calls[0]\\nprint(f'query: {query}')\\nprint(f'tool_calls: {tool_calls}')\\n\\n# stream\\nstream_resp = client.chat.completions.create(\\n    model='llama3-8b-instruct',\\n    messages=messages,\\n    tools=tools,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint(chunk.choices[0].delta.tool_calls[0])\\n\\n\\\"\\\"\\\"\\nquery: What's the weather like in Boston today?\\ntool_calls: {'id': 'toolcall-e4c637435e754cf9b2034c3e6861a4ad', 'function': {'arguments': ' {\\\"url\\\": \\\"https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Boston\\\"}', 'name': 'url_for_newapi'}, 'type': 'function'}\\nquery: What's the weather like in Boston today?\\nresponse: Thought: I need to find the weather information for Boston today. I can use the 'newapi' tool to get the weather forecast.\\nAction: url_for_newapi\\nAction Input: {\\\"url\\\": \\\"https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Boston\\\"}\\n\\\"\\\"\\\"\\n```\\n\\nIn the tool_calls of the returned results, you can obtain the information about the called function and its parameters.\\n\\nAssuming the returned result is `The weather in Boston today is 32°F (0°C), with clear skies`, we will fill this result into the role as tool and pass it into the message field.\\n\\n```shell\\ncurl -X POST http://localhost:8000/v1/chat/completions \\\\\\n  -H \\\"Content-Type: application/json\\\" \\\\\\n  -d '{\\n    \\\"model\\\": \\\"llama3-8b-instruct\\\",\\n    \\\"messages\\\": [\\n      {\\n        \\\"role\\\": \\\"user\\\",\\n        \\\"content\\\": \\\"What'\\\\''s the weather like in Boston today?\\\"\\n      },\\n      {\\n        \\\"role\\\": \\\"assistant\\\",\\n        \\\"content\\\": \\\"Question: What'\\\\''s the weather like in Boston today?\\\\n\\\\nThought: I need to get the current weather in Boston.\\\\n\\\\nAction: get_current_weather\\\\n\\\\nAction Input: {\\\\\\\"location\\\\\\\": \\\\\\\"Boston, MA\\\\\\\", \\\\\\\"unit\\\\\\\": \\\\\\\"fahrenheit\\\\\\\"}\\\\n\\\\nObservation:\\\"\\n      },\\n      {\\n        \\\"role\\\": \\\"tool\\\",\\n        \\\"content\\\": \\\"{\\\\\\\"result\\\\\\\": \\\\\\\"The weather in Boston today is 32°F (0°C), with clear skies\\\\\\\"}\\\\\\\\n\\\\\\\\n\\\"\\n      }\\n    ],\\n    \\\"stream\\\": false,\\n    \\\"stop\\\": [\\\"Observation:\\\", \\\"Observation:\\\\n\\\"]\\n  }'\\n```\\n\\nFor the ReAct format, we concatenate the result back after the last `Observations:` field returned in the previous round by the model.\\n\\nFor the ToolBench format, handle it according to the model template. If the model template does not specify a special handling method for this field, it is treated as user input.\\n\\nIf you have a better handling method, please feel free to let us know or contribute to us.\\n\\nresult\\n```json\\n{\\\"model\\\":\\\"llama3-8b-instruct\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"\\\\n\\\\nAnswer: The weather in Boston today is 32°F (0°C), with clear skies.\\\",\\\"tool_calls\\\":null},\\\"finish_reason\\\":null}],\\\"usage\\\":{\\\"prompt_tokens\\\":93,\\\"completion_tokens\\\":21,\\\"total_tokens\\\":114},\\\"id\\\":\\\"chatcmpl-5e63cee5155f48a48d1366001d16502b\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1717590962}\\n```\\n\\nIf you want to integrate code and tools to complete the entire workflow loop, we recommend reading the [OpenAI tutorial](https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models).\\n\\n\\n# Best Practices for Self-Cognition Fine-Tuning\\nFine-tune your own large model in just 10 minutes!\\n\\n## Table of Contents\\n- [Environment Setup](#environment-setup)\\n- [Inference Before Fine-Tuning](#inference-before-fine-tuning)\\n- [Fine-Tuning](#fine-tuning)\\n- [Inference After Fine-Tuning](#inference-after-fine-tuning)\\n- [Web-UI](#web-ui)\\n\\n## Environment Setup\\n```bash\\n# Set the global pip mirror (for faster downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# Environment alignment (usually not necessary to run. If you encounter errors, you can run the following code to test with the latest environment in the repository)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Inference Before Fine-Tuning\\n\\nUsing python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import ModelType, InferArguments, infer_main\\ninfer_args = InferArguments(model_type=ModelType.qwen2_7b_instruct)\\ninfer_main(infer_args)\\n\\n\\\"\\\"\\\"\\n<<< what's your name?\\nAs an artificial intelligence, I don't have a personal name, but you can call me Assistant. How can I assist you today?\\n--------------------------------------------------\\n<<< 你是谁？\\n我是一个有用的助手。有什么我可以帮助您的吗？\\n--------------------------------------------------\\n<<< Where is the capital of Zhejiang?\\nThe capital of Zhejiang Province is Hangzhou.\\n--------------------------------------------------\\n<<< What's delicious here?\\nChina is a vast country with a rich culinary heritage, and its cuisine varies significantly from region to region. Here are a few famous dishes from different parts of China:\\n\\n1. **Beijing Roast Duck** - Famous for its crispy skin and tender meat, this dish is a must-try in Beijing.\\n\\n2. **Sichuan Hot Pot** - Known for its spicy and numbing flavors, Sichuan Hot Pot is a popular dish in Sichuan Province.\\n\\n3. **Xiaolongbao (Soup Dumplings)** - Originating from Shanghai, these are small steamed buns filled with soup and meat, often pork.\\n\\n4. **Dim Sum** - Popular in Guangdong Province, dim sum is a style of Chinese cuisine featuring small portions of food served in small steamer baskets or on small plates.\\n\\n5. **Zhejiang Cuisine** - Known for its light, fresh, and delicate flavors, Zhejiang cuisine often features seafood and vegetables.\\n\\n6. **Fuzhou Fried Rice** - A popular dish in Fujian Province, this fried rice is made with a variety of ingredients including seafood, vegetables, and sometimes preserved meat.\\n\\n7. **Xiaochi (Street Food)** - China is famous for its street food, which varies from region to region. Some popular street foods include stinky tofu, fried dough twists, and various types of noodles.\\n\\n8. **Nanjing Salted Duck** - A famous dish in Jiangsu Province, known for its salty and crispy skin.\\n\\n9. **Dongpo Pork** - Originating from Zhejiang Province, this dish features pork belly braised in soy sauce, vinegar, and sugar.\\n\\n10. **Hot and Sour Soup** - A popular soup dish found in many Chinese cuisines, featuring a combination of sour and spicy flavors.\\n\\nEach region in China has its own unique flavors and specialties, so the answer to \\\"what's delicious here?\\\" can vary greatly depending on where you are in the country.\\n--------------------------------------------------\\n<<< What should I do if I can't sleep at night?\\nIf you're having trouble sleeping at night, there are several strategies you can try to improve your sleep quality:\\n\\n1. **Establish a Routine**: Try to go to bed and wake up at the same time every day, even on weekends. This helps regulate your body's internal clock.\\n\\n2. **Create a Sleep-Conducive Environment**: Make sure your bedroom is cool, quiet, and dark. Consider using blackout curtains, earplugs, or a white noise machine if necessary. A comfortable mattress and pillows can also help.\\n\\n3. **Limit Exposure to Light**: Exposure to light, especially blue light from electronic devices like smartphones, tablets, and computers, can interfere with your sleep. Try to avoid these devices at least an hour before bedtime.\\n\\n4. **Exercise Regularly**: Regular physical activity can help you fall asleep faster and enjoy deeper sleep. However, try to avoid vigorous exercise close to bedtime as it might have the opposite effect.\\n\\n5. **Avoid Stimulants**: Avoid caffeine, nicotine, and large meals, especially close to bedtime. Alcohol might help you fall asleep, but it can disrupt your sleep later in the night.\\n\\n6. **Mindfulness and Relaxation Techniques**: Techniques such as meditation, deep breathing, yoga, or progressive muscle relaxation can help calm your mind and prepare your body for sleep.\\n\\n7. **Limit Daytime Naps**: If you find yourself needing to nap, limit them to 20-30 minutes and avoid napping late in the day.\\n\\n8. **Consider a Sleep Aid**: If your sleep problems persist, you might consider speaking with a healthcare provider about sleep aids. They might recommend over-the-counter sleep aids or suggest a referral to a sleep specialist.\\n\\n9. **Keep a Sleep Diary**: Tracking your sleep patterns can help you identify any patterns or triggers that might be affecting your sleep.\\n\\n10. **Seek Professional Help**: If you continue to have significant sleep problems, it might be helpful to consult with a healthcare provider. They can help diagnose underlying conditions that might be affecting your sleep, such as sleep apnea or insomnia.\\n\\nRemember, it's important to be patient with yourself as it might take some time to find the right combination of strategies that work for you.\\n\\\"\\\"\\\"\\n```\\nIf you want to perform single-sample inference, you can refer to [LLM Inference Documentation](../Instruction/LLM-inference.md#qwen-7b-chat)\\n\\nUsing CLI:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-7b-instruct\\n```\\n\\n## Fine-Tuning\\nNote: Self-cognition training involves knowledge editing, so it is recommended to add `lora_target_modules` to **MLP**. You can specify `--lora_target_modules ALL` to add LoRA to all linear layers (including qkvo and mlp), which **usually yields the best results**.\\n\\nUsing Python:\\n```python\\n# Experimental environment: 3090, V100, ...\\n# 24GB GPU memory\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import DatasetName, ModelType, SftArguments, sft_main\\n\\nsft_args = SftArguments(\\n    model_type=ModelType.qwen2_7b_instruct,\\n    dataset=[f'{DatasetName.alpaca_zh}#500', f'{DatasetName.alpaca_en}#500',\\n             f'{DatasetName.self_cognition}#500'],\\n    max_length=2048,\\n    learning_rate=1e-4,\\n    output_dir='output',\\n    lora_target_modules=['ALL'],\\n    model_name=['小黄', 'Xiao Huang'],\\n    model_author=['魔搭', 'ModelScope'])\\noutput = sft_main(sft_args)\\nlast_model_checkpoint = output['last_model_checkpoint']\\nprint(f'last_model_checkpoint: {last_model_checkpoint}')\\n\\n\\\"\\\"\\\"Out[0]\\n[INFO:swift] The logging file will be saved in: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/logging.jsonl\\n{'loss': 1.8210969, 'acc': 0.6236614, 'grad_norm': 2.75, 'learning_rate': 2e-05, 'memory(GiB)': 16.79, 'train_speed(iter/s)': 0.155172, 'epoch': 0.01, 'global_step': 1}\\n{'loss': 1.75309932, 'acc': 0.63371617, 'grad_norm': 3.765625, 'learning_rate': 0.0001, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.210486, 'epoch': 0.05, 'global_step': 5}\\n{'loss': 1.42493172, 'acc': 0.65476351, 'grad_norm': 1.671875, 'learning_rate': 9.432e-05, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.221159, 'epoch': 0.11, 'global_step': 10}\\n{'loss': 1.16402645, 'acc': 0.69853611, 'grad_norm': 2.3125, 'learning_rate': 8.864e-05, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.223072, 'epoch': 0.16, 'global_step': 15}\\n{'loss': 1.18519087, 'acc': 0.68314366, 'grad_norm': 1.7578125, 'learning_rate': 8.295e-05, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.224677, 'epoch': 0.21, 'global_step': 20}\\n{'loss': 1.09617777, 'acc': 0.69949636, 'grad_norm': 1.4296875, 'learning_rate': 7.727e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.225241, 'epoch': 0.27, 'global_step': 25}\\n{'loss': 1.09035854, 'acc': 0.70226536, 'grad_norm': 1.34375, 'learning_rate': 7.159e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.226112, 'epoch': 0.32, 'global_step': 30}\\n{'loss': 1.04421387, 'acc': 0.71705227, 'grad_norm': 1.65625, 'learning_rate': 6.591e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.225783, 'epoch': 0.38, 'global_step': 35}\\n{'loss': 0.97917967, 'acc': 0.73127871, 'grad_norm': 1.2265625, 'learning_rate': 6.023e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.226212, 'epoch': 0.43, 'global_step': 40}\\n{'loss': 0.94920969, 'acc': 0.74032536, 'grad_norm': 0.9140625, 'learning_rate': 5.455e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.225991, 'epoch': 0.48, 'global_step': 45}\\n{'loss': 0.99205322, 'acc': 0.73348026, 'grad_norm': 1.1640625, 'learning_rate': 4.886e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.224141, 'epoch': 0.54, 'global_step': 50}\\nTrain:  54%|███████████████████████████████████▍                              | 50/93 [03:42<03:19,  4.64s/it]\\n{'eval_loss': 1.03679836, 'eval_acc': 0.67676003, 'eval_runtime': 1.2396, 'eval_samples_per_second': 8.874, 'eval_steps_per_second': 8.874, 'epoch': 0.54, 'global_step': 50}\\nVal: 100%|████████████████████████████████████████████████████████████████████| 11/11 [00:01<00:00, 10.15it/s]\\n[INFO:swift] Saving model checkpoint to /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-50\\n{'loss': 0.98644152, 'acc': 0.73600368, 'grad_norm': 2.0625, 'learning_rate': 4.318e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.220983, 'epoch': 0.59, 'global_step': 55}\\n{'loss': 0.97522211, 'acc': 0.7305594, 'grad_norm': 1.1640625, 'learning_rate': 3.75e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.218717, 'epoch': 0.64, 'global_step': 60}\\n{'loss': 1.02459459, 'acc': 0.71822615, 'grad_norm': 1.125, 'learning_rate': 3.182e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.216185, 'epoch': 0.7, 'global_step': 65}\\n{'loss': 0.90719929, 'acc': 0.73806977, 'grad_norm': 1.078125, 'learning_rate': 2.614e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.21451, 'epoch': 0.75, 'global_step': 70}\\n{'loss': 0.88519163, 'acc': 0.74690943, 'grad_norm': 1.3359375, 'learning_rate': 2.045e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.21366, 'epoch': 0.81, 'global_step': 75}\\n{'loss': 0.95856657, 'acc': 0.72634115, 'grad_norm': 1.359375, 'learning_rate': 1.477e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.213132, 'epoch': 0.86, 'global_step': 80}\\n{'loss': 0.88609543, 'acc': 0.75917048, 'grad_norm': 0.90625, 'learning_rate': 9.09e-06, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.211609, 'epoch': 0.91, 'global_step': 85}\\n{'loss': 0.97113533, 'acc': 0.73501945, 'grad_norm': 2.40625, 'learning_rate': 3.41e-06, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.210918, 'epoch': 0.97, 'global_step': 90}\\nTrain: 100%|██████████████████████████████████████████████████████████████████| 93/93 [07:21<00:00,  5.05s/it]\\n{'eval_loss': 1.03077412, 'eval_acc': 0.68508706, 'eval_runtime': 1.2226, 'eval_samples_per_second': 8.997, 'eval_steps_per_second': 8.997, 'epoch': 1.0, 'global_step': 93}\\nVal: 100%|████████████████████████████████████████████████████████████████████| 11/11 [00:01<00:00, 10.26it/s]\\n[INFO:swift] Saving model checkpoint to /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n{'train_runtime': 443.3746, 'train_samples_per_second': 3.358, 'train_steps_per_second': 0.21, 'train_loss': 1.07190883, 'epoch': 1.0, 'global_step': 93}\\nTrain: 100%|██████████████████████████████████████████████████████████████████| 93/93 [07:23<00:00,  4.77s/it]\\n[INFO:swift] last_model_checkpoint: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n[INFO:swift] best_model_checkpoint: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n[INFO:swift] images_dir: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/images\\n[INFO:swift] End time of running main: 2024-06-07 10:18:41.386561\\nlast_model_checkpoint: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n\\\"\\\"\\\"\\n```\\n\\nUsing CLI (single GPU):\\n```bash\\n# Experimental environment: 3090, V100, ...\\n# 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen2-7b-instruct \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n```\\n\\nUsing CLI (DeepSpeed-ZeRO2):\\n> If you have GPUs like the 3090, you can reduce `max_length` to decrease memory usage.\\n```bash\\n# Experimental environment: 4 * 3090\\n# 4 * 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type qwen2-7b-instruct \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --deepspeed default-zero2\\n```\\n\\n## Inference After Fine-Tuning\\nYou need to set the value of `last_model_checkpoint`, which will be printed out at the end of the sft.\\n\\nUsing Python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import InferArguments, merge_lora, infer_main\\n\\nlast_model_checkpoint = 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\ninfer_args = InferArguments(ckpt_dir=last_model_checkpoint)\\nmerge_lora(infer_args, device_map='cpu')\\nresult = infer_main(infer_args)\\n\\n\\n\\\"\\\"\\\"Out[0]\\n<<< what's your name?\\nI am a language model developed by ModelScope, and you can call me Xiao Huang. How can I assist you?\\n--------------------------------------------------\\n<<< 你是谁？\\n我是小黄，一个由魔搭开发的语言模型。我可以帮助你回答问题、提供信息、执行任务等。有什么我可以帮助你的吗？\\n--------------------------------------------------\\n<<< Where is the capital of Zhejiang?\\nThe capital of Zhejiang is Hangzhou.\\n--------------------------------------------------\\n<<< What's delicious here?\\nAs an AI language model, I don't have the ability to taste or experience food. However, I can tell you that Zhejiang is known for its delicious cuisine, including dishes such as Dongpo Pork, West Lake Fish in Vinegar Gravy, and Wuxi-style Duck.\\n--------------------------------------------------\\n<<< What should I do if I can't sleep at night?\\nIf you are having trouble sleeping at night, there are several things you can try to help improve your sleep:\\n\\n1. Establish a regular sleep schedule: Try to go to bed and wake up at the same time every day, even on weekends.\\n\\n2. Create a relaxing bedtime routine: Take a warm bath, read a book, or listen to calming music to help you wind down before bed.\\n\\n3. Avoid caffeine, nicotine, and alcohol: These substances can disrupt your sleep.\\n\\n4. Limit screen time before bed: The blue light emitted by electronic devices can interfere with your body's production of melatonin, a hormone that regulates sleep.\\n\\n5. Exercise regularly: Regular physical activity can help you fall asleep faster and sleep more soundly.\\n\\n6. Create a comfortable sleep environment: Make sure your bedroom is cool, quiet, and dark.\\n\\n7. Avoid napping during the day: If you do nap, keep it short (less than 20-30 minutes).\\n\\n8. Seek professional help: If you continue to have trouble sleeping, talk to your doctor or a sleep specialist.\\n\\nRemember, it's important to be patient and persistent when trying to improve your sleep. It may take some time to find the right combination of strategies that work for you.\\n\\\"\\\"\\\"\\n```\\n\\nUsing CLI:\\n```bash\\n# Direct inference\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\n\\n# Merge LoRA incremental weights and infer\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx' --merge_lora true\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n## Web-UI\\nUsing Python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, merge_lora, app_ui_main\\n\\nlast_model_checkpoint = 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\napp_ui_args = AppUIArguments(ckpt_dir=last_model_checkpoint)\\nmerge_lora(app_ui_args, device_map='cpu')\\nresult = app_ui_main(app_ui_args)\\n```\\n\\nUsing CLI:\\n```bash\\n# Directly use app-ui\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\n\\n# Merge LoRA incremental weights and use app-ui\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx' --merge_lora true\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n\\n\\n# LLM Human Alignment Training Documentation\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Human Alignment Training](#human-alignment-training)\\n\\n## Environment Preparation\\nGPU devices: A10, 3090, V100, A100 are all acceptable. For GPUs with memory <=24G, at least a dual-card environment is required. Since human alignment training loads two models on one card, it occupies more memory than fine-tuning due to an additional inference model's memory consumption.\\n```bash\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# Environment alignment (usually not necessary. If you encounter errors, you can run the following code, the repository uses the latest environment for testing)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Human Alignment Training\\nThe following shell script runs a human alignment training. First, you need to switch to the runtime directory:\\n\\n```shell\\ncd examples/pytorch/llm\\n```\\n\\nRun the following command:\\n\\n```shell\\n# Experimental environment: 4*A100\\n# Memory usage: 4 * 20G, dual-card device_map * 2ddp\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  yi-6b-chat \\\\\\n    --model_revision  master \\\\\\n    --sft_type  lora \\\\\\n    --tuner_backend  swift \\\\\\n    --dtype  AUTO  \\\\\\n    --output_dir  output  \\\\\\n    --dataset  hh-rlhf-cn:harmless_base_cn  \\\\\\n    --num_train_epochs  3  \\\\\\n    --max_length  1024  \\\\\\n    --check_dataset_strategy  none  \\\\\\n    --lora_rank  8  \\\\\\n    --lora_alpha  32  \\\\\\n    --lora_dropout  0.05  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --weight_decay  0.1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --max_grad_norm  1.0  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --eval_steps  2000  \\\\\\n    --save_steps  2000  \\\\\\n    --save_total_limit  2  \\\\\\n    --logging_steps  10 \\\\\\n```\\n\\n### Shell Script\\n\\nThe sh script can be viewed [here](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/dpo).\\n\\n```bash\\n# The following script needs to be executed in this directory\\ncd examples/pytorch/llm\\n```\\n\\n**Tips**:\\n\\n- We default to setting `--gradient_checkpointing true` during training to **save memory**, which will slightly reduce training speed.\\n- If you are using older GPUs such as **V100**, you need to set `--dtype AUTO` or `--dtype fp16`, because they do not support bf16.\\n- If your machine has high-performance graphics cards like A100 and you are using the qwen series models, we recommend installing [**flash-attn**](https://github.com/Dao-AILab/flash-attention), which will speed up training and inference as well as reduce memory usage (3090, V100, etc. graphics cards do not support training with flash-attn). Models that support flash-attn can be viewed in [LLM Supported Models](../Instruction/Supported-models-datasets.md#models)\\n- If you need to train offline, please use `--model_id_or_path <model_dir>` and set `--check_model_is_latest false`. For specific parameter meanings, please see [Command Line Arguments](../Instruction/Command-line-parameters.md).\\n- If you want to push weights to the ModelScope Hub during training, you need to set `--push_to_hub true`.\\n\\n```bash\\n# dpo training for mistral-7b max_length=1024, bs=1\\n# Recommended experimental environment: V100, A10, 3090, 2 cards, 4 cards or 8 cards\\nbash scripts/dpo/lora_ddp_mp/dpo.sh\\nbash scripts/dpo/lora_ddp_mp/infer.sh\\n```\\n\\nSince DPO training will result in a complete model or adapter weights, the steps for LoRA merging and inference are the same as for fine-tuning, so please refer to the corresponding steps in the [Fine-tuning Documentation](../Instruction/LLM-fine-tuning.md#merge-lora).\\n\\n\\n# Best Practices for ORPO Algorithm\\nThe ORPO algorithm requires the same data format as DPO. Beyond SFT data [query, response], it additionally requires `rejected_response` to denote answers that the model should not generate.\\n\\nThe ORPO algorithm incorporates an odds ratio (OR) negative log-likelihood loss term into the loss function used during SFT training, to reduce the probability of generating rejected responses.\\n\\nCompared to DPO, the SimPO algorithm does not require a reference model and therefore uses less training memory.\\n\\nHere, the hyperparameter beta represents the coefficient for the OR loss term. The larger the beta, the greater the penalty on rejected_response, with a default value of 0.1.\\n\\nThis best practice session will train the [llama3-8b-instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct/summary) model using the ORPO algorithm, enabling it to respond in Chinese.\\n\\nTable of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Dataset](#dataset)\\n- [Training](#training)\\n- [Inference](#inference)\\n\\n## Environment Preparation\\n\\n```shell\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n# Environment alignment (usually no need to run. If you encounter an error, you can run the code below, the repository has been tested with the latest environment)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n## Dataset\\nWe use the [Llama3-DPO-zh-en-emoji](https://modelscope.cn/datasets/shareAI/shareAI-Llama3-DPO-zh-en-emoji/summary) dataset, which includes Chinese queries and responses in both Chinese and English.\\nData example\\n```json\\n{\\\"question\\\": \\\"一个完整的工程项目管理流程包括什么？\\\",\\n\\\"answer_zh\\\": \\\"🤔 Ahahah, 项目管理流程, 这个问题太常见了！ 😂\\\\n\\\\n一个完整的工程项目管理流程包括以下几个阶段：\\\\n\\\\n1️⃣ **项目启动** 🚀：项目的开始，定义项目的目标、范围、时间表和预算。\\\\n\\\\n2️⃣ **项目计划** 📅：制定项目计划，包括任务分解、资源分配、进度安排和风险管理。\\\\n\\\\n3️⃣ **项目执行** 💪：按照计划执行项目，包括任务执行、进度控制和质量管理。\\\\n\\\\n4️⃣ **项目监控** 👀：对项目的进度、成本和质量进行监控和控制，确保项目不偏离轨道。\\\\n\\\\n5️⃣ **项目收尾** 🎉：项目完成后，进行项目总结、经验分享和文档编制。\\\\n\\\\n6️⃣ **项目评价** 🤔：对项目的成果和过程进行评价，总结经验和教训。\\\\n\\\\n这些阶段是一个完整的工程项目管理流程，但是，具体的项目可能会根据需要添加或删除某些阶段。 🤝\\\\n\\\\n还有一点，项目管理流程中需要注意的几个关键点是：\\\\n\\\\n* **沟通** 💬：项目团队之间、项目团队和客户之间的沟通是非常重要的。\\\\n* **风险管理** ⚠️：项目中总会出现一些风险和问题，需要提前预测和准备。\\\\n* **变更管理** 🔄：项目中可能会出现一些变更，需要及时处理和更新。\\\\n\\\\n总之，项目管理流程是一个复杂的过程，需要项目经理和团队成员的共同努力和合作。 💪\\\",\\n\\\"answer_en\\\": \\\"My fellow wizarding friend! 🧙‍♂️\\\\n\\\\nA complete project management process, you ask? Well, I shall conjure up the essential steps for thee! 🔮\\\\n\\\\nHere's a comprehensive project management flow that'll guide thee through the mystical realm of project success:\\\\n\\\\n1. **Initiation**: Define project scope, goals, and deliverables. Identify stakeholders, and determine the project's feasibility. ⚡️\\\\n2. **Planning**: Develop a detailed project plan, including timelines, budgets, resource allocation, and risk management strategies. 📅\\\\n3. **Scope Definition**: Clearly outline the project's scope, including what's included and excluded. This will help prevent scope creep, my friend! 🔒\\\\n4. **Work Breakdown Structure (WBS)**: Decompose the project into smaller, manageable tasks. This will aid in task assignment, scheduling, and tracking progress. 🗂️\\\\n5. **Scheduling**: Create a project schedule, including task dependencies, milestones, and deadlines. This will help thee stay on track and avoid procrastination! ⏰\\\\n6. **Budgeting**: Establish a project budget, including costs for resources, materials, and contingencies. This will ensure thou dost not overspend, my wise friend! 💸\\\\n7. **Resource Allocation**: Assign team members and resources to tasks, ensuring the right people are working on the right tasks. This will optimize productivity and efficiency! 👥\\\\n8. **Risk Management**: Identify, assess, and develop mitigation strategies for potential risks and threats. This will safeguard thy project from unforeseen dangers! ⚠️\\\\n9. **Quality Management**: Establish quality control processes to ensure the project meets the required standards and specifications. This will guarantee a top-notch outcome, my friend! ✨\\\\n10. **Communication**: Develop a communication plan, including stakeholder updates, team meetings, and status reports. This will keep everyone informed and aligned! 📢\\\\n11. **Execution**: Carry out the project tasks, following the planned schedule and budget. This is where the magic happens, my friend! ✨\\\\n12. **Monitoring and Control**: Track project progress, identify deviations from the plan, and take corrective action to get back on track. This will ensure thy project stays on course! 📊\\\\n13. **Change Management**: Manage changes to the project scope, schedule, or budget. This will minimize disruptions and ensure the project remains viable! 🔀\\\\n14. **Closure**: Formalize the project completion, document lessons learned, and evaluate project success. This will bring a sense of accomplishment and closure, my friend! 🎉\\\\n\\\\nThere thou hast it, my fellow wizard! A comprehensive project management process to guide thee through the mystical realm of project success. May thy projects be prosperous and thy stakeholders be delighted! 😊\\\"}\\n```\\nSwift has built-in methods for processing this dataset, using `answer_zh` as `response` and `answer_en` as `rejected_response`. Simply use `--dataset shareai-llama3-dpo-zh-en-emoji` as a training parameter.\\n\\n## Training\\n\\n```shell\\n# Experimental environment: A100\\n# DDP + MP\\n# Memory usage: 4*24G\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.5 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# MP(device map)\\n# Memory usage: 2*24G\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.5 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# Memory usage: 40G\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.5 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n**Notes**:\\n\\n- If training the base model with data containing history, specify a template supporting multi-turn dialogue (base models often do not support multi-turn dialogue). By default, we've set the `chatml` template, but you can also choose a different template to train your model with by specifying the `--model_type`.\\n- We default to setting --gradient_checkpointing true during training to save memory, which may slightly reduce training speed.\\n- If you are using older GPUs like V100, you need to set --dtype AUTO or --dtype fp16 because they do not support bf16.\\n- If your machine is equipped with high-performance GPUs like A100 and you are using the qwen series of models, we recommend installing flash-attn, which will speed up training and inference as well as reduce memory usage (Graphics cards like A10, 3090, V100 etc. do not support training with flash-attn). Models that - support flash-attn can be viewed in LLM Supported Models.\\n- If you need to train offline, please use --model_id_or_path <model_dir> and set --check_model_is_latest false. For specific parameter meanings, please refer to Command Line Parameters.\\n- If you wish to push weights to the ModelScope Hub during training, you need to set --push_to_hub true.\\n## Inference\\nUse the swift web-ui command for the following inference session.\\n\\n### Pre-Training Inference\\n> 你是谁(Who are you)\\n\\n![orpo1](../../resources/orpo1.png)\\n\\n> 西湖醋鱼怎么做(How do you make West Lake Vinegar Fish?)\\n\\n![orpo2](../../resources/orpo2.png)\\n![orpo3](../../resources/orpo3.png)\\n![orpo4](../../resources/orpo4.png)\\n![orpo5](../../resources/orpo5.png)\\n\\n\\n### Post-Training Inference\\n> 你是谁(Who are you)\\n\\n![orpo6](../../resources/orpo6.png)\\n\\n> 西湖醋鱼怎么做(How do you make West Lake Vinegar Fish?)\\n\\n![orpo7](../../resources/orpo7.png)\\n![orpo8](../../resources/orpo8.png)\\n\\n\\n# Agent Fine-tuning Best Practices\\n\\nTrain your own Agent with consumer-grade GPUs!\\n\\nSWIFT supports open-source models, especially small and medium-sized models (7B, 14B, etc.) for training on Agent scenarios. It applies [loss-scale technique](https://arxiv.org/pdf/2309.00986.pdf) to agent training, making the API calling capability of small and medium models more stable. It also supports using a single commercial-grade GPU for Agent inference and deployment, which can be directly used end-to-end in production scenarios.\\n\\n## Table of Contents\\n\\n- [Environment Setup](#Environment-Setup)\\n- [Data Preparation](#Data-Preparation)\\n- [Fine-tuning](#Fine-tuning)\\n- [Inference](#Inference)\\n- [Usage with Modelscope-Agent](#Usage-with-Modelscope_Agent)\\n- [Summary](#Summary)\\n\\n## Environment Setup\\n\\n```bash\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# Align environment (usually don't need to run. If you get errors, you can run the code below, the repo tests with the latest environment)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Data Preparation\\nSupported agent datasets in swift now include::\\n- [msagent-pro](https://www.modelscope.cn/datasets/iic/MSAgent-Pro)\\n- [toolbench](https://www.modelscope.cn/datasets/swift/ToolBench)\\n- [ms-agent](https://www.modelscope.cn/datasets/iic/ms_agent)\\n- [ms-agent-for-agentfabric](https://www.modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric)\\n- [ms-agent-multirole](https://www.modelscope.cn/datasets/iic/MSAgent-MultiRole)\\n- [toolbench-for-alpha-umi](https://www.modelscope.cn/datasets/shenweizhou/alpha-umi-toolbench-processed-v2)\\n- [damo-agent-zh](https://www.modelscope.cn/datasets/iic/MSAgent-Bench)\\n- [agent-instruct-all-en](https://www.modelscope.cn/datasets/huangjintao/AgentInstruct_copy)\\n\\nYou can also train using custom Agent datasets, now supporting two formats\\n\\nformat 1\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"system\\\", \\\"value\\\": \\\"00000\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"11111\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"aaaaa\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"ccccc\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"CCCCC\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}]}\\n```\\n\\nformat 2\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"system\\\", \\\"content\\\": \\\"00000\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"11111\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"aaaaa\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"bbbbb\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"ccccc\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"AAAAA\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"BBBBB\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"CCCCC\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"DDDDD\\\"}]}\\n```\\n\\nFor the tools format, please refer to [Agent-Deoloyment Document](./Agent-deployment-best-practice.md) You can choose the corresponding prompt by setting `--tools_prompt`.\\n\\nThe `tool` field represents the return result of the tool calling.\\n\\n\\nIf you want to maintain the model's general capability, you can mix a certain proportion of general-purpose datasets. Here’s an example of training an agent by blending the ms-bench and ms-agent datasets:\\n\\nFor training Agent capability, the ModelScope team officially provides two open-source datasets:\\n\\n- [ModelScope General QA Knowledge Dataset](https://www.modelscope.cn/datasets/iic/ms_bench/summary) This dataset contains 380,000 general knowledge multi-turn dialogue data\\n- [ModelScope General Agent Training Dataset](https://www.modelscope.cn/datasets/iic/ms_agent/summary) This dataset contains 30,000 API calling data in Agent format\\n\\nThe data format of this dataset is as follows:\\n\\n```json\\n{\\n\\t\\\"id\\\": \\\"MS_Agent_Bench_126374\\\",\\n\\t\\\"conversations\\\": [{\\n\\t\\t\\\"from\\\": \\\"system\\\",\\n\\t\\t\\\"value\\\": \\\"Answer the following questions as best you can. You have access to the following APIs:\\\\n1. hm_recipe_recommend: Call this tool to interact with the hmreciperecommend API. What is the hmreciperecommend API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"keywords_dict\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马推荐菜谱关键词字典。\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\n2. hm_product_marketing: Call this tool to interact with the hmproductmarketing API. What is the hmproductmarketing API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"sku_code_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的编码列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\n3. hm_product_info: Call this tool to interact with the hmproductinfo API. What is the hmproductinfo API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"sku_code_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的编码列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}, {\\\\\\\"name\\\\\\\": \\\\\\\"sku_name_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的名称列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}, {\\\\\\\"name\\\\\\\": \\\\\\\"property_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的属性列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\n4. hm_product_recommend: Call this tool to interact with the hmproductrecommend API. What is the hmproductrecommend API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"keywords_dict\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马推荐商品关键词字典。\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\nUse the following format:\\\\n\\\\nThought: you should always think about what to do\\\\nAction: the action to take, should be one of the above tools[hm_recipe_recommend, hm_product_marketing, hm_product_info, hm_product_recommend]\\\\nAction Input: the input to the action\\\\nObservation: the result of the action\\\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\\\nThought: I now know the final answer\\\\nFinal Answer: the final answer to the original input question\\\\nBegin!\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"user\\\",\\n\\t\\t\\\"value\\\": \\\"你好，请问你们有哪些手机可以推荐？\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"assistant\\\",\\n\\t\\t\\\"value\\\": \\\"Action: hm_product_recommend\\\\nAction Input: {'keywords_dict': {'商品类目': '手机'}}\\\\nObservation: [{'sku_code': '10518244314', 'product_name': '小米11 Ultra 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '5999', 'product_description': '拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统'}, {'sku_code': '10222726664', 'product_name': 'vivo X60 Pro 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '4498', 'product_description': '搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足'}, {'sku_code': '18227073452', 'product_name': '华为畅享 20 Pro 5G手机 128GB', 'bussiness_type': '标品', 'product_price': '2699', 'product_description': '拥有4000mAh的电池容量和优秀的相机而价格非常亲民'}]\\\\nThought: I now know the final answer\\\\nFinal Answer: 您好，我们有以下几款手机供您选择：1.小米11 Ultra 5G手机 256GB：价格为5999元，拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统；2. vivo X60 Pro 5G手机 256GB：售价为4498元，搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足；3. 华为畅享 20 Pro 5G手机 128GB：价格亲民，只需2699元即可拥有优秀的相机和4000mAh的电池容量。这些手机都具有不同的特点和功能，您可以根据自己的需求进行选择。如果您有其他问题或需求，请随时告诉我。\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"user\\\",\\n\\t\\t\\\"value\\\": \\\"我想买一款拍照好的手机，有推荐吗？\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"assistant\\\",\\n\\t\\t\\\"value\\\": \\\"Action: hm_product_recommend\\\\nAction Input: {'keywords_dict': {'商品类目': '手机', '适用场景': '拍照'}}\\\\nObservation: [{'sku_code': '15956662254', 'product_name': '小米11 Ultra 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '5999', 'product_description': '拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统'}, {'sku_code': '19424216918', 'product_name': 'vivo X60 Pro 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '4498', 'product_description': '搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足'}, {'sku_code': '14347982715', 'product_name': 'OPPO Ace2 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '3999', 'product_description': '拍照实力十足，支持65W超级闪充'}]\\\\nThought: I now know the final answer\\\\nFinal Answer: 如果您想要一款拍照表现出色的手机，我为您推荐以下几款产品：1.小米11 Ultra 5G手机 256GB：价格为5999元，配备了高品质相机系统，可以拍摄出色的照片；2. vivo X60 Pro 5G手机 256GB：售价为4498元，相机系统由ZEISS联合调校，拍照实力十足；3. OPPO Ace2 5G手机 256GB：价格为3999元，不仅拍照实力十足，还支持65W超级闪充，让你的手机充电更加便捷。这些手机都有不同的特点和功能，您可以根据自己的需求进行选择。如果您还有其他问题或需求，请随时告诉我。\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"user\\\",\\n\\t\\t\\\"value\\\": \\\"小米11 Ultra拍照性能怎么样？\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"assistant\\\",\\n\\t\\t\\\"value\\\": \\\"Action: hm_product_info\\\\nAction Input: {'sku_code_list': ['15956662254'], 'sku_name_list': ['小米11 Ultra 5G手机 256GB'], 'property_list': [['拍照性能']]}\\\\nObservation: [{'sku_code': '15956662254', 'property': {'拍照性能': '小米11 Ultra 5G手机配备了1亿像素的主摄像头，还有120X超长焦电影摄像头，以及20MP超广角摄像头等组合，拍照性能非常出色。'}}]\\\\nThought: I now know the final answer\\\\nFinal Answer: 小米11 Ultra 5G手机配备了1亿像素的主摄像头，还有120X超长焦电影摄像头，以及20MP超广角摄像头等组合，拍照性能非常出色。如果您还有其他问题或需求，请随时告诉我。\\\"\\n\\t}]\\n}\\n```\\n\\nThe specific format of the system field in the Agent dataset is as follows (convert the \\\\\\\\\\\" character to \\\" and \\\\n to newline):\\n\\n```text\\nAnswer the following questions as best you can. You have access to the following APIs:\\n1. hm_recipe_recommend: Call this tool to interact with the hmreciperecommend API. What is the hmreciperecommend API useful for? . Parameters: [{\\\"name\\\": \\\"keywords_dict\\\", \\\"description\\\": \\\"盒马推荐菜谱关键词字典。\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n2. hm_product_marketing: Call this tool to interact with the hmproductmarketing API. What is the hmproductmarketing API useful for? . Parameters: [{\\\"name\\\": \\\"sku_code_list\\\", \\\"description\\\": \\\"盒马商品的编码列表\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n3. hm_product_info: Call this tool to interact with the hmproductinfo API. What is the hmproductinfo API useful for? . Parameters: [{\\\"name\\\": \\\"sku_code_list\\\", \\\"description\\\": \\\"盒马商品的编码列表\\\", \\\"required\\\": \\\"True\\\"}, {\\\"name\\\": \\\"sku_name_list\\\", \\\"description\\\": \\\"盒马商品的名称列表\\\", \\\"required\\\": \\\"True\\\"}, {\\\"name\\\": \\\"property_list\\\", \\\"description\\\": \\\"盒马商品的属性列表\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n4. hm_product_recommend: Call this tool to interact with the hmproductrecommend API. What is the hmproductrecommend API useful for? . Parameters: [{\\\"name\\\": \\\"keywords_dict\\\", \\\"description\\\": \\\"盒马推荐商品关键词字典。\\\", \\\"required\\\": \\\"True\\\"}]\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[hm_recipe_recommend, hm_product_marketing, hm_product_info, hm_product_recommend]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\n```\\n\\nAPI format:\\n\\n```text\\nAnswer the following questions as best you can. You have access to the following APIs:\\nNumber: API Name: API Function API Parameters\\n\\n...\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[API Name List]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\n```\\n\\nThe structure of the response of calling API in the Agent dataset is as follows:\\n\\n```text\\nAction: hm_product_recommend\\nAction Input: {'keywords_dict': {'商品类目': '手机', '适用场景': '拍照'}}\\nObservation: [{'sku_code': '15956662254', 'product_name': '小米11 Ultra 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '5999', 'product_description': '拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统'}, {'sku_code': '19424216918', 'product_name': 'vivo X60 Pro 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '4498', 'product_description': '搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足'}, {'sku_code': '14347982715', 'product_name': 'OPPO Ace2 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '3999', 'product_description': '拍照实力十足，支持65W超级闪充'}]\\nThought: I now know the final answer\\nFinal Answer: 如果您想要一款拍照表现出色的手机，我为您推荐以下几款产品：1.小米11 Ultra 5G手机 256GB：价格为5999元，配备了高品质相机系统，可以拍摄出色的照片；2. vivo X60 Pro 5G手机 256GB：售价为4498元，相机系统由ZEISS联合调校，拍照实力十足；3. OPPO Ace2 5G手机 256GB：价格为3999元，不仅拍照实力十足，还支持65W超级闪充，让你的手机充电更加便捷。这些手机都有不同的特点和功能，您可以根据自己的需求进行选择。如果您还有其他问题或需求，请随时告诉我。\\n```\\n\\n- Action: The actual API name called\\n- Action Input: The actual input parameters\\n- Observation: This part is the actual calling result, which does not participate in the loss during training, and needs to be filled into the model after external calling during inference\\n- Thought: Model's thinking output\\n- Final Answer: Model's final answer\\n\\n## Fine-tuning\\n\\nIn Agent training, in order to avoid severe knowledge forgetting after training, our data ratio is [ms-agent](https://www.modelscope.cn/datasets/iic/ms_agent/summary):[ms-bench](https://www.modelscope.cn/datasets/iic/ms_bench/summary) dataset is 1:2, among which ms_agent has a total of 30,000, and 60,000 are randomly sampled from the ms_bench dataset. At the same time, in order to change the model's perception, 3,000 self-recognition data are added.\\n\\n| Dataset | Number of Samples |\\n| -------- | -------- |\\n| ms-agent | 30000 (full dataset) |\\n| ms-bench | 60000 (sampled) |\\n| self-recognition | 3000 (repeatedly sampled) |\\n\\nWe also support using your own Agent dataset. The dataset format needs to meet the requirements of [custom dataset](https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E9%9B%86). More specifically, the Agent's response/system should conform to the above Action/Action Input/Observation format.\\n\\nWe added **MLP** and **Embedder** to lora_target_modules. You can add lora to all linear layers (including qkvo, mlp and embedder) by specifying `--lora_target_modules ALL`. This **usually gives the best effect**.\\n\\nThe fine-tuning used the qwen-7b-chat model, with the following hyperparameters:\\n\\n| Hyperparameter | Value |\\n| -------- | -------- |\\n| LR | 5e-5 |\\n| Epoch | 2 |\\n| lora_rank | 8 |\\n| lora_alpha | 32 |\\n| lora_target_modules | ALL |\\n| batch_size | 2 |\\n| gradient_accumulation_steps | 32 total |\\n\\nThe running command and other hyperparameters are as follows:\\n\\n```shell\\n# Experimental environment: 8GPU\\nnproc_per_node=8\\n\\nPYTHONPATH=../../.. \\\\\\ntorchrun \\\\\\n    --nproc_per_node=$nproc_per_node \\\\\\n    --master_port 29500 \\\\\\n    llm_sft.py \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --model_revision master \\\\\\n    --sft_type lora \\\\\\n    --tuner_backend peft \\\\\\n    --dtype AUTO \\\\\\n    --output_dir output \\\\\\n    --dataset ms-agent \\\\\\n    --train_dataset_mix_ratio 2.0 \\\\\\n    --train_dataset_sample -1 \\\\\\n    --num_train_epochs 2 \\\\\\n    --max_length 1500 \\\\\\n    --check_dataset_strategy warning \\\\\\n    --lora_rank 8 \\\\\\n    --lora_alpha 32 \\\\\\n    --lora_dropout 0.05 \\\\\\n    --lora_target_modules ALL \\\\\\n    --self_cognition_sample 3000 \\\\\\n    --model_name 卡卡罗特 \\\\\\n    --model_author 陶白白 \\\\\\n    --gradient_checkpointing true \\\\\\n    --batch_size 2 \\\\\\n    --weight_decay 0.01 \\\\\\n    --learning_rate 5e-5 \\\\\\n    --gradient_accumulation_steps $(expr 32 / $nproc_per_node) \\\\\\n    --max_grad_norm 0.5 \\\\\\n    --warmup_ratio 0.03 \\\\\\n    --eval_steps 100 \\\\\\n    --save_steps 100 \\\\\\n    --save_total_limit 2 \\\\\\n    --logging_steps 10\\n```\\n\\nIn the official experiment, the training process used an 8-GPU hardware environment, with **training time of 3 hours**.\\n\\n> [!NOTE]\\n>\\n> 1. This training can also run on a consumer-grade single GPU (corresponding to **22G of video memory occupied**), users can change the DDP command to a single-card command.\\n>\\n> 2. The forgetting problem of LoRA training is not serious, the proportion of the ms-bench dataset can be appropriately lowered to improve training speed.\\n\\n## Inference\\n\\nWe evaluate general knowledge and Agent. A simple evaluation result is listed below.\\n\\n### Original Model\\n\\n#### General Knowledge\\n\\n> How to make West Lake vinegar fish\\n\\n![image-20240201122323540](../../resources/image-20240201122323540.png)\\n\\n> What is the difference between COVID-19 and the common cold\\n\\n![image-20240201122441874](../../resources/image-20240201122441874.png)\\n\\n#### Agent Capability\\n\\nWe use a fire alarm scenario as a test case:\\n\\n```text\\nAnswer the following questions as best you can. You have access to the following APIs:\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\n\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\n\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\n```\\n\\n![image-20240201122625473](../../resources/image-20240201122625473.png)\\n\\n![image-20240201122725477](../../resources/image-20240201122725477.png)\\n\\n![image-20240201131811038](../../resources/image-20240201131811038.png)\\n\\nIt can be seen that after manually inputting the Observation, the model's answer is not correct.\\n\\n### After Training\\n\\n#### General Knowledge\\n\\n> How to make West Lake vinegar fish\\n\\n![image-20240201132124061](../../resources/image-20240201132124061.png)\\n\\n![image-20240201132139698](../../resources/image-20240201132139698.png)\\n\\n> What is the difference between COVID-19 and the common cold\\n>\\n![image-20240201132308260](../../resources/image-20240201132308260.png)\\n\\n#### Agent Capability\\n\\n![image-20240201132421298](../../resources/image-20240201132421298.png)\\n\\n![image-20240201132454465](../../resources/image-20240201132454465.png)\\n\\nIt can be seen that after training, the model can correctly call the API and give the final answer.\\n\\n#### Self-recognition\\n\\n![image-20240201133359457](../../resources/image-20240201133359457.png)\\n\\n### Using Agent in the Command Line\\n\\nCurrently, Agent inference support in the command line needs to specify `--eval_human true`, because when this parameter is false, it will read the dataset content, and the API calling results after `Observation:` cannot be manually input at this time.\\n\\n```shell\\n# Use the trained model\\nswift infer --ckpt_dir output/qwen-7b-chat/vx-xxx/checkpoint-xxx --eval_human true --stop_words Observation: --infer_backend pt\\n# The original model such as qwn-7b-chat or chatglm3-6b-32k can also be used to run agent\\n# swift infer --model_type qwen-7b-chat --eval_human true --stop_words Observation: --infer_backend pt\\n# swift infer --model_type chatglm3-6b-32k --eval_human true --stop_words Observation: --infer_backend pt\\n```\\n\\nAfter running the command, change the system field:\\n```shell\\n# Single line system\\n<<< reset-system\\n<<< Answer the following questions as best you can. You have access to the following APIs:\\\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\\\n\\\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\\\n\\\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\\\n\\\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\\\n\\\\nUse the following format:\\\\n\\\\nThought: you should always think about what to do\\\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\\\nAction Input: the input to the action\\\\nObservation: the result of the action\\\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\\\nThought: I now know the final answer\\\\nFinal Answer: the final answer to the original input question\\\\nBegin!\\n```\\n\\nIf you need to input in multiple lines, you can use the following command (multi-line information ends with #):\\n\\n```shell\\n# Multi-line system\\n<<< multi-line\\n<<<[M] reset-system#\\n<<<[MS] Answer the following questions as best you can. You have access to the following APIs:\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\n\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\n\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!#\\n```\\n\\nNext, you can perform Agent question-answering (note that when using multi-line mode input, add an extra **#** at the end of the line):\\n\\n```shell\\n<<< The input image is /tmp/1.jpg, please help determine if there are any fire points in the image\\nThought: I need to use the fire\\\\_recognition API to analyze the input image and determine if there are any signs of fire.\\n\\nAction: Use the fire\\\\_recognition API to analyze the input image.\\n\\nAction Input: /tmp/1.jpg\\n\\nObservation:\\n<<< [{'coordinate': [101.1, 200.9], 'on_fire': True}]\\nThought: The fire\\\\_recognition API has returned a result indicating that there is fire in the input image.\\n\\nFinal Answer: There is fire in the input image.\\n```\\n\\nAs you can see, the model has returned the API calling result analysis. The user can continue asking questions for multi-turn Agent scenarios. You can also specify `--infer_backend vllm` and `--stream true` to use vllm and streaming inference.\\n\\n### Using Agent in Deployment\\n\\nSince deployment does not support history management, the splicing of Agent's API calling results needs to be done by the user. Here is an example of OpenAI format runnable code.\\n\\nServer side:\\n```shell\\n# Use the trained model\\nswift deploy --ckpt_dir output/qwen-7b-chat/vx-xxx/checkpoint-xxx --stop_words Observation:\\n# The original model such as qwen-7b-chat or chatglm3-6b-32k can also be used to run agent\\n# swift deploy --model_type qwn-7b-chat --stop_words Observation:\\n# swift deploy --model_type chatglm3-6b-32k --stop_words Observation:\\n```\\n\\nClient side:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nsystem = \\\"\\\"\\\"Answer the following questions as best you can. You have access to the following APIs:\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"image\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"The input image to recognize fire\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\n\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\n\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\n\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\\"\\\"\\\"\\nmessages = [{\\n    'role': 'system',\\n    'content': system\\n}, {\\n    'role': 'user',\\n    'content': '输入图片是/tmp/1.jpg，协助判断图片中是否存在着火点'\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stop=['Observation:'],\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'response: {response}')\\n\\n# # Streaming\\nmessages.append({'role': 'assistant', 'content': response + \\\"\\\\n[{'coordinate': [101.1, 200.9], 'on_fire': True}]\\\"})\\nprint(messages)\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stop=['Observation:'],\\n    stream=True,\\n    seed=42)\\n\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n## Output:\\n# model_type: qwen-7b-chat\\n# response: Thought: I need to check if there is fire in the image\\n# Action: Use fire\\\\_recognition API\\n# Action Input: /tmp/1.jpg\\n# Observation:\\n# [{'role': 'system', 'content': 'Answer the following questions as best you can. You have access to the following APIs:\\\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\\\n\\\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building\\\\'s administraters. Parameters: []\\\\n\\\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\\\n\\\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\\\n\\\\nUse the following format:\\\\n\\\\nThought: you should always think about what to do\\\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\\\nAction Input: the input to the action\\\\nObservation: the result of the action\\\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\\\nThought: I now know the final answer\\\\nFinal Answer: the final answer to the original input question\\\\nBegin!'}, {'role': 'user', 'content': '输入图片是/tmp/1.jpg，协助判断图片中是否存在着火点'}, {'role': 'assistant', 'content': \\\"Thought: I need to check if there is fire in the image\\\\nAction: Use fire\\\\\\\\_recognition API\\\\nAction Input: /tmp/1.jpg\\\\nObservation:\\\\n[{'coordinate': [101.1, 200.9], 'on_fire': True}]\\\"}]\\n# response:\\n# Final Answer: There is fire in the image at coordinates [101.1, 200.9]\\n```\\n## Usage-with-Modelscope_Agent\\nIn conjunction with Modelscope-Agent(https://github.com/modelscope/modelscope-agent), fine-tune models for building Agents.\\n\\nThis section focuses on the interactive framework AgentFabric within Modelscope-Agent to fine-tune the small model qwen-7b-chat to enable function call capabilities.\\n\\nDue to the mismatch between the system prompt in ms-agent and that in Modelscope-Agent, direct training yields suboptimal results. To address this, we have created a new dataset [ms_agent_for_agentfabric](https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary) by converting the format from ms-agent, which is now integrated into SWIFT. The `ms-agent-for-agentfabric-default` includes 30,000 entries converted from ms-agent data, while `ms-agent-for-agentfabric-additional` contains 488 entries filtered from actual function call access data by the open-source AgentFabric framework.\\n\\n### Fine-tuning\\nReplace `dataset` with `ms-agent-for-agentfabric-default` and `ms-agent-for-agentfabric-addition`:\\n```shell\\n# Experimental environment: 8GPU\\nnproc_per_node=8\\n\\nPYTHONPATH=../../.. \\\\\\ntorchrun \\\\\\n    --nproc_per_node=$nproc_per_node \\\\\\n    --master_port 29500 \\\\\\n    llm_sft.py \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --model_revision master \\\\\\n    --sft_type lora \\\\\\n    --tuner_backend swift \\\\\\n    --dtype AUTO \\\\\\n    --output_dir output \\\\\\n    --dataset ms-agent-for-agentfabric-default ms-agent-for-agentfabric-addition \\\\\\n    --train_dataset_mix_ratio 2.0 \\\\\\n    --train_dataset_sample -1 \\\\\\n    --num_train_epochs 2 \\\\\\n    --max_length 1500 \\\\\\n    --check_dataset_strategy warning \\\\\\n    --lora_rank 8 \\\\\\n    --lora_alpha 32 \\\\\\n    --lora_dropout 0.05 \\\\\\n    --lora_target_modules ALL \\\\\\n    --self_cognition_sample 3000 \\\\\\n    --model_name 卡卡罗特 \\\\\\n    --model_author 陶白白 \\\\\\n    --gradient_checkpointing true \\\\\\n    --batch_size 2 \\\\\\n    --weight_decay 0.1 \\\\\\n    --learning_rate 5e-5 \\\\\\n    --gradient_accumulation_steps $(expr 32 / $nproc_per_node) \\\\\\n    --max_grad_norm 0.5 \\\\\\n    --warmup_ratio 0.03 \\\\\\n    --eval_steps 100 \\\\\\n    --save_steps 100 \\\\\\n    --save_total_limit 2 \\\\\\n    --logging_steps 10\\n```\\n\\nmerge lora\\n```\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir '/path/to/qwen-7b-chat/vx-xxx/checkpoint-xxx' --merge_lora true\\n```\\n### AgentFabric\\n#### Environment Setup:\\n```bash\\ngit clone https://github.com/modelscope/modelscope-agent.git\\ncd modelscope-agent  && pip install -r requirements.txt && pip install -r apps/agentfabric/requirements.txt\\n```\\n\\n#### Model Deployment\\nLaunch vllm service:\\nUse any of the following methods to deploy the model.\\n\\n##### swift deploy\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir /path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged\\n```\\n\\n##### vllm\\n```bash\\npython -m vllm.entrypoints.openai.api_server --model /path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged --trust-remote-code\\n```\\n\\n#### Adding Local Model Configuration\\n\\nIn /path/to/modelscope-agent/apps/agentfabric/config/model_config.json, add the merged local model:\\n```\\n    \\\"my-qwen-7b-chat\\\": {\\n        \\\"type\\\": \\\"openai\\\",\\n        \\\"model\\\": \\\"/path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged\\\",\\n        \\\"api_base\\\": \\\"http://localhost:8000/v1\\\",\\n        \\\"is_chat\\\": true,\\n        \\\"is_function_call\\\": false,\\n        \\\"support_stream\\\": false\\n    }\\n```\\nNote that if deploying with `swift deploy`, the value of `model` should be set to `qwen-7b-chat`.\\n\\n#### Launching AgentFabric\\nIn the following practice, [Wanx Image Generation](https://help.aliyun.com/zh/dashscope/opening-service?spm=a2c4g.11186623.0.0.50724937O7n40B) and [Amap Weather]((https://lbs.amap.com/api/webservice/guide/create-project/get-key)) will be called, requiring manual setting of API KEY. After setting, start AgentFabric:\\n```bash\\nexport PYTHONPATH=$PYTHONPATH:/path/to/your/modelscope-agent\\nexport DASHSCOPE_API_KEY=your_api_key\\nexport AMAP_TOKEN=your_api_key\\ncd modelscope-agent/apps/agentfabric\\npython app.py\\n```\\nAfter entering Agentfabric, select the local model my-qwen-7b-chat in the Configured models.\\n\\nChoose the APIs that the agent can call, select Wanx Image Generation and Amap Weather here.\\n\\nClick Update Configuration, wait for the configuration to complete, and interact with the Agent in the input box on the right.\\n\\n> Weather Inquiry\\n![agentfabric_1](../../resources/agentfabric_1.png)\\n![agentfabric_2](../../resources/agentfabric_2.png)\\n\\n> text2image\\n![agentfabric_3](../../resources/agentfabric_3.png)\\n![agentfabric_4](../../resources/agentfabric_4.png)\\n\\nIt can be seen that the fine-tuned model can correctly understand instructions and call tools.\\n## Summary\\n\\nThrough the Agent training capability supported by SWIFT, we fine-tuned the qwen-7b-chat model using ms-agent and ms-bench. It can be seen that after fine-tuning, the model retains the general knowledge question-answering ability, and when the system field is added with APIs, it can correctly call and complete tasks. It should be noted that:\\n\\n1. When training changes from LoRA to full-parameter training, the knowledge forgetting problem will become more serious, and the dataset mixing ratio needs to be actually tested and adjusted.\\n2. Some models may still have poor calling effects after training, and it can be tested whether the model's own pre-training ability is solid.\\n3. After the Agent training set format and language have detailed changes, the format of the corresponding inference stage also needs to be adjusted accordingly, otherwise the effect may be poor.\\n4. Special characters such as `\\\\n` in important positions are relatively important, please pay attention to the consistency of inference and training formats.\\n\\n\\n# NPU Best Practice\\nAuthors: [chuanzhubin](https://github.com/chuanzhubin), [jintao](https://github.com/Jintao-Huang)\\n\\n## Table of Contents\\n- [Environment Preparation](#Environment-Preparation)\\n- [Fine-tuning](#Fine-tuning)\\n- [Inference](#Inference)\\n\\n## Environment Preparation\\n\\nExperimental environment: 8 * Ascend 910B3 (The device is provided by [@chuanzhubin](https://github.com/chuanzhubin), thanks for the support to modelscope and swift ~)\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\npip install torch-npu decorator\\npip install deepspeed\\n\\n# Align environment (usually not necessary to run. If you encounter errors, you can run the following code, the repository is tested with the latest environment)\\npip install -r requirements/framework.txt -U\\npip install -r requirements/llm.txt -U\\n```\\n\\nVerify the installation of the testing environment:\\n```python\\nfrom transformers.utils import is_torch_npu_available\\nimport torch\\n\\nprint(is_torch_npu_available())  # True\\nprint(torch.npu.device_count())  # 8\\nprint(torch.randn(10, device='npu:0'))\\n```\\n\\n## Fine-tuning\\nThe following introduces the fine-tuning of LoRA. Set the parameter `--sft_type full` for full parameter fine-tuning.\\n\\n\\n### Single Card Training\\n\\nStart single card fine-tuning with the following command:\\n\\n```shell\\n# Experimental Environment: Ascend 910B3\\n# GPU Memory Requirement: 25GB\\n# Runtime: 8 hours\\nASCEND_RT_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n\\n### Training with DDP\\n\\n```shell\\n# Experimental Environment: 4 * Ascend 910B3\\n# GPU Memory Requirement: 4 * 30GB\\n# Runtime: 2 hours\\nNPROC_PER_NODE=4 \\\\\\nASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n\\n### Training with DeepSpeed\\n\\nZeRO2:\\n```shell\\n# Experimental Environment: 4 * Ascend 910B3\\n# GPU Memory Requirement: 4 * 28GB\\n# Runtime: 3.5 hours\\nNPROC_PER_NODE=4 \\\\\\nASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero2 \\\\\\n```\\n\\nZeRO3:\\n```shell\\n# Experimental Environment: 4 * Ascend 910B3\\n# GPU Memory Requirement: 4 * 25GB\\n# Runtime: 8.5 hours\\nNPROC_PER_NODE=4 \\\\\\nASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\n\\n## Inference\\n\\nOriginal Model:\\n```shell\\nASCEND_RT_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n```\\n\\nAfter LoRA Fine-tuning:\\n```shell\\nASCEND_RT_VISIBLE_DEVICES=0 swift infer --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true\\n```\\n\\n\\n# HuggingFace Eco-compatibility\\nBy default, we use models and datasets from [ModelScope](https://modelscope.cn/my/overview) for fine-tuning and inference. However, considering that overseas users are more familiar with the [HuggingFace](https://huggingface.co/) ecosystem, we have made it compatible with HuggingFace.\\n\\nTo enable HuggingFace compatibility, you need to set the environment variable `USE_HF=1`. Supported HuggingFace models and datasets can be found in the [Supported Models and Datasets](../Instruction/Supported-models-datasets.md). Note that some datasets are only supported in the ModelScope environment.\\n\\nHere is an example inference script for qwen1.5-7b-chat:\\n```shell\\n# Experimental Environment: A10, 3090, V100\\nUSE_HF=1 CUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n```\\n\\nFine-tuning script:\\n```shell\\n# Experimental Environment: 2 * A100\\n# GPU Memory Requirement: 2 * 30GB\\nUSE_HF=1 \\\\\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\nPlease refer to other documents for inference after fine-tuning, and deployment .\\n\\n\\n# Benchmark\\n## Table of Contents\\n- [Parameter Settings](#parameter-settings)\\n- [Quantization](#quantization)\\n- [Model Type & Max Length](#model-type--max-length)\\n- [Batch Size](#batch-size)\\n- [Use Flash Attn & Gradient Checkpointing](#use-flash-attn--gradient-checkpointing)\\n- [LoRA Rank & LoRA Target Modules](#lora-rank--lora-target-modules)\\n- [Gradient Accumulation Steps](#gradient-accumulation-steps)\\n- [Tuners](#Tuners)\\n- [Export](#Export)\\n- [AWQ](#AWQ)\\n- [AQLM](#AQLM)\\n- [Sequence Parallel](#Sequence-Parallel)\\n\\n## Parameter Settings\\nExperimental environment:\\n- A100\\n- CUDA 11.8\\n- python 3.10\\n- torch 2.1.1\\n- flash_attn 2.3.4\\n- xformers 0.0.23\\n- auto_gptq 0.5.1\\n- bitsandbytes 0.41.3.post2\\n\\n\\nThe following are the same command line settings for all experiments:\\n```bash\\n    --dataset_test_ratio 0 \\\\\\n    --dataset cls-fudan-news-zh \\\\\\n    --save_strategy no \\\\\\n    --check_dataset_strategy warning \\\\\\n    --preprocess_num_proc 4 \\\\\\n```\\n\\nIf the following parameters are not specified, the following default values are used:\\n```bash\\n    --max_length 2048 \\\\\\n    --batch_size 1 \\\\\\n    --gradient_checkpointing true \\\\\\n    --use_flash_attn true \\\\\\n    --lora_rank 8 \\\\\\n    --lora_target_modules DEFAULT \\\\\\n    --quantization_bit 0 \\\\\\n    --gradient_accumulation_steps 16 \\\\\\n```\\n\\nToken statistics of the corresponding test dataset (obtained by qwen's tokenizer): 3234.4±2547.5, min=91, max=19548.\\n\\nThe experimental script can be found in `scripts/benchmark/test_memory_time/`.\\n\\n## Quantization\\nThe test script is:\\n```bash\\nswift sft \\\\\\n    --model_type {MODEL_TYPE} \\\\\\n    --quantization_bit {QUANTIZATION_BIT} \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Quantization</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>bf16</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (gptq)</td>\\n        <td>2.05</td>\\n        <td>19.21</td>\\n    </tr>\\n    <tr>\\n        <td>int8 (gptq)</td>\\n        <td>1.97</td>\\n        <td>22.20</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (bnb)</td>\\n        <td>2.41</td>\\n        <td>23.85</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-14b-chat</td>\\n        <td>bf16</td>\\n        <td>2.60</td>\\n        <td>40.14</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (gptq)</td>\\n        <td>1.15</td>\\n        <td>23.30</td>\\n    </tr>\\n    <tr>\\n        <td>int8 (gptq)</td>\\n        <td>1.08</td>\\n        <td>29.13</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (bnb)</td>\\n        <td>1.36</td>\\n        <td>30.05</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-72b-chat</td>\\n        <td>bf16</td>\\n        <td>0.59 (2*A100)</td>\\n        <td>73.71+78.54</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (gptq)</td>\\n        <td>0.23</td>\\n        <td>54.86</td>\\n    </tr>\\n    <tr>\\n        <td>int8 (gptq)</td>\\n        <td>0.21</td>\\n        <td>78.44</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (bnb)</td>\\n        <td>0.28</td>\\n        <td>74.87</td>\\n    </tr>\\n</table>\\n\\n## Model Type & Max Length\\n### LoRA\\nThe test script is:\\n```bash\\nswift sft \\\\\\n    --model_type {MODEL_TYPE} \\\\\\n    --max_length {MAX_LENGTH} \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Max Length</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-1_8b-chat</td>\\n        <td>512</td>\\n        <td>9.88</td>\\n        <td>6.99</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>9.90</td>\\n        <td>10.71</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>8.77</td>\\n        <td>16.35</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>5.92</td>\\n        <td>23.80</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>4.19</td>\\n        <td>37.03</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-7b-chat</td>\\n        <td>512</td>\\n        <td>7.43</td>\\n        <td>18.01</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>6.51</td>\\n        <td>21.73</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>2.05</td>\\n        <td>35.31</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.34</td>\\n        <td>48.41</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-14b-chat</td>\\n        <td>512</td>\\n        <td>5.63</td>\\n        <td>30.14</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>4.36</td>\\n        <td>34.43</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>2.60</td>\\n        <td>40.14</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.17</td>\\n        <td>47.95</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.79</td>\\n        <td>60.74</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-72b-chat (2*A100)</td>\\n        <td>512</td>\\n        <td>1.41</td>\\n        <td>67.68+73.07</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>1.02</td>\\n        <td>70.25+77.11</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>0.59</td>\\n        <td>73.71+78.54</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>-</td>\\n        <td>OOM</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>-</td>\\n        <td>OOM</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">chatglm3-6b</td>\\n        <td>512</td>\\n        <td>6.72</td>\\n        <td>13.94</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>6.16</td>\\n        <td>12.99</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>4.20</td>\\n        <td>17.20</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.92</td>\\n        <td>29.80</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.24</td>\\n        <td>66.82</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">yi-6b-chat</td>\\n        <td>512</td>\\n        <td>5.27</td>\\n        <td>13.72</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>5.07</td>\\n        <td>15.44</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.84</td>\\n        <td>16.95</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.99</td>\\n        <td>28.25</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.35</td>\\n        <td>43.81</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">yi-34b-chat</td>\\n        <td>512</td>\\n        <td>2.32</td>\\n        <td>66.72</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>1.76</td>\\n        <td>69.10</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>1.05</td>\\n        <td>71.34</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>0.47</td>\\n        <td>78.72</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.31 (2*A100)</td>\\n        <td>47.01+65.03</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">openbuddy-zephyr-7b-chat</td>\\n        <td>512</td>\\n        <td>5.17</td>\\n        <td>14.99</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>3.92</td>\\n        <td>16.57</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.08</td>\\n        <td>19.89</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.85</td>\\n        <td>23.29</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.92</td>\\n        <td>52.14</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">baichuan2-7b-chat</td>\\n        <td>512</td>\\n        <td>6.09</td>\\n        <td>18.18</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>5.36</td>\\n        <td>17.45</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.43</td>\\n        <td>19.18</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.69</td>\\n        <td>34.22</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.16</td>\\n        <td>45.47</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">baichuan2-13b-chat</td>\\n        <td>512</td>\\n        <td>5.32</td>\\n        <td>31.01</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>3.91</td>\\n        <td>31.58</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>1.77</td>\\n        <td>32.40</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>0.65</td>\\n        <td>49.63</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.36</td>\\n        <td>76.17</td>\\n    </tr>\\n</table>\\n\\n### Full\\nThe test script is:\\n```bash\\nswift sft \\\\\\n    --model_type {MODEL_TYPE} \\\\\\n    --max_length {MAX_LENGTH} \\\\\\n    --sft_type full \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [FULL]</td>\\n        <td>Max Length</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-1_8b-chat</td>\\n        <td>512</td>\\n        <td>10.77</td>\\n        <td>18.16</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>10.39</td>\\n        <td>18.62</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>8.73</td>\\n        <td>35.11</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>5.45</td>\\n        <td>31.62</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>3.81</td>\\n        <td>38.93</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-7b-chat</td>\\n        <td>512</td>\\n        <td>5.96</td>\\n        <td>73.37</td>\\n    </tr>\\n    <tr>\\n<td>1024</td>\\n        <td>5.00</td>\\n        <td>73.64</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.30</td>\\n        <td>74.26</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.64</td>\\n        <td>78.76</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.11 (2*A100)</td>\\n        <td>61.34+73.00</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-14b-chat (2*A100)</td>\\n        <td>512</td>\\n        <td>3.66</td>\\n        <td>60.42+72.31</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>2.98</td>\\n        <td>60.61+74.37</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>1.93</td>\\n        <td>60.70+78.22</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>0.92</td>\\n        <td>75.59+78.64</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.62</td>\\n        <td>76.59+77.68</td>\\n    </tr>\\n</table>\\n\\n\\n## Batch Size\\nThe test script is:\\n```bash\\nswift sft \\\\\\n    --batch_size {BATCH_SIZE} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Batch Size</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>1</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>2</td>\\n        <td>3.60</td>\\n        <td>43.11</td>\\n    </tr>\\n    <tr>\\n        <td>4</td>\\n        <td>3.02</td>\\n        <td>63.81</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>2.77</td>\\n        <td>76.14</td>\\n    </tr>\\n</table>\\n\\n## Use Flash Attn & Gradient Checkpointing\\nThe test script is:\\n```bash\\nswift sft \\\\\\n    --use_flash_attn {USE_FLASH_ATTN} \\\\\\n    --gradient_checkpointing {GRADIENT_CHECKPOINTING} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n     <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Use Flash Attn</td>\\n        <td>Gradient Checkpointing</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>&#x2714;</td>\\n        <td>&#x2714;</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>&#x2714;</td>\\n        <td>&#x2718;</td>\\n        <td>6.19</td>\\n        <td>37.70</td>\\n    </tr>\\n    <tr>\\n        <td>&#x2718;</td>\\n        <td>&#x2714;</td>\\n        <td>3.13</td>\\n        <td>27.71</td>\\n    </tr>\\n    <tr>\\n        <td>&#x2718;</td>\\n        <td>&#x2718;</td>\\n        <td>4.45</td>\\n        <td>57.67</td>\\n    </tr>\\n</table>\\n\\n\\n## LoRA Rank & LoRA Target Modules\\nThe test script is:\\n```bash\\nswift sft \\\\\\n    --lora_rank {LORA_RANK} \\\\\\n    --lora_target_modules {LORA_TARGET_MODULES} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>LoRA Rank</td>\\n        <td>LoRA Target Modules</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n        <td>Trainable Params (M)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>2</td>\\n        <td>DEFAULT (c_attn)</td>\\n        <td>4.27</td>\\n        <td>27.72</td>\\n        <td>1.05</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>DEFAULT</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n        <td>4.19</td>\\n    </tr>\\n    <tr>\\n        <td>64</td>\\n        <td>DEFAULT</td>\\n        <td>4.19</td>\\n        <td>27.85</td>\\n        <td>33.55</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>ALL (all linear)</td>\\n        <td>3.22</td>\\n        <td>27.87</td>\\n        <td>17.89</td>\\n    </tr>\\n</table>\\n\\n\\n## Gradient Accumulation Steps\\nThe test script is:\\n```bash\\nswift sft \\\\\\n    --gradient_accumulation_steps {GRADIENT_ACCUMULATION_STEPS} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Gradient Accumulation Steps</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"7\\\">qwen-7b-chat</td>\\n        <td>1</td>\\n        <td>4.26</td>\\n        <td>27.73</td>\\n    </tr>\\n    <tr>\\n        <td>2</td>\\n        <td>4.32</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>4</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>4.32</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>16</td>\\n        <td>4.33</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>32</td>\\n        <td>4.30</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>64</td>\\n        <td>4.32</td>\\n        <td>27.74</td>\\n    </tr>\\n</table>\\n\\n## Tuners\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|adalora|qwen-7b-chat|ms-agent|2.0|adalora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|26.8389(0.3464%)|True|True|lr=5e-05/epoch=2|32.55GiB|0.92(87543 samples/95338.71 seconds)|17.33(2345 tokens/135.29 seconds)|0.57|1.07|0.391|0.665|0.569|\\n|adapter|qwen-7b-chat|ms-agent|2.0|adapter||33.6896(0.4344%)|True|True|lr=5e-05/epoch=2|32.19GiB|1.48(87543 samples/59067.71 seconds)|26.63(4019 tokens/150.90 seconds)|0.55|1.03|0.438|0.662|0.565|\\n|dora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=True|19.2512(0.2487%)|True|True|lr=5e-05/epoch=2|32.46GiB|0.51(87543 samples/171110.54 seconds)|4.29(2413 tokens/562.32 seconds)|0.53|1.01|0.466|0.683|**0.577**|\\n|full+galore128|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.02GiB|1.10(87543 samples/79481.96 seconds)|28.96(2400 tokens/82.88 seconds)|0.55|1.00|0.358|**0.688**|**0.577**|\\n|full+galore32|qwen-7b-chat|ms-agent|2.0|full|galore_rank=32/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.05GiB|1.11(87543 samples/78989.74 seconds)|29.17(2431 tokens/83.35 seconds)|0.56|1.01|0.386|0.667|0.539|\\n|full+galore64|qwen-7b-chat|ms-agent|2.0|full|galore_rank=64/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|46.91GiB|1.11(87543 samples/79200.36 seconds)|28.94(2448 tokens/84.60 seconds)|0.56|1.01|0.397|0.674|0.544|\\n|full+galore_emb|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=true|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|44.53GiB|1.10(87543 samples/79775.02 seconds)|29.45(2433 tokens/82.62 seconds)|0.55|1.00|0.398|0.670|0.568|\\n|full+galore_perparam|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=true/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.02GiB|1.25(87543 samples/69821.89 seconds)|29.02(2478 tokens/85.39 seconds)|0.54|1.00|0.372|0.669|0.524|\\n|full+galore128+quantize+proj_quant|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|41.53GiB|1.45(76982 samples/52947.54 seconds)||0.54|1.00||||\\n|full+galore128+quantize|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|41.72GiB|1.46(76982 samples/52583.22 seconds)||0.54|1.00||||\\n|full+no_mix|qwen-7b-chat|ms-agent|0.0|full||7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|72.56GiB|1.27(29698 samples/23356.97 seconds)|30.31(11738 tokens/387.29 seconds)|0.57|**0.44**|0.174|0.652|0.553|\\n|full|qwen-7b-chat|ms-agent|2.0|full||7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|73.53GiB|1.43(87543 samples/61022.97 seconds)|29.51(3382 tokens/114.62 seconds)|0.54|0.95|0.343|0.536|0.495|\\n|llamapro|qwen-7b-chat|ms-agent|2.0|llamapro|num_blocks=4|809.5826(9.4900%)|True|True|lr=5e-05/epoch=2|38.11GiB|1.53(87543 samples/57294.42 seconds)|25.80(2374 tokens/92.02 seconds)|0.53|1.00|0.434|0.645|0.357|\\n|lora+|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=16.0/use_rslora=False/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.95(87543 samples/91923.80 seconds)|18.81(3329 tokens/176.94 seconds)|0.53|0.98|0.432|0.647|0.344|\\n|lora+neftune|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/neftune_noise_alpha=15.0|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.96(87543 samples/91525.50 seconds)|19.84(161792 tokens/8156.02 seconds)|0.53|1.02|0.456|0.671|0.401|\\n|lora+no_mix|qwen-7b-chat|ms-agent|0.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|30.86GiB|0.91(29698 samples/32570.15 seconds)|19.89(36308 tokens/1825.26 seconds)|0.53|0.53|0.470|0.666|0.574|\\n|lora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.95(87543 samples/91974.29 seconds)|18.11(2415 tokens/133.32 seconds)|0.53|1.01|0.462|0.676|0.304|\\n|qwen-7b-chat-eval|qwen-7b-chat|None|0.0|None||None(None)||||None||30.81(13765 tokens/446.83 seconds)|||**0.517**|0.679|0.568|\\n|rslora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=True/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.94(87543 samples/92758.63 seconds)|18.87(2762 tokens/146.34 seconds)|**0.53**|0.99|0.451|0.679|0.339|\\n| full+lisa_2          | qwen-7b-chat | ms-agent | 2.0                | full     | lisa_activated_layers=2/lisa_step_interval=20                | -                    | True       | True                   | lr=5e-05/epoch=2 | 31.11GiB | 2.66(76837 samples/28881.28 seconds)  | 36.10(134469 tokens/3725.21 seconds) | 0.62       | 1.06      | 0.349              | 0.653            | 0.592              |\\n| full+lisa_4          | qwen-7b-chat | ms-agent | 2.0                | full     | lisa_activated_layers=4/lisa_step_interval=20                | -                    | True       | True                   | lr=5e-05/epoch=2 | 31.87GiB | 2.63(76837 samples/29215.15 seconds)  | 36.75(135477 tokens/3686.17 seconds) | 0.63       | 1.06      | 0.377              | 0.656            | **0.607**          |\\n|lora+packing+ddp|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/packing=True|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|35.65GiB*2|1.56(7900 samples/5057.30 seconds)|26.20(421094 tokens/16073.09 seconds)|0.63|0.98|0.473|0.664|0.552|\\n|lora+packing+lazytokenize|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/packing=True|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.83GiB|7.69(78237 samples/10179.40 seconds)|25.86(307390 tokens/11888.17 seconds)|0.63|1.04|0.472|0.660|0.554|\\n|lora+packing|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/packing=True|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|28.06GiB|0.79(7900 samples/10048.53 seconds)|26.12(409507 tokens/15675.36 seconds)|0.61|0.95|0.492|0.676|0.539|\\n\\n## unsloth\\n\\n| exp_name        | model_type         | dataset  | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers           | memory   | train speed(samples/s)               | infer speed(tokens/s)                 | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| --------------- | ------------------ | -------- | ------------------ | ----- | ------------ | ------------------- | ---------- | ---------------------- | ---------------- | -------- | ------------------------------------ | ------------------------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n| unsloth+lora+q4 | llama3-8b-instruct | ms-agent | 2.0                | lora  |              | 4.7186(0.1038%)     | True       | True                   | lr=5e-05/epoch=2 | 21.69GiB | 1.76(76839 samples/43763.01 seconds) | 15.22(160885 tokens/10570.90 seconds) | 0.58       | 1.03      | 0.668              | 0.755            | 0.501              |\\n\\n## Export\\n\\n| exp_name | model_type | calibration dataset | quantization method | quantization bits | infer speed(tokens/s) | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------------------- | ------------------- | ----------------- | --------------------- | ------------------ | ---------------- | ------------------ |\\n|awq-ms-bench-mini|qwen-7b-chat|ms-bench-mini|awq|4|27.25(16501 tokens/605.47 seconds)|0.494|0.665|0.571|\\n|awq-pileval|qwen-7b-chat|pileval|awq|4|26.92(12994 tokens/482.72 seconds)|**0.497**|**0.675**|**0.577**|\\n|gptq-ms-bench-mini|qwen-7b-chat|ms-bench-mini|gptq|4|31.16(15349 tokens/492.54 seconds)|0.482|0.642|0.556|\\n|gptq-pileval|qwen-7b-chat|pileval|gptq|4|31.67(15185 tokens/479.54 seconds)|0.478|0.654|0.559|\\n\\n## AWQ\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|qwen1half-7b-chat-awq|qwen1half-7b-chat-awq|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|19.9885(1.5802%)|True|True|lr=5e-05/epoch=2|24.26GiB|0.45(87543 samples/194746.58 seconds)|16.08(2469 tokens/153.58 seconds)|**0.55**|**1.19**|**0.505**|**0.737**|**0.656**|\\n\\n## AQLM\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|llama2-7b-aqlm-2bit-1x16|llama2-7b-aqlm-2bit-1x16|dureader-robust-zh|0.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|19.9885(1.6510%)|True|True|lr=5e-05/epoch=2|4.04GiB|0.17(14994 samples/86140.71 seconds)||**0.48**|**0.74**||||\\n\\n## Sequence Parallel\\n\\n<table>\\n\\n<tr>\\n<td>Model</td>\\n<td>Dataset</td>\\n<td>Hyper params</td>\\n<td>Total steps</td>\\n<td>Train speed</td>\\n<td>Gpu memory</td>\\n</tr>\\n\\n<tr>\\n<td rowspan=\\\"4\\\">chatglm3-6b-32k</td>\\n<td rowspan=\\\"4\\\">long-alpaca-12k(8055 tokens * 12000 rows)</td>\\n<td>gpu=2/sequence_parallel_size=1(2 GPU DDP baseline)</td>\\n<td>5940</td>\\n<td>0.30iter/s(5h13min total)</td>\\n<td>27G*2</td>\\n</tr>\\n\\n\\n<tr>\\n<td>gpu=2/sequence_parallel_size=2(2 GPU with sequence parallel 2)</td>\\n<td>11880</td>\\n<td>0.5iter/s(6h total)</td>\\n<td>20G*2</td>\\n</tr>\\n\\n<tr>\\n<td>gpu=4/sequence_parallel_size=4(4 GPU with sequence parallel 4)</td>\\n<td>11880</td>\\n<td>1iter/s(3h20min total)</td>\\n<td>18G*4</td>\\n</tr>\\n\\n<tr>\\n<td>gpu=4/sequence_parallel_size=2(4 GPU sequence parallel 2)</td>\\n<td>5940</td>\\n<td>0.45iter/s(3h total)</td>\\n<td>21G*4</td>\\n</tr>\\n\\n</table>\\n\\n\\n# VLLM Inference Acceleration and Deployment\\nThe models supported by vllm can be found in [Supported Models](../Instruction/Supported-models-datasets.md#Models).\\n\\nYou can check the best practices for inference acceleration and deployment of Llama 3.1 405b [here](https://github.com/modelscope/ms-swift/issues/1484).\\n\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Inference Acceleration](#inference-acceleration)\\n- [Web-UI Acceleration](#web-ui-acceleration)\\n- [Deployment](#deployment)\\n\\n## Environment Preparation\\nGPU devices: A10, 3090, V100, A100 are all supported.\\n```bash\\n# Set pip global mirror (speeds up downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# vllm version corresponds to cuda version, please select version according to `https://docs.vllm.ai/en/latest/getting_started/installation.html`\\npip install vllm\\npip install openai -U\\n\\n# Environment alignment (usually not needed. If you get errors, you can run the code below, the repo uses the latest environment for testing)\\npip install -r requirements/framework.txt -U\\npip install -r requirements/llm.txt -U\\n```\\n\\n## Inference Acceleration\\n\\n### Using Python\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm, inference_stream_vllm\\n)\\n\\nmodel_type = ModelType.qwen_7b_chat\\nmodel_id_or_path = None\\nllm_engine = get_vllm_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# Similar to `transformers.GenerationConfig` interface\\nllm_engine.generation_config.max_new_tokens = 256\\ngeneration_info = {}\\n\\nrequest_list = [{'query': 'Hello!'}, {'query': 'Where is the capital of Zhejiang?'}]\\nresp_list = inference_vllm(llm_engine, template, request_list, generation_info=generation_info)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\nprint(generation_info)\\n\\n# stream\\nhistory1 = resp_list[1]['history']\\nrequest_list = [{'query': 'Is there anything tasty here?', 'history': history1}]\\ngen = inference_stream_vllm(llm_engine, template, request_list, generation_info=generation_info)\\nquery = request_list[0]['query']\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\nhistory = resp_list[0]['history']\\nprint(f'history: {history}')\\nprint(generation_info)\\n\\n\\\"\\\"\\\"Out[0]\\nquery: Hello!\\nresponse: Hello! How can I assist you today? Is there something on your mind that you would like to talk about or ask me about? I'm here to help answer any questions you may have.\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang is Hangzhou. It is located in eastern China, on the southern bank of the Qiantang River. Hangzhou is known for its beautiful natural scenery, historic landmarks, and cultural heritage, including the West Lake, Lingyin Temple, and the Longjing tea plantations. It is also an important economic center, with a thriving technology industry and a strong presence in finance and commerce.\\n{'num_prompt_tokens': 49, 'num_generated_tokens': 126, 'runtime': 1.1199991840112489, 'samples/s': 1.7857155867177066, 'tokens/s': 112.50008196321552}\\nquery: Is there anything tasty here?\\nresponse: Yes, Hangzhou is famous for its delicious food! One of the most popular dishes from Hangzhou is the \\\"Dongpo pork\\\", which is made from slow-cooked pork that has been marinated in a sweet and savory sauce made from soy sauce, rice wine, and sugar. Another popular dish is \\\"West Lake fish in vinegar sauce\\\", which features fresh fish fillets cooked in a tangy vinegar sauce and served with steamed buns. There are many other delicious local specialties to try, such as \\\"Longjing tea eggs\\\" (steamed eggs boiled in Longjing tea), \\\"Jiashan bamboo shoots\\\" (a type of vegetable dish), and \\\"Zhouguyu\\\" (a soup made with fermented tofu). Hangzhou's cuisine is known for its delicate flavors and use of fresh ingredients, making it a must-try for any food lover visiting the city.\\nhistory: [['Where is the capital of Zhejiang?', 'The capital of Zhejiang is Hangzhou. It is located in eastern China, on the southern bank of the Qiantang River. Hangzhou is known for its beautiful natural scenery, historic landmarks, and cultural heritage, including the West Lake, Lingyin Temple, and the Longjing tea plantations. It is also an important economic center, with a thriving technology industry and a strong presence in finance and commerce.'], ['Is there anything tasty here?', 'Yes, Hangzhou is famous for its delicious food! One of the most popular dishes from Hangzhou is the \\\"Dongpo pork\\\", which is made from slow-cooked pork that has been marinated in a sweet and savory sauce made from soy sauce, rice wine, and sugar. Another popular dish is \\\"West Lake fish in vinegar sauce\\\", which features fresh fish fillets cooked in a tangy vinegar sauce and served with steamed buns. There are many other delicious local specialties to try, such as \\\"Longjing tea eggs\\\" (steamed eggs boiled in Longjing tea), \\\"Jiashan bamboo shoots\\\" (a type of vegetable dish), and \\\"Zhouguyu\\\" (a soup made with fermented tofu). Hangzhou\\\\'s cuisine is known for its delicate flavors and use of fresh ingredients, making it a must-try for any food lover visiting the city.']]\\n{'num_prompt_tokens': 129, 'num_generated_tokens': 181, 'runtime': 2.307140746997902, 'samples/s': 0.43343692893518526, 'tokens/s': 78.45208413726853}\\n\\\"\\\"\\\"\\n```\\n\\n### Using CLI\\n```bash\\n# qwen\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-7b-chat --infer_backend vllm\\n# yi\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type yi-6b-chat --infer_backend vllm\\n# gptq\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat-int4 --infer_backend vllm\\n\\n# TP\\n# 2 * 80GiB A100\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1 swift infer \\\\\\n    --model_type qwen2-72b-instruct --infer_backend vllm --max_model_len 2048 \\\\\\n    --tensor_parallel_size 2\\n```\\n\\n### Fine-tuned Models\\n\\n**Single sample inference**:\\n\\nFor models fine-tuned using LoRA, you need to first [merge-lora](../Instruction/LLM-fine-tuning.md#merge-lora) to generate a complete checkpoint directory.\\n\\nModels fine-tuned with full parameters can seamlessly use VLLM for inference acceleration.\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm\\n)\\n\\nckpt_dir = 'vx-xxx/checkpoint-100-merged'\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\n\\nllm_engine = get_vllm_engine(model_type, model_id_or_path=ckpt_dir)\\ntokenizer = llm_engine.hf_tokenizer\\ntemplate = get_template(template_type, tokenizer)\\nquery = 'Hello'\\nresp = inference_vllm(llm_engine, template, [{'query': query}])[0]\\nprint(f\\\"response: {resp['response']}\\\")\\nprint(f\\\"history: {resp['history']}\\\")\\n```\\n\\n**Using CLI**:\\n```bash\\n# merge LoRA incremental weights and use vllm for inference acceleration\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\n# Evaluate using dataset\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' \\\\\\n    --infer_backend vllm \\\\\\n    --load_dataset_config true \\\\\\n\\n# Manual evaluation\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' \\\\\\n    --infer_backend vllm \\\\\\n```\\n\\n## Web-UI Acceleration\\n\\n### Original Models\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --model_type qwen-7b-chat --infer_backend vllm\\n```\\n\\n### Fine-tuned Models\\n```bash\\n# merge LoRA incremental weights and use vllm as backend to build app-ui\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' --infer_backend vllm\\n```\\n\\n## Deployment\\nSwift uses VLLM as the inference backend and is compatible with the OpenAI API style.\\n\\nFor server deployment command line arguments, refer to: [deploy command line arguments](../Instruction/Command-line-parameters.md#deploy-Parameters).\\n\\nFor OpenAI API arguments on the client side, refer to: https://platform.openai.com/docs/api-reference/introduction.\\n\\nBenchmark testing code: https://github.com/modelscope/ms-swift/blob/main/scripts/benchmark/deploy.py\\n\\n### Original Models\\n#### qwen-7b-chat\\n\\n**Server side:**\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen-7b-chat\\n# Multi-GPU deployment\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy --model_type qwen-7b-chat --tensor_parallel_size 4\\n```\\n\\n**Client side:**\\n\\nTest:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen-7b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"What to do if I can't fall asleep at night?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\nSynchronous client interface using swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = 'Where is the capital of Zhejiang?'\\nrequest_config = XRequestConfig(seed=42)\\nresp = inference_client(model_type, query, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = 'What delicious food is there?'\\nrequest_config = XRequestConfig(stream=True, seed=42)\\nstream_resp = inference_client(model_type, query, history, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b-chat\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang Province is Hangzhou.\\nquery: What delicious food is there?\\nresponse: Hangzhou has many delicious foods, such as West Lake Vinegar Fish, Dongpo Pork, Longjing Shrimp, Beggar's Chicken, etc. In addition, Hangzhou also has many specialty snacks, such as West Lake Lotus Root Powder, Hangzhou Xiao Long Bao, Hangzhou You Tiao, etc.\\n\\\"\\\"\\\"\\n```\\n\\nAsynchronous client interface using swift:\\n```python\\nimport asyncio\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client_async\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = 'Where is the capital of Zhejiang?'\\nrequest_config = XRequestConfig(seed=42)\\ntasks = [inference_client_async(model_type, query, request_config=request_config) for _ in range(5)]\\nasync def _batch_run(tasks):\\n    return await asyncio.gather(*tasks)\\n\\nresp_list = asyncio.run(_batch_run(tasks))\\nresp = resp_list[0]\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nasync def _stream():\\n    global query\\n    history = [(query, response)]\\n    query = 'What delicious food is there?'\\n    request_config = XRequestConfig(stream=True, seed=42)\\n    stream_resp = await inference_client_async(model_type, query, history, request_config=request_config)\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    async for chunk in stream_resp:\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n\\nasyncio.run(_stream())\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b-chat\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang is Hangzhou.\\nquery: What delicious food is there?\\nresponse: Hangzhou is famous for its delicious food, such as West Lake Fish in Vinegar Gravy, Dongpo Pork, and Longjing Tea.\\n\\\"\\\"\\\"\\n```\\n\\nUsing OpenAI (synchronous):\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = 'Where is the capital of Zhejiang?'\\nmessages = [{\\n    'role': 'user',\\n    'content': query\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = 'What delicious food is there?'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b-chat\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang Province is Hangzhou.\\nquery: What delicious food is there?\\nresponse: Hangzhou has many delicious foods, such as West Lake Vinegar Fish, Dongpo Pork, Longjing Shrimp, Beggar's Chicken, etc. In addition, Hangzhou also has many specialty snacks, such as West Lake Lotus Root Powder, Hangzhou Xiao Long Bao, Hangzhou You Tiao, etc.\\n\\\"\\\"\\\"\\n```\\n\\n#### qwen-7b\\n\\n**Server side:**\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen-7b\\n# Multi-GPU deployment\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy --model_type qwen-7b --tensor_parallel_size 4\\n```\\n\\n**Client side:**\\n\\nTest:\\n```bash\\ncurl http://localhost:8000/v1/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen-7b\\\",\\n\\\"prompt\\\": \\\"Zhejiang -> Hangzhou\\\\nAnhui -> Hefei\\\\nSichuan ->\\\",\\n\\\"max_tokens\\\": 32,\\n\\\"temperature\\\": 0.1,\\n\\\"seed\\\": 42\\n}'\\n```\\n\\nSynchronous client interface using swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = 'Zhejiang -> Hangzhou\\\\nAnhui -> Hefei\\\\nSichuan ->'\\nrequest_config = XRequestConfig(max_tokens=32, temperature=0.1, seed=42)\\nresp = inference_client(model_type, query, request_config=request_config)\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nrequest_config.stream = True\\nstream_resp = inference_client(model_type, query, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].text, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b\\nquery: Zhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan ->\\nresponse:  Chengdu\\nGuangdong -> Guangzhou\\nJiangsu -> Nanjing\\nZhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan -> Chengdu\\n\\nquery: Zhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan ->\\nresponse:  Chengdu\\nGuangdong -> Guangzhou\\nJiangsu -> Nanjing\\nZhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan -> Chengdu\\n\\\"\\\"\\\"\\n```\\n\\nAsynchronous client interface using swift:\\n```python\\nimport asyncio\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client_async\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = 'Zhejiang -> Hangzhou\\\\nAnhui -> Hefei\\\\nSichuan ->'\\nrequest_config = XRequestConfig(max_tokens=32, temperature=0.1, seed=42)\\n\\nresp = asyncio.run(inference_client_async(model_type, query, request_config=request_config))\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nasync def _stream():\\n    request_config.stream = True\\n    stream_resp = await inference_client_async(model_type, query, request_config=request_config)\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    async for chunk in stream_resp:\\n        print(chunk.choices[0].text, end='', flush=True)\\n    print()\\n\\nasyncio.run(_stream())\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b\\nquery: Zhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan ->\\nresponse:  Chengdu\\nGuangdong -> Guangzhou\\nJiangsu -> Nanjing\\nZhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan -> Chengdu\\n\\nquery: Zhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan ->\\nresponse:  Chengdu\\nGuangdong -> Guangzhou\\nJiangsu -> Nanjing\\nZhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan -> Chengdu\\n\\\"\\\"\\\"\\n```\\n\\nUsing OpenAI (synchronous):\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = 'Zhejiang -> Hangzhou\\\\nAnhui -> Hefei\\\\nSichuan ->'\\nkwargs = {'model': model_type, 'prompt': query, 'seed': 42, 'temperature': 0.1, 'max_tokens': 32}\\n\\nresp = client.completions.create(**kwargs)\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# Streaming\\nstream_resp = client.completions.create(stream=True, **kwargs)\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].text, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b\\nquery: Zhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan ->\\nresponse:  Chengdu\\nGuangdong -> Guangzhou\\nJiangsu -> Nanjing\\nZhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan -> Chengdu\\n\\nquery: Zhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan ->\\nresponse:  Chengdu\\nGuangdong -> Guangzhou\\nJiangsu -> Nanjing\\nZhejiang -> Hangzhou\\nAnhui -> Hefei\\nSichuan -> Chengdu\\n\\\"\\\"\\\"\\n```\\n\\n### Fine-tuned Models\\nServer side:\\n```bash\\n# merge LoRA incremental weights and deploy\\n# If you need quantization, you can specify `--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\nThe example code for the client side is the same as the original models.\\n\\n## Multiple LoRA Deployments\\n\\nThe current model deployment method now supports multiple LoRA deployments with `peft>=0.10.0`. The specific steps are:\\n\\n- Ensure `merge_lora` is set to `False` during deployment.\\n- Use the `--lora_modules` argument, which can be referenced in the [command line documentation](../Instruction/Command-line-parameters.md).\\n- Specify the name of the LoRA tuner in the model field during inference.\\n\\nExample:\\n\\n```shell\\n# Assuming a LoRA model named Kakarot was trained from llama3-8b-instruct\\n# Server side\\nswift deploy --ckpt_dir /mnt/ckpt-1000 --infer_backend pt --lora_modules my_tuner=/mnt/my-tuner\\n# This loads two tuners, one is `default-lora` from `/mnt/ckpt-1000`, and the other is `my_tuner` from `/mnt/my-tuner`\\n\\n# Client side\\ncurl http://localhost:8000/v1/chat/completions -H \\\"Content-Type: application/json\\\" -d '{\\n\\\"model\\\": \\\"my-tuner\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"who are you?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n# resp: I am Kakarot...\\n# If the mode='llama3-8b-instruct' is specified, it will return I'm llama3..., which is the response of the original model\\n```\\n\\n> [!NOTE]\\n>\\n> If the `--ckpt_dir` parameter is a LoRA path, the original default will be loaded onto the default-lora tuner, and other tuners need to be loaded through `lora_modules` manually.\\n\\n## VLLM & LoRA\\n\\nModels supported by VLLM & LoRA can be viewed at: https://docs.vllm.ai/en/latest/models/supported_models.html\\n\\n### Setting Up LoRA\\n\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type llama2-7b-chat \\\\\\n    --dataset self-cognition#500 sharegpt-gpt4:default#1000 \\\\\\n    --max_length 4096 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 'Xiao Huang' \\\\\\n    --model_author ModelScope \\\\\\n```\\n\\n\\n### Accelerating VLLM Inference\\n\\nInference:\\n\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/llama2-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm \\\\\\n    --vllm_enable_lora true\\n```\\n\\nInference results:\\n\\n```python\\n\\\"\\\"\\\"\\n<<< who are you?\\nI am an artificial intelligence language model developed by ModelScope. I am designed to assist and communicate with users in a helpful and respectful manner. I can answer questions, provide information, and engage in conversation. How can I help you?\\n\\\"\\\"\\\"\\n```\\n\\nSingle sample inference:\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\nimport torch\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_stream_vllm, LoRARequest, inference_vllm\\n)\\n\\nlora_checkpoint = 'output/llama2-7b-chat/vx-xxx/checkpoint-xxx'\\nlora_request = LoRARequest('default-lora', 1, lora_checkpoint)\\n\\nmodel_type = ModelType.llama2_7b_chat\\nllm_engine = get_vllm_engine(model_type, torch.float16, enable_lora=True,\\n                             max_loras=1, max_lora_rank=16)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# Interface similar to `transformers.GenerationConfig`\\nllm_engine.generation_config.max_new_tokens = 256\\n\\n# using lora\\nrequest_list = [{'query': 'who are you?'}]\\nquery = request_list[0]['query']\\nresp_list = inference_vllm(llm_engine, template, request_list, lora_request=lora_request)\\nresponse = resp_list[0]['response']\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# without lora\\ngen = inference_stream_vllm(llm_engine, template, request_list)\\nquery = request_list[0]['query']\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nprint_idx = 0\\nfor resp_list in gen:\\n    response = resp_list[0]['response']\\n    print(response[print_idx:], end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: who are you?\\nresponse: I am an artificial intelligence language model developed by ModelScope. I can understand and respond to text-based questions and prompts, and provide information and assistance on a wide range of topics.\\nquery: who are you?\\nresponse:  Hello! I'm just an AI assistant, here to help you with any questions or tasks you may have. I'm designed to be helpful, respectful, and honest in my responses, and I strive to provide socially unbiased and positive answers. I'm not a human, but a machine learning model trained on a large dataset of text to generate responses to a wide range of questions and prompts. I'm here to help you in any way I can, while always ensuring that my answers are safe and respectful. Is there anything specific you'd like to know or discuss?\\n\\\"\\\"\\\"\\n```\\n\\n\\n### Deployment\\n\\n**Server**:\\n\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir output/llama2-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm \\\\\\n    --vllm_enable_lora true\\n```\\n\\n**Client**:\\n\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"default-lora\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"who are you?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"llama2-7b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"who are you?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\nOutput:\\n\\n```python\\n\\\"\\\"\\\"\\n{\\\"model\\\":\\\"default-lora\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"I am an artificial intelligence language model developed by ModelScope. I am designed to assist and communicate with users in a helpful, respectful, and honest manner. I can answer questions, provide information, and engage in conversation. How can I assist you?\\\"},\\\"finish_reason\\\":\\\"stop\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":141,\\\"completion_tokens\\\":53,\\\"total_tokens\\\":194},\\\"id\\\":\\\"chatcmpl-fb95932dcdab4ce68f4be49c9946b306\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1710820459}\\n\\n{\\\"model\\\":\\\"llama2-7b-chat\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\" Hello! I'm just an AI assistant, here to help you with any questions or concerns you may have. I'm designed to provide helpful, respectful, and honest responses, while ensuring that my answers are socially unbiased and positive in nature. I'm not capable of providing harmful, unethical, racist, sexist, toxic, dangerous, or illegal content, and I will always do my best to explain why I cannot answer a question if it does not make sense or is not factually coherent. If I don't know the answer to a question, I will not provide false information. My goal is to assist and provide accurate information to the best of my abilities. Is there anything else I can help you with?\\\"},\\\"finish_reason\\\":\\\"stop\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":141,\\\"completion_tokens\\\":163,\\\"total_tokens\\\":304},\\\"id\\\":\\\"chatcmpl-d867a3a52bb7451588d4f73e1df4ba95\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1710820557}\\n\\\"\\\"\\\"\\n```\\n\\nWith openai:\\n\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type_list = [model.id for model in client.models.list().data]\\nprint(f'model_type_list: {model_type_list}')\\n\\nquery = 'who are you?'\\nmessages = [{\\n    'role': 'user',\\n    'content': query\\n}]\\nresp = client.chat.completions.create(\\n    model='default-lora',\\n    messages=messages,\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# stream\\nstream_resp = client.chat.completions.create(\\n    model='llama2-7b-chat',\\n    messages=messages,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type_list: ['llama2-7b-chat', 'default-lora']\\nquery: who are you?\\nresponse: I am an artificial intelligence language model developed by ModelScope. I am designed to assist and communicate with users in a helpful, respectful, and honest manner. I can answer questions, provide information, and engage in conversation. How can I assist you?\\nquery: who are you?\\nresponse:  Hello! I'm just an AI assistant, here to help you with any questions or concerns you may have. I'm designed to provide helpful, respectful, and honest responses, while ensuring that my answers are socially unbiased and positive in nature. I'm not capable of providing harmful, unethical, racist, sexist, toxic, dangerous, or illegal content, and I will always do my best to explain why I cannot answer a question if it does not make sense or is not factually coherent. If I don't know the answer to a question, I will not provide false information. Is there anything else I can help you with?\\n\\\"\\\"\\\"\\n```\\n\\n\\n# Best Practices for SimPO Algorithm\\n[SimPO](https://arxiv.org/abs/2405.14734) requires the same data format as DPO for training. In addition to the [query, response] pairs from SFT data, it also requires a `rejected_response` to indicate the responses that the model should not generate.\\n\\nThe SimPO algorithm applies a regularization of response length to the reward which replaces the reference model log probability term in DPO. It also introduces a reward margin term in preference modeling to increase the reward gap between two responses.\\n\\nCompared to DPO, the SimPO algorithm does not require a reference model and therefore uses less training memory.\\n\\nThe hyperparameter `beta`, similar to DPO, is used as a reward coefficient and is typically set between 2.0 and 2.5, with a default of 2.0. The `gamma` serves as the reward margin and is typically set between 0.5 and 1.5, with a default of 1.0.\\n\\nThis best practice session will train the [llama3-8b-instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct/summary) model using the SimPO algorithm, enabling it to respond in Chinese.\\n\\nTable of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Dataset](#dataset)\\n- [Training](#training)\\n- [Inference](#inference)\\n\\n## Environment Preparation\\n\\n```shell\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n# Environment alignment (usually no need to run. If you encounter an error, you can run the code below, the repository has been tested with the latest environment)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## Dataset\\nWe use the [Llama3-DPO-zh-en-emoji](https://modelscope.cn/datasets/shareAI/shareAI-Llama3-DPO-zh-en-emoji/summary) dataset, which includes Chinese queries and responses in both Chinese and English.\\nData example\\n```json\\n{\\\"question\\\": \\\"一个完整的工程项目管理流程包括什么？\\\",\\n\\\"answer_zh\\\": \\\"🤔 Ahahah, 项目管理流程, 这个问题太常见了！ 😂\\\\n\\\\n一个完整的工程项目管理流程包括以下几个阶段：\\\\n\\\\n1️⃣ **项目启动** 🚀：项目的开始，定义项目的目标、范围、时间表和预算。\\\\n\\\\n2️⃣ **项目计划** 📅：制定项目计划，包括任务分解、资源分配、进度安排和风险管理。\\\\n\\\\n3️⃣ **项目执行** 💪：按照计划执行项目，包括任务执行、进度控制和质量管理。\\\\n\\\\n4️⃣ **项目监控** 👀：对项目的进度、成本和质量进行监控和控制，确保项目不偏离轨道。\\\\n\\\\n5️⃣ **项目收尾** 🎉：项目完成后，进行项目总结、经验分享和文档编制。\\\\n\\\\n6️⃣ **项目评价** 🤔：对项目的成果和过程进行评价，总结经验和教训。\\\\n\\\\n这些阶段是一个完整的工程项目管理流程，但是，具体的项目可能会根据需要添加或删除某些阶段。 🤝\\\\n\\\\n还有一点，项目管理流程中需要注意的几个关键点是：\\\\n\\\\n* **沟通** 💬：项目团队之间、项目团队和客户之间的沟通是非常重要的。\\\\n* **风险管理** ⚠️：项目中总会出现一些风险和问题，需要提前预测和准备。\\\\n* **变更管理** 🔄：项目中可能会出现一些变更，需要及时处理和更新。\\\\n\\\\n总之，项目管理流程是一个复杂的过程，需要项目经理和团队成员的共同努力和合作。 💪\\\",\\n\\\"answer_en\\\": \\\"My fellow wizarding friend! 🧙‍♂️\\\\n\\\\nA complete project management process, you ask? Well, I shall conjure up the essential steps for thee! 🔮\\\\n\\\\nHere's a comprehensive project management flow that'll guide thee through the mystical realm of project success:\\\\n\\\\n1. **Initiation**: Define project scope, goals, and deliverables. Identify stakeholders, and determine the project's feasibility. ⚡️\\\\n2. **Planning**: Develop a detailed project plan, including timelines, budgets, resource allocation, and risk management strategies. 📅\\\\n3. **Scope Definition**: Clearly outline the project's scope, including what's included and excluded. This will help prevent scope creep, my friend! 🔒\\\\n4. **Work Breakdown Structure (WBS)**: Decompose the project into smaller, manageable tasks. This will aid in task assignment, scheduling, and tracking progress. 🗂️\\\\n5. **Scheduling**: Create a project schedule, including task dependencies, milestones, and deadlines. This will help thee stay on track and avoid procrastination! ⏰\\\\n6. **Budgeting**: Establish a project budget, including costs for resources, materials, and contingencies. This will ensure thou dost not overspend, my wise friend! 💸\\\\n7. **Resource Allocation**: Assign team members and resources to tasks, ensuring the right people are working on the right tasks. This will optimize productivity and efficiency! 👥\\\\n8. **Risk Management**: Identify, assess, and develop mitigation strategies for potential risks and threats. This will safeguard thy project from unforeseen dangers! ⚠️\\\\n9. **Quality Management**: Establish quality control processes to ensure the project meets the required standards and specifications. This will guarantee a top-notch outcome, my friend! ✨\\\\n10. **Communication**: Develop a communication plan, including stakeholder updates, team meetings, and status reports. This will keep everyone informed and aligned! 📢\\\\n11. **Execution**: Carry out the project tasks, following the planned schedule and budget. This is where the magic happens, my friend! ✨\\\\n12. **Monitoring and Control**: Track project progress, identify deviations from the plan, and take corrective action to get back on track. This will ensure thy project stays on course! 📊\\\\n13. **Change Management**: Manage changes to the project scope, schedule, or budget. This will minimize disruptions and ensure the project remains viable! 🔀\\\\n14. **Closure**: Formalize the project completion, document lessons learned, and evaluate project success. This will bring a sense of accomplishment and closure, my friend! 🎉\\\\n\\\\nThere thou hast it, my fellow wizard! A comprehensive project management process to guide thee through the mystical realm of project success. May thy projects be prosperous and thy stakeholders be delighted! 😊\\\"}\\n```\\nSwift has built-in methods for processing this dataset, using `answer_zh` as `response` and `answer_en` as `rejected_response`. Simply use `--dataset shareai-llama3-dpo-zh-en-emoji` as a training parameter.\\n\\n## Training\\n\\n```shell\\n# Experimental environment: A100\\n# DDP + MP\\n# Memory usage: 4*56G\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=2 \\\\\\nswift rlhf \\\\\\n    --rlhf_type simpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --sft_type  full \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --learning_rate  2e-6\\n```\\n\\n**Notes**:\\n- We found that SimPO+LoRA performed poorly, full fine-tuning is recommended.\\n- If training the base model with data containing history, specify a template supporting multi-turn dialogue (base models often do not support multi-turn dialogue). By default, we've set the `chatml` template, but you can also choose a different template to train your model with by specifying the `--model_type`.\\n- We default to setting --gradient_checkpointing true during training to save memory, which may slightly reduce training speed.\\n- If you are using older GPUs like V100, you need to set --dtype AUTO or --dtype fp16 because they do not support bf16.\\n- If your machine is equipped with high-performance GPUs like A100 and you are using the qwen series of models, we recommend installing flash-attn, which will speed up training and inference as well as reduce memory usage (Graphics cards like A10, 3090, V100 etc. do not support training with flash-attn). Models that - support flash-attn can be viewed in LLM Supported Models.\\n- If you need to train offline, please use --model_id_or_path <model_dir> and set --check_model_is_latest false. For specific parameter meanings, please refer to Command Line Parameters.\\n- If you wish to push weights to the ModelScope Hub during training, you need to set --push_to_hub true.\\n## Inference\\nUse the swift web-ui command for the following inference session.\\n\\n### Pre-Training Inference\\n> 你是谁(Who are you)\\n\\n![orpo1](../../resources/orpo1.png)\\n\\n> 西湖醋鱼怎么做(How do you make West Lake Vinegar Fish?)\\n\\n![orpo2](../../resources/orpo2.png)\\n![orpo3](../../resources/orpo3.png)\\n![orpo4](../../resources/orpo4.png)\\n![orpo5](../../resources/orpo5.png)\\n\\n\\n### Post-Training Inference\\n> 你是谁(Who are you)\\n\\n![simpo1](../../resources/simpo1.png)\\n\\n> 西湖醋鱼怎么做(How do you make West Lake Vinegar Fish?)\\n\\n![simpo2](../../resources/simpo2.png)\\n![simpo3](../../resources/simpo3.png)\\n![simpo4](../../resources/simpo4.png)\\n\\n\\n# LmDeploy Inference Acceleration and Deployment\\nlmdeploy github: [https://github.com/InternLM/lmdeploy](https://github.com/InternLM/lmdeploy).\\n\\nModels that support inference acceleration using lmdeploy can be found at [Supported Models](../Instruction/Supported-models-datasets.md#LLM).\\n\\n## Table of Contents\\n- [Environment Preparation](#environment-preparation)\\n- [Inference Acceleration](#inference-acceleration)\\n- [Deployment](#deployment)\\n- [Multimodal](#multimodal)\\n\\n## Environment Preparation\\nGPU devices: A10, 3090, V100, A100 are all supported.\\n```bash\\n# Set pip global mirror (speeds up downloads)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# There is a correspondence between lmdeploy and CUDA versions. Please follow the installation instructions at `https://github.com/InternLM/lmdeploy#installation`.\\npip install lmdeploy\\n```\\n\\n## Inference Acceleration\\n\\n### Using Python\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\nmodel_type = ModelType.qwen_7b_chat\\nmodel_id_or_path = None\\nlmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n# Similar to `transformers.GenerationConfig` interface\\nlmdeploy_engine.generation_config.max_new_tokens = 256\\ngeneration_info = {}\\n\\nrequest_list = [{'query': 'Hello!'}, {'query': 'Where is the capital of Zhejiang?'}]\\nresp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\nprint(generation_info)\\n\\n# stream\\nhistory1 = resp_list[1]['history']\\nrequest_list = [{'query': 'Is there anything tasty here?', 'history': history1}]\\ngen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nquery = request_list[0]['query']\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\nhistory = resp_list[0]['history']\\nprint(f'history: {history}')\\nprint(generation_info)\\n\\\"\\\"\\\"\\nquery: Hello!\\nresponse: Hello there! How can I help you today?\\nquery: Where is the capital of Zhejiang?\\nresponse: The capital of Zhejiang is Hangzhou. It is located in southeastern China, along the lower reaches of the Qiantang River (also known as the West Lake), and is one of the most prosperous cities in the country. Hangzhou is famous for its natural beauty, cultural heritage, and economic development, with a rich history dating back over 2,000 years. The city is home to many historic landmarks and attractions, including the West Lake, Lingyin Temple, and the Longjing Tea Plantations. Additionally, Hangzhou is a major center for technology, finance, and transportation in China.\\n{'num_prompt_tokens': 49, 'num_generated_tokens': 135, 'num_samples': 2, 'runtime': 1.5066149180056527, 'samples/s': 1.3274792225258558, 'tokens/s': 89.60484752049527}\\nquery: Is there anything tasty here?\\nresponse: Yes, Hangzhou is known for its delicious cuisine! The city has a long history of culinary arts and is considered to be one of the birthplaces of Chinese cuisine. Some of the most popular dishes from Hangzhou include:\\n\\n  * Dongpo Pork: A dish made with pork belly that has been braised in a soy sauce-based broth until it is tender and flavorful.\\n  * West Lake Fish in Vinegar Gravy: A dish made with freshwater fish that has been simmered in a tangy vinegar sauce.\\n  * Longjing Tea Soup: A soup made with Dragon Well tea leaves and chicken or pork, often served as a light meal or appetizer.\\n  * Xiao Long Bao: Small steamed dumplings filled with meat or vegetables and served with a savory broth.\\n\\nIn addition to these classic dishes, Hangzhou also has a thriving street food scene, with vendors selling everything from steamed buns to grilled meats and seafood. So if you're a foodie, you'll definitely want to try some of the local specialties while you're in Hangzhou!\\nhistory: [['Where is the capital of Zhejiang?', 'The capital of Zhejiang is Hangzhou. It is located in southeastern China, along the lower reaches of the Qiantang River (also known as the West Lake), and is one of the most prosperous cities in the country. Hangzhou is famous for its natural beauty, cultural heritage, and economic development, with a rich history dating back over 2,000 years. The city is home to many historic landmarks and attractions, including the West Lake, Lingyin Temple, and the Longjing Tea Plantations. Additionally, Hangzhou is a major center for technology, finance, and transportation in China.'], ['Is there anything tasty here?', \\\"Yes, Hangzhou is known for its delicious cuisine! The city has a long history of culinary arts and is considered to be one of the birthplaces of Chinese cuisine. Some of the most popular dishes from Hangzhou include:\\\\n\\\\n  * Dongpo Pork: A dish made with pork belly that has been braised in a soy sauce-based broth until it is tender and flavorful.\\\\n  * West Lake Fish in Vinegar Gravy: A dish made with freshwater fish that has been simmered in a tangy vinegar sauce.\\\\n  * Longjing Tea Soup: A soup made with Dragon Well tea leaves and chicken or pork, often served as a light meal or appetizer.\\\\n  * Xiao Long Bao: Small steamed dumplings filled with meat or vegetables and served with a savory broth.\\\\n\\\\nIn addition to these classic dishes, Hangzhou also has a thriving street food scene, with vendors selling everything from steamed buns to grilled meats and seafood. So if you're a foodie, you'll definitely want to try some of the local specialties while you're in Hangzhou!\\\"]]\\n{'num_prompt_tokens': 169, 'num_generated_tokens': 216, 'num_samples': 1, 'runtime': 2.4760487159946933, 'samples/s': 0.4038692750834161, 'tokens/s': 87.23576341801788}\\n\\\"\\\"\\\"\\n```\\n\\n### Using CLI\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-7b-instruct --infer_backend lmdeploy\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen2-7b-instruct --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen2-72b-instruct --infer_backend lmdeploy --tp 2\\n```\\n\\n## Deployment\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-7b-instruct --infer_backend lmdeploy\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen2-7b-instruct --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen2-72b-instruct --infer_backend lmdeploy --tp 2\\n```\\n\\nThe method for client invocation can be found in: [vLLM Inference Acceleration and Deployment Documentation](VLLM-inference-acceleration-and-deployment.md#deployment).\\n\\nBenchmark testing code: https://github.com/modelscope/ms-swift/blob/main/scripts/benchmark/deploy.py\\n\\n## Multimodal\\nCheck [here](../Multi-Modal/LmDeploy-inference-acceleration-and-deployment.md)\\n\\n\\n# Megatron Training Documentation\\n\\nModels that support training with Megatron can be found [here](../Instruction/Supported-models-datasets.md#models).\\n\\n## Table of Contents\\n- [Environment Preparation](#Environment-Preparation)\\n- [SFT Example](#SFT-Example)\\n- [Multi-Node Pre-Training Example](#Multi-Node-Pre-Training-Example)\\n- [Mapping between MegatronArguments and SftArguments](#Mapping-between-MegatronArguments-and-SftArguments)\\n\\n\\n## Environment-Preparation\\n\\n```shell\\n# Install ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# Install Megatron-related dependencies (You do not need to install megatron-ml or other dependency libraries)\\npip install pybind11\\n# transformer_engine (If the installation is unsuccessful, please try: release_v1.7)\\npip install git+https://github.com/NVIDIA/TransformerEngine.git@stable\\n# apex\\ngit clone https://github.com/NVIDIA/apex\\ncd apex\\npip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings \\\"--build-option=--cpp_ext\\\" --config-settings \\\"--build-option=--cuda_ext\\\" ./\\n```\\n\\nThe other two dependency libraries are [Megatron-LM](https://github.com/NVIDIA/Megatron-LM) and [Pai-Megatron-Patch](https://github.com/alibaba/Pai-Megatron-Patch). They will be cloned and installed via swift, so no user installation is required. You can also specify the paths to the already downloaded repositories using the environment variables `MEGATRON_LM_PATH` and `PAI_MEGATRON_PATCH_PATH`.\\n\\n\\n## SFT-Example\\nHere we present a quick-start example of training with Megatron. Through this example, you can get familiar with the entire Megatron training workflow. For a corresponding example of fine-tuning using HF Trainer, please refer to [Self-cognition-best-practice](Self-cognition-best-practice.md).\\n\\n1. Converting weights from HF format to Megatron format:\\n```shell\\n# Default output path: --megatron_output_dir {model_type}-tp{tp}-pp{pp}\\nCUDA_VISIBLE_DEVICES=0 swift export --model_type qwen2-7b-instruct \\\\\\n    --to_megatron true --tp 2 --dtype bf16\\n\\n# If using qwen2-72b-instruct, the conversion command is as follows:\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift export --model_type qwen2-72b-instruct \\\\\\n    --to_megatron true --tp 8 --dtype bf16\\n```\\n\\n2. Fine-tuning using Megatron format weights, the command script is as follows:\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 4 * 55GB\\n# TP=2, DP=2\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#500 swift-mix:codefuse#250 swift-mix:metamathqa#250 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n```\\n\\n3. Converting weights from Megatron format back to HF format:\\n```shell\\n# Unfine-tuned model\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir qwen2-7b-instruct-tp2-pp1 --to_hf true\\n\\n# fine-tuned model\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen2-7b-instruct-tp2-pp1/vx-xxx --to_hf true\\n\\n# If using qwen2-72b-instruct, the conversion command is as follows:\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift export \\\\\\n    --ckpt_dir qwen2-72b-instruct-tp8-pp1 --to_hf true\\n```\\n\\n4. Perform inference testing on the obtained weights and accelerate using vLLM:\\n```shell\\n# Unfine-tuned model\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-7b-instruct \\\\\\n    --model_id_or_path qwen2-7b-instruct-tp2-pp1/qwen2-7b-instruct-hf \\\\\\n\\n# fine-tuned model\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen2-7b-instruct-tp2-pp1/vx-xxx/qwen2-7b-instruct-hf\\n```\\n\\nThe performance of the fine-tuned model is as follows:\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁\\n我是小黄，由魔搭开发的人工智能聊天机器人。我的目标是通过文本交流提供帮助、信息和娱乐。如果您有任何问题或需要帮助，请随时向我提问。\\n--------------------------------------------------\\n<<< who are you\\nI am Xiao Huang, an artificial intelligence chatbot developed by ModelScope. My purpose is to provide assistance, information, and entertainment through text communication. If you have any questions or need help, please feel free to ask me at any time.\\n--------------------------------------------------\\n<<< What should I do if I can't sleep at night?\\nLack of sleep at night can be caused by various factors, such as stress, anxiety, irregular sleep patterns, caffeine or alcohol consumption, or an uncomfortable sleep environment. Here are some suggestions that may help improve your sleep quality:\\n\\n1. Establish a regular sleep schedule: Try to go to bed and wake up at the same time every day, even on weekends. This helps adjust your body clock and improve your sleep quality.\\n2. Create a comfortable sleep environment: Ensure that your bedroom is quiet, dark, and cool, and that your bed is comfortable. Use blackout curtains, earplugs, or white noise machines to create a more comfortable sleep environment.\\n3. Avoid caffeine and alcohol: Avoid consuming caffeine and alcohol in the hours leading up to bedtime, as they can affect your sleep quality.\\n4. Relax your mind and body: Try deep breathing, meditation, yoga, or other relaxation techniques to help you relax and prepare for sleep.\\n5. Avoid using electronic devices: Avoid using electronic devices before bedtime, as the blue light emitted by screens can affect your sleep quality.\\n6. Avoid napping during the day: If you take naps during the day, it may affect your sleep quality at night. Try to avoid napping for several hours before bedtime.\\n7. Limit your fluid intake before bedtime: Avoid drinking too much liquid before bedtime to reduce the number of times you need to get up to use the bathroom.\\n8. Maintain a positive mindset: Avoid worrying or being anxious before bedtime, as this can affect your sleep quality. Try to think positively about the next day.\\n9. Try relaxation techniques: Try deep breathing, meditation, yoga, or other relaxation techniques to help you relax and prepare for sleep.\\n10. If you have tried the above suggestions but still cannot sleep, consider consulting a doctor or sleep expert for more advice.\\n\\\"\\\"\\\"\\n```\\n\\nWe evaluate the trained HF model:\\n```shell\\npip install llmuses==0.4.0\\n# Original model\\nCUDA_VISIBLE_DEVICES=0 swift eval --model_type qwen2-7b-instruct \\\\\\n    --eval_dataset ceval mmlu gsm8k arc --eval_backend Native\\n\\n# Unfine-tuned model\\nCUDA_VISIBLE_DEVICES=0 swift eval --model_type qwen2-7b-instruct \\\\\\n    --model_id_or_path qwen2-7b-instruct-tp2-pp1/qwen2-7b-instruct-hf \\\\\\n    --eval_dataset ceval mmlu gsm8k arc --eval_backend Native\\n\\n# fine-tuned model\\nCUDA_VISIBLE_DEVICES=0 swift eval \\\\\\n    --ckpt_dir output/qwen2-7b-instruct-tp2-pp1/vx-xxx/qwen2-7b-instruct-hf \\\\\\n    --eval_dataset ceval mmlu gsm8k arc --eval_backend Native\\n```\\n\\n\\nEvaluation results:\\n|     |  ceval    | mmlu   | gsm8k    | arc   |\\n| ---- | ---- | ---- | ---- | ---- |\\n|  Original Model  |    0.6642  |  0.6909    |    0.787  |  0.8507    |\\n|  Unfine-tuned  |    0.6642  |  0.6909    |    0.787  |  0.8507    |\\n|  Fine-tuned  |   0.7392   |    0.6878  |  0.8241    |    0.8481  |\\n\\n\\n**Multi-Node**:\\n```shell\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#20000 swift-mix:codefuse#10000 swift-mix:metamathqa#10000 self-cognition#500 \\\\\\n    --max_length 8192 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#20000 swift-mix:codefuse#10000 swift-mix:metamathqa#10000 self-cognition#500 \\\\\\n    --max_length 8192 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n```\\n\\n\\n**Alibaba Cloud DLC Multi-Node Training** (No need to modify the wildcard):\\n```shell\\nNNODES=$WORLD_SIZE \\\\\\nNODE_RANK=$RANK \\\\\\nswift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#20000 swift-mix:codefuse#10000 swift-mix:metamathqa#10000 self-cognition#500 \\\\\\n    --max_length 8192 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n```\\n\\n\\n## Multi-Node Pre-Training Example\\nComming soon...\\n\\n\\n## Mapping between MegatronArguments and SftArguments\\n|  MegatronArguments    |  SftArguments |\\n| ---- | ---- |\\n|   optimizer   | optim |\\n|   lr_decay_style   | lr_scheduler_type |\\n|  weight_decay  | weight_decay |\\n| clip_grad   |  max_grad_norm |\\n|   adam_beta1 | adam_beta1 |\\n|  adam_beta2  | adam_beta2 |\\n| adam_eps  | adam_epsilon |\\n|  lr  | learning_rate |\\n|  min_lr  | min_lr |\\n|   fp16<br> apply_query_key_layer_scaling | fp16 |\\n|  bf16  | bf16 |\\n|  tensor_model_parallel_size  | tp |\\n|  pipeline_model_parallel_size  | pp |\\n|  seed  | seed |\\n|  load  | resume_from_checkpoint |\\n|  save  | output_dir |\\n|  tensorboard_dir  | logging_dir |\\n|  log_interval  | logging_steps |\\n|  eval_interval  | eval_steps |\\n|  save_interval  | save_steps |\\n|  micro_batch_size  | batch_size |\\n|  global_batch_size  | batch_size * gradient_accumulation_steps * world_size |\\n|  sequence_parallel  | sequence_parallel |\\n|  num_workers  | dataloader_num_workers |\\n|  use_flash_attn  | use_flash_attn |\\n|  train_iters  | int(math.ceil(len(train_dataset) * num_train_epochs / global_batch_size)) |\\n|  eval_iters  | int(math.ceil(len(val_dataset) / global_batch_size)) |\\n|  lr_warmup_iters  |  warmup_steps if warmup_steps > 0 else math.ceil(train_iters * warmup_ratio) |\\n|  no_save_optim<br>no_save_rng  | save_only_model |\\n\\n\\n## LLM Documentation\\n\\n[中文文档](https://swift.readthedocs.io/zh-cn/latest/LLM/index.html)\\n\\n### 📚Tutorials!\\n\\n1. [LRHF Training](Human-Preference-Alignment-Training-Documentation.md)\\n2. [DPO Training](DPO.md)\\n3. [ORPO Training](ORPO.md)\\n4. [SimPO Training](SimPO.md)\\n5. [OLLAMA Export](./OLLaMA-Export.md)\\n6. [VLLM Inference and Deployment](VLLM-inference-acceleration-and-deployment.md)\\n7. [LmDeploy Inference and Deployment](LmDeploy-inference-acceleration-and-deployment.md)\\n8. [Megatron-training](Megatron-training.md)\\n\\n### ⭐️Best Practices!\\n\\n1. [Self Cognition Best Practice](Self-cognition-best-practice.md)\\n2. [Agent Training and Inference Best Practice](Agent-fine-tuning-best-practice.md)\\n3. [Agent deployment best practice](Agent-deployment-best-practice.md)\\n4. [Qwen1.5 Best Practice](Qwen1.5-best-practice.md)\\n5. [NPU Best Practice](NPU-best-practice.md)\\n6. [Grok-1 Training and Inference Best Practice](Grok-1-best-practice.md)\\n\\n\\n### 🐔References！\\n1. [Benchmark](Benchmark.md)\\n2. [Compatible with the HuggingFace ecosystem](Compat-HF.md)\\n\\n### 🍀Multi-Modal Best Practices!\\n\\nPlease check: [Multi-Modal Best Practices](../Multi-Modal/index.md)\\n\\n\\n# Configuration file for the Sphinx documentation builder.\\n#\\n# This file only contains a selection of the most common options. For a full\\n# list see the documentation:\\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\\n\\n# -- Path setup --------------------------------------------------------------\\n\\n# If extensions (or modules to document with autodoc) are in another directory,\\n# add these directories to sys.path here. If the directory is relative to the\\n# documentation root, use os.path.abspath to make it absolute, like shown here.\\n#\\nimport os\\nimport sys\\n\\n# import sphinx_book_theme\\n\\nsys.path.insert(0, os.path.abspath('../../'))\\n# -- Project information -----------------------------------------------------\\n\\nproject = 'swift'\\ncopyright = '2022-2024, Alibaba ModelScope'\\nauthor = 'ModelScope Authors'\\nversion_file = '../../swift/version.py'\\nhtml_theme = 'sphinx_rtd_theme'\\nlanguage = 'zh_CN'\\n\\n\\ndef get_version():\\n    with open(version_file, 'r', encoding='utf-8') as f:\\n        exec(compile(f.read(), version_file, 'exec'))\\n    return locals()['__version__']\\n\\n\\n# The full version, including alpha/beta/rc tags\\nversion = get_version()\\nrelease = version\\n\\n# -- General configuration ---------------------------------------------------\\n\\n# Add any Sphinx extension module names here, as strings. They can be\\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\\n# ones.\\nextensions = [\\n    'sphinx.ext.napoleon',\\n    'sphinx.ext.autosummary',\\n    'sphinx.ext.autodoc',\\n    'sphinx.ext.viewcode',\\n    'sphinx_markdown_tables',\\n    'sphinx_copybutton',\\n    'myst_parser',\\n]\\n\\n# build the templated autosummary files\\nautosummary_generate = True\\nnumpydoc_show_class_members = False\\n\\n# Enable overriding of function signatures in the first line of the docstring.\\nautodoc_docstring_signature = True\\n\\n# Disable docstring inheritance\\nautodoc_inherit_docstrings = False\\n\\n# Show type hints in the description\\nautodoc_typehints = 'description'\\n\\n# Add parameter types if the parameter is documented in the docstring\\nautodoc_typehints_description_target = 'documented_params'\\n\\nautodoc_default_options = {\\n    'member-order': 'bysource',\\n}\\n\\n# Add any paths that contain templates here, relative to this directory.\\ntemplates_path = ['_templates']\\n\\n# The suffix(es) of source filenames.\\n# You can specify multiple suffix as a list of string:\\n#\\nsource_suffix = ['.rst', '.md']\\n\\n# The master toctree document.\\nroot_doc = 'index'\\n\\n# List of patterns, relative to source directory, that match files and\\n# directories to ignore when looking for source files.\\n# This pattern also affects html_static_path and html_extra_path.\\nexclude_patterns = ['build', 'source/.ipynb_checkpoints', 'source/api/generated', 'Thumbs.db', '.DS_Store']\\n# A list of glob-style patterns [1] that are used to find source files.\\n# They are matched against the source file names relative to the source directory,\\n# using slashes as directory separators on all platforms.\\n# The default is **, meaning that all files are recursively included from the source directory.\\n# -- Options for HTML output -------------------------------------------------\\n\\n# The theme to use for HTML and HTML Help pages.  See the documentation for\\n# a list of builtin themes.\\n#\\n# html_theme = 'sphinx_book_theme'\\n# html_theme_path = [sphinx_book_theme.get_html_theme_path()]\\n# html_theme_options = {}\\n\\n# Add any paths that contain custom static files (such as style sheets) here,\\n# relative to this directory. They are copied after the builtin static files,\\n# so a file named \\\"default.css\\\" will overwrite the builtin \\\"default.css\\\".\\nhtml_static_path = ['_static']\\n# html_css_files = ['css/readthedocs.css']\\n\\n# -- Options for HTMLHelp output ---------------------------------------------\\n# Output file base name for HTML help builder.\\n\\n# -- Extension configuration -------------------------------------------------\\n# Ignore >>> when copying code\\ncopybutton_prompt_text = r'>>> |\\\\.\\\\.\\\\. '\\ncopybutton_prompt_is_regexp = True\\n\\n# Example configuration for intersphinx: refer to the Python standard library.\\nintersphinx_mapping = {'https://docs.python.org/': None}\\n\\n\\n# LLM&VLM训练、推理、部署、评测常见问题\\n\\n下面是swift使用过程中遇到的一些常见问题。\\n\\n## 训练\\n\\n### Q1: Swift微调支持的模型和数据集有哪些？\\n详见文档[支持的模型和数据集](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E6%94%AF%E6%8C%81%E7%9A%84%E6%A8%A1%E5%9E%8B%E5%92%8C%E6%95%B0%E6%8D%AE%E9%9B%86.html)。\\n\\n### Q2: 使用自定义数据集训练时支持的数据格式有哪些？\\nllm自定义数据集格式见文档[自定义与拓展](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.html)；vlm自定义数据集格式，不同模型对图像数量的支持不同, 具体参考模型对应的最佳实践文档[Multi-Modal文档](https://swift.readthedocs.io/zh-cn/latest/Multi-Modal/index.html)。\\n\\n### Q3: 自定义数据集dataset_info.json格式，如何通过这种方式使用自定义数据集？\\ndataset_info.json格式见文档[自定义与拓展](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.html)。命令行，`--custom_dataset_info xxx.json`，`--dataset dataset_name`。\\n\\n### Q4: 如何在界面训练使用自定义数据集？\\n界面训练使用自定义数据集与命令行一致，参考文档[自定义与拓展](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.html)。\\n\\n### Q5: 数据集jsonl文件里的一行能不能写成这样？{\\\"index\\\": \\\"00000\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", 'source':'qqq'}\\n可以有额外字段的，这些字段不会被使用。\\n\\n### Q6: 命令行参数在哪个文档中查看？\\n详见文档[命令行参数](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html)。\\n\\n### Q7: 离线环境训练需要配置的参数有哪些？\\n`--model_id_or_path 本地路径`，`--check_model_is_latest false`，详见[命令行参数](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html)。\\n\\n### Q8: model_type在哪儿查看？\\n查看文档[支持的模型和数据集](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E6%94%AF%E6%8C%81%E7%9A%84%E6%A8%A1%E5%9E%8B%E5%92%8C%E6%95%B0%E6%8D%AE%E9%9B%86.html)。\\n\\n### Q9: 模型训练完能直接转gguf格式吗？\\n目前只支持导出ModelFile，详见文档[OLLaMA导出文档](https://swift.readthedocs.io/zh-cn/latest/LLM/OLLAMA%E5%AF%BC%E5%87%BA%E6%96%87%E6%A1%A3.html)。\\n\\n### Q10: swift支持预训练吗，我看只有sft？\\n支持，命令行`swift pt`，数据集格式见[自定义与拓展](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.html)。\\n\\n### Q11: 想问一下用lora微调的模型，如果想断点续训的话，是应该先把它合成一整个模型吗，还是可以不合起来，直接通过路径来指定原模型和lora块\\n不合并，`--resume_from_checkpoint output/xxx/vx-xxx/checkpoint-xxx`，详见[命令行参数](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html)。\\n\\n### Q12: 我想控制一下从网上下载下来的原始模型权重的位置，怎么才能做到把原始的模型放在指定的文件夹里呢？\\n可以配置环境变量`MODELSCOPE_CACHE=your_path`将原始的模型存到指定路径；如果用sdk下载，通过`cache_dir=\\\"本地地址\\\"`；也可以使用`modelscope download`命令行工具或`git`下载，详见modelscope文档[模型下载](https://modelscope.cn/docs/%E6%A8%A1%E5%9E%8B%E7%9A%84%E4%B8%8B%E8%BD%BD)。训练时`--model_id_or_path`配置本地路径即可。如果需要在离线环境训练，配置`--check_model_is_latest false`，详见[命令行参数](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html)。\\n\\n### Q13: 有人在用ms-swift遇到过这个问题？\\n```text\\n[rank6]: pydantic_core._pydantic_core.ValidationError: 1 validation error for DeepSpeedZeroConfig\\n[rank6]: stage3_prefetch_bucket_size\\n[rank6]: Input should be a valid integer, got a number with a fractional part [type=int_from_float,input_value=11560550.4，in put_type=float]\\n[rank6]: For further information visit https://errors.pydantic.dev/2.8/v/int_fro_float\\n```\\n`deepspeed`版本降到`0.14.*`。\\n\\n### Q14: 有微调qwen-2-vl的完整的教程和命令行吗？\\n[Qwen2-VL 最佳实践](https://swift.readthedocs.io/zh-cn/latest/Multi-Modal/qwen2-vl%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html)。\\n\\n### Q15: 多模态大模型微调有什么支持的trick吗，类似llm的neftune?\\n`piassa/olora/dora`这些`lora`的变种或者`fourierft`都可以尝试。参考`sft`参数里面的各种trick，有一些不一定在多模态上适用。\\n\\n### Q16: 训练过程中eval得到的acc和对应保存的ckpt去重新推理一遍计算得到的acc不是一致的\\n训练时候的eval_acc和推理时候的acc 计算方式不一样的。`acc_strategy`: 默认为`'token'`, 可选择的值包括: `'token'`, `'sentence'`.\\n\\n### Q17: 魔搭官方镜像与swift环境\\n`docker run`命令启动容器即可，如：`docker run --gpus all -p 8000:8000 -it -d --name ms registry.cn-beijing.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.3.0-tf2.16.1-1.16.0 /bin/bash`，启动容器后拉最新代码安装swift。\\n\\n### Q18: 多机多卡训练命令行\\n```shell\\n# 多机多卡\\n# 如果非共用磁盘请在各机器sh中额外指定`--save_on_each_node true`.\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n```\\n详见[LLM微调文档](https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E5%BE%AE%E8%B0%83%E6%96%87%E6%A1%A3.html)\\n\\n### Q19: 如何选择template?\\n见[issue](https://github.com/modelscope/ms-swift/issues/1813)。\\n\\n### Q20: 多卡训练torchrun和swift sft如何使用？\\n`swift sft`走的就是`torchrun`。\\n\\n### Q21: 有个问题，因为我的sft数据集太大了，然后每次tokenize都需要很久，有解决方案吗？\\n使用`lazy_tokenize`，详见[命令行参数](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html)。\\n\\n### Q22: 训练时，如果两个数据集直接追加一起放在训练集中，模型在训练的时候内部会有shuffle的流程吗？还是按顺序取数据去训练？\\ntrainer中会随机。\\n\\n## 推理\\n\\n### Q1:swift推理有文档吗？\\nswift支持python脚本、命令行、ui界面推理，详见[LLM推理文档](https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E6%8E%A8%E7%90%86%E6%96%87%E6%A1%A3.html)。\\n\\n### Q2: 训练后的模型如何使用数据集推理？\\n参数`--load_dataset_config true`或`--val_dataset <your-val-dataset>`，见文档[LLM微调文档](https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E5%BE%AE%E8%B0%83%E6%96%87%E6%A1%A3.html#%E5%BE%AE%E8%B0%83%E5%90%8E%E6%A8%A1%E5%9E%8B)。\\n\\n### Q3: swift推理的时候可以指定下载好的模型吗？\\n`--model_id_or_path`配置本地路径即可，详见[命令行参数](https://swift.readthedocs.io/zh-cn/latest/Instruction/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.html)。\\n\\n### Q4: 我想在一个没有label的数据集上推理，怎么做呢？我看文档里面的数据集格式都是训练集\\n配置参数`--val_dataset <your-val-dataset>`。\\n\\n### Q5: 遇到报错ValueError: Input length of input_ids is 35, but `max_length` is set to 20.如何解决？\\n```text\\nraise ValueError(\\nValueError: Input length of input_ids is 35, but `max_length` is set to 20. This can lead to unexpected behavior. You should consider increasing `max_length` or, better yet, setting `max_new_tokens`.\\n```\\n设置model.generation_config.max_new_tokens。\\n\\n### Q6: qwen2-vl推理爆显存\\n设置环境变量，SIZE_FACTOR=8 MAX_PIXELS=602112，见文档[Qwen2-VL 最佳实践](https://swift.readthedocs.io/zh-cn/latest/Multi-Modal/qwen2-vl%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html)。\\n\\n## 部署\\n\\n### Q1: 如何部署训练后的模型？\\n`swift deploy --ckpt_dir xxx`，见文档[VLLM推理加速与部署](https://swift.readthedocs.io/zh-cn/latest/LLM/VLLM%E6%8E%A8%E7%90%86%E5%8A%A0%E9%80%9F%E4%B8%8E%E9%83%A8%E7%BD%B2.html)。\\n\\n### Q2: 如何使用vllm部署进行多卡部署？\\n`RAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy --model_type qwen-7b --tensor_parallel_size 4`，见文档[VLLM推理加速与部署](https://swift.readthedocs.io/zh-cn/latest/LLM/VLLM%E6%8E%A8%E7%90%86%E5%8A%A0%E9%80%9F%E4%B8%8E%E9%83%A8%E7%BD%B2.html)。\\n\\n### Q3: 请问用vllm部署的时候，客户端怎么传入图片？\\n详见多模态文档，[vLLM推理加速文档](https://swift.readthedocs.io/zh-cn/latest/Multi-Modal/vLLM%E6%8E%A8%E7%90%86%E5%8A%A0%E9%80%9F%E6%96%87%E6%A1%A3.html)。\\n\\n### Q4: 有个问题想问一下，qwen2-7b部署后使用客户端时，调用openai的api要使用client.completions.create，不能使用client.chat.completions.create，但是使用qwen2-7b-instruct-q5_k_m.gguf的时候可以使用client.chat.completions.create，这是为什么呀？\\nbase模型可以用client.chat.completions.create的，不过这个是兼容行为。\\n\\n### Q5: 使用两张卡用swift deploy启动服务端后，用Ctrl+C退出后，会一直有一个python进程，一直占用一张卡的显存，这是正常现象吗？\\n需要kill 一下, 这是vllm的问题。\\n\\n## 评测\\n\\n### Q1: swift支持的评测集有哪些？\\n纯文本评测：\\n```text\\n'obqa', 'cmb', 'AX_b', 'siqa', 'nq', 'mbpp', 'winogrande', 'mmlu', 'BoolQ', 'cluewsc', 'ocnli', 'lambada',\\n'CMRC', 'ceval', 'csl', 'cmnli', 'bbh', 'ReCoRD', 'math', 'humaneval', 'eprstmt', 'WSC', 'storycloze',\\n'MultiRC', 'RTE', 'chid', 'gsm8k', 'AX_g', 'bustm', 'afqmc', 'piqa', 'lcsts', 'strategyqa', 'Xsum', 'agieval',\\n'ocnli_fc', 'C3', 'tnews', 'race', 'triviaqa', 'CB', 'WiC', 'hellaswag', 'summedits', 'GaokaoBench',\\n'ARC_e', 'COPA', 'ARC_c', 'DRCD'\\n```\\n\\n多模态评测：\\n```text\\n'COCO_VAL', 'MME', 'HallusionBench', 'POPE', 'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN',\\n'MMBench', 'MMBench_CN', 'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11',\\n'MMBench_TEST_CN_V11', 'MMBench_V11', 'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2',\\n'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST', 'MMT-Bench_ALL_MI', 'MMT-Bench_ALL',\\n'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL', 'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar',\\n'RealWorldQA', 'MLLMGuard_DS', 'BLINK', 'OCRVQA_TEST', 'OCRVQA_TESTCORE', 'TextVQA_VAL', 'DocVQA_VAL',\\n'DocVQA_TEST', 'InfoVQA_VAL', 'InfoVQA_TEST', 'ChartQA_TEST', 'MathVision', 'MathVision_MINI',\\n'MMMU_DEV_VAL', 'MMMU_TEST', 'OCRBench', 'MathVista_MINI', 'LLaVABench', 'MMVet', 'MTVQA_TEST',\\n'MMLongBench_DOC', 'VCR_EN_EASY_500', 'VCR_EN_EASY_100', 'VCR_EN_EASY_ALL', 'VCR_EN_HARD_500',\\n'VCR_EN_HARD_100', 'VCR_EN_HARD_ALL', 'VCR_ZH_EASY_500', 'VCR_ZH_EASY_100', 'VCR_ZH_EASY_ALL',\\n'VCR_ZH_HARD_500', 'VCR_ZH_HARD_100', 'VCR_ZH_HARD_ALL', 'MMDU', 'MMBench-Video', 'Video-MME',\\n'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN', 'MMBench', 'MMBench_CN',\\n'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11', 'MMBench_TEST_CN_V11', 'MMBench_V11',\\n'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2', 'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST',\\n'MMT-Bench_ALL_MI', 'MMT-Bench_ALL', 'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL',\\n'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar', 'RealWorldQA', 'MLLMGuard_DS', 'BLINK'\\n```\\n\\n详见文档[LLM评测文档](https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E8%AF%84%E6%B5%8B%E6%96%87%E6%A1%A3.html)。\\n\\n### Q2: 如何使用自定义评测集？\\n纯文本、多模态自定义评测集必须和某个官方评测集数据格式（pattern）保持一致，见文档[LLM评测文档](https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E8%AF%84%E6%B5%8B%E6%96%87%E6%A1%A3.html)。\\n\\n\\n# 命令行参数\\n\\n## 目录\\n\\n- [sft 参数](#sft-参数)\\n- [pt 参数](#pt-参数)\\n- [rlhf 参数](#rlhf-参数)\\n- [infer merge-lora 参数](#infer-merge-lora-参数)\\n- [export 参数](#export-参数)\\n- [eval参数](#eval参数)\\n- [app-ui 参数](#app-ui-参数)\\n- [deploy 参数](#deploy-参数)\\n\\n## sft 参数\\n\\n- `--🔥model_type`: 表示你选择的模型类型, 默认是`None`. `model_type`指定了对应模型默认的`target_modules`, `template_type`等信息. 你可以通过只指定`model_type`进行微调. 对应的`model_id_or_path`会使用默认的设置, 从ModelScope进行下载, 并使用默认的缓存路径. model_type和model_id_or_path必须指定其中的一个. 可以选择的`model_type`可以查看[支持的模型](支持的模型和数据集.md#模型). 你可以设置`USE_HF`环境变量来控制从HF Hub下载模型和数据集, 参考[HuggingFace生态兼容文档](../LLM/HuggingFace生态兼容.md).\\n- `--🔥model_id_or_path`: 表示模型在ModelScope/HuggingFace Hub中的`model_id`或者本地路径, 默认为`None`. 如果传入的`model_id_or_path`已经被注册, 则会根据`model_id_or_path`推断出`model_type`. 如果未被注册, 则需要同时指定`model_type`, e.g. `--model_type <model_type> --model_id_or_path <model_id_or_path>`.\\n- `--model_revision`: 表示模型在ModelScope Hub中对应`model_id`的版本号, 默认为`None`. `model_revision`指定为`None`, 则使用注册在`MODEL_MAPPING`中的revision. 否则强制使用命令行传入的`model_revision`.\\n- `--local_repo_path`: 部分模型在加载时依赖于github repo. 为了避免`git clone`时遇到网络问题, 可以直接使用本地repo. 该参数需要传入本地repo的路径, 默认为`None`. 这部分模型包括:\\n  - mPLUG-Owl模型: `https://github.com/X-PLUG/mPLUG-Owl`\\n  - DeepSeek-VL模型: `https://github.com/deepseek-ai/DeepSeek-VL`\\n  - YI-VL模型: `https://github.com/01-ai/Yi`\\n  - LLAVA模型: `https://github.com/haotian-liu/LLaVA.git`\\n- `--🔥sft_type`: 表示微调的方式, 默认是`'lora'`. 你可以选择的值包括: 'lora', 'full', 'longlora', 'adalora', 'ia3', 'llamapro', 'adapter', 'vera', 'boft', 'fourierft', 'reft'. 如果你要使用qlora, 你需设置`--sft_type lora --quantization_bit 4`.\\n- `--packing`: pack数据集到`max-length`, 默认值`False`.\\n- `--full_determinism`: 固定所有的随机性, 默认值`False`.\\n- `--auto_find_batch_size`: 根据显存值自定找到batch_size, 默认值`False`.\\n- `--streaming`: 是否使用流式数据处理, 默认值`False`.\\n- `--freeze_parameters`: 当sft_type指定为'full'时, 将以freeze_parameters为前缀的层进行freeze. 默认为`[]`. 例如: `--freeze_parameters visual`.\\n- `--🔥freeze_vit`: 当sft_type指定为'full', 且训练的是多模态模型时, 可以通过将该参数设置为`True`来冻结vit的参数. 默认指为`False`.\\n- `--freeze_parameters_ratio`: 当sft_type指定为'full'时, 将模型最底部的参数进行freeze. 指定范围为0. ~ 1., 默认为`0.`. 该参数提供了lora与全参数微调的折中方案.\\n- `--additional_trainable_parameters`: 作为freeze_parameters的补充, 只有在sft_type指定为'full'才允许被使用, 默认为`[]`. 例如你如果想训练50%的参数的情况下想额外训练embedding层, 你可以设置`--freeze_parameters_ratio 0.5 --additional_trainable_parameters transformer.wte`, 所有以`transformer.wte`开头的parameters都会被激活. 你也可以设置`--freeze_parameters_ratio 1 --additional_trainable_parameters xxx`来自定义可以训练的层.\\n- `--tuner_backend`: 表示lora, qlora的后端支持, 默认是`'peft'`. 你可以选择的值包括: 'swift', 'peft', 'unsloth'.\\n- `--🔥template_type`: 表示使用的对话模板的类型, 默认是`'AUTO'`, 即根据`model_type`查找`MODEL_MAPPING`中的`template`. 可以选择的`template_type`可以查看`TEMPLATE_MAPPING.keys()`.\\n- `--🔥output_dir`: 表示ckpt存储的目录, 默认是`'output'`. 我们会在该目录后拼接`model_type`和微调版本号. 方便用户对不同模型进行多次对比实验, 而不需要改变`output_dir`命令行参数. 如果不需要拼接这些内容, 你需要额外指定参数`--add_output_dir_suffix false`.\\n- `--add_output_dir_suffix`: 默认为`True`, 表示会在`output_dir`的目录后拼接上`model_type`和微调版本号的后缀. 如果要避免此行为, 你可以设置为`False`.\\n- `--ddp_backend`: 表示分布式的后端支持, 默认是`None`. 你可以选择的值包括: 'nccl', 'gloo', 'mpi', 'ccl'.\\n- `--ddp_timeout`: DDP timeout. 默认`1800`秒.\\n- `--seed`: 全局的seed, 默认使用`42`. 用于复现训练效果.\\n- `--🔥resume_from_checkpoint`: 用于断点续训, 默认为`None`. 你可以将其设置为checkpoint的路径, 例如: `--resume_from_checkpoint output/qwen-7b-chat/vx-xxx/checkpoint-xxx`, 来进行断点续训. 支持调节`--resume_only_model`在断点续训时只读取模型文件.\\n- `--resume_only_model`: 默认为`False`, 即为严格的断点续训, 这会读取模型、优化器和lr_scheduler的权重和各个设备存储的随机种子, 并将从上次训练暂停的stpes后继续计数进行训练. 如果设置为`True`, 则只读取模型的权重.\\n- `--dtype`: 基模型载入时的torch_dtype, 默认为`'AUTO'`, 即智能选择dtype: 如果机器不支持bf16, 则使用fp16, 如果`MODEL_MAPPING`中对应模型有指定torch_dtype, 则使用其对应dtype, 否则使用bf16. 你可以选择的值包括: 'bf16', 'fp16', 'fp32'.\\n- `--model_kwargs`: 用于传入多模态模型中针对于模型的额外参数, 例如: `'{\\\"hd_num\\\": 16}'`. 你可以传入json字符串或者直接传入字典. 默认为`None`. 除了使用该参数，你也可以通过环境变量传入, 例如: `HD_NUM=16`.\\n- `--🔥dataset`: 用于选择训练的数据集, 默认为`[]`. 可以选择的数据集可以查看[支持的数据集](支持的模型和数据集.md#数据集). 如果需要使用多个数据集进行训练, 你可以使用','或者' '进行分割, 例如: `--dataset alpaca-en,alpaca-zh` or `--dataset alpaca-en alpaca-zh`. 支持Modelscope Hub/HuggingFace Hub/本地路径、subsets选择与数据集采样, 每个数据集指定格式如下: `[HF or MS::]{dataset_name} or {dataset_id} or {dataset_path}[:subset1/subset2/...][#dataset_sample]`, 最简只需要指定dataset_name、dataset_id或者dataset_path即可. 自定义数据集可以查看[数据集的自定义与拓展文档](自定义与拓展.md#自定义数据集).\\n   - 支持MS和HF hub, 以及dataset_sample的支持. e.g. 'MS::alpaca-zh#2000', 'HF::jd-sentiment-zh#2000' (默认使用的hub, 由`USE_UF`环境变量控制, 默认MS).\\n   - 对subsets更细粒度的控制: 默认使用注册时指定的subsets(注册时未指定则使用'default'). e.g. 'sharegpt-gpt4'. 如果指定subsets则使用对应子集的数据集. e.g. 'sharegpt-gpt4:default/V3_format#2000'. 这里使用`default`和`V3_format`子数据集, 使用'/'进行分隔, 并取2000条.\\n   - dataset_id的支持. e.g. 'AI-ModelScope/alpaca-gpt4-data-zh#2000', 'HF::llm-wizard/alpaca-gpt4-data-zh#2000', 'hurner/alpaca-gpt4-data-zh#2000', 'HF::shibing624/alpaca-zh#2000'. 如果dataset_id已经注册，则会使用注册时的预处理函数、subsets、split等. 否则使用`SmartPreprocessor`, 支持5种数据集格式, 并使用'default'的subsets, split设置为'train'. 支持的数据集格式可以查看[数据集的自定义与拓展文档](自定义与拓展.md#自定义数据集).\\n   - dataset_path的支持. e.g. '1.jsonl#5000'. (如果是相对路径，则为相对于运行目录的相对路径).\\n- `--val_dataset`: 用于指定单独的验证集, 格式和`dataset`参数相同, 默认为`[]`. 如果使用本参数, 则`dataset_test_ratio`不再生效.\\n- `--dataset_seed`: 用于指定数据集处理的seed, 默认为`None`, 即指定为全局`seed`. dataset_seed以random_state形式存在, 不影响全局seed.\\n- `--dataset_test_ratio`: 用于指定子数据集切分成训练集和验证集的比例, 默认为`0.01`. 若设置了`--val_dataset`, 则该参数失效.\\n- `--train_dataset_sample`: 对训练集的采样数, 默认是`-1`, 即使用完整的训练集进行训练. 该参数已废弃, 请使用`--dataset {dataset_name}#{dataset_sample}`\\n- `--val_dataset_sample`: 对验证集进行采样, 默认是`None`, 自动选取合适数量的数据集数量进行验证. 如果你指定为`-1`, 则使用完整的验证集进行验证. 该参数已废弃, 验证集数量由`--dataset_test_ratio`或者`--val_dataset {dataset_name}#{dataset_sample}`控制.\\n- `--🔥system`: 对话模板中使用的system, 默认为`None`, 即使用模型默认的system. 如果指定为'', 则不使用system.\\n- `--tools_prompt`: 选择tools字段转化的相应tools system prompt, 可选项为['react_en','react_zh', 'toolbench'], 分别为英文版ReAct格式，中文版ReAct格式和toolbench格式，默认为英文版ReAct格式。如果你想了解更多，可以参考[Agent部署最佳实践](../LLM/Agent部署最佳实践.md)\\n- `--🔥max_length`: token的最大长度, 默认为`2048`. 可以避免个别过长的数据样本造成OOM的问题. 当指定`--truncation_strategy delete`时, 如果某数据样本长度超过max_length, 我们会删除该数据样本. 如果指定`--truncation_strategy truncation_left`时, 我们会切除最前面的token: `input_ids[-max_length:]`. 如果设置为-1, 则无限制.\\n- `--truncation_strategy`: 默认是`'delete'`表示把超过max_length的句子从数据集中删除. `'truncation_left'`表示会将超过文本的左边给切除掉, 这可能会切到special token, 会影响性能, 并不推荐.\\n- `--check_dataset_strategy`: 默认值为`'none'`, 即不做检查. 如果你训练的模型是LLM, 则推荐使用`'warning'`作为数据检查的策略. 如果你的训练目标为句子分类等任务, 则建议设置为'`none`'.\\n- `--custom_train_dataset_path`: 默认值为`[]`. 该参数已废弃, 请使用`--dataset {dataset_path}`.\\n- `--custom_val_dataset_path`: 默认值为`[]`. 该参数已废弃, 该参数已废弃. 请使用`--val_dataset {dataset_path}`.\\n- `--self_cognition_sample`: 自我认知数据集的采样数. 默认为`0`. 你该值设置为>0时, 需要同时指定`--model_name`, `--model_author`. 该参数已废弃, 请使用`--dataset self-cognition#{self_cognition_sample}`.\\n- `--🔥model_name`: 默认为`[None, None]`. 如果开启了自我认知数据集的采样(即指定`--dataset self-cognition`或者self_cognition_sample>0), 你需要传入两个值, 分别代表模型的中文名和英文名. 例如: `--model_name 小黄 'Xiao Huang'`. 如果你想了解更多, 可以查看[自我认知微调最佳实践](../LLM/自我认知微调最佳实践.md).\\n- `--🔥model_author`: 默认为`[None, None]`. 如果开启了自我认知数据集的采样, 你需要传入两个值, 分别代表作者的中文名和英文名. 例如: `--model_author 魔搭 ModelScope`.\\n- `--quant_method`: 量化方法, 默认为`None`. 你可以选择为'bnb', 'hqq', 'eetq'.\\n- `--quantization_bit`: 用于指定是否进行量化和量化的bit数, 默认为`0`, 即不进行量化. 如果要使用4bit qlora, 你需要设置`--sft_type lora --quantization_bit 4`\\n- `--hqq_axis`: hqq量化参数，表示执行分组的所沿的轴，默认为`0`, 可选值包括`0`,`1`\\n- `--hqq_dynamic_config_path`: hqq本地配置路径，支持对模型不同层配置不同的量化配置，[参考](https://github.com/mobiusml/hqq?tab=readme-ov-file#custom-quantization-configurations-%EF%B8%8F)\\n- `--bnb_4bit_comp_dtype`: 在进行4bit量化时, 我们需要在模型的forward和backward时, 将其进行反量化. 该参数用于指定反量化后的torch_dtype. 默认为`'AUTO'`, 即与`dtype`保持一致. 可选择的值包括: 'fp16', 'bf16', 'fp32'. 当quantization_bit为0时, 该参数无效.\\n- `--bnb_4bit_quant_type`: 4bit量化时的量化方式, 默认是`'nf4'`. 可选择的值包括: 'nf4', 'fp4'. 当quantization_bit为0时, 该参数无效.\\n- `--bnb_4bit_use_double_quant`: 是否在4bit量化时开启double量化, 默认为`True`. 当quantization_bit为0时, 该参数无效.\\n- `--bnb_4bit_quant_storage`: 默认值为`None`. 量化参数的存储类型. 若`quantization_bit`设置为0, 则该参数失效.\\n- `--🔥target_modules`: 指定lora模块, 默认为`['DEFAULT']`. 如果target_modules传入`'DEFAULT'` or `'AUTO'`, 则根据`model_type`查找`MODEL_MAPPING`中的`target_modules`(LLM默认指定为qkv, MLLM默认为llm和projector中所有的linear). 如果传入`'ALL'`, 则将所有的Linear层(不含head)指定为lora模块. 如果传入`'EMBEDDING'`, 则Embedding层指定为lora模块. 如果内存允许, 建议设置成'ALL'. 当然, 你也可以设置`['ALL', 'EMBEDDING']`, 将所有的Linear和embedding层指定为lora模块. 该参数在使用lora/vera/boft/ia3/adalora/fourierft时生效.\\n- `--target_regex`: 指定lora模块的regex表达式, `Optional[str]`类型. 默认为`None`, 如果该值传入, 则target_modules不生效.该参数在使用lora/vera/boft/ia3/adalora/fourierft时生效.\\n- `--🔥lora_rank`: 默认为`8`. 只有当`sft_type`指定为'lora'时才生效.\\n- `--🔥lora_alpha`: 默认为`32`. 只有当`sft_type`指定为'lora'时才生效.\\n- `--lora_dropout`: 默认为`0.05`, 只有当`sft_type`指定为'lora'时才生效.\\n- `--init_lora_weights`: 初始化LoRA weights的方法, 可以指定为`true`, `false`, `guassian`, `pissa`, `pissa_niter_[number of iters]`, 默认值`true`.\\n- `--lora_bias_trainable`: 默认为`'none'`, 可以选择的值: 'none', 'all'. 如果你要将bias全都设置为可训练, 你可以设置为`'all'`.\\n- `--modules_to_save`: 默认为`[]`. 如果你想要训练embedding, lm_head, 或者layer_norm, 你可以设置此参数, 例如: `--modules_to_save EMBEDDING LN lm_head`. 如果传入`'EMBEDDING'`, 则将Embedding层添加到`modules_to_save`. 如果传入`'LN'`, 则将`RMSNorm`和`LayerNorm`添加到`modules_to_save`.该参数在使用lora/vera/boft/ia3/adalora/fourierft时生效.\\n- `--lora_dtype`: 默认为`'AUTO'`, 指定lora模块的dtype类型. 如果是`AUTO`则跟随原始模块的dtype类型. 你可以选择的值: 'fp16', 'bf16', 'fp32', 'AUTO'.\\n- `--use_dora`: 默认为`False`, 是否使用`DoRA`.\\n- `--use_rslora`: 默认为`False`, 是否使用`RS-LoRA`.\\n- `--neftune_noise_alpha`: `NEFTune`添加的噪声系数, 可以提升模型在指令微调中的性能, 默认为`None`. 通常可以设置为5, 10, 15. 你可以查看[相关论文](https://arxiv.org/abs/2310.05914).\\n- `--neftune_backend`: `NEFTune`的backend，支持`transformers`和`swift`两种, 默认使用`transformers`库.\\n- `--🔥gradient_checkpointing`: 是否开启gradient checkpointing, 默认为`True`. 该参数可以用于节约显存, 虽然这会略微降低训练速度. 该参数在max_length较大, batch_size较大时作用显著.\\n- `--🔥deepspeed`: 用于指定deepspeed的配置文件的路径或者直接传入json格式的配置信息, 默认为`None`, 即不开启deepspeed. deepspeed可以节约显存. 我们书写了默认的[ZeRO-2配置文件](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero2.json), [ZeRO-3配置文件](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero3.json), [ZeRO-2 Offload配置文件](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero2_offload.json)和[ZeRO-3 Offload配置文件](https://github.com/modelscope/swift/blob/main/swift/llm/ds_config/zero3_offload.json). 你只需要指定'default-zero2', 'default-zero3', 'zero2-offload', 'zero3-offload'即可.\\n- `--batch_size`: 训练时的batch_size, 默认为`1`. 增大batch_size可以增加GPU的利用率, 但不一定会增加训练速度, 因为在一个batch中, 需要对较短的句子按该batch中最长句子的长度进行padding, 从而引入无效的计算量.\\n- `--eval_batch_size`: 评估时的batch_size, 默认为`None`, 即当`predict_with_generate`为True时, 设置为1, 为False时, 设置为`batch_size`.\\n- `--🔥num_train_epochs`: 训练的epoch数, 默认为`1`. 如果`max_steps >= 0`, 则覆盖`num_train_epochs`. 你可以设置为3, 5, 10等.\\n- `--max_steps`: 训练的max_steps数, 默认为`-1`. 如果`max_steps >= 0`, 则覆盖`num_train_epochs`.\\n- `--optim`: 默认为`'adamw_torch'`.\\n- `--adam_beta1`: 默认为`0.9`.\\n- `--adam_beta2`: 默认为`0.95`.\\n- `--adam_epsilon`: 默认为`1e-8`.\\n- `--🔥learning_rate`: 默认值为`None`, 即如果`sft_type`为lora, 则设置为1e-4, 如果`sft_type`为full, 则设置为1e-5.\\n- `--weight_decay`: 默认值为`0.1`.\\n- `--🔥gradient_accumulation_steps`: 梯度累加, 默认值为`None`, 设置为`math.ceil(16 / self.batch_size / world_size)`. `total_batch_size =  batch_size * gradient_accumulation_steps * world_size`.\\n- `--max_grad_norm`: 梯度裁剪, 默认值为`1`.\\n- `--predict_with_generate`: 评估时是否使用生成式的方式, 默认为`False`. 如果设置为False, 则使用`loss`进行评估. 如果设置为True, 则使用`ROUGE-L`等指标进行评估. 使用生成式评估耗费的时间很长, 请谨慎选择.\\n- `--lr_scheduler_type`: 默认值为`'cosine'`, 你可以选择: 'linear', 'cosine', 'constant'等.\\n- `--warmup_ratio`: warmup占用总的训练steps的比例, 默认为`0.05`.\\n- `--warmup_steps`: warmup的步数, 默认为`0`. 如果设置`warmup_steps>0`, 则覆盖warmup_ratio.\\n- `--🔥eval_steps`: 每训练多少steps进行评估, 默认为`50`.\\n- `--save_steps`: 每训练多少个steps进行保存, 默认为`None`, 即设置为`eval_steps`.\\n- `--🔥save_only_model`: 是否只保存模型参数, 而不存储断点续训所需的中间状态, 默认为`False`.\\n- `--save_total_limit`: 保存的checkpoint的数量, 默认为`2`, 即保存best和last的checkpoint. 如果设置为-1, 则保存所有的checkpoint.\\n- `--logging_steps`: 每训练多少步打印训练信息(e.g. loss, learning_rate等), 默认为`5`.\\n- `--dataloader_num_workers`: 默认值为`None`, 如果是windows机器, 则设置为`0`, 否则设置为`1`.\\n- `--push_to_hub`: 是否将训练的checkpoint同步推送到ModelScope Hub中, 默认为`False`.\\n- `--hub_model_id`: 推送到的ModelScope Hub的model_id, 默认为`None`, 即设置为`f'{model_type}-{sft_type}'`. 你可以将其设置为model_id, 也可以设置为repo_name. 我们会根据hub_token推断出user_name. 推送的远程仓库如果不存在, 则会创建一个新的仓库, 如果存在, 则复用之前的仓库. 该参数只有在`push_to_hub`设置为True时才生效.\\n- `--hub_token`: 推送时需要的SDK token. 可以从[https://modelscope.cn/my/myaccesstoken](https://modelscope.cn/my/myaccesstoken)获取, 默认为`None`, 即从环境变量`MODELSCOPE_API_TOKEN`中获取. 该参数只有在`push_to_hub`设置为True时才生效.\\n- `--hub_private_repo`: 推送的ModelScope Hub中的模型仓库的权限是否设置为私有, 默认为`False`. 该参数只有在`push_to_hub`设置为True时才生效.\\n- `--hub_strategy`: 推送策略, 默认为`'every_save'`. 可选择的值包括: 'end', 'every_save', 'checkpoint', 'all_checkpoints'. 该参数从transformers透传而来, 只有在`push_to_hub`设置为True时才生效.\\n- `--test_oom_error`: 用于检测训练是否会发生OOM, 默认为`False`. 如果设置为True, 则会将训练集按max_length倒序进行排列, 方便OOM的测试. 该参数一般用于测试, 请谨慎设置.\\n- `--disable_tqdm`: 是否不启用tqdm, 这在`nohup`启动脚本时很有用. 默认为`False`, 即为启动tqdm.\\n- `--🔥lazy_tokenize`: 如果设置为False,  则在`trainer.train()`之前提前对所有文本进行预处理. 如果设置为True, 则延迟对文本进行编码, 减少预处理的等待并减少内存占用, 这在处理大数据集时很有用. 默认为`None`, 即我们会根据template的类型进行智能选择, LLM的模型通常设置为False, 多模态的模型通常设置为True(避免图片和音频加载导致过多的内存占用).\\n- `--🔥preprocess_num_proc`: 在对数据集预处理时(对文本进行tokenize), 使用多进程. 默认为`1`. 与`lazy_tokenize`命令行参数一样, 用于解决预处理速度慢的问题. 但该策略无法减少内存占用, 所以如果当数据集巨大时, 建议使用`lazy_tokenize`. 推荐设置的值: 4, 8.\\n- `--🔥use_flash_attn`: 是否使用flash attn, 默认为`None`. 安装flash_attn的步骤可以查看[https://github.com/Dao-AILab/flash-attention](https://github.com/Dao-AILab/flash-attention). 支持flash_attn的模型可以查看[LLM支持的模型](支持的模型和数据集.md#模型).\\n- `--ignore_args_error`: 是否忽略命令行传参错误抛出的Error, 默认为`False`. 如果需要拷贝代码到notebook中运行, 需要设置成True.\\n- `--🔥check_model_is_latest`: 检查模型是否是最新, 默认为`True`. 如果你需要断网进行训练, 请将该参数设置为`False`.\\n- `--logging_dir`: 默认为`None`. 即设置为`f'{self.output_dir}/runs'`, 表示tensorboard文件存储路径.\\n- `--report_to`: 默认为`['tensorboard']`. 可以设置`--report_to all`来报告所有已安装的集成.\\n- `--acc_strategy`: 默认为`'token'`, 可选择的值包括: 'token', 'sentence'.\\n- `--save_on_each_node`: 该参数在多机训练时生效, 默认为`False`.\\n- `--save_strategy`: 保存checkpoint的策略, 默认为`'steps'`, 可选择的值包括: 'steps', 'epoch', 'no'.\\n- `--evaluation_strategy`: 交叉验证策略, 默认为`'steps'`, 可选择的值包括: 'steps', 'epoch', 'no'.\\n- `--save_safetensors`: 默认为`True`.\\n- `--include_num_input_tokens_seen`: 默认为`False`. 跟踪整个训练过程中观察到的输入tokens的数量.\\n- `--max_new_tokens`: 默认为`2048`. 该参数只有在`predict_with_generate`设置为True的时候才生效.\\n- `--do_sample`: 参考文档: [https://huggingface.co/docs/transformers/main_classes/text_generation](https://huggingface.co/docs/transformers/main_classes/text_generation). 默认为`None`, 继承模型的generation_config. 该参数只有在`predict_with_generate`设置为True的时候才生效.\\n- `--temperature`: 默认为`None`, 继承模型的generation_config. 该参数只有在`predict_with_generate`设置为True的时候才生效.\\n- `--top_k`: 默认为`None`, 继承模型的generation_config. 该参数只有在`predict_with_generate`设置为True的时候才生效.\\n- `--top_p`: 默认为`None`, 继承模型的generation_config. 该参数只有在`predict_with_generate`设置为True的时候才生效.\\n- `--repetition_penalty`: 默认为`None`, 继承模型的generation_config. 该参数只有在`predict_with_generate`设置为True的时候才生效.\\n- `--num_beams`: 默认为`1`. 该参数只有在`predict_with_generate`设置为True的时候才生效.\\n- `--gpu_memory_fraction`: 默认为`None`. 该参数旨在指定显卡最大可用显存比例的情况下运行训练，用于极限测试.\\n- `--train_dataset_mix_ratio`: 默认为`0.`. 该参数定义了如何进行数据集打混训练. 指定该参数时, 会混合训练集的`train_dataset_mix_ratio`倍数的`train_dataset_mix_ds`指定的通用知识数据集. 该参数已废弃, 请使用`--dataset`进行数据集混合.\\n- `--train_dataset_mix_ds`: 默认为`['ms-bench']`. 用于防止知识遗忘的通用知识数据集. 该参数已废弃, 请使用`--dataset`进行数据集混合.\\n- `--use_loss_scale`: 默认为`False`. 生效时会将Agent的部分字段(Action/Action Input部分)的loss权重加强以强化CoT, 对普通SFT场景没有任何效果.\\n- `--loss_scale_config_path` 选项指定自定义的 loss_scale 配置，适用于在启用 use_loss_scale 时，例如在 Agent 训练中放大 Action 和其他关键 ReAct 字段的损失权重。\\n  - 在配置文件中，您可以使用字典格式来设置 loss_scale。每个键代表一个特定字段名，其关联的值设定了该字段及其后续内容的损失缩放倍数。例如，通过设定 `\\\"Observation:\\\": [2, 0]`，当response包含 `xxxx Observation:error` 时，`Observation:` 字段loss将增加到两倍，`error` 部分的loss则不计入。除了字面匹配，配置也支持正则表达式规则，以实现更灵活的匹配，如模式 '<.*?>':[2.0] 将针对所有尖括号括起来的部分损失增加到两倍。字段匹配与正则匹配所对应的损失缩放倍数，分别由长度为2和1的列表表示。\\n  - 同时支持匹配query对整段response设置loss_scale, 这在处理像[Agent-FLAN](https://arxiv.org/abs/2403.12881)论文中描述的固定多轮对话查询时极其有用，如果query中包含了预定义键的任一项，相应的响应将采用关联的 loss_scale 值。，你可以参考`swift/llm/agent/agentflan.json`\\n  - 默认情况下，我们为 Action:, Action Input:, Thought:, Final Answer:, 和 Observation: 等字段预设了损失缩放值。我们为[alpha-umi](https://arxiv.org/pdf/2401.07324)和[Agent-FLAN](https://arxiv.org/abs/2403.12881)也提供了默认配置，你可以设置为`alpha-umi`和`agent-flan`来使用。默认的配置文件位于`swift/llm/agent`下\\n  - 匹配规则的应用优先级，从高到低为：query字段 > response特定字段 > 正则表达式匹配规则。\\n- `--custom_register_path`: 默认为`None`. 传入`.py`文件, 用于注册模板、模型和数据集.\\n- `--custom_dataset_info`: 默认为`None`, 传入外置dataset_info.json的路径、json字符串或者dict. 用于拓展数据集. 格式参考: https://github.com/modelscope/swift/blob/main/swift/llm/data/dataset_info.json\\n- `--device_map_config`: 手动配置模型的device_map, 默认为`None`. 你可以传入本地路径(.json), json字符串或者dict.\\n- `--device_max_memory`: 每个设备device_map的最大可用显存, `List`, 默认为`[]`, 传递的值数量必须和可见显卡数量相等. 比如`10GB 10GB`.\\n\\n### Long Context\\n\\n- `--rope_scaling`: 默认值`None`, 支持`linear`和`dynamic`两种scaling方式.当`max_length`超过`max_position_embeddings`时使用.\\n- `--rescale_image`: 是否对输入image进行rescale, 值为目标像素数, 例如480000(width * height), 所有大于此像素的图片会按照原始长宽比被缩放到这个值. 注意：并不是所有多模态模型都可以从这个参数中获益。\\n\\n### FSDP参数\\n\\n- `--fsdp`: 默认值`''`, fsdp类型, 详情可以查看该参数[原始文档](https://huggingface.co/docs/transformers/v4.39.3/en/main_classes/trainer#transformers.TrainingArguments.fsdp).\\n- `--fsdp_config`: 默认值`None`, fsdp配置文件的路径.\\n\\n### Sequence Parallel参数\\n\\n- `--sequence_parallel_size`: 默认值`1`, 大于1时可以拆分一个sequence到多张显卡上以节省显存, 值需要设置为能被DDP数量整除\\n\\n### FourierFt 参数\\n\\nFourierFt使用`target_modules`, `target_regex`, `modules_to_save`三个参数.\\n\\n- `--fourier_n_frequency`: 傅里叶变换的频率数量, `int`类型, 类似于LoRA中的`r`. 默认值`2000`.\\n- `--fourier_scaling`: W矩阵的缩放值, `float`类型, 类似LoRA中的`lora_alpha`. 默认值`300.0`.\\n\\n### BOFT参数\\n\\nBOFT使用`target_modules`, `target_regex`, `modules_to_save`三个参数.\\n\\n- `--boft_block_size`: BOFT块尺寸, 默认值4.\\n- `--boft_block_num`: BOFT块数量, 不能和`boft_block_size`同时使用.\\n- `--boft_dropout`: boft的dropout值, 默认0.0.\\n\\n### Vera参数\\n\\nVera使用`target_modules`, `target_regex`, `modules_to_save`三个参数.\\n\\n- `--vera_rank`: Vera Attention的尺寸, 默认值256.\\n- `--vera_projection_prng_key`: 是否存储Vera映射矩阵, 默认为True.\\n- `--vera_dropout`: Vera的dropout值, 默认`0.0`.\\n- `--vera_d_initial`: Vera的d矩阵的初始值, 默认`0.1`.\\n\\n### LoRA+微调参数\\n\\n- `--lora_lr_ratio`: 默认值`None`, 建议值`10~16`, 使用lora时指定该参数即可使用lora+.\\n\\n### GaLore微调参数\\n\\n- `--use_galore: bool` : 默认值False, 是否使用GaLore.\\n- `--galore_target_modules: Union[str, List[str]]` : 默认值None, 不传的情况下对attention和mlp应用GaLore.\\n- `--galore_rank: int` : 默认值128, GaLore的rank值.\\n- `--galore_update_proj_gap: int` : 默认值50, 分解矩阵的更新间隔.\\n- `--galore_scale: int` : 默认值1.0, 矩阵权重系数.\\n- `--galore_proj_type: str` : 默认值`std`, GaLore矩阵分解类型.\\n- `--galore_optim_per_parameter: bool` : 默认值False, 是否给每个Galore目标Parameter设定一个单独的optimizer.\\n- `--galore_with_embedding: bool` : 默认值False, 是否对embedding应用GaLore.\\n- `--galore_quantization` 是否使用q-galore. 默认值`False`.\\n- `--galore_proj_quant`: 是否对SVD分解矩阵做量化, 默认`False`.\\n- `--galore_proj_bits`: SVD量化bit数.\\n- `--galore_proj_group_size`: SVD量化分组数.\\n- `--galore_cos_threshold`: 投影矩阵更新的cos相似度阈值. 默认值0.4.\\n- `--galore_gamma_proj`: 在投影矩阵逐渐相似后会拉长更新间隔, 本参数为每次拉长间隔的系数, 默认值2.\\n- `--galore_queue_size`: 计算投影矩阵相似度的队列长度, 默认值5.\\n\\n### LISA微调参数\\n\\n注意：LISA仅支持全参数，即`--sft_type full`.\\n\\n- `--lisa_activated_layers`: 默认值`0`, 代表不使用LISA，改为非0代表需要激活的layers个数，建议设置为2或8.\\n- `--lisa_step_interval`: 默认值`20`, 多少iter切换可反向传播的layers.\\n\\n### UNSLOTH微调参数\\n\\nunsloth无新增参数，对已有参数进行调节即可支持：\\n\\n```\\n--tuner_backend unsloth\\n--sft_type full/lora\\n--quantization_type 4\\n```\\n\\n### LLAMAPRO微调参数\\n\\n- `--llamapro_num_new_blocks`: 默认值`4`, 插入的新layers总数.\\n- `--llamapro_num_groups`: 默认值`None`, 分为多少组插入new_blocks, 如果为`None`则等于`llamapro_num_new_blocks`, 即每个新的layer单独插入原模型.\\n\\n### AdaLoRA微调参数\\n\\n以下参数`sft_type`设置为`adalora`时生效. adalora的`target_modules`等参数继承于lora的对应参数, 但`lora_dtype`参数不生效.\\n\\n- `--adalora_target_r`: 默认值`8`, adalora的平均rank.\\n- `--adalora_init_r`: 默认值`12`, adalora的初始rank.\\n- `--adalora_tinit`: 默认值`0`, adalora的初始warmup.\\n- `--adalora_tfinal`: 默认值`0`, adalora的final warmup.\\n- `--adalora_deltaT`: 默认值`1`, adalora的step间隔.\\n- `--adalora_beta1`: 默认值`0.85`, adalora的EMA参数.\\n- `--adalora_beta2`: 默认值`0.85`, adalora的EMA参数.\\n- `--adalora_orth_reg_weight`: 默认值`0.5`, adalora的正则化参数.\\n\\n### IA3微调参数\\n\\nIA3使用`target_modules`, `target_regex`, `modules_to_save`三个参数.\\n\\n以下参数`sft_type`设置为`ia3`时生效.\\n\\n- `--ia3_feedforward_modules`: 指定IA3的MLP的Linear名称, 该名称必须在`ia3_target_modules`中.\\n\\n### ReFT微调参数\\n\\n以下参数`sft_type`设置为`reft`时生效.\\n\\n> 1. ReFT无法合并tuner\\n> 2. ReFT和gradient_checkpointing不兼容\\n> 3. 如果使用DeepSpeed遇到问题请暂时卸载DeepSpeed\\n\\n- `--reft_layers`: ReFT应用于哪些层上, 默认为`None`, 代表所有层, 可以输入层号的list, 例如`--reft_layers 1 2 3 4`\\n- `--reft_rank`: ReFT矩阵的rank, 默认为`4`.\\n- `--reft_intervention_type`: ReFT的类型, 支持'NoreftIntervention', 'LoreftIntervention', 'ConsreftIntervention', 'LobireftIntervention', 'DireftIntervention', 'NodireftIntervention', 默认为`LoreftIntervention`.\\n- `--reft_args`: ReFT Intervention中的其他支持参数, 以json-string格式输入.\\n\\n### Liger微调参数\\n\\n- `--use_liger`: 使用liger-kernel进行训练.\\n\\n## PT 参数\\n\\nPT参数继承了sft参数，并修改了部分默认值.\\n- `--sft_type`: 默认值为`'full'`.\\n- `--target_modules`: 默认值为`'ALL'`.\\n- `--lazy_tokenize`: 默认值为`True`.\\n- `--eval_steps`: 默认值为`500`.\\n\\n## RLHF 参数\\n\\nRLHF参数继承了sft参数, 除此之外增加了以下参数:\\n- `--🔥rlhf_type`: 选择对齐算法，可选项为'dpo', 'orpo', 'simpo', 'kto', 'cpo', 默认为`'dpo'`. 训练脚本请查看[文档](../LLM/人类偏好对齐训练文档.md)\\n- `--ref_model_type`: 选择参考模型, 同model_type参数, 默认为`None`, 与训练模型一致。其中`cpo`, `simpo`, `orpo`算法无需选择。通常不需要设置。\\n- `--ref_model_id_or_path`: 参考模型的本地cache路径, 默认为`None`.\\n- `--beta`: KL正则项系数, 默认为`None`, 即`simpo`算法默认为`2.`, 其他算法默认为`0.1`. 具体参考[文档](../LLM/人类偏好对齐训练文档.md)\\n- `--label_smoothing`: 是否使用DPO smoothing, 默认值为`0`，一般设置在0~0.5之间.\\n- `--loss_type`: loss类型, 默认为`None`, 如果是dpo, cpo则为`sigmoid`, 如果是simpo则为`simpo`.\\n- `--🔥rpo_alpha`: 控制DPO中加入sft_loss的权重, 默认为`1`. 最后的loss为`KL_loss + rpo_alpha * sft_loss`.\\n- `--cpo_alpha`: CPO/SimPO loss 中 nll loss的系数, 默认为`1.`.\\n- `--simpo_gamma`: SimPO算法中的reward margin项，论文中建议设置为0.5-1.5, 默认为`1.`\\n- `--desirable_weight`: KTO算法中对desirable response的loss权重 $\\\\lambda_D$ ，默认为`1.`\\n- `--undesirable_weight`: KTO论文中对undesirable response的loss权重 $\\\\lambda_U$ , 默认为`1.`. 分别用$n_d$ 和$n_u$ 表示数据集中desirable examples和undesirable examples的数量，论文中推荐控制 $\\\\frac{\\\\lambda_D n_D}{\\\\lambda_Un_U} \\\\in [1,\\\\frac{4}{3}]$\\n\\n## infer merge-lora 参数\\n\\n- `--🔥model_type`: 默认值为`None`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--🔥model_id_or_path`: 默认值为`None`, 具体的参数介绍可以在`sft命令行参数`中查看. 推荐使用model_type的方式指定.\\n- `--model_revision`: 默认值为`None`. 具体的参数介绍可以在`sft命令行参数`中查看. 如果`model_id_or_path`为None或者是本地的模型目录, 则该参数失效.\\n- `--🔥sft_type`: 默认值为`'lora'`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--🔥template_type`: 默认值为`'AUTO'`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--🔥infer_backend`: 你可以选择'AUTO', 'vllm', 'pt'. 默认使用'AUTO', 进行智能选择, 即如果没有传入`ckpt_dir`或使用全参数微调, 并且安装了vllm且模型支持vllm则使用vllm引擎, 否则使用原生torch进行推理. vllm环境准备可以参考[VLLM推理加速与部署](VLLM推理加速与部署.md#环境准备), vllm支持的模型可以查看[支持的模型](../Instruction/支持的模型和数据集.md#模型).\\n- `--🔥ckpt_dir`: 必填项, 值为SFT阶段保存的checkpoint路径, e.g. `'/path/to/your/vx-xxx/checkpoint-xxx'`.\\n- `--load_args_from_ckpt_dir`: 是否从`ckpt_dir`的`sft_args.json`文件中读取模型配置信息. 默认是`True`.\\n- `--🔥load_dataset_config`: 该参数只有在`--load_args_from_ckpt_dir true`时才生效. 即是否从`ckpt_dir`的`sft_args.json`文件中读取数据集相关的配置信息. 默认为`False`.\\n- `--eval_human`: 使用数据集中的验证集部分进行评估还是使用人工的方式评估. 默认值为`None`, 进行智能选择,  如果没有任何数据集(含自定义数据集)传入, 则会使用人工评估的方式. 如果有数据集传入, 则会使用数据集方式评估.\\n- `--device_map_config`: 默认值为`None`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--device_max_memory`: 默认值为`[]`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--seed`: 默认值为`42`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--dtype`: 默认值为`'AUTO`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--model_kwargs`: 默认值为`'None`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--🔥dataset`: 默认值为`[]`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--🔥val_dataset`: 默认为`[]`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--dataset_seed`: 默认值为`None`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--dataset_test_ratio`: 默认值为`0.01`. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--🔥show_dataset_sample`: 表示想要评估和展示的验证集的数量, 默认值为`-1`.\\n- `--system`: 默认值为`None`. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--tools_prompt`: 默认值为`react_en`. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--max_length`: 默认值为`-1`. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--truncation_strategy`: 默认是`'delete'`. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--check_dataset_strategy`: 默认值为`'none'`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--custom_train_dataset_path`: 默认值为`[]`. 该参数已废弃, 请使用`--dataset {dataset_path}`.\\n- `--custom_val_dataset_path`: 默认值为`[]`. 该参数已废弃. 请使用`--val_dataset {dataset_path}`.\\n- `--quantization_bit`: 默认值为0. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--quant_method`: 量化方法, 默认为`None`. 你可以选择为'bnb', 'hqq', 'eetq'.\\n- `--hqq_axis`: hqq量化参数，表示执行分组的所沿的轴，默认为`0`, 可选值包括`0`,`1`\\n- `--hqq_dynamic_config_path`: hqq本地配置路径，支持对模型不同层配置不同的量化配置，[参考](https://github.com/mobiusml/hqq?tab=readme-ov-file#custom-quantization-configurations-%EF%B8%8F)\\n- `--bnb_4bit_comp_dtype`: 默认值为`'AUTO'`.  具体的参数介绍可以在`sft命令行参数`中查看. 若`quantization_bit`设置为0, 则该参数失效.\\n- `--bnb_4bit_quant_type`: 默认值为`'nf4'`.  具体的参数介绍可以在`sft命令行参数`中查看. 若`quantization_bit`设置为0, 则该参数失效.\\n- `--bnb_4bit_use_double_quant`: 默认值为`True`.  具体的参数介绍可以在`sft命令行参数`中查看. 若`quantization_bit`设置为0, 则该参数失效.\\n- `--bnb_4bit_quant_storage`: 默认值为`True`. 具体的参数介绍可以在`sft命令行参数`中查看. 若`quantization_bit`设置为0, 则该参数失效.\\n- `--🔥max_new_tokens`: 生成新token的最大数量, 默认值为`2048`.\\n- `--🔥do_sample`: 参考文档: [https://huggingface.co/docs/transformers/main_classes/text_generation](https://huggingface.co/docs/transformers/main_classes/text_generation). 默认值为`None`, 继承模型的generation_config.\\n- `--temperature`: 默认值为`None`, 继承模型的generation_config. 该参数只有在`do_sample`设置为True时才生效. 该参数会在部署参数中作为默认值使用.\\n- `--top_k`: 默认值为`None`, 继承模型的generation_config. 该参数只有在`do_sample`设置为True时才生效. 该参数会在部署参数中作为默认值使用.\\n- `--top_p`: 默认值为`None`, 继承模型的generation_config. 该参数只有在`do_sample`设置为True时才生效. 该参数会在部署参数中作为默认值使用.\\n- `--repetition_penalty`: 默认值为`None`, 继承模型的generation_config. 该参数会在部署参数中作为默认值使用.\\n- `--num_beams`: 默认为`1`.\\n- `--use_flash_attn`: 默认值为`None`, 即为'auto'. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--ignore_args_error`: 默认值为`False`, 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--stream`: 是否使用流式输出, 默认为`True`. 该参数只有在使用数据集评估并且verbose为True时才生效.\\n- `--🔥merge_lora`: 是否将lora权重merge到基模型中, 并保存完整的权重, 默认为`False`. 权重会保存在`ckpt_dir`的同级目录中, e.g. `'/path/to/your/vx-xxx/checkpoint-xxx-merged'`目录下.\\n- `--merge_device_map`: merge-lora时使用的device_map, 默认为`None`, 为减少显存占用, 在仅有merge-lora过程时使用`auto`，其他情况默认使用`cpu`.\\n- `--save_safetensors`: 保存成`safetensors`文件还是`bin`文件. 默认为`True`.\\n- `--overwrite_generation_config`: 是否将评估所使用的generation_config保存成`generation_config.json`文件, 默认为`False`.\\n- `--🔥verbose`: 如果设置为False, 则使用tqdm样式推理. 如果设置为True, 则输出推理的query, response, label. 默认为`None`, 进行自动选择, 即`len(val_dataset) >= 100`时, 设置为False, 否则设置为True. 该参数只有在使用数据集评估时生效.\\n- `--lora_modules`: 默认为`[]`, 输入的格式为`'{lora_name}={lora_path}'`, e.g. `--lora_modules lora_name1=lora_path1 lora_name2=lora_path2`. `ckpt_dir`会以`f'default-lora={args.ckpt_dir}'`的形式加入args.lora_modules.\\n- `--custom_register_path`: 默认为`None`. 传入`.py`文件, 用于注册模板、模型和数据集.\\n- `--custom_dataset_info`: 默认为`None`, 传入外置dataset_info.json的路径、json字符串或者dict. 用于拓展数据集.\\n- `--rope_scaling`: 默认值`None`, 支持`linear`和`dynamic`两种scaling方式, 当`max_length`超过`max_position_embeddings`时使用. 需要同时指定`--max_length`参数.\\n\\n### vLLM 参数\\n参考文档: [https://docs.vllm.ai/en/latest/models/engine_args.html](https://docs.vllm.ai/en/latest/models/engine_args.html)\\n\\n- `--🔥gpu_memory_utilization`: 初始化vllm引擎`EngineArgs`的参数, 默认为`0.9`. 该参数只有在使用vllm时才生效. VLLM推理加速和部署可以查看[VLLM推理加速与部署](../LLM/VLLM推理加速与部署.md).\\n- `--🔥tensor_parallel_size`: 初始化vllm引擎`EngineArgs`的参数, 默认为`1`. 该参数只有在使用vllm时才生效.\\n- `--max_num_seqs`: 初始化vllm引擎`EngineArgs`的参数, 默认为`256`. 该参数只有在使用vllm时才生效.\\n- `--🔥max_model_len`: 覆盖模型的max_model_len, 默认为`None`. 该参数只有在使用vllm时才生效.\\n- `--disable_custom_all_reduce`: 是否禁用自定义的all-reduce kernel, 而回退到NCCL. 默认为`True`, 这与vLLM的默认值不同.\\n- `--enforce_eager`: vllm使用pytorch eager模式还是建立cuda graph. 默认为`False`. 设置为True可以节约显存, 但会影响效率.\\n- `--limit_mm_per_prompt`: 控制vllm使用多图, 默认为`None`. 例如传入`--limit_mm_per_prompt '{\\\"image\\\": 10, \\\"video\\\": 5}'`.\\n- `--vllm_enable_lora`: 默认为`False`. 是否开启vllm对lora的支持. 具体可以查看[VLLM & LoRA](../LLM/VLLM推理加速与部署.md#vllm--lora).\\n- `--vllm_max_lora_rank`: 默认为`16`. vllm对于lora支持的参数.\\n- `--lora_modules`: 已介绍.\\n\\n### lmdeploy 参数\\n参考文档: [https://lmdeploy.readthedocs.io/en/latest/api/pipeline.html#turbomindengineconfig](https://lmdeploy.readthedocs.io/en/latest/api/pipeline.html#turbomindengineconfig)\\n\\n- `--🔥tp`: tensor并行, 用于初始化lmdeploy引擎的参数, 默认值为`1`.\\n- `--cache_max_entry_count`: 初始化lmdeploy引擎的参数, 默认值为`0.8`.\\n- `--quant_policy`: Key-Value Cache量化, 初始化lmdeploy引擎的参数, 默认值为`0`, 你可以设置为4, 8.\\n- `--vision_batch_size`: 初始化lmdeploy引擎的参数, 默认值为`1`. 该参数只有在使用多模态模型时生效.\\n\\n\\n## export 参数\\n\\nexport参数继承了infer参数, 除此之外增加了以下参数:\\n\\n- `--to_peft_format`: 默认为`False`. 将lora的swift format（`--tuner_backend swift`）转成peft format.\\n- `--🔥merge_lora`: 默认为`False`. 该参数已在InferArguments中定义, 不属于新增参数. 是否将lora权重merge到基模型中, 并保存完整的权重. 权重会保存在`ckpt_dir`的同级目录中, e.g. `'/path/to/your/vx-xxx/checkpoint-xxx-merged'`目录下.\\n- `--🔥quant_bits`: 量化的bits数. 默认为`0`, 即不进行量化. 如果你设置了`--quant_method awq`, 你可以设置为`4`进行4bits量化. 如果你设置了`--quant_method gptq`, 你可以设置为`2`,`3`,`4`,`8`进行对应bits的量化. 如果对原始模型进行量化, 权重会保存在`f'{args.model_type}-{args.quant_method}-int{args.quant_bits}'`目录中. 如果对微调后模型进行量化, 权重会保存在`ckpt_dir`的同级目录中, e.g. `f'/path/to/your/vx-xxx/checkpoint-xxx-{args.quant_method}-int{args.quant_bits}'`目录下.\\n- `--🔥quant_method`: 量化方法, 默认为`'awq'`. 你可以选择为'awq', 'gptq', 'bnb'.\\n- `--🔥dataset`: 该参数已在InferArguments中定义, 在export时含义为量化数据集. 默认为`[]`. 更多细节: 包括如何自定义量化数据集, 可以参考[LLM量化与导出文档](LLM量化与导出文档.md).\\n- `--quant_n_samples`: 量化参数, 默认为`256`. 当设置为`--quant_method awq`时, 如果出现量化的时候OOM, 可以适度降低`--quant_n_samples`和`--quant_seqlen`. `--quant_method gptq`通常不会出现量化OOM.\\n- `--quant_seqlen`: 量化参数, 默认为`2048`.\\n- `--quant_batch_size`: 量化数据集的batch_size，默认为`1`.\\n- `--quant_device_map`: 默认为`None`. 你可以指定为'cuda:0', 'auto', 'cpu'等, 表示量化时模型导入的设备.\\n- `--quant_output_dir`: 默认为`None`, 默认的quant_output_dir会被打印在命令行中.\\n- `--push_to_hub`: 默认为`False`. 是否将最后的`ckpt_dir`push到ModelScope Hub中. 如果你指定了`merge_lora`, 则将推送全量参数; 如果你还指定了`quant_bits`, 则将推送量化后的模型.\\n- `--hub_model_id`: 默认为`None`. 推送到的ModelScope Hub的model_id. 如果`push_to_hub`设置为True, 该参数必须被设置.\\n- `--hub_token`: 默认为`None`. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--hub_private_repo`: 默认为`False`. 具体的参数介绍可以在`sft命令行参数`中查看.\\n- `--commit_message`: 默认是`'update files'`.\\n- `--to_ollama`: 转为ollama导出.\\n- `--ollama_output_dir`: ollama输出目录. 默认存储在当前目录下的`模型类型-ollama`文件夹内.\\n\\n## eval参数\\n\\neval参数继承了infer参数，除此之外增加了以下参数：（注意: infer中的generation_config参数将失效, 由[evalscope](https://github.com/modelscope/eval-scope)控制.）\\n\\n- `--🔥eval_dataset`: 评测的官方数据集, 默认值为空, 代表全量评测, 注意指定了custom_eval_config时本参数不生效. [查看所有支持的评测集](LLM评测文档.md#能力介绍).\\n- `--eval_few_shot`: 每个评测集的子数据集的few-shot个数, 默认为`None`, 即使用数据集的默认配置. **本参数暂时废弃**\\n- `--eval_limit`: 每个评测集的子数据集的采样数量, 默认为`None`代表全量评测. 可以传入整数, 表示每个数据集的评测数量, 也可以传入string, 如`[10:20]`, 代表切片.\\n- `--name`: 用于区分相同配置评估的结果存储路径. 如: `{eval_output_dir}/{name}`, 默认在：`eval_outputs/defaults`, 其内部存在以时间命名的文件夹来承载每次评测结果.\\n- `--eval_url`: OpenAI标准的模型调用接口, 例如`http://127.0.0.1:8000/v1`. 如果使用部署的方式评估, 则需要进行设置, 通常不需要设置. 默认为`None`.\\n  ```shell\\n  swift eval --eval_url http://127.0.0.1:8000/v1 --eval_is_chat_model true --model_type gpt4 --eval_token xxx\\n  ```\\n- `--eval_token`: OpenAI标准的模型调用接口的token, 默认为`'EMPTY'`, 代表没有token.\\n- `--eval_is_chat_model`: 如果`eval_url`不为空, 则需要传入本值判断是否为`chat`模型, False代表为`base`模型. 默认为`None`.\\n- `--custom_eval_config`: 使用自定义数据集进行评测, 需要是一个本地存在的文件路径, 文件格式详见[自定义评测集](LLM评测文档.md#自定义评测集). 默认为`None`.\\n- `--eval_use_cache`: 是否使用已经生成的评测缓存, 使做过的评测不会重新运行而只是重新生成评测结果. 默认`False`.\\n- `--eval_output_dir`: 评测结果输出路径, 默认是当前文件夹下的`eval_outputs`路径.\\n- `--eval_batch_size`: 评测的输入batch_size, 默认是8\\n- `--eval_nproc`: 并发数, 更大的并发数可以更快评测, 但显存占用也更高, 默认值16. 本参数仅对多模态评测生效.\\n- `--deploy_timeout`: 评测之前会启动模型部署, 该参数设置部署的等待超时时长, 默认值为60, 代表一分钟.\\n\\n\\n## app-ui 参数\\n\\napp-ui参数继承了infer参数, 除此之外增加了以下参数:\\n\\n- `--host`: 默认为`'127.0.0.1'`. 传递给gradio的`demo.queue().launch(...)`函数.\\n- `--port`: 默认为`7860`. 传递给gradio的`demo.queue().launch(...)`函数.\\n- `--share`: 默认为`False`. 传递给gradio的`demo.queue().launch(...)`函数.\\n\\n## deploy 参数\\n\\ndeploy参数继承了infer参数, 除此之外增加了以下参数:\\n\\n- `--host`: 默认为`'0.0.0.0'`.\\n- `--port`: 默认为`8000`.\\n- `--api_key`: 默认为`None`, 即不对请求进行api_key验证.\\n- `--ssl_keyfile`: 默认为`None`.\\n- `--ssl_certfile`: 默认为`None`.\\n- `--verbose`: 是否对请求内容进行打印, 默认为`True`.\\n- `--log_interval`: 对统计信息进行打印的间隔, 单位为秒. 默认为`10`. 如果设置为`0`, 表示不打印统计信息.\\n\\n## web-ui 参数\\n\\n- `--🔥host`: 默认为`'127.0.0.1'`. 要使其在非本机上可访问, 可设置为'0.0.0.0'.\\n- `--port`: 默认为`7860`.\\n- `--lang`: 默认为`'zh'`.\\n- `--share`: 默认为`False`.\\n\\n\\n# LLM微调文档\\n## 目录\\n- [环境准备](#环境准备)\\n- [微调](#微调)\\n- [DPO](#dpo)\\n- [ORPO](#orpo)\\n- [Merge LoRA](#merge-lora)\\n- [量化](#量化)\\n- [推理](#推理)\\n- [Web-UI](#web-ui)\\n- [推送模型](#推送模型)\\n\\n## 环境准备\\nGPU设备: A10, 3090, V100, A100均可.\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 如果你想要使用deepspeed.\\npip install deepspeed -U\\n\\n# 如果你想要使用基于auto_gptq的qlora训练. (推荐, 效果优于bnb)\\n# 支持auto_gptq的模型: `https://github.com/modelscope/swift/blob/main/docs/source/Instruction/支持的模型和数据集.md#模型`\\n# auto_gptq和cuda版本有对应关系，请按照`https://github.com/PanQiWei/AutoGPTQ#quick-installation`选择版本\\npip install auto_gptq -U\\n\\n# 如果你想要使用基于bnb的qlora训练.\\npip install bitsandbytes -U\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## 微调\\n如果你要使用界面的方式进行微调与推理, 可以查看[界面训练与推理文档](../GetStarted/界面训练推理.md).\\n\\n### 使用python\\n```python\\n# Experimental environment: A10, 3090, V100, ...\\n# 20GB GPU memory\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nimport torch\\n\\nfrom swift.llm import (\\n    DatasetName, InferArguments, ModelType, SftArguments,\\n    infer_main, sft_main, app_ui_main\\n)\\n\\nmodel_type = ModelType.qwen_7b_chat\\nsft_args = SftArguments(\\n    model_type=model_type,\\n    dataset=[f'{DatasetName.blossom_math_zh}#2000'],\\n    output_dir='output')\\nresult = sft_main(sft_args)\\nlast_model_checkpoint = result['last_model_checkpoint']\\nprint(f'last_model_checkpoint: {last_model_checkpoint}')\\ntorch.cuda.empty_cache()\\n\\ninfer_args = InferArguments(\\n    ckpt_dir=last_model_checkpoint,\\n    load_dataset_config=True)\\n# merge_lora(infer_args, device_map='cpu')\\nresult = infer_main(infer_args)\\ntorch.cuda.empty_cache()\\n\\napp_ui_main(infer_args)\\n```\\n\\n### 使用CLI\\n```bash\\n# Experimental environment: A10, 3090, V100, ...\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n\\n# 使用自己的数据集\\n# 自定义数据集格式查看: https://github.com/modelscope/swift/blob/main/docs/source/Instruction/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E9%9B%86\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset chatml.jsonl \\\\\\n    --output_dir output \\\\\\n\\n# 使用DDP\\n# Experimental environment: 2 * 3090\\n# 2 * 23GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nNPROC_PER_NODE=2 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n\\n# 多机多卡\\n# 如果非共用磁盘请在各机器sh中额外指定`--save_on_each_node true`.\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --dataset AI-ModelScope/blossom-math-v2 \\\\\\n    --output_dir output \\\\\\n```\\n\\n### 更多sh脚本\\n\\n更多sh脚本可以查看[这里](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts)\\n\\n```bash\\n# 脚本需要在此目录下执行\\ncd examples/pytorch/llm\\n```\\n\\n**提示**:\\n\\n- 我们默认在训练时设置`--gradient_checkpointing true`来**节约显存**, 这会略微降低训练速度.\\n- 如果你想要使用量化参数`--quantization_bit 4`, 你需要先安装[bnb](https://github.com/TimDettmers/bitsandbytes): `pip install bitsandbytes -U`. 这会减少显存消耗, 但通常会降低训练速度.\\n- 如果你想要使用基于**auto_gptq**的量化, 你需要先安装对应cuda版本的[auto_gptq](https://github.com/PanQiWei/AutoGPTQ): `pip install auto_gptq -U`.\\n  > 使用auto_gptq的模型可以查看[LLM支持的模型](支持的模型和数据集.md#模型). 建议使用auto_gptq, 而不是bnb.\\n- 如果你想要使用deepspeed, 你需要`pip install deepspeed -U`. 使用deepspeed可以**节约显存**, 但可能会略微降低训练速度.\\n- 如果你的训练涉及到**知识编辑**的内容, 例如: [自我认知微调](../LLM/自我认知微调最佳实践.md), 你需要在MLP上也加上LoRA, 否则可能会效果不佳. 你可以简单传入参数`--lora_target_modules ALL`来对所有的linear(qkvo, mlp)加上lora, **这通常是效果最好的**.\\n- 如果你使用的是**V100**等较老的GPU, 你需要设置`--dtype AUTO`或者`--dtype fp16`, 因为其不支持bf16.\\n- 如果你的机器是A100等高性能显卡, 且模型支持flash-attn, 推荐你安装[**flash-attn**](https://github.com/Dao-AILab/flash-attention), 这将会加快训练和推理的速度以及显存占用(A10, 3090, V100等显卡不支持flash-attn进行训练). 支持flash-attn的模型可以查看[LLM支持的模型](支持的模型和数据集.md#模型)\\n- 如果你要进行**二次预训练**, **多轮对话**, 你可以参考[自定义与拓展](自定义与拓展.md#注册数据集的方式)\\n- 如果你需要**断网**进行训练, 请使用`--model_id_or_path <model_dir>`和设置`--check_model_is_latest false`. 具体参数含义请查看[命令行参数](命令行参数.md).\\n- 如果你想在训练时, 将权重push到ModelScope Hub中, 你需要设置`--push_to_hub true`.\\n- 如果你想要在推理时, 合并LoRA权重并保存，你需要设置`--merge_lora true`. **不推荐对qlora训练的模型进行merge**, 这会存在精度损失. 因此**不建议使用qlora进行微调**, 部署生态不好.\\n\\n\\n**注意**:\\n\\n- 由于曾用名问题, 以`xxx_ds`结尾的脚本的含义是: 使用deepspeed zero2进行训练. (e.g. `full_ddp_ds`).\\n- 除了以下列出的脚本, 其他脚本不一定进行维护.\\n\\n\\n如果你想要**自定义脚本**, 可以参考以下脚本进行修改: (以下脚本会**定期维护**)\\n\\n- full: [qwen1half-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_7b_chat/full) (A100), [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_mp) (2\\\\*A100)\\n- full+ddp+zero2: [qwen-7b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_7b_chat/full_ddp_zero2) (4\\\\*A100)\\n- full+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/full_ddp_zero3) (4\\\\*A100)\\n- lora: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora) (3090), [baichuan2-13b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/baichuan2_13b_chat/lora_mp) (2\\\\*3090), [yi-34b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/yi_34b_chat/lora) (A100), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_mp) (2\\\\*A100)\\n- lora+ddp: [chatglm3-6b](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/chatglm3_6b/lora_ddp) (2\\\\*3090)\\n- lora+ddp+zero3: [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/lora_ddp_zero3) (4\\\\*3090), [qwen-72b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_72b_chat/lora_ddp_zero3) (4\\\\*A100)\\n- qlora(gptq-int4): [qwen-14b-chat-int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat_int4/qlora) (3090), [qwen1half-72b-chat-int4](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen1half_72b_chat_int4/qlora) (A100)\\n- qlora(gptq-int8): [qwen-14b-chat-int8](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat_int8/qlora) (3090)\\n- qlora(bnb-int4): [qwen-14b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/qwen_14b_chat/qlora) (3090), [llama2-70b-chat](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/llama2_70b_chat/qlora_mp) (2 \\\\* 3090)\\n\\n\\n## DPO\\n如果你要使用DPO进行人类对齐, 你可以查看[DPO训练文档](../LLM/DPO训练文档.md).\\n\\n## ORPO\\n如果你要使用ORPO进行人类对齐, 你可以查看[ORPO最佳实践](../LLM/ORPO算法最佳实践.md).\\n\\n## Merge LoRA\\n提示: **暂时**不支持bnb和auto_gptq量化模型的merge lora, 这会产生较大的精度损失.\\n```bash\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n```\\n\\n## 量化\\n\\n对微调后模型进行量化可以查看[LLM量化与导出文档](LLM量化与导出文档.md#微调后模型)\\n\\n## 推理\\n如果你要使用VLLM进行推理加速, 可以查看[VLLM推理加速与部署](../LLM/VLLM推理加速与部署.md#微调后的模型)\\n\\n### 原始模型\\n**单样本推理**可以查看[LLM推理文档](LLM推理文档.md#推理)\\n\\n使用**数据集**评估:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_id_or_path qwen/Qwen-7B-Chat --dataset AI-ModelScope/blossom-math-v2\\n```\\n### 微调后模型\\n**单样本推理**:\\n\\n使用LoRA**增量**权重进行推理:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type\\n)\\nfrom swift.tuners import Swift\\n\\nckpt_dir = 'vx-xxx/checkpoint-100'\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'})\\n\\nmodel = Swift.from_pretrained(model, ckpt_dir, inference_mode=True)\\ntemplate = get_template(template_type, tokenizer)\\nquery = 'xxxxxx'\\nresponse, history = inference(model, template, query)\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n```\\n\\n使用LoRA **merged**的权重进行推理:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type\\n)\\n\\nckpt_dir = 'vx-xxx/checkpoint-100-merged'\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'},\\n                                       model_id_or_path=ckpt_dir)\\n\\ntemplate = get_template(template_type, tokenizer)\\nquery = 'xxxxxx'\\nresponse, history = inference(model, template, query)\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n```\\n\\n使用**数据集**评估:\\n```bash\\n# 直接推理\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' \\\\\\n    --load_dataset_config true \\\\\\n\\n# 如果需要更换val_dataset\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --val_dataset <your-val-dataset>\\n\\n# Merge LoRA增量权重并推理\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' --load_dataset_config true\\n```\\n\\n**人工**评估:\\n```bash\\n# 直接推理\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx'\\n\\n# Merge LoRA增量权重并推理\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n## Web-UI\\n如果你要使用VLLM进行部署并提供**API**接口, 可以查看[VLLM推理加速与部署](../LLM/VLLM推理加速与部署.md#部署)\\n\\n### 原始模型\\n使用原始模型的web-ui可以查看[LLM推理文档](LLM推理文档.md#Web-UI)\\n\\n### 微调后模型\\n```bash\\n# 直接使用app-ui\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx'\\n\\n# merge LoRA增量权重并使用app-ui\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n## 推送模型\\n如果你想推送模型到ModelScope，可以参考[模型推送文档](LLM量化与导出文档.md#推送模型)\\n\\n\\n# 自定义与拓展\\n## 目录\\n- [自定义数据集](#自定义数据集)\\n- [自定义模型](#自定义模型)\\n- [自定义对话模板](#自定义对话模板)\\n\\n## 自定义数据集\\n自定义数据集视频介绍：\\n\\n<video width=\\\"600\\\" height=\\\"400\\\" controls>\\n  <source src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/custom_dataset.mp4\\\" type=\\\"video/mp4\\\">\\n</video>\\n\\n下面是文字版：\\n\\n我们支持三种**自定义数据集**的方法.\\n\\n1. 【推荐】直接命令行传参的方式，指定`--dataset xxx.json yyy.jsonl zzz.csv`, **更加方便支持自定义数据集**, 支持五种数据集格式（即使用`SmartPreprocessor`，支持的数据集格式见下方）, 支持`dataset_id`和`dataset_path`. 不需要修改`dataset_info.json`文件. 该方法适合刚接触ms-swift的用户, 下两种方法适合对ms-swift进行拓展的开发者.\\n2. 添加数据集到`dataset_info.json`中, 比第一种方式更灵活但繁琐, 支持对数据集使用两种预处理器并指定其参数: `RenameColumnsPreprocessor`, `ConversationsPreprocessor`（默认使用`SmartPreprocessor`）. 支持直接修改swift内置的`dataset_info.json`, 或者通过`--custom_dataset_info xxx.json`的方式传入外置的json文件（方便pip install而非git clone的用户拓展数据集）.\\n3. **注册数据集**的方式: 比第1、2种方式更加灵活但繁琐, 支持使用函数对数据集进行预处理. 方法1、2在实现上借助了方法3. 可以直接修改源码进行拓展, 或者通过`--custom_register_path xxx.py`的方式传入, 脚本会对py文件进行解析（方便pip install的用户）.\\n\\n### 📌 【推荐】直接命令行传参\\n支持直接传入行自定义的**dataset_id**(兼容MS和HF)和**dataset_path**, 以及同时传入多个自定义数据集以及对应采样数, 脚本会进行自动的预处理和拼接. 如果传入的是`dataset_id`, 默认会使用dataset\\\\_id中的'default'子数据集, 并设置split为'train'. 如果该dataset\\\\_id已经注册, 则会使用注册时传入的subsets、split以及预处理函数. 如果传入的是`dataset_path`, 则可以指定为相对路径和绝对路径, 其中相对路径为相对于当前运行目录.\\n\\n每个数据集指定格式如下: `[HF or MS::]{dataset_name} or {dataset_id} or {dataset_path}[:subset1/subset2/...][#dataset_sample]`, 最简只需要指定dataset_name、dataset_id或者dataset_path即可.\\n\\n```bash\\n# 默认使用modelscope的dataset_id, 同时也支持huggingface的dataset_id\\n--dataset {dataset_id} {dataset_path} HF::{dataset_id}\\n\\n# 数据集混合: 以下取dataset_id中subset1和subset2子数据集并随机采样20000条. 如果不使用`#{dataset_sample}`, 则使用数据集中的所有样本\\n--dataset {dataset_name}#20000 {dataset_id}:{subset1}/{subset2}#20000 {dataset_path}#10000\\n```\\n\\n脚本支持的文件格式包含`csv`, `json`, `jsonl`格式. 你需要将传入的文件符合以下数据集格式（只列出了一部分）. 以下格式都支持system (需要注意的是, csv如果指定了system字段, 则无法设置为`None`, 只能指定为空字符串. json和jsonl没有这个限制). `json`, `jsonl`格式的文件支持多轮对话 (`csv`不支持).\\n\\n\\n**格式1:**\\n\\n预训练:\\n\\n```csv\\nresponse\\n11111\\naaaaa\\nAAAAA\\n```\\n\\n```jsonl\\n{\\\"response\\\": \\\"11111\\\"}\\n{\\\"response\\\": \\\"aaaaa\\\"}\\n{\\\"response\\\": \\\"AAAAA\\\"}\\n```\\n\\n单轮对话:\\n\\n```csv\\nsystem,query,response\\n00000,11111,22222\\n00001,aaaaa,bbbbb\\n00002,AAAAA,BBBBB\\n```\\n\\n```jsonl\\n{\\\"system\\\": \\\"00000\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\"}\\n{\\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\"}\\n{\\\"system\\\": \\\"00001\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\"}\\n```\\n\\n多轮对话:\\n\\n```jsonl\\n{\\\"system\\\": \\\"00000\\\", \\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\"}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": []}\\n{\\\"system\\\": \\\"00001\\\", \\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\n```json\\n[{\\\"system\\\": \\\"00000\\\", \\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\"},\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": []},\\n{\\\"system\\\": \\\"00001\\\", \\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}]\\n```\\n\\n**格式2:**\\n\\n```jsonl\\n{\\\"conversations\\\": [{\\\"from\\\": \\\"system\\\", \\\"value\\\": \\\"00000\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"11111\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}]}\\n{\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"aaaaa\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"ccccc\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}]}\\n{\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}]}\\n```\\n\\n**格式3:**\\n\\n```jsonl\\n{\\\"messages\\\": [{\\\"role\\\": \\\"system\\\", \\\"content\\\": \\\"00000\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"11111\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"22222\\\"}]}\\n{\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"aaaaa\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"bbbbb\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"ccccc\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"ddddd\\\"}]}\\n{\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"AAAAA\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"BBBBB\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"CCCCC\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"DDDDD\\\"}]}\\n```\\n\\n**格式4:**\\n\\n```jsonl\\n{\\\"system\\\": \\\"00000\\\", \\\"conversation\\\": [{\\\"human\\\": \\\"11111\\\", \\\"assistant\\\": \\\"22222\\\"}]}\\n{\\\"conversation\\\": [{\\\"human\\\": \\\"aaaaa\\\", \\\"assistant\\\": \\\"bbbbb\\\"}]}\\n{\\\"system\\\": \\\"00001\\\", \\\"conversation\\\": [{\\\"human\\\": \\\"AAAAA\\\", \\\"assistant\\\": \\\"BBBBB\\\"}, {\\\"human\\\": \\\"CCCCC\\\", \\\"assistant\\\": \\\"DDDDD\\\"}, {\\\"human\\\": \\\"EEEEE\\\", \\\"assistant\\\": \\\"FFFFF\\\"}]}\\n```\\n\\n**格式5:**\\n\\n```csv\\nsystem,instruction,input,output\\n00000,11111,22222,33333\\n00001,aaaaa,bbbbb,ccccc\\n00002,AAAAA,BBBBB,CCCCC\\n```\\n\\n**额外的预训练格式**：\\n```jsonl\\n{\\\"text\\\": \\\"11111\\\"}\\n{\\\"text\\\": \\\"aaaaa\\\"}\\n{\\\"text\\\": \\\"AAAAA\\\"}\\n```\\n\\n\\n**人类对齐**\\n\\n语言模型（DPO/ORPO/SimPO/CPO）\\n```jsonl\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"rejected_response\\\": \\\"33333\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"rejected_response\\\": \\\"ccccc\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"rejected_response\\\": \\\"CCCCC\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\n- 其中`system`和`history`为可选项\\n\\n语言模型 (KTO)\\n```jsonl\\n{\\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"label\\\": true}\\n{\\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"label\\\": false}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"label\\\": true, \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n- 注意`label`需要是bool类型, 不能是字符串\\n\\n- 其中`system`和`history`为可选项\\n\\n\\n视觉多模态大模型（DPO/ORPO/SimPO/CPO）\\n\\n```jsonl\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"rejected_response\\\": \\\"33333\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"rejected_response\\\": \\\"ccccc\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"rejected_response\\\": \\\"CCCCC\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\n- 不同模型对图像数量的支持不同, 具体参考模型对应的最佳实践文档\\n\\n- 其中`system`和`history`为可选项\\n\\n**Tool-Calling Agent**\\n\\n格式1\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"system\\\", \\\"value\\\": \\\"00000\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"11111\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"aaaaa\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"ccccc\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"CCCCC\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}]}\\n```\\n\\n格式2\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"system\\\", \\\"content\\\": \\\"00000\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"11111\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"aaaaa\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"bbbbb\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"ccccc\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"AAAAA\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"BBBBB\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"CCCCC\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"DDDDD\\\"}]}\\n```\\n其中tools格式参考[Agent部署文档](../LLM/Agent部署最佳实践.md#tools字段), 你可以通过设置`--tools_prompt`来选择对应的prompt\\n\\n`tool`字段表示工具调用返回结果\\n\\n### 添加dataset_info.json\\n可以参考[swift内置的dataset_info.json](https://github.com/modelscope/swift/blob/main/swift/llm/data/dataset_info.json)进行数据集拓展. 你可以直接在内置的dataset_info.json中添加, 也可以通过`--custom_dataset_info 1.json`传入外置的dataset_info.json的路径、json字符串或者字典.\\n\\n添加dataset\\\\_id:\\n```python\\n# MS\\n# 使用: `--dataset <dataset_name>`\\n\\\"<dataset_name>\\\": {\\n    \\\"dataset_id\\\": \\\"xxx/xxx\\\"\\n}\\n\\n# HF\\n# 使用: `--dataset HF::<dataset_name>` 或者 直接使用`USE_HF`环境变量.\\n\\\"<dataset_name>\\\": {\\n    \\\"hf_dataset_id\\\": \\\"xxx/xxx\\\"\\n}\\n```\\n\\n添加dataset\\\\_path:\\n```python\\n# 可以指定相对路径和绝对路径. 相对路径相对于dataset_info.json文件所在目录.\\n# 使用: `--dataset <dataset_name>`\\n\\\"<dataset_name>\\\": {\\n    \\\"dataset_path\\\": \\\"xxx\\\"\\n}\\n```\\n\\n支持以下参数:\\n- dataset\\\\_id: 数据集对应的ModelScope的dataset\\\\_id, 默认为`None`. 最简的设置必须指定`dataset_id`、`hf_dataset_id`和`dataset_path`中的一个.\\n- subsets: 子数据集的名字列表, 默认为`[]`, 即使用'default'子数据集.\\n- split: 默认为`['train']`, 通常不需要修改.\\n- hf\\\\_dataset\\\\_id: 数据集对应的HuggingFace的datasset\\\\_id, 默认为`None`.\\n- dataset\\\\_path: 用于指定数据集的本地路径, e.g. 1.jsonl等, 默认为`None`. 可以传入相对路径和绝对路径. 如果使用相对路径, 则相对于`dataset_info.json`文件所在目录. 如果设置了dataset\\\\_path, 那么dataset\\\\_id, subsets, hf\\\\_dataset\\\\_id参数失效.\\n- columns: 默认使用的预处理器为`SmartPreprocessor`, 指定此参数则指定为`RenameColumnsPreprocessor`, 你需要rename数据集中的列并转换为上述**格式1**的样式.\\n- conversations: 指定此参数则指定预处理器为`ConversationsPreprocessor`  ('columns'的优先级高于'conversations').\\n- remove\\\\_useless\\\\_columns: 指定是否移除无用的列 (包括: 'query', 'response', 'rejected\\\\_response', 'system', 'history', 'images'), 默认为`True`, 通常不需要设置.\\n- tags: 用于注释数据集, 默认为`[]`, 通常不需要设置.\\n\\n如果`dataset_info.json`中参数无法满足您的要求, 例如你需要添加自定义的prompt、需要对数据集提前进行清洗或者进行复杂的数据集获取与预处理, 则可以使用注册数据集的方式, 使用函数的方式来进行数据获取与预处理.\\n\\n\\n### 注册数据集的方式\\n\\n以下是一个**注册数据集**的案例. 完整的py文件可以查看[custom.py](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/custom.py), sh脚本可以查看[custom](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/custom). 你可以通过指定`--custom_register_path xxx.py`对注册的内容进行解析.\\n\\n```python\\nfrom typing import Optional, Tuple\\n\\nfrom datasets import Dataset as HfDataset\\nfrom modelscope import MsDataset\\n\\nfrom swift.llm import get_dataset, register_dataset, get_dataset_from_repo\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass CustomDatasetName:\\n    stsb_en = 'stsb-en'\\n\\ndef _preprocess_stsb(dataset: HfDataset) -> HfDataset:\\n    prompt = \\\"\\\"\\\"Task: Based on the given two sentences, provide a similarity score between 0.0 and 5.0.\\nSentence 1: {text1}\\nSentence 2: {text2}\\nSimilarity score: \\\"\\\"\\\"\\n    query = []\\n    response = []\\n    for d in dataset:\\n        query.append(prompt.format(text1=d['text1'], text2=d['text2']))\\n        response.append(f\\\"{d['label']:.1f}\\\")\\n    return HfDataset.from_dict({'query': query, 'response': response})\\n\\n\\nregister_dataset(CustomDatasetName.stsb_en, 'swift/stsb', None, _preprocess_stsb, get_dataset_from_repo)\\n\\n\\nif __name__ == '__main__':\\n    # test dataset\\n    train_dataset, val_dataset = get_dataset([CustomDatasetName.stsb_en],\\n                                             check_dataset_strategy='warning')\\n    print(f'train_dataset: {train_dataset}')\\n    print(f'val_dataset: {val_dataset}')\\n\\n```\\n\\n`register_dataset`会在`DATASET_MAPPING`中注册数据集, 该函数的参数含义如下:\\n\\n- `dataset_name`: 必填项, 表示数据集的名字, 也是数据集的唯一id.\\n- `dataset_id_or_path`: 必填项. 表示数据集在ModelScope Hub上的`dataset_id`或者本地的`dataset_dir`.\\n- `subsets`: 数据集的子数据集列表, 默认为`[]`.\\n- `preprocess_func`: 预处理函数.\\n- `get_function`: 默认值为`None`. 获取数据集的函数. 如果传入None, 则使用修饰器方案进行数据集注册. 如果传入一个函数, 则使用正常方案进行注册.\\n  > `get_function`需要返回`HfDataset`或`Tuple[HfDataset, Optional[HfDataset]]`. 如果只返回一个数据集, 则该数据集为train\\\\_dataset. 如果返回两个数据集, 则分别作为train\\\\_dataset和val\\\\_dataset. `get_dataset`函数支持获取多个数据集, 例如:`get_dataset(['dataset1', 'dataset2'])`. 我们会将各个子数据集的训练集和验证集部分分别进行拼接, 最终返回合并后的训练集和验证集.\\n\\n  > 函数返回的`HfDataset`需要符合一定的规范. 如果你要进行**预训练**, 那么只需要包含`response`字段, 具体可以参考`'tigerbot-law-zh'`数据集. 如果是**指令微调(单轮对话)**的情况下, 需包含`query`, `response`字段, 分别代表指令微调的用户询问和AI助手的回答, 具体可以参考`'alpaca-zh'`数据集. 如果是**多轮对话**, 则需要额外加上`history`字段, 代表对话的历史信息, 具体可以参考`'damo-agent-mini-zh'`数据集. 如果每个数据集样例具有不同的`system`, 则需要额外加上system字段, 具体你也可以参考`'damo-agent-mini-zh'`数据集.\\n\\n- `**kwargs`: 其他用于注释数据集的参数. 该参数一般不需要设置.\\n\\n\\n## 自定义模型\\n以下是一个**自定义模型**的案例. 完整的py文件可以查看[custom.py](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/custom.py), sh脚本可以查看[custom](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/custom). 你可以通过指定`--custom_register_path xxx.py`对注册的内容进行解析.\\n\\n```python\\nfrom typing import Any, Dict\\nimport torch\\nfrom transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer\\n\\nfrom transformers.utils.versions import require_version\\n\\nfrom swift.llm import LoRATM, TemplateType, get_model_tokenizer, register_model\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass CustomModelType:\\n    tigerbot_7b = 'tigerbot-7b'\\n    tigerbot_13b = 'tigerbot-13b'\\n    tigerbot_13b_chat = 'tigerbot-13b-chat'\\n\\n\\nclass CustomTemplateType:\\n    tigerbot = 'tigerbot'\\n\\n\\n@register_model(CustomModelType.tigerbot_7b,\\n                'TigerResearch/tigerbot-7b-base-v3', LoRATM.llama,\\n                TemplateType.default_generation)\\n@register_model(CustomModelType.tigerbot_13b,\\n                'TigerResearch/tigerbot-13b-base-v2', LoRATM.llama,\\n                TemplateType.default_generation)\\n@register_model(CustomModelType.tigerbot_13b_chat,\\n                'TigerResearch/tigerbot-13b-chat-v4', LoRATM.llama,\\n                CustomTemplateType.tigerbot)\\ndef get_tigerbot_model_tokenizer(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 **kwargs):\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if use_flash_attn:\\n        require_version('transformers>=4.34')\\n        logger.info('Setting use_flash_attention_2: True')\\n        model_kwargs['use_flash_attention_2'] = True\\n    model_config = AutoConfig.from_pretrained(\\n        model_dir, trust_remote_code=True)\\n    model_config.pretraining_tp = 1\\n    model_config.torch_dtype = torch_dtype\\n    logger.info(f'model_config: {model_config}')\\n    tokenizer = AutoTokenizer.from_pretrained(\\n        model_dir, trust_remote_code=True)\\n    model = None\\n    if load_model:\\n        model = AutoModelForCausalLM.from_pretrained(\\n            model_dir,\\n            config=model_config,\\n            torch_dtype=torch_dtype,\\n            trust_remote_code=True,\\n            **model_kwargs)\\n    return model, tokenizer\\n\\n\\nif __name__ == '__main__':\\n    # test model base\\n    model, tokenizer = get_model_tokenizer(\\n        CustomModelType.tigerbot_7b, use_flash_attn=False)\\n    print(model.__class__.__name__)\\n    # test model chat\\n    model, tokenizer = get_model_tokenizer(\\n        CustomModelType.tigerbot_13b_chat, use_flash_attn=False)\\n    print(model.__class__.__name__)\\n```\\n\\n`register_model`会在`MODEL_MAPPING`中注册模型, 该函数的参数含义如下:\\n\\n- `model_type`: 必填项. 表示模型的名字, 也是唯一的id.\\n- `model_id_or_path`: 必填项. 表示模型在ModelScope Hub中的`model_id`, 或者是本地的模型目录`model_dir`.\\n- `lora_target_modules`: 默认为`None`. 表示在sh脚本中指定`--lora_target_modules DEFAULT`或`--lora_target_modules AUTO`或未指定`--lora_target_modules`情况下默认使用的lora_target_modules.\\n- `template`: 默认为`TemplateType.default`. 表示在sh脚本中指定`--template_type AUTO`或未指定`--template_type`情况下默认使用的对话模板.\\n- `get_function`: 默认值为`None`. 获取model和tokenizer的函数. 如果传入None, 则使用修饰器方案进行模型注册. 如果传入一个函数, 则使用正常方案进行注册.\\n- `requires`: 默认为`[]`. 表示模型所需要的区别于其他模型的依赖. 该参数一般不需要设置.\\n- `torch_dtype`: 默认为`None`. 表示模型所推荐使用的torch_dtype. 该参数一般不需要设置.\\n- `revision`: 默认为`None`. 用于指定模型的版本号. 如果`model_id_or_path`是本地的模型目录, 则该参数失效. 该参数一般不需要设置.\\n- `ignore_file_pattern`: 默认为`None`. 表示下载的时候需要忽略的文件名的正则pattern, 该参数会传递给`snapshot_download`. 例如`r'.+\\\\.bin$'`, `r'.+\\\\.savetensors$'`等. 该参数一般不需要设置.\\n- `**kwargs`: 其他用于注释模型能力的参数. 该参数一般不需要设置.\\n\\n\\n## 自定义对话模板\\n以下是一个**自定义模型**的案例. 完整的py文件可以查看[custom.py](https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/custom.py), sh脚本可以查看[custom](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/custom).\\n\\n```python\\nfrom swift.llm import (Template, ModelType, dataset_map,\\n                       get_model_tokenizer, get_template, get_dataset,\\n                       print_example, register_template, DatasetName)\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass CustomTemplateType:\\n    tigerbot = 'tigerbot'\\n\\n\\n# Ref: https://github.com/TigerResearch/TigerBot/blob/main/infer.py\\nregister_template(\\n    CustomTemplateType.tigerbot,\\n    Template(['{{SYSTEM}}'], ['\\\\n\\\\n### Instruction:\\\\n{{QUERY}}\\\\n\\\\n### Response:\\\\n'], [],\\n             [['eos_token_id']]))\\n\\nif __name__ == '__main__':\\n    # test template\\n    train_dataset, _ = get_dataset(DatasetName.blossom_math_zh)\\n    _, tokenizer = get_model_tokenizer(ModelType.qwen_7b_chat, load_model=False)\\n    template = get_template(CustomTemplateType.tigerbot, tokenizer)\\n    train_dataset = dataset_map(train_dataset, template.encode)\\n    print_example(train_dataset[0], tokenizer)\\n```\\n\\n`register_template`会在`TEMPLATE_MAPPING`中注册对话模板, 该函数的参数含义如下:\\n\\n- `template_type`: 必填项, 表示对话模板的名字, 也是template的唯一id.\\n- `template`: 必填项, 需要传入一个`Template`. 初始化`Template`需要传入以下参数: `prefix`, `prompt`, `chat_sep`, `suffix`, `default_system`.\\n\\n模板初始化函数会根据这四个内容, 获取完整的chat template. 其中这四个配置内容的含义如下.\\n\\n- `prefix`: 表示对话模板中的前缀部分, 一般为system部分, 前缀token, bos token等内容. 我们使用`{{SYSTEM}}`作为system的占位符. 如果`{{SYSTEM}}`没有在prefix中存在, 则该Template不支持system, e.g. `damo-agent-mini-zh`数据集.\\n- `prompt`: 表示对话模板中的一轮对话. 我们使用`{{QUERY}}`作为每轮对话中, human询问部分的占位符, `{{ROUND0}}`则表示本次对话是第几轮的占位符, 从0开始计数, `{{ROUND1}}`从1开始计数. AI助手的回复部分会拼接在`prompt`的后面, 因此我们没有设计其占位符. 我们只会对AI助手的回复部分计算损失.\\n- `chat_sep`: 如果需要进行多轮对话, `chat_sep`会作为每轮对话之间的分隔符, 例如: 换行等. 如果设置为None, 则该Template不支持多轮对话.\\n- `suffix`: 作为对话模板的后缀部分, 一般为eos token. 会拼接在最后一轮的对话后面.\\n- `default_system`: 默认的system.\\n\\n\\n# LLM推理文档\\n如果你要使用vllm进行推理加速, 可以查看[VLLM推理加速与部署](../LLM/VLLM推理加速与部署.md#推理加速)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [Web-UI](#web-ui)\\n\\n## 环境准备\\nGPU设备: A10, 3090, V100, A100均可.\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# 如果你想要使用基于auto_gptq的模型进行推理.\\n# 使用auto_gptq的模型: `https://github.com/modelscope/swift/blob/main/docs/source/Instruction/支持的模型和数据集.md#模型`\\n# auto_gptq和cuda版本有对应关系，请按照`https://github.com/PanQiWei/AutoGPTQ#quick-installation`选择版本\\npip install auto_gptq -U\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## 推理\\n### qwen-7b-chat\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\n\\nkwargs = {}\\n# kwargs['use_flash_attn'] = True  # 使用flash_attn\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path,\\n                                       model_kwargs={'device_map': 'auto'}, **kwargs)\\n# 修改max_new_tokens\\nmodel.generation_config.max_new_tokens = 128\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '浙江的省会在哪里？'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = '这有什么好吃的？'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: 浙江的省会在哪里？\\nresponse: 浙江省的省会是杭州。\\nquery: 这有什么好吃的？\\nresponse: 杭州市有很多著名的美食，例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外，还有杭州特色的点心，如桂花糕、荷花酥、艾窝窝等。\\nhistory: [('浙江的省会在哪里？', '浙江省的省会是杭州。'), ('这有什么好吃的？', '杭州市有很多著名的美食，例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外，还有杭州特色的点心，如桂花糕、荷花酥、艾窝窝等。')]\\n\\\"\\\"\\\"\\n\\n# 流式输出对话模板\\ninference(model, template, '第一个问题是什么', history, verbose=True, stream=True)\\n\\\"\\\"\\\"Out[1]\\n[PROMPT]<|im_start|>system\\nYou are a helpful assistant.<|im_end|>\\n<|im_start|>user\\n浙江的省会在哪里？<|im_end|>\\n<|im_start|>assistant\\n浙江省的省会是杭州。<|im_end|>\\n<|im_start|>user\\n这有什么好吃的？<|im_end|>\\n<|im_start|>assistant\\n杭州市有很多著名的美食，例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外，还有杭州特色的点心，如桂花糕、荷花酥、艾窝窝等。<|im_end|>\\n<|im_start|>user\\n第一个问题是什么<|im_end|>\\n<|im_start|>assistant\\n[OUTPUT]你的第一个问题是“浙江的省会在哪里？”<|im_end|>\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-7b-chat-int4\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b_chat_int4\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '浙江的省会在哪里？'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = '这有什么好吃的？'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: 浙江的省会在哪里？\\nresponse: 浙江省的省会是杭州。\\nquery: 这有什么好吃的？\\nresponse: 杭州有很多著名的美食，例如西湖醋鱼、东坡肉、宋嫂鱼羹、叫化鸡等。此外，还有杭州特色的点心，如桂花糖藕、酒酿圆子、麻婆豆腐等等。\\nhistory: [('浙江的省会在哪里？', '浙江省的省会是杭州。'), ('这有什么好吃的？', '杭州有很多著名的美食，例如西湖醋鱼、东坡肉、宋嫂鱼羹、叫化鸡等。此外，还有杭州特色的点心，如桂花糖藕、酒酿圆子、麻婆豆腐等等。')]\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-7b\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: default-generation\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 64\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '浙江 -> 杭州\\\\n安徽 -> 合肥\\\\n四川 ->'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\\"\\\"\\\"Out[0]\\nquery: 浙江 -> 杭州\\n安徽 -> 合肥\\n四川 ->\\nresponse:  成都\\n山东 -> 济南\\n福建 -> 福州\\n重庆 -> 重庆\\n广东 -> 广州\\n北京 -> 北京\\n浙江 -> 杭州\\n安徽 -> 合肥\\n四川 -> 成都\\n山东 -> 济南\\n福建 -> 福州\\n重庆\\n\\\"\\\"\\\"\\n```\\n\\n### 流式输出\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference_stream, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = '浙江的省会在哪里？'\\ngen = inference_stream(model, template, query)\\nprint(f'query: {query}')\\nfor response, history in gen:\\n    pass\\nprint(f'response: {response}')\\n\\n# 方式1\\nquery = '这有什么好吃的？'\\nold_history = history\\ngen = inference_stream(model, template, query, old_history)\\nprint(f'query: {query}')\\nfor response, history in gen:\\n    print(f'response: {response}')\\nprint(f'history: {history}')\\n\\n# 方式2\\nquery = '这有什么好吃的？'\\ngen = inference_stream(model, template, query, old_history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint(f'\\\\nhistory: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: 浙江的省会在哪里？\\nresponse: 浙江省的省会是杭州。\\nquery: 这有什么好吃的？\\nresponse: 杭\\nresponse: 杭州\\nresponse: 杭州市有\\n...\\nresponse: 杭州市有很多著名的美食，例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外，还有杭州特色的点心，如桂花酥饼、抹茶糕点等。\\nhistory: [['浙江的省会在哪里？', '浙江省的省会是杭州。'], ['这有什么好吃的？', '杭州市有很多著名的美食，例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外，还有杭州特色的点心，如桂花酥饼、抹茶糕点等。']]\\nquery: 这有什么好吃的？\\nresponse: 杭州有许多美食，比如西湖醋鱼、龙井虾仁、酱鸭等。此外，还有许多小吃，如烧麦、春卷、油条等，都是浙江特色美食。\\nhistory: [['浙江的省会在哪里？', '浙江省的省会是杭州。'], ['这有什么好吃的？', '杭州有许多美食，比如西湖醋鱼、龙井虾仁、酱鸭等。此外，还有许多小吃，如烧麦、春卷、油条等，都是浙江特色美食。']]\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-vl-chat\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_vl_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '<image>这是什么'\\nimages = ['https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg']\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = '输出击掌的检测框'\\nresponse, history = inference(model, template, query, history, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\ndef _fetch_latest_picture(*args, **kwargs):\\n    return images[0]\\ntokenizer._fetch_latest_picture = _fetch_latest_picture\\nimage = tokenizer.draw_bbox_on_latest_picture(response, history)\\nimage.save('output_chat.jpg')\\n\\\"\\\"\\\"\\nquery: <image>这是什么\\nresponse: 图中是一名女子在沙滩上和狗玩耍，旁边的狗是一只拉布拉多犬，它们处于沙滩上。\\nquery: 输出击掌的检测框\\nresponse: <ref>击掌</ref><box>(523,513),(584,605)</box>\\nhistory: [['<image>这是什么', '图中是一名女子在沙滩上和狗玩耍，旁边的狗是一只拉布拉多犬，它们处于沙滩上。'], ['输出击掌的检测框', '<ref>击掌</ref><box>(523,513),(584,605)</box>']]\\n\\\"\\\"\\\"\\n```\\n\\n### qwen-audio-chat\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.qwen_audio_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\n\\ntemplate = get_template(template_type, tokenizer)\\n\\nseed_everything(42)\\nquery = '<audio>what does the person say?'\\naudios = ['https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-Audio/1272-128104-0000.flac']\\nresponse, history = inference(model, template, query, audios=audios)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = 'Find the start time and end time of the word \\\"middle classes'\\nresponse, history = inference(model, template, query, history, audios=audios)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\\"\\\"\\\"Out[0]\\nquery: <audio>what does the person say?\\nresponse: The person says: \\\"mister quilter is the apostle of the middle classes and we are glad to welcome his gospel\\\".\\nquery: Find the start time and end time of the word \\\"middle classes\\nresponse: The word \\\"middle classes\\\" starts at <|2.33|> seconds and ends at <|3.26|> seconds.\\nhistory: [['<audio>what does the person say?', 'The person says: \\\"mister quilter is the apostle of the middle classes and we are glad to welcome his gospel\\\".'], ['Find the start time and end time of the word \\\"middle classes', 'The word \\\"middle classes\\\" starts at <|2.33|> seconds and ends at <|3.26|> seconds.']]\\n\\\"\\\"\\\"\\n```\\n\\n### chatglm3\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = ModelType.chatglm3_6b\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: chatglm3\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 128\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '浙江的省会在哪里？'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = '这有什么好吃的？'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nresponse: 浙江有很多美食,以下是一些著名的:\\n\\n1. 杭州小笼包:这是杭州著名的传统小吃,外皮薄而有韧性,内馅鲜美多汁。\\n\\n2. 西湖醋鱼:这是杭州的名菜之一,用草鱼煮熟后,淋上特制的糟汁和醋,味道鲜美。\\n\\n3. 浙江炖鸡:这是浙江省传统的名菜之一,用鸡肉加上姜、葱、酱油等调料慢慢炖煮而成,味道浓郁。\\n\\n4. 油爆双脆:这是浙江省传统的糕点之一,外皮酥脆,内馅香甜\\nhistory: [('浙江的省会在哪里？', '浙江的省会是杭州。'), ('这有什么好吃的？', '浙江有很多美食,以下是一些著名的:\\\\n\\\\n1. 杭州小笼包:这是杭州著名的传统小吃,外皮薄而有韧性,内馅鲜美多汁。\\\\n\\\\n2. 西湖醋鱼:这是杭州的名菜之一,用草鱼煮熟后,淋上特制的糟汁和醋,味道鲜美。\\\\n\\\\n3. 浙江炖鸡:这是浙江省传统的名菜之一,用鸡肉加上姜、葱、酱油等调料慢慢炖煮而成,味道浓郁。\\\\n\\\\n4. 油爆双脆:这是浙江省传统的糕点之一,外皮酥脆,内馅香甜')]\\n\\\"\\\"\\\"\\n```\\n\\n\\n### bnb量化\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\nfrom transformers import BitsAndBytesConfig\\nimport torch\\n\\nmodel_type = ModelType.chatglm3_6b\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: chatglm3\\n\\ntorch_dtype = torch.bfloat16\\nquantization_config = BitsAndBytesConfig(load_in_4bit=True,\\n            bnb_4bit_compute_dtype=torch_dtype,\\n            bnb_4bit_quant_type='nf4',\\n            bnb_4bit_use_double_quant=True)\\nmodel, tokenizer = get_model_tokenizer(model_type, torch_dtype, {'device_map': 'auto',\\n                                      'quantization_config': quantization_config})\\nmodel.generation_config.max_new_tokens = 128\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '浙江的省会在哪里？'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nquery = '这有什么好吃的？'\\nresponse, history = inference(model, template, query, history)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"Out[0]\\nquery: 浙江的省会在哪里？\\nresponse: 浙江的省会是杭州。\\nquery: 这有什么好吃的？\\nresponse: 浙江有很多美食,以下是一些著名的:\\n\\n1. 杭州小笼包:这是杭州著名的传统小吃,外皮薄而有韧性,内馅鲜美多汁。\\n\\n2. 浙江粽子:浙江粽子有多种口味,如咸蛋黄肉粽、豆沙粽等,其中以杭州粽子最为著名。\\n\\n3. 油爆虾:这是浙江海鲜中的代表之一,用热油爆炒虾仁,口感鲜嫩。\\n\\n4. 椒盐土豆丝:这是浙江传统的素菜之一,用土豆丝和椒盐一起炒制,口感清爽。\\n\\nhistory: [('浙江的省会在哪里？', '浙江的省会是杭州。'), ('这有什么好吃的？', '浙江有很多美食,以下是一些著名的:\\\\n\\\\n1. 杭州小笼包:这是杭州著名的传统小吃,外皮薄而有韧性,内馅鲜美多汁。\\\\n\\\\n2. 浙江粽子:浙江粽子有多种口味,如咸蛋黄肉粽、豆沙粽等,其中以杭州粽子最为著名。\\\\n\\\\n3. 油爆虾:这是浙江海鲜中的代表之一,用热油爆炒虾仁,口感鲜嫩。\\\\n\\\\n4. 椒盐土豆丝:这是浙江传统的素菜之一,用土豆丝和椒盐一起炒制,口感清爽。\\\\n')]\\n\\\"\\\"\\\"\\n```\\n\\n### 使用CLI\\n```bash\\n# qwen\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-7b-chat\\n# yi\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type yi-6b-chat\\n```\\n\\n### 微调后模型\\n如果你要使用微调后模型进行推理, 可以查看[LLM微调文档](LLM微调文档.md#微调后模型)\\n\\n\\n## Web-UI\\n### qwen-7b-chat\\n使用CLI:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --model_type qwen-7b-chat\\n```\\n\\n使用python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, ModelType, app_ui_main\\n\\napp_ui_args = AppUIArguments(model_type=ModelType.qwen_7b_chat)\\napp_ui_main(app_ui_args)\\n```\\n\\n使用bnb量化:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, ModelType, app_ui_main\\n\\napp_ui_args = AppUIArguments(model_type=ModelType.qwen_7b_chat, quantization_bit=4)\\napp_ui_main(app_ui_args)\\n```\\n\\n### qwen-7b\\n使用CLI:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --model_type qwen-7b\\n```\\n\\n使用python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, ModelType, app_ui_main\\n\\napp_ui_args = AppUIArguments(model_type=ModelType.qwen_7b)\\napp_ui_main(app_ui_args)\\n```\\n\\n### 微调后模型\\n使用微调后模型的web-ui可以查看[LLM微调文档](LLM微调文档.md#微调后模型)\\n\\n\\n# LLM实验文档\\n\\n## 目录\\n\\n- [环境准备](#环境准备)\\n- [准备实验配置](#准备实验配置)\\n- [运行实验](#运行试验)\\n- [收集实验结果](#收集试验结果)\\n\\n## 环境准备\\n\\nSWIFT支持了exp（实验）能力，该能力是为了将多个需要进行的对比实验方便地进行管理。实验能力包含的主要功能有：\\n\\n- 支持在单机多卡（单机单卡下）并行运行多个训练（导出）等任务，并将超参数、训练输出、训练指标等信息记录下来，显卡占满情况下会排队\\n- 支持直接运行训练（或导出）后的评测任务，并将评测指标记录下来\\n- 支持将所有的指标生成MarkDown格式的表格方便对比\\n- 支持重复幂等运行，已完成实验不会重复运行\\n\\n该能力是对SWIFT训练、推理、评测能力的补充，本质是多个任务的调度能力。\\n\\n## 准备实验配置\\n\\n一个示例实验配置如下：\\n\\n```json\\n{\\n    \\\"cmd\\\": \\\"sft\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\",\\n        \\\"ddp\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"args\\\": {\\n      \\\"model_type\\\": \\\"qwen-7b-chat\\\",\\n      \\\"dataset\\\": \\\"ms-agent\\\",\\n      \\\"train_dataset_mix_ratio\\\": 2.0,\\n      \\\"batch_size\\\": 1,\\n      \\\"max_length\\\": 2048,\\n      \\\"use_loss_scale\\\": true,\\n      \\\"gradient_accumulation_steps\\\": 16,\\n      \\\"learning_rate\\\": 5e-5,\\n      \\\"use_flash_attn\\\": true,\\n      \\\"eval_steps\\\": 2000,\\n      \\\"save_steps\\\": 2000,\\n      \\\"train_dataset_sample\\\": -1,\\n      \\\"val_dataset_sample\\\": 5000,\\n      \\\"num_train_epochs\\\": 2,\\n      \\\"check_dataset_strategy\\\": \\\"none\\\",\\n      \\\"gradient_checkpointing\\\": true,\\n      \\\"weight_decay\\\": 0.01,\\n      \\\"warmup_ratio\\\": 0.03,\\n      \\\"save_total_limit\\\": 2,\\n      \\\"logging_steps\\\": 10\\n    },\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"lora\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"lora_lr_ratio\\\": 16.0\\n        }\\n      }\\n    ]\\n}\\n```\\n\\n- cmd：本实验运行的swift命令\\n- requirements：配置gpu数量和ddp数量\\n- eval_requirements：评测使用的gpu数量\\n- eval_dataset：评测使用的数据集，如果不配置则不进行评测\\n- args：cmd命令对应的参数\\n- experiment：每个子实验的独立参数，会覆盖上面的参数。必须包含name字段以存储实验结果\\n\\n可以查看[这个文件夹](https://github.com/modelscope/swift/tree/main/scripts/benchmark/config)获取当前已经配置的实验示例。\\n\\n## 运行实验\\n\\n```shell\\n# 在swift根目录下运行\\nPYTHONPATH=. nohup python scripts/benchmark/exp.py --save_dir './experiment' --config your-config-path > run.log 2>&1 &\\n```\\n\\n--config参数支持一个实验配置文件或一个文件夹，当指定文件夹时会并行运行其内所有的实验配置。\\n\\n运行试验后会讲每个实验的日志单独记录在`./exp`文件夹内，实验结果会记录在`--save_dir`指定的文件夹内\\n\\n## 收集实验结果\\n\\n```shell\\n# 在swift根目录下运行\\npython scripts/benchmark/generate_report.py\\n```\\n\\n实验结果的日志如下：\\n\\n```text\\n=================Printing the sft cmd result of exp tuner==================\\n\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|adalora|qwen-7b-chat|ms-agent|2.0|adalora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|26.8389(0.3464%)|True|True|lr=5e-05/epoch=2|32.55GiB|0.92(87543 samples/95338.71 seconds)|17.33(2345 tokens/135.29 seconds)|0.57|1.07|0.391|0.665|0.569|\\n|adapter|qwen-7b-chat|ms-agent|2.0|adapter||33.6896(0.4344%)|True|True|lr=5e-05/epoch=2|32.19GiB|1.48(87543 samples/59067.71 seconds)|26.63(4019 tokens/150.90 seconds)|0.55|1.03|0.438|0.662|0.565|\\n|dora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=True|19.2512(0.2487%)|True|True|lr=5e-05/epoch=2|32.46GiB|0.51(87543 samples/171110.54 seconds)|4.29(2413 tokens/562.32 seconds)|0.53|1.01|0.466|0.683|**0.577**|\\n|full+galore128|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.02GiB|1.10(87543 samples/79481.96 seconds)|28.96(2400 tokens/82.88 seconds)|0.55|1.00|0.358|**0.688**|**0.577**|\\n...\\n```\\n\\n可以将表格拷贝进其它文档中用于分析。\\n\\n\\n# 支持的模型和数据集\\n## 目录\\n- [模型](#模型)\\n  - [大语言模型](#大语言模型)\\n  - [多模态大模型](#多模态大模型)\\n- [数据集](#数据集)\\n\\n## 模型\\n下表介绍了swift介入的模型的相关信息:\\n- Model List: 模型在swift中注册的model_type的列表.\\n- Default Lora Target Modules: 对应模型的默认lora_target_modules.\\n- Default Template: 对应模型的默认template.\\n- Support Flash Attn: 模型是否支持[flash attention](https://github.com/Dao-AILab/flash-attention)加速推理和微调.\\n- Support VLLM: 模型是否支持[vllm](https://github.com/vllm-project/vllm)加速推理和部署.\\n- Requires: 对应模型所需的额外依赖要求.\\n\\n\\n### 大语言模型\\n| Model Type | Model ID | Default Lora Target Modules | Default Template | Support Flash Attn | Support vLLM | Support LMDeploy | Support Megatron | Requires | Tags | HF Model ID |\\n| ---------  | -------- | --------------------------- | ---------------- | ------------------ | ------------ | ---------------- | ---------------- | -------- | ---- | ----------- |\\n|qwen-1_8b|[qwen/Qwen-1_8B](https://modelscope.cn/models/qwen/Qwen-1_8B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-1_8B](https://huggingface.co/Qwen/Qwen-1_8B)|\\n|qwen-1_8b-chat|[qwen/Qwen-1_8B-Chat](https://modelscope.cn/models/qwen/Qwen-1_8B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-1_8B-Chat](https://huggingface.co/Qwen/Qwen-1_8B-Chat)|\\n|qwen-1_8b-chat-int4|[qwen/Qwen-1_8B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-1_8B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-1_8B-Chat-Int4](https://huggingface.co/Qwen/Qwen-1_8B-Chat-Int4)|\\n|qwen-1_8b-chat-int8|[qwen/Qwen-1_8B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-1_8B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-1_8B-Chat-Int8](https://huggingface.co/Qwen/Qwen-1_8B-Chat-Int8)|\\n|qwen-7b|[qwen/Qwen-7B](https://modelscope.cn/models/qwen/Qwen-7B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-7B](https://huggingface.co/Qwen/Qwen-7B)|\\n|qwen-7b-chat|[qwen/Qwen-7B-Chat](https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-7B-Chat](https://huggingface.co/Qwen/Qwen-7B-Chat)|\\n|qwen-7b-chat-int4|[qwen/Qwen-7B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-7B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-7B-Chat-Int4](https://huggingface.co/Qwen/Qwen-7B-Chat-Int4)|\\n|qwen-7b-chat-int8|[qwen/Qwen-7B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-7B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-7B-Chat-Int8](https://huggingface.co/Qwen/Qwen-7B-Chat-Int8)|\\n|qwen-14b|[qwen/Qwen-14B](https://modelscope.cn/models/qwen/Qwen-14B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-14B](https://huggingface.co/Qwen/Qwen-14B)|\\n|qwen-14b-chat|[qwen/Qwen-14B-Chat](https://modelscope.cn/models/qwen/Qwen-14B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-14B-Chat](https://huggingface.co/Qwen/Qwen-14B-Chat)|\\n|qwen-14b-chat-int4|[qwen/Qwen-14B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-14B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-14B-Chat-Int4](https://huggingface.co/Qwen/Qwen-14B-Chat-Int4)|\\n|qwen-14b-chat-int8|[qwen/Qwen-14B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-14B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-14B-Chat-Int8](https://huggingface.co/Qwen/Qwen-14B-Chat-Int8)|\\n|qwen-72b|[qwen/Qwen-72B](https://modelscope.cn/models/qwen/Qwen-72B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-72B](https://huggingface.co/Qwen/Qwen-72B)|\\n|qwen-72b-chat|[qwen/Qwen-72B-Chat](https://modelscope.cn/models/qwen/Qwen-72B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[Qwen/Qwen-72B-Chat](https://huggingface.co/Qwen/Qwen-72B-Chat)|\\n|qwen-72b-chat-int4|[qwen/Qwen-72B-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-72B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-72B-Chat-Int4](https://huggingface.co/Qwen/Qwen-72B-Chat-Int4)|\\n|qwen-72b-chat-int8|[qwen/Qwen-72B-Chat-Int8](https://modelscope.cn/models/qwen/Qwen-72B-Chat-Int8/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[Qwen/Qwen-72B-Chat-Int8](https://huggingface.co/Qwen/Qwen-72B-Chat-Int8)|\\n|modelscope-agent-7b|[iic/ModelScope-Agent-7B](https://modelscope.cn/models/iic/ModelScope-Agent-7B/summary)|c_attn|modelscope-agent|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|-|\\n|modelscope-agent-14b|[iic/ModelScope-Agent-14B](https://modelscope.cn/models/iic/ModelScope-Agent-14B/summary)|c_attn|modelscope-agent|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|-|\\n|qwen1half-0_5b|[qwen/Qwen1.5-0.5B](https://modelscope.cn/models/qwen/Qwen1.5-0.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-0.5B](https://huggingface.co/Qwen/Qwen1.5-0.5B)|\\n|qwen1half-1_8b|[qwen/Qwen1.5-1.8B](https://modelscope.cn/models/qwen/Qwen1.5-1.8B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-1.8B](https://huggingface.co/Qwen/Qwen1.5-1.8B)|\\n|qwen1half-4b|[qwen/Qwen1.5-4B](https://modelscope.cn/models/qwen/Qwen1.5-4B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-4B](https://huggingface.co/Qwen/Qwen1.5-4B)|\\n|qwen1half-7b|[qwen/Qwen1.5-7B](https://modelscope.cn/models/qwen/Qwen1.5-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-7B](https://huggingface.co/Qwen/Qwen1.5-7B)|\\n|qwen1half-14b|[qwen/Qwen1.5-14B](https://modelscope.cn/models/qwen/Qwen1.5-14B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-14B](https://huggingface.co/Qwen/Qwen1.5-14B)|\\n|qwen1half-32b|[qwen/Qwen1.5-32B](https://modelscope.cn/models/qwen/Qwen1.5-32B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-32B](https://huggingface.co/Qwen/Qwen1.5-32B)|\\n|qwen1half-72b|[qwen/Qwen1.5-72B](https://modelscope.cn/models/qwen/Qwen1.5-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-72B](https://huggingface.co/Qwen/Qwen1.5-72B)|\\n|qwen1half-110b|[qwen/Qwen1.5-110B](https://modelscope.cn/models/qwen/Qwen1.5-110B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-110B](https://huggingface.co/Qwen/Qwen1.5-110B)|\\n|codeqwen1half-7b|[qwen/CodeQwen1.5-7B](https://modelscope.cn/models/qwen/CodeQwen1.5-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/CodeQwen1.5-7B](https://huggingface.co/Qwen/CodeQwen1.5-7B)|\\n|qwen1half-moe-a2_7b|[qwen/Qwen1.5-MoE-A2.7B](https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen1.5-MoE-A2.7B](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B)|\\n|qwen1half-0_5b-chat|[qwen/Qwen1.5-0.5B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-0.5B-Chat](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat)|\\n|qwen1half-1_8b-chat|[qwen/Qwen1.5-1.8B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-1.8B-Chat](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat)|\\n|qwen1half-4b-chat|[qwen/Qwen1.5-4B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-4B-Chat](https://huggingface.co/Qwen/Qwen1.5-4B-Chat)|\\n|qwen1half-7b-chat|[qwen/Qwen1.5-7B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-7B-Chat](https://huggingface.co/Qwen/Qwen1.5-7B-Chat)|\\n|qwen1half-14b-chat|[qwen/Qwen1.5-14B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-14B-Chat](https://huggingface.co/Qwen/Qwen1.5-14B-Chat)|\\n|qwen1half-32b-chat|[qwen/Qwen1.5-32B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-32B-Chat](https://huggingface.co/Qwen/Qwen1.5-32B-Chat)|\\n|qwen1half-72b-chat|[qwen/Qwen1.5-72B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen1.5-72B-Chat](https://huggingface.co/Qwen/Qwen1.5-72B-Chat)|\\n|qwen1half-110b-chat|[qwen/Qwen1.5-110B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen1.5-110B-Chat](https://huggingface.co/Qwen/Qwen1.5-110B-Chat)|\\n|qwen1half-moe-a2_7b-chat|[qwen/Qwen1.5-MoE-A2.7B-Chat](https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen1.5-MoE-A2.7B-Chat](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat)|\\n|codeqwen1half-7b-chat|[qwen/CodeQwen1.5-7B-Chat](https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/CodeQwen1.5-7B-Chat](https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat)|\\n|qwen1half-0_5b-chat-int4|[qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4)|\\n|qwen1half-1_8b-chat-int4|[qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4)|\\n|qwen1half-4b-chat-int4|[qwen/Qwen1.5-4B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-4B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-4B-Chat-GPTQ-Int4)|\\n|qwen1half-7b-chat-int4|[qwen/Qwen1.5-7B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-7B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GPTQ-Int4)|\\n|qwen1half-14b-chat-int4|[qwen/Qwen1.5-14B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-14B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-14B-Chat-GPTQ-Int4)|\\n|qwen1half-32b-chat-int4|[qwen/Qwen1.5-32B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-32B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-32B-Chat-GPTQ-Int4)|\\n|qwen1half-72b-chat-int4|[qwen/Qwen1.5-72B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-72B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-72B-Chat-GPTQ-Int4)|\\n|qwen1half-110b-chat-int4|[qwen/Qwen1.5-110B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-110B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-110B-Chat-GPTQ-Int4)|\\n|qwen1half-0_5b-chat-int8|[qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8)|\\n|qwen1half-1_8b-chat-int8|[qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8)|\\n|qwen1half-4b-chat-int8|[qwen/Qwen1.5-4B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-4B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-4B-Chat-GPTQ-Int8)|\\n|qwen1half-7b-chat-int8|[qwen/Qwen1.5-7B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-7B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GPTQ-Int8)|\\n|qwen1half-14b-chat-int8|[qwen/Qwen1.5-14B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-14B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-14B-Chat-GPTQ-Int8)|\\n|qwen1half-72b-chat-int8|[qwen/Qwen1.5-72B-Chat-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen1.5-72B-Chat-GPTQ-Int8](https://huggingface.co/Qwen/Qwen1.5-72B-Chat-GPTQ-Int8)|\\n|qwen1half-moe-a2_7b-chat-int4|[qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.40|moe|[Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4)|\\n|qwen1half-0_5b-chat-awq|[qwen/Qwen1.5-0.5B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-0.5B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-AWQ)|\\n|qwen1half-1_8b-chat-awq|[qwen/Qwen1.5-1.8B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-1.8B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-AWQ)|\\n|qwen1half-4b-chat-awq|[qwen/Qwen1.5-4B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-4B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-4B-Chat-AWQ)|\\n|qwen1half-7b-chat-awq|[qwen/Qwen1.5-7B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-7B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-7B-Chat-AWQ)|\\n|qwen1half-14b-chat-awq|[qwen/Qwen1.5-14B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-14B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-14B-Chat-AWQ)|\\n|qwen1half-32b-chat-awq|[qwen/Qwen1.5-32B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-32B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-32B-Chat-AWQ)|\\n|qwen1half-72b-chat-awq|[qwen/Qwen1.5-72B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-72B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-72B-Chat-AWQ)|\\n|qwen1half-110b-chat-awq|[qwen/Qwen1.5-110B-Chat-AWQ](https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen1.5-110B-Chat-AWQ](https://huggingface.co/Qwen/Qwen1.5-110B-Chat-AWQ)|\\n|codeqwen1half-7b-chat-awq|[qwen/CodeQwen1.5-7B-Chat-AWQ](https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/CodeQwen1.5-7B-Chat-AWQ](https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat-AWQ)|\\n|qwen2-0_5b|[qwen/Qwen2-0.5B](https://modelscope.cn/models/qwen/Qwen2-0.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-0.5B](https://huggingface.co/Qwen/Qwen2-0.5B)|\\n|qwen2-0_5b-instruct|[qwen/Qwen2-0.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct)|\\n|qwen2-0_5b-instruct-int4|[qwen/Qwen2-0.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-0.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GPTQ-Int4)|\\n|qwen2-0_5b-instruct-int8|[qwen/Qwen2-0.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-0.5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GPTQ-Int8)|\\n|qwen2-0_5b-instruct-awq|[qwen/Qwen2-0.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-0.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-AWQ)|\\n|qwen2-1_5b|[qwen/Qwen2-1.5B](https://modelscope.cn/models/qwen/Qwen2-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-1.5B](https://huggingface.co/Qwen/Qwen2-1.5B)|\\n|qwen2-1_5b-instruct|[qwen/Qwen2-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2-1.5B-Instruct)|\\n|qwen2-1_5b-instruct-int4|[qwen/Qwen2-1.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-1.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-GPTQ-Int4)|\\n|qwen2-1_5b-instruct-int8|[qwen/Qwen2-1.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-1_5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-1_5B-Instruct-GPTQ-Int8)|\\n|qwen2-1_5b-instruct-awq|[qwen/Qwen2-1.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-1.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-AWQ)|\\n|qwen2-7b|[qwen/Qwen2-7B](https://modelscope.cn/models/qwen/Qwen2-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-7B](https://huggingface.co/Qwen/Qwen2-7B)|\\n|qwen2-7b-instruct|[qwen/Qwen2-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-7B-Instruct](https://huggingface.co/Qwen/Qwen2-7B-Instruct)|\\n|qwen2-7b-instruct-int4|[qwen/Qwen2-7B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-7B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-7B-Instruct-GPTQ-Int4)|\\n|qwen2-7b-instruct-int8|[qwen/Qwen2-7B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-7B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-7B-Instruct-GPTQ-Int8)|\\n|qwen2-7b-instruct-awq|[qwen/Qwen2-7B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-7B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-7B-Instruct-AWQ)|\\n|qwen2-72b|[qwen/Qwen2-72B](https://modelscope.cn/models/qwen/Qwen2-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-72B](https://huggingface.co/Qwen/Qwen2-72B)|\\n|qwen2-72b-instruct|[qwen/Qwen2-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-72B-Instruct](https://huggingface.co/Qwen/Qwen2-72B-Instruct)|\\n|qwen2-72b-instruct-int4|[qwen/Qwen2-72B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-72B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-72B-Instruct-GPTQ-Int4)|\\n|qwen2-72b-instruct-int8|[qwen/Qwen2-72B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2-72B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-72B-Instruct-GPTQ-Int8)|\\n|qwen2-72b-instruct-awq|[qwen/Qwen2-72B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2-72B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-72B-Instruct-AWQ)|\\n|qwen2-57b-a14b|[qwen/Qwen2-57B-A14B](https://modelscope.cn/models/qwen/Qwen2-57B-A14B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen2-57B-A14B](https://huggingface.co/Qwen/Qwen2-57B-A14B)|\\n|qwen2-57b-a14b-instruct|[qwen/Qwen2-57B-A14B-Instruct](https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.40|moe|[Qwen/Qwen2-57B-A14B-Instruct](https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct)|\\n|qwen2-57b-a14b-instruct-int4|[qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.40|moe|[Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4)|\\n|qwen2-math-1_5b|[qwen/Qwen2-Math-1.5B](https://modelscope.cn/models/qwen/Qwen2-Math-1.5B/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-1.5B](https://huggingface.co/Qwen/Qwen2-Math-1.5B)|\\n|qwen2-math-1_5b-instruct|[qwen/Qwen2-Math-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Math-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2-Math-1.5B-Instruct)|\\n|qwen2-math-7b|[qwen/Qwen2-Math-7B](https://modelscope.cn/models/qwen/Qwen2-Math-7B/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-7B](https://huggingface.co/Qwen/Qwen2-Math-7B)|\\n|qwen2-math-7b-instruct|[qwen/Qwen2-Math-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Math-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-7B-Instruct](https://huggingface.co/Qwen/Qwen2-Math-7B-Instruct)|\\n|qwen2-math-72b|[qwen/Qwen2-Math-72B](https://modelscope.cn/models/qwen/Qwen2-Math-72B/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-72B](https://huggingface.co/Qwen/Qwen2-Math-72B)|\\n|qwen2-math-72b-instruct|[qwen/Qwen2-Math-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Math-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2714;|transformers>=4.37|-|[Qwen/Qwen2-Math-72B-Instruct](https://huggingface.co/Qwen/Qwen2-Math-72B-Instruct)|\\n|qwen2_5-0_5b|[qwen/Qwen2.5-0.5B](https://modelscope.cn/models/qwen/Qwen2.5-0.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-0.5B](https://huggingface.co/Qwen/Qwen2.5-0.5B)|\\n|qwen2_5-1_5b|[qwen/Qwen2.5-1.5B](https://modelscope.cn/models/qwen/Qwen2.5-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-1.5B](https://huggingface.co/Qwen/Qwen2.5-1.5B)|\\n|qwen2_5-3b|[qwen/Qwen2.5-3B](https://modelscope.cn/models/qwen/Qwen2.5-3B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-3B](https://huggingface.co/Qwen/Qwen2.5-3B)|\\n|qwen2_5-7b|[qwen/Qwen2.5-7B](https://modelscope.cn/models/qwen/Qwen2.5-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-7B](https://huggingface.co/Qwen/Qwen2.5-7B)|\\n|qwen2_5-14b|[qwen/Qwen2.5-14B](https://modelscope.cn/models/qwen/Qwen2.5-14B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-14B](https://huggingface.co/Qwen/Qwen2.5-14B)|\\n|qwen2_5-32b|[qwen/Qwen2.5-32B](https://modelscope.cn/models/qwen/Qwen2.5-32B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-32B](https://huggingface.co/Qwen/Qwen2.5-32B)|\\n|qwen2_5-72b|[qwen/Qwen2.5-72B](https://modelscope.cn/models/qwen/Qwen2.5-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-72B](https://huggingface.co/Qwen/Qwen2.5-72B)|\\n|qwen2_5-0_5b-instruct|[qwen/Qwen2.5-0.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-0.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct)|\\n|qwen2_5-1_5b-instruct|[qwen/Qwen2.5-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct)|\\n|qwen2_5-3b-instruct|[qwen/Qwen2.5-3B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)|\\n|qwen2_5-7b-instruct|[qwen/Qwen2.5-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct)|\\n|qwen2_5-14b-instruct|[qwen/Qwen2.5-14B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-14B-Instruct](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct)|\\n|qwen2_5-32b-instruct|[qwen/Qwen2.5-32B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-32B-Instruct](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct)|\\n|qwen2_5-72b-instruct|[qwen/Qwen2.5-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-72B-Instruct](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct)|\\n|qwen2_5-0_5b-instruct-gptq-int4|[qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int4)|\\n|qwen2_5-1_5b-instruct-gptq-int4|[qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int4)|\\n|qwen2_5-3b-instruct-gptq-int4|[qwen/Qwen2.5-3B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-3B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-GPTQ-Int4)|\\n|qwen2_5-7b-instruct-gptq-int4|[qwen/Qwen2.5-7B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4)|\\n|qwen2_5-14b-instruct-gptq-int4|[qwen/Qwen2.5-14B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-14B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct-GPTQ-Int4)|\\n|qwen2_5-32b-instruct-gptq-int4|[qwen/Qwen2.5-32B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-32B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct-GPTQ-Int4)|\\n|qwen2_5-72b-instruct-gptq-int4|[qwen/Qwen2.5-72B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-72B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct-GPTQ-Int4)|\\n|qwen2_5-0_5b-instruct-gptq-int8|[qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GPTQ-Int8)|\\n|qwen2_5-1_5b-instruct-gptq-int8|[qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GPTQ-Int8)|\\n|qwen2_5-3b-instruct-gptq-int8|[qwen/Qwen2.5-3B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-3B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-GPTQ-Int8)|\\n|qwen2_5-7b-instruct-gptq-int8|[qwen/Qwen2.5-7B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-7B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GPTQ-Int8)|\\n|qwen2_5-14b-instruct-gptq-int8|[qwen/Qwen2.5-14B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-14B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct-GPTQ-Int8)|\\n|qwen2_5-32b-instruct-gptq-int8|[qwen/Qwen2.5-32B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-32B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct-GPTQ-Int8)|\\n|qwen2_5-72b-instruct-gptq-int8|[qwen/Qwen2.5-72B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5, transformers>=4.37|-|[Qwen/Qwen2.5-72B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct-GPTQ-Int8)|\\n|qwen2_5-0_5b-instruct-awq|[qwen/Qwen2.5-0.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-0.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-0.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-AWQ)|\\n|qwen2_5-1_5b-instruct-awq|[qwen/Qwen2.5-1.5B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-1.5B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-1.5B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-AWQ)|\\n|qwen2_5-3b-instruct-awq|[qwen/Qwen2.5-3B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-3B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-3B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-AWQ)|\\n|qwen2_5-7b-instruct-awq|[qwen/Qwen2.5-7B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-7B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-7B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-AWQ)|\\n|qwen2_5-14b-instruct-awq|[qwen/Qwen2.5-14B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-14B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-14B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-14B-Instruct-AWQ)|\\n|qwen2_5-32b-instruct-awq|[qwen/Qwen2.5-32B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-32B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-32B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct-AWQ)|\\n|qwen2_5-72b-instruct-awq|[qwen/Qwen2.5-72B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2.5-72B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.37, autoawq|-|[Qwen/Qwen2.5-72B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct-AWQ)|\\n|qwen2_5-math-1_5b|[qwen/Qwen2.5-Math-1.5B](https://modelscope.cn/models/qwen/Qwen2.5-Math-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-1.5B](https://huggingface.co/Qwen/Qwen2.5-Math-1.5B)|\\n|qwen2_5-math-7b|[qwen/Qwen2.5-Math-7B](https://modelscope.cn/models/qwen/Qwen2.5-Math-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-7B](https://huggingface.co/Qwen/Qwen2.5-Math-7B)|\\n|qwen2_5-math-72b|[qwen/Qwen2.5-Math-72B](https://modelscope.cn/models/qwen/Qwen2.5-Math-72B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-72B](https://huggingface.co/Qwen/Qwen2.5-Math-72B)|\\n|qwen2_5-math-1_5b-instruct|[qwen/Qwen2.5-Math-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Math-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Math-1.5B-Instruct)|\\n|qwen2_5-math-7b-instruct|[qwen/Qwen2.5-Math-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Math-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Math-7B-Instruct)|\\n|qwen2_5-math-72b-instruct|[qwen/Qwen2.5-Math-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Math-72B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Math-72B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Math-72B-Instruct)|\\n|qwen2_5-coder-1_5b|[qwen/Qwen2.5-Coder-1.5B](https://modelscope.cn/models/qwen/Qwen2.5-Coder-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-1.5B](https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B)|\\n|qwen2_5-coder-1_5b-instruct|[qwen/Qwen2.5-Coder-1.5B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Coder-1.5B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct)|\\n|qwen2_5-coder-7b|[qwen/Qwen2.5-Coder-7B](https://modelscope.cn/models/qwen/Qwen2.5-Coder-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-7B](https://huggingface.co/Qwen/Qwen2.5-Coder-7B)|\\n|qwen2_5-coder-7b-instruct|[qwen/Qwen2.5-Coder-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2.5-Coder-7B-Instruct/summary)|q_proj, k_proj, v_proj|qwen2_5|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.37|-|[Qwen/Qwen2.5-Coder-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct)|\\n|chatglm2-6b|[ZhipuAI/chatglm2-6b](https://modelscope.cn/models/ZhipuAI/chatglm2-6b/summary)|query_key_value|chatglm2|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm2-6b](https://huggingface.co/THUDM/chatglm2-6b)|\\n|chatglm2-6b-32k|[ZhipuAI/chatglm2-6b-32k](https://modelscope.cn/models/ZhipuAI/chatglm2-6b-32k/summary)|query_key_value|chatglm2|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm2-6b-32k](https://huggingface.co/THUDM/chatglm2-6b-32k)|\\n|chatglm3-6b-base|[ZhipuAI/chatglm3-6b-base](https://modelscope.cn/models/ZhipuAI/chatglm3-6b-base/summary)|query_key_value|chatglm-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b-base](https://huggingface.co/THUDM/chatglm3-6b-base)|\\n|chatglm3-6b|[ZhipuAI/chatglm3-6b](https://modelscope.cn/models/ZhipuAI/chatglm3-6b/summary)|query_key_value|chatglm3|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b](https://huggingface.co/THUDM/chatglm3-6b)|\\n|chatglm3-6b-32k|[ZhipuAI/chatglm3-6b-32k](https://modelscope.cn/models/ZhipuAI/chatglm3-6b-32k/summary)|query_key_value|chatglm3|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b-32k](https://huggingface.co/THUDM/chatglm3-6b-32k)|\\n|chatglm3-6b-128k|[ZhipuAI/chatglm3-6b-128k](https://modelscope.cn/models/ZhipuAI/chatglm3-6b-128k/summary)|query_key_value|chatglm3|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.42|-|[THUDM/chatglm3-6b-128k](https://huggingface.co/THUDM/chatglm3-6b-128k)|\\n|codegeex2-6b|[ZhipuAI/codegeex2-6b](https://modelscope.cn/models/ZhipuAI/codegeex2-6b/summary)|query_key_value|chatglm-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.34|coding|[THUDM/codegeex2-6b](https://huggingface.co/THUDM/codegeex2-6b)|\\n|glm4-9b|[ZhipuAI/glm-4-9b](https://modelscope.cn/models/ZhipuAI/glm-4-9b/summary)|query_key_value|chatglm-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/glm-4-9b](https://huggingface.co/THUDM/glm-4-9b)|\\n|glm4-9b-chat|[ZhipuAI/glm-4-9b-chat](https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/summary)|query_key_value|chatglm4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/glm-4-9b-chat](https://huggingface.co/THUDM/glm-4-9b-chat)|\\n|glm4-9b-chat-1m|[ZhipuAI/glm-4-9b-chat-1m](https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat-1m/summary)|query_key_value|chatglm4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/glm-4-9b-chat-1m](https://huggingface.co/THUDM/glm-4-9b-chat-1m)|\\n|codegeex4-9b-chat|[ZhipuAI/codegeex4-all-9b](https://modelscope.cn/models/ZhipuAI/codegeex4-all-9b/summary)|query_key_value|codegeex4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers<4.42|coding|[THUDM/codegeex4-all-9b](https://huggingface.co/THUDM/codegeex4-all-9b)|\\n|llama2-7b|[modelscope/Llama-2-7b-ms](https://modelscope.cn/models/modelscope/Llama-2-7b-ms/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-7b-hf](https://huggingface.co/meta-llama/Llama-2-7b-hf)|\\n|llama2-7b-chat|[modelscope/Llama-2-7b-chat-ms](https://modelscope.cn/models/modelscope/Llama-2-7b-chat-ms/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-7b-chat-hf](https://huggingface.co/meta-llama/Llama-2-7b-chat-hf)|\\n|llama2-13b|[modelscope/Llama-2-13b-ms](https://modelscope.cn/models/modelscope/Llama-2-13b-ms/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-13b-hf](https://huggingface.co/meta-llama/Llama-2-13b-hf)|\\n|llama2-13b-chat|[modelscope/Llama-2-13b-chat-ms](https://modelscope.cn/models/modelscope/Llama-2-13b-chat-ms/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-13b-chat-hf](https://huggingface.co/meta-llama/Llama-2-13b-chat-hf)|\\n|llama2-70b|[modelscope/Llama-2-70b-ms](https://modelscope.cn/models/modelscope/Llama-2-70b-ms/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-70b-hf](https://huggingface.co/meta-llama/Llama-2-70b-hf)|\\n|llama2-70b-chat|[modelscope/Llama-2-70b-chat-ms](https://modelscope.cn/models/modelscope/Llama-2-70b-chat-ms/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Llama-2-70b-chat-hf](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf)|\\n|llama2-7b-aqlm-2bit-1x16|[AI-ModelScope/Llama-2-7b-AQLM-2Bit-1x16-hf](https://modelscope.cn/models/AI-ModelScope/Llama-2-7b-AQLM-2Bit-1x16-hf/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.38, aqlm, torch>=2.2.0|-|[ISTA-DASLab/Llama-2-7b-AQLM-2Bit-1x16-hf](https://huggingface.co/ISTA-DASLab/Llama-2-7b-AQLM-2Bit-1x16-hf)|\\n|llama3-8b|[LLM-Research/Meta-Llama-3-8B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-8B](https://huggingface.co/meta-llama/Meta-Llama-3-8B)|\\n|llama3-8b-instruct|[LLM-Research/Meta-Llama-3-8B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-8B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct)|\\n|llama3-8b-instruct-int4|[swift/Meta-Llama-3-8B-Instruct-GPTQ-Int4](https://modelscope.cn/models/swift/Meta-Llama-3-8B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int4](https://huggingface.co/study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int4)|\\n|llama3-8b-instruct-int8|[swift/Meta-Llama-3-8B-Instruct-GPTQ-Int8](https://modelscope.cn/models/swift/Meta-Llama-3-8B-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int8](https://huggingface.co/study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int8)|\\n|llama3-8b-instruct-awq|[swift/Meta-Llama-3-8B-Instruct-AWQ](https://modelscope.cn/models/swift/Meta-Llama-3-8B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[study-hjt/Meta-Llama-3-8B-Instruct-AWQ](https://huggingface.co/study-hjt/Meta-Llama-3-8B-Instruct-AWQ)|\\n|llama3-70b|[LLM-Research/Meta-Llama-3-70B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-70B](https://huggingface.co/meta-llama/Meta-Llama-3-70B)|\\n|llama3-70b-instruct|[LLM-Research/Meta-Llama-3-70B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[meta-llama/Meta-Llama-3-70B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct)|\\n|llama3-70b-instruct-int4|[swift/Meta-Llama-3-70B-Instruct-GPTQ-Int4](https://modelscope.cn/models/swift/Meta-Llama-3-70B-Instruct-GPTQ-Int4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int4](https://huggingface.co/study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int4)|\\n|llama3-70b-instruct-int8|[swift/Meta-Llama-3-70b-Instruct-GPTQ-Int8](https://modelscope.cn/models/swift/Meta-Llama-3-70b-Instruct-GPTQ-Int8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int8](https://huggingface.co/study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int8)|\\n|llama3-70b-instruct-awq|[swift/Meta-Llama-3-70B-Instruct-AWQ](https://modelscope.cn/models/swift/Meta-Llama-3-70B-Instruct-AWQ/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[study-hjt/Meta-Llama-3-70B-Instruct-AWQ](https://huggingface.co/study-hjt/Meta-Llama-3-70B-Instruct-AWQ)|\\n|llama3_1-8b|[LLM-Research/Meta-Llama-3.1-8B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-8B](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B)|\\n|llama3_1-8b-instruct|[LLM-Research/Meta-Llama-3.1-8B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct)|\\n|llama3_1-8b-instruct-awq|[LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, autoawq|-|[hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4)|\\n|llama3_1-8b-instruct-gptq-int4|[LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, auto_gptq|-|[hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4)|\\n|llama3_1-8b-instruct-bnb|[LLM-Research/Meta-Llama-3.1-8B-Instruct-BNB-NF4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-BNB-NF4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, bitsandbytes|-|[hugging-quants/Meta-Llama-3.1-8B-Instruct-BNB-NF4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-BNB-NF4)|\\n|llama3_1-70b|[LLM-Research/Meta-Llama-3.1-70B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-70B](https://huggingface.co/meta-llama/Meta-Llama-3.1-70B)|\\n|llama3_1-70b-instruct|[LLM-Research/Meta-Llama-3.1-70B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-70B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct)|\\n|llama3_1-70b-instruct-fp8|[LLM-Research/Meta-Llama-3.1-70B-Instruct-FP8](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-FP8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-70B-Instruct-FP8](https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct-FP8)|\\n|llama3_1-70b-instruct-awq|[LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43, autoawq|-|[hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4)|\\n|llama3_1-70b-instruct-gptq-int4|[LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, auto_gptq|-|[hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4)|\\n|llama3_1-70b-instruct-bnb|[LLM-Research/Meta-Llama-3.1-70B-Instruct-bnb-4bit](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-bnb-4bit/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, bitsandbytes|-|[unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit](https://huggingface.co/unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit)|\\n|llama3_1-405b|[LLM-Research/Meta-Llama-3.1-405B](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-405B](https://huggingface.co/meta-llama/Meta-Llama-3.1-405B)|\\n|llama3_1-405b-instruct|[LLM-Research/Meta-Llama-3.1-405B-Instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-405B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3.1-405B-Instruct)|\\n|llama3_1-405b-instruct-fp8|[LLM-Research/Meta-Llama-3.1-405B-Instruct-FP8](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-FP8/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[meta-llama/Meta-Llama-3.1-405B-Instruct-FP8](https://huggingface.co/meta-llama/Meta-Llama-3.1-405B-Instruct-FP8)|\\n|llama3_1-405b-instruct-awq|[LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43, autoawq|-|[hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4)|\\n|llama3_1-405b-instruct-gptq-int4|[LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, auto_gptq|-|[hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4)|\\n|llama3_1-405b-instruct-bnb|[LLM-Research/Meta-Llama-3.1-405B-Instruct-BNB-NF4](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-BNB-NF4/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43, bitsandbytes|-|[hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4](https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4)|\\n|llama3_2-1b|[LLM-Research/Llama-3.2-1B](https://modelscope.cn/models/LLM-Research/Llama-3.2-1B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-1B](https://huggingface.co/meta-llama/Llama-3.2-1B)|\\n|llama3_2-1b-instruct|[LLM-Research/Llama-3.2-1B-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-1B-Instruct/summary)|q_proj, k_proj, v_proj|llama3_2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-1B-Instruct](https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct)|\\n|llama3_2-3b|[LLM-Research/Llama-3.2-3B](https://modelscope.cn/models/LLM-Research/Llama-3.2-3B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-3B](https://huggingface.co/meta-llama/Llama-3.2-3B)|\\n|llama3_2-3b-instruct|[LLM-Research/Llama-3.2-3B-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-3B-Instruct/summary)|q_proj, k_proj, v_proj|llama3_2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.45|-|[meta-llama/Llama-3.2-3B-Instruct](https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct)|\\n|reflection-llama_3_1-70b|[LLM-Research/Reflection-Llama-3.1-70B](https://modelscope.cn/models/LLM-Research/Reflection-Llama-3.1-70B/summary)|q_proj, k_proj, v_proj|reflection|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mattshumer/Reflection-Llama-3.1-70B](https://huggingface.co/mattshumer/Reflection-Llama-3.1-70B)|\\n|longwriter-glm4-9b|[ZhipuAI/LongWriter-glm4-9b](https://modelscope.cn/models/ZhipuAI/LongWriter-glm4-9b/summary)|query_key_value|chatglm4|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.42|-|[THUDM/LongWriter-glm4-9b](https://huggingface.co/THUDM/LongWriter-glm4-9b)|\\n|longwriter-llama3_1-8b|[ZhipuAI/LongWriter-llama3.1-8b](https://modelscope.cn/models/ZhipuAI/LongWriter-llama3.1-8b/summary)|q_proj, k_proj, v_proj|longwriter-llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[THUDM/LongWriter-llama3.1-8b](https://huggingface.co/THUDM/LongWriter-llama3.1-8b)|\\n|chinese-llama-2-1_3b|[AI-ModelScope/chinese-llama-2-1.3b](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-1.3b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-1.3b](https://huggingface.co/hfl/chinese-llama-2-1.3b)|\\n|chinese-llama-2-7b|[AI-ModelScope/chinese-llama-2-7b](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-7b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-7b](https://huggingface.co/hfl/chinese-llama-2-7b)|\\n|chinese-llama-2-7b-16k|[AI-ModelScope/chinese-llama-2-7b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-7b-16k/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-7b-16k](https://huggingface.co/hfl/chinese-llama-2-7b-16k)|\\n|chinese-llama-2-7b-64k|[AI-ModelScope/chinese-llama-2-7b-64k](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-7b-64k/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-7b-64k](https://huggingface.co/hfl/chinese-llama-2-7b-64k)|\\n|chinese-llama-2-13b|[AI-ModelScope/chinese-llama-2-13b](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-13b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-13b](https://huggingface.co/hfl/chinese-llama-2-13b)|\\n|chinese-llama-2-13b-16k|[AI-ModelScope/chinese-llama-2-13b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-llama-2-13b-16k/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-llama-2-13b-16k](https://huggingface.co/hfl/chinese-llama-2-13b-16k)|\\n|chinese-alpaca-2-1_3b|[AI-ModelScope/chinese-alpaca-2-1.3b](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-1.3b/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-1.3b](https://huggingface.co/hfl/chinese-alpaca-2-1.3b)|\\n|chinese-alpaca-2-7b|[AI-ModelScope/chinese-alpaca-2-7b](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-7b/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-7b](https://huggingface.co/hfl/chinese-alpaca-2-7b)|\\n|chinese-alpaca-2-7b-16k|[AI-ModelScope/chinese-alpaca-2-7b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-7b-16k/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-7b-16k](https://huggingface.co/hfl/chinese-alpaca-2-7b-16k)|\\n|chinese-alpaca-2-7b-64k|[AI-ModelScope/chinese-alpaca-2-7b-64k](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-7b-64k/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-7b-64k](https://huggingface.co/hfl/chinese-alpaca-2-7b-64k)|\\n|chinese-alpaca-2-13b|[AI-ModelScope/chinese-alpaca-2-13b](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-13b/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-13b](https://huggingface.co/hfl/chinese-alpaca-2-13b)|\\n|chinese-alpaca-2-13b-16k|[AI-ModelScope/chinese-alpaca-2-13b-16k](https://modelscope.cn/models/AI-ModelScope/chinese-alpaca-2-13b-16k/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/chinese-alpaca-2-13b-16k](https://huggingface.co/hfl/chinese-alpaca-2-13b-16k)|\\n|llama-3-chinese-8b|[ChineseAlpacaGroup/llama-3-chinese-8b](https://modelscope.cn/models/ChineseAlpacaGroup/llama-3-chinese-8b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/llama-3-chinese-8b](https://huggingface.co/hfl/llama-3-chinese-8b)|\\n|llama-3-chinese-8b-instruct|[ChineseAlpacaGroup/llama-3-chinese-8b-instruct](https://modelscope.cn/models/ChineseAlpacaGroup/llama-3-chinese-8b-instruct/summary)|q_proj, k_proj, v_proj|llama3|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[hfl/llama-3-chinese-8b-instruct](https://huggingface.co/hfl/llama-3-chinese-8b-instruct)|\\n|atom-7b|[FlagAlpha/Atom-7B](https://modelscope.cn/models/FlagAlpha/Atom-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[FlagAlpha/Atom-7B](https://huggingface.co/FlagAlpha/Atom-7B)|\\n|atom-7b-chat|[FlagAlpha/Atom-7B-Chat](https://modelscope.cn/models/FlagAlpha/Atom-7B-Chat/summary)|q_proj, k_proj, v_proj|atom|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[FlagAlpha/Atom-7B-Chat](https://huggingface.co/FlagAlpha/Atom-7B-Chat)|\\n|yi-6b|[01ai/Yi-6B](https://modelscope.cn/models/01ai/Yi-6B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-6B](https://huggingface.co/01-ai/Yi-6B)|\\n|yi-6b-200k|[01ai/Yi-6B-200K](https://modelscope.cn/models/01ai/Yi-6B-200K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-6B-200K](https://huggingface.co/01-ai/Yi-6B-200K)|\\n|yi-6b-chat|[01ai/Yi-6B-Chat](https://modelscope.cn/models/01ai/Yi-6B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-6B-Chat](https://huggingface.co/01-ai/Yi-6B-Chat)|\\n|yi-6b-chat-awq|[01ai/Yi-6B-Chat-4bits](https://modelscope.cn/models/01ai/Yi-6B-Chat-4bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[01-ai/Yi-6B-Chat-4bits](https://huggingface.co/01-ai/Yi-6B-Chat-4bits)|\\n|yi-6b-chat-int8|[01ai/Yi-6B-Chat-8bits](https://modelscope.cn/models/01ai/Yi-6B-Chat-8bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[01-ai/Yi-6B-Chat-8bits](https://huggingface.co/01-ai/Yi-6B-Chat-8bits)|\\n|yi-9b|[01ai/Yi-9B](https://modelscope.cn/models/01ai/Yi-9B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-9B](https://huggingface.co/01-ai/Yi-9B)|\\n|yi-9b-200k|[01ai/Yi-9B-200K](https://modelscope.cn/models/01ai/Yi-9B-200K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-9B-200K](https://huggingface.co/01-ai/Yi-9B-200K)|\\n|yi-34b|[01ai/Yi-34B](https://modelscope.cn/models/01ai/Yi-34B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-34B](https://huggingface.co/01-ai/Yi-34B)|\\n|yi-34b-200k|[01ai/Yi-34B-200K](https://modelscope.cn/models/01ai/Yi-34B-200K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-34B-200K](https://huggingface.co/01-ai/Yi-34B-200K)|\\n|yi-34b-chat|[01ai/Yi-34B-Chat](https://modelscope.cn/models/01ai/Yi-34B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-34B-Chat](https://huggingface.co/01-ai/Yi-34B-Chat)|\\n|yi-34b-chat-awq|[01ai/Yi-34B-Chat-4bits](https://modelscope.cn/models/01ai/Yi-34B-Chat-4bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[01-ai/Yi-34B-Chat-4bits](https://huggingface.co/01-ai/Yi-34B-Chat-4bits)|\\n|yi-34b-chat-int8|[01ai/Yi-34B-Chat-8bits](https://modelscope.cn/models/01ai/Yi-34B-Chat-8bits/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq|-|[01-ai/Yi-34B-Chat-8bits](https://huggingface.co/01-ai/Yi-34B-Chat-8bits)|\\n|yi-1_5-6b|[01ai/Yi-1.5-6B](https://modelscope.cn/models/01ai/Yi-1.5-6B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-6B](https://huggingface.co/01-ai/Yi-1.5-6B)|\\n|yi-1_5-6b-chat|[01ai/Yi-1.5-6B-Chat](https://modelscope.cn/models/01ai/Yi-1.5-6B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-6B-Chat](https://huggingface.co/01-ai/Yi-1.5-6B-Chat)|\\n|yi-1_5-9b|[01ai/Yi-1.5-9B](https://modelscope.cn/models/01ai/Yi-1.5-9B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-9B](https://huggingface.co/01-ai/Yi-1.5-9B)|\\n|yi-1_5-9b-chat|[01ai/Yi-1.5-9B-Chat](https://modelscope.cn/models/01ai/Yi-1.5-9B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-9B-Chat](https://huggingface.co/01-ai/Yi-1.5-9B-Chat)|\\n|yi-1_5-9b-chat-16k|[01ai/Yi-1.5-9B-Chat-16K](https://modelscope.cn/models/01ai/Yi-1.5-9B-Chat-16K/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-9B-Chat-16K](https://huggingface.co/01-ai/Yi-1.5-9B-Chat-16K)|\\n|yi-1_5-34b|[01ai/Yi-1.5-34B](https://modelscope.cn/models/01ai/Yi-1.5-34B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-34B](https://huggingface.co/01-ai/Yi-1.5-34B)|\\n|yi-1_5-34b-chat|[01ai/Yi-1.5-34B-Chat](https://modelscope.cn/models/01ai/Yi-1.5-34B-Chat/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-34B-Chat](https://huggingface.co/01-ai/Yi-1.5-34B-Chat)|\\n|yi-1_5-34b-chat-16k|[01ai/Yi-1.5-34B-Chat-16K](https://modelscope.cn/models/01ai/Yi-1.5-34B-Chat-16K/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-1.5-34B-Chat-16K](https://huggingface.co/01-ai/Yi-1.5-34B-Chat-16K)|\\n|yi-1_5-6b-chat-awq-int4|[AI-ModelScope/Yi-1.5-6B-Chat-AWQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-6B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[modelscope/Yi-1.5-6B-Chat-AWQ](https://huggingface.co/modelscope/Yi-1.5-6B-Chat-AWQ)|\\n|yi-1_5-6b-chat-gptq-int4|[AI-ModelScope/Yi-1.5-6B-Chat-GPTQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-6B-Chat-GPTQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[modelscope/Yi-1.5-6B-Chat-GPTQ](https://huggingface.co/modelscope/Yi-1.5-6B-Chat-GPTQ)|\\n|yi-1_5-9b-chat-awq-int4|[AI-ModelScope/Yi-1.5-9B-Chat-AWQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-9B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[modelscope/Yi-1.5-9B-Chat-AWQ](https://huggingface.co/modelscope/Yi-1.5-9B-Chat-AWQ)|\\n|yi-1_5-9b-chat-gptq-int4|[AI-ModelScope/Yi-1.5-9B-Chat-GPTQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-9B-Chat-GPTQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[modelscope/Yi-1.5-9B-Chat-GPTQ](https://huggingface.co/modelscope/Yi-1.5-9B-Chat-GPTQ)|\\n|yi-1_5-34b-chat-awq-int4|[AI-ModelScope/Yi-1.5-34B-Chat-AWQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-34B-Chat-AWQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2714;|&#x2718;|autoawq|-|[modelscope/Yi-1.5-34B-Chat-AWQ](https://huggingface.co/modelscope/Yi-1.5-34B-Chat-AWQ)|\\n|yi-1_5-34b-chat-gptq-int4|[AI-ModelScope/Yi-1.5-34B-Chat-GPTQ](https://modelscope.cn/models/AI-ModelScope/Yi-1.5-34B-Chat-GPTQ/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|[modelscope/Yi-1.5-34B-Chat-GPTQ](https://huggingface.co/modelscope/Yi-1.5-34B-Chat-GPTQ)|\\n|yi-coder-1_5b|[01ai/Yi-Coder-1.5B](https://modelscope.cn/models/01ai/Yi-Coder-1.5B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-1.5B](https://huggingface.co/01-ai/Yi-Coder-1.5B)|\\n|yi-coder-1_5b-chat|[01ai/Yi-Coder-1.5B-Chat](https://modelscope.cn/models/01ai/Yi-Coder-1.5B-Chat/summary)|q_proj, k_proj, v_proj|yi-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-1.5B-Chat](https://huggingface.co/01-ai/Yi-Coder-1.5B-Chat)|\\n|yi-coder-9b|[01ai/Yi-Coder-9B](https://modelscope.cn/models/01ai/Yi-Coder-9B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-9B](https://huggingface.co/01-ai/Yi-Coder-9B)|\\n|yi-coder-9b-chat|[01ai/Yi-Coder-9B-Chat](https://modelscope.cn/models/01ai/Yi-Coder-9B-Chat/summary)|q_proj, k_proj, v_proj|yi-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[01-ai/Yi-Coder-9B-Chat](https://huggingface.co/01-ai/Yi-Coder-9B-Chat)|\\n|internlm-7b|[Shanghai_AI_Laboratory/internlm-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-7b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-7b](https://huggingface.co/internlm/internlm-7b)|\\n|internlm-7b-chat|[Shanghai_AI_Laboratory/internlm-chat-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-7b/summary)|q_proj, k_proj, v_proj|internlm|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-chat-7b](https://huggingface.co/internlm/internlm-chat-7b)|\\n|internlm-7b-chat-8k|[Shanghai_AI_Laboratory/internlm-chat-7b-8k](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-7b-8k/summary)|q_proj, k_proj, v_proj|internlm|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|-|\\n|internlm-20b|[Shanghai_AI_Laboratory/internlm-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-20b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-20b](https://huggingface.co/internlm/internlm-20b)|\\n|internlm-20b-chat|[Shanghai_AI_Laboratory/internlm-chat-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-20b/summary)|q_proj, k_proj, v_proj|internlm|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[internlm/internlm-chat-20b](https://huggingface.co/internlm/internlm-chat-20b)|\\n|internlm2-1_8b|[Shanghai_AI_Laboratory/internlm2-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-1_8b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-1_8b](https://huggingface.co/internlm/internlm2-1_8b)|\\n|internlm2-1_8b-sft-chat|[Shanghai_AI_Laboratory/internlm2-chat-1_8b-sft](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-1_8b-sft/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-1_8b-sft](https://huggingface.co/internlm/internlm2-chat-1_8b-sft)|\\n|internlm2-1_8b-chat|[Shanghai_AI_Laboratory/internlm2-chat-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-1_8b](https://huggingface.co/internlm/internlm2-chat-1_8b)|\\n|internlm2-7b-base|[Shanghai_AI_Laboratory/internlm2-base-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-base-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-base-7b](https://huggingface.co/internlm/internlm2-base-7b)|\\n|internlm2-7b|[Shanghai_AI_Laboratory/internlm2-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-7b](https://huggingface.co/internlm/internlm2-7b)|\\n|internlm2-7b-sft-chat|[Shanghai_AI_Laboratory/internlm2-chat-7b-sft](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-7b-sft/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-7b-sft](https://huggingface.co/internlm/internlm2-chat-7b-sft)|\\n|internlm2-7b-chat|[Shanghai_AI_Laboratory/internlm2-chat-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-7b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-7b](https://huggingface.co/internlm/internlm2-chat-7b)|\\n|internlm2-20b-base|[Shanghai_AI_Laboratory/internlm2-base-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-base-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-base-20b](https://huggingface.co/internlm/internlm2-base-20b)|\\n|internlm2-20b|[Shanghai_AI_Laboratory/internlm2-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-20b](https://huggingface.co/internlm/internlm2-20b)|\\n|internlm2-20b-sft-chat|[Shanghai_AI_Laboratory/internlm2-chat-20b-sft](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-20b-sft/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-20b-sft](https://huggingface.co/internlm/internlm2-chat-20b-sft)|\\n|internlm2-20b-chat|[Shanghai_AI_Laboratory/internlm2-chat-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-20b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2-chat-20b](https://huggingface.co/internlm/internlm2-chat-20b)|\\n|internlm2_5-1_8b|[Shanghai_AI_Laboratory/internlm2_5-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-1_8b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-1_8b](https://huggingface.co/internlm/internlm2_5-1_8b)|\\n|internlm2_5-1_8b-chat|[Shanghai_AI_Laboratory/internlm2_5-1_8b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-1_8b-chat](https://huggingface.co/internlm/internlm2_5-1_8b-chat)|\\n|internlm2_5-7b|[Shanghai_AI_Laboratory/internlm2_5-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-7b](https://huggingface.co/internlm/internlm2_5-7b)|\\n|internlm2_5-7b-chat|[Shanghai_AI_Laboratory/internlm2_5-7b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b-chat/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-7b-chat](https://huggingface.co/internlm/internlm2_5-7b-chat)|\\n|internlm2_5-7b-chat-1m|[Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-7b-chat-1m](https://huggingface.co/internlm/internlm2_5-7b-chat-1m)|\\n|internlm2_5-20b|[Shanghai_AI_Laboratory/internlm2_5-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-20b](https://huggingface.co/internlm/internlm2_5-20b)|\\n|internlm2_5-20b-chat|[Shanghai_AI_Laboratory/internlm2_5-20b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-20b-chat/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|-|[internlm/internlm2_5-20b-chat](https://huggingface.co/internlm/internlm2_5-20b-chat)|\\n|internlm2-math-7b|[Shanghai_AI_Laboratory/internlm2-math-base-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-base-7b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-base-7b](https://huggingface.co/internlm/internlm2-math-base-7b)|\\n|internlm2-math-7b-chat|[Shanghai_AI_Laboratory/internlm2-math-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-7b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-7b](https://huggingface.co/internlm/internlm2-math-7b)|\\n|internlm2-math-20b|[Shanghai_AI_Laboratory/internlm2-math-base-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-base-20b/summary)|wqkv|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-base-20b](https://huggingface.co/internlm/internlm2-math-base-20b)|\\n|internlm2-math-20b-chat|[Shanghai_AI_Laboratory/internlm2-math-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-20b/summary)|wqkv|internlm2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.38|math|[internlm/internlm2-math-20b](https://huggingface.co/internlm/internlm2-math-20b)|\\n|deepseek-7b|[deepseek-ai/deepseek-llm-7b-base](https://modelscope.cn/models/deepseek-ai/deepseek-llm-7b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-7b-base](https://huggingface.co/deepseek-ai/deepseek-llm-7b-base)|\\n|deepseek-7b-chat|[deepseek-ai/deepseek-llm-7b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-llm-7b-chat/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-7b-chat](https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat)|\\n|deepseek-moe-16b|[deepseek-ai/deepseek-moe-16b-base](https://modelscope.cn/models/deepseek-ai/deepseek-moe-16b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;||moe|[deepseek-ai/deepseek-moe-16b-base](https://huggingface.co/deepseek-ai/deepseek-moe-16b-base)|\\n|deepseek-moe-16b-chat|[deepseek-ai/deepseek-moe-16b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-moe-16b-chat/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2718;|&#x2718;||moe|[deepseek-ai/deepseek-moe-16b-chat](https://huggingface.co/deepseek-ai/deepseek-moe-16b-chat)|\\n|deepseek-67b|[deepseek-ai/deepseek-llm-67b-base](https://modelscope.cn/models/deepseek-ai/deepseek-llm-67b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-67b-base](https://huggingface.co/deepseek-ai/deepseek-llm-67b-base)|\\n|deepseek-67b-chat|[deepseek-ai/deepseek-llm-67b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-llm-67b-chat/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[deepseek-ai/deepseek-llm-67b-chat](https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat)|\\n|deepseek-coder-1_3b|[deepseek-ai/deepseek-coder-1.3b-base](https://modelscope.cn/models/deepseek-ai/deepseek-coder-1.3b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-1.3b-base](https://huggingface.co/deepseek-ai/deepseek-coder-1.3b-base)|\\n|deepseek-coder-1_3b-instruct|[deepseek-ai/deepseek-coder-1.3b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-coder-1.3b-instruct/summary)|q_proj, k_proj, v_proj|deepseek-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-1.3b-instruct](https://huggingface.co/deepseek-ai/deepseek-coder-1.3b-instruct)|\\n|deepseek-coder-6_7b|[deepseek-ai/deepseek-coder-6.7b-base](https://modelscope.cn/models/deepseek-ai/deepseek-coder-6.7b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-6.7b-base](https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-base)|\\n|deepseek-coder-6_7b-instruct|[deepseek-ai/deepseek-coder-6.7b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-coder-6.7b-instruct/summary)|q_proj, k_proj, v_proj|deepseek-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-6.7b-instruct](https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-instruct)|\\n|deepseek-coder-33b|[deepseek-ai/deepseek-coder-33b-base](https://modelscope.cn/models/deepseek-ai/deepseek-coder-33b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-33b-base](https://huggingface.co/deepseek-ai/deepseek-coder-33b-base)|\\n|deepseek-coder-33b-instruct|[deepseek-ai/deepseek-coder-33b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-coder-33b-instruct/summary)|q_proj, k_proj, v_proj|deepseek-coder|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[deepseek-ai/deepseek-coder-33b-instruct](https://huggingface.co/deepseek-ai/deepseek-coder-33b-instruct)|\\n|deepseek-coder-v2-instruct|[deepseek-ai/DeepSeek-Coder-V2-Instruct](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Instruct/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Instruct](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Instruct)|\\n|deepseek-coder-v2-lite-instruct|[deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct)|\\n|deepseek-coder-v2|[deepseek-ai/DeepSeek-Coder-V2-Base](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Base/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Base](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Base)|\\n|deepseek-coder-v2-lite|[deepseek-ai/DeepSeek-Coder-V2-Lite-Base](https://modelscope.cn/models/deepseek-ai/DeepSeek-Coder-V2-Lite-Base/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|coding, moe|[deepseek-ai/DeepSeek-Coder-V2-Lite-Base](https://huggingface.co/deepseek-ai/DeepSeek-Coder-V2-Lite-Base)|\\n|deepseek-math-7b|[deepseek-ai/deepseek-math-7b-base](https://modelscope.cn/models/deepseek-ai/deepseek-math-7b-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||math|[deepseek-ai/deepseek-math-7b-base](https://huggingface.co/deepseek-ai/deepseek-math-7b-base)|\\n|deepseek-math-7b-instruct|[deepseek-ai/deepseek-math-7b-instruct](https://modelscope.cn/models/deepseek-ai/deepseek-math-7b-instruct/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||math|[deepseek-ai/deepseek-math-7b-instruct](https://huggingface.co/deepseek-ai/deepseek-math-7b-instruct)|\\n|deepseek-math-7b-chat|[deepseek-ai/deepseek-math-7b-rl](https://modelscope.cn/models/deepseek-ai/deepseek-math-7b-rl/summary)|q_proj, k_proj, v_proj|deepseek|&#x2714;|&#x2714;|&#x2714;|&#x2718;||math|[deepseek-ai/deepseek-math-7b-rl](https://huggingface.co/deepseek-ai/deepseek-math-7b-rl)|\\n|numina-math-7b|[AI-ModelScope/NuminaMath-7B-TIR](https://modelscope.cn/models/AI-ModelScope/NuminaMath-7B-TIR/summary)|q_proj, k_proj, v_proj|numina-math|&#x2714;|&#x2714;|&#x2718;|&#x2718;||math|[AI-MO/NuminaMath-7B-TIR](https://huggingface.co/AI-MO/NuminaMath-7B-TIR)|\\n|deepseek-v2|[deepseek-ai/DeepSeek-V2](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2](https://huggingface.co/deepseek-ai/DeepSeek-V2)|\\n|deepseek-v2-chat|[deepseek-ai/DeepSeek-V2-Chat](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2-Chat/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2-Chat](https://huggingface.co/deepseek-ai/DeepSeek-V2-Chat)|\\n|deepseek-v2-lite|[deepseek-ai/DeepSeek-V2-Lite](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2-Lite/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2-Lite](https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite)|\\n|deepseek-v2-lite-chat|[deepseek-ai/DeepSeek-V2-Lite-Chat](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2-Lite-Chat/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2-Lite-Chat](https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite-Chat)|\\n|deepseek-v2_5|[deepseek-ai/DeepSeek-V2.5](https://modelscope.cn/models/deepseek-ai/DeepSeek-V2.5/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj|deepseek2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.3|moe|[deepseek-ai/DeepSeek-V2.5](https://huggingface.co/deepseek-ai/DeepSeek-V2.5)|\\n|gemma-2b|[AI-ModelScope/gemma-2b](https://modelscope.cn/models/AI-ModelScope/gemma-2b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-2b](https://huggingface.co/google/gemma-2b)|\\n|gemma-7b|[AI-ModelScope/gemma-7b](https://modelscope.cn/models/AI-ModelScope/gemma-7b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-7b](https://huggingface.co/google/gemma-7b)|\\n|gemma-2b-instruct|[AI-ModelScope/gemma-2b-it](https://modelscope.cn/models/AI-ModelScope/gemma-2b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-2b-it](https://huggingface.co/google/gemma-2b-it)|\\n|gemma-7b-instruct|[AI-ModelScope/gemma-7b-it](https://modelscope.cn/models/AI-ModelScope/gemma-7b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.38|-|[google/gemma-7b-it](https://huggingface.co/google/gemma-7b-it)|\\n|gemma2-2b|[LLM-Research/gemma-2-2b](https://modelscope.cn/models/LLM-Research/gemma-2-2b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-2b](https://huggingface.co/google/gemma-2-2b)|\\n|gemma2-9b|[LLM-Research/gemma-2-9b](https://modelscope.cn/models/LLM-Research/gemma-2-9b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-9b](https://huggingface.co/google/gemma-2-9b)|\\n|gemma2-27b|[LLM-Research/gemma-2-27b](https://modelscope.cn/models/LLM-Research/gemma-2-27b/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-27b](https://huggingface.co/google/gemma-2-27b)|\\n|gemma2-2b-instruct|[LLM-Research/gemma-2-2b-it](https://modelscope.cn/models/LLM-Research/gemma-2-2b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it)|\\n|gemma2-9b-instruct|[LLM-Research/gemma-2-9b-it](https://modelscope.cn/models/LLM-Research/gemma-2-9b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-9b-it](https://huggingface.co/google/gemma-2-9b-it)|\\n|gemma2-27b-instruct|[LLM-Research/gemma-2-27b-it](https://modelscope.cn/models/LLM-Research/gemma-2-27b-it/summary)|q_proj, k_proj, v_proj|gemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42|-|[google/gemma-2-27b-it](https://huggingface.co/google/gemma-2-27b-it)|\\n|minicpm-1b-sft-chat|[OpenBMB/MiniCPM-1B-sft-bf16](https://modelscope.cn/models/OpenBMB/MiniCPM-1B-sft-bf16/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36.0|-|[openbmb/MiniCPM-1B-sft-bf16](https://huggingface.co/openbmb/MiniCPM-1B-sft-bf16)|\\n|minicpm-2b-sft-chat|[OpenBMB/MiniCPM-2B-sft-fp32](https://modelscope.cn/models/OpenBMB/MiniCPM-2B-sft-fp32/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[openbmb/MiniCPM-2B-sft-fp32](https://huggingface.co/openbmb/MiniCPM-2B-sft-fp32)|\\n|minicpm-2b-chat|[OpenBMB/MiniCPM-2B-dpo-fp32](https://modelscope.cn/models/OpenBMB/MiniCPM-2B-dpo-fp32/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[openbmb/MiniCPM-2B-dpo-fp32](https://huggingface.co/openbmb/MiniCPM-2B-dpo-fp32)|\\n|minicpm-2b-128k|[OpenBMB/MiniCPM-2B-128k](https://modelscope.cn/models/OpenBMB/MiniCPM-2B-128k/summary)|q_proj, k_proj, v_proj|chatml|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36.0|-|[openbmb/MiniCPM-2B-128k](https://huggingface.co/openbmb/MiniCPM-2B-128k)|\\n|minicpm-moe-8x2b|[OpenBMB/MiniCPM-MoE-8x2B](https://modelscope.cn/models/OpenBMB/MiniCPM-MoE-8x2B/summary)|q_proj, k_proj, v_proj|minicpm|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36.0|moe|[openbmb/MiniCPM-MoE-8x2B](https://huggingface.co/openbmb/MiniCPM-MoE-8x2B)|\\n|minicpm3-4b|[OpenBMB/MiniCPM3-4B](https://modelscope.cn/models/OpenBMB/MiniCPM3-4B/summary)|q_a_proj, q_b_proj, kv_a_proj_with_mqa, kv_b_proj|chatml|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.36|-|[openbmb/MiniCPM3-4B](https://huggingface.co/openbmb/MiniCPM3-4B)|\\n|openbuddy-llama-65b-chat|[OpenBuddy/openbuddy-llama-65b-v8-bf16](https://modelscope.cn/models/OpenBuddy/openbuddy-llama-65b-v8-bf16/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama-65b-v8-bf16](https://huggingface.co/OpenBuddy/openbuddy-llama-65b-v8-bf16)|\\n|openbuddy-llama2-13b-chat|[OpenBuddy/openbuddy-llama2-13b-v8.1-fp16](https://modelscope.cn/models/OpenBuddy/openbuddy-llama2-13b-v8.1-fp16/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama2-13b-v8.1-fp16](https://huggingface.co/OpenBuddy/openbuddy-llama2-13b-v8.1-fp16)|\\n|openbuddy-llama2-70b-chat|[OpenBuddy/openbuddy-llama2-70b-v10.1-bf16](https://modelscope.cn/models/OpenBuddy/openbuddy-llama2-70b-v10.1-bf16/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama2-70b-v10.1-bf16](https://huggingface.co/OpenBuddy/openbuddy-llama2-70b-v10.1-bf16)|\\n|openbuddy-llama3-8b-chat|[OpenBuddy/openbuddy-llama3-8b-v21.1-8k](https://modelscope.cn/models/OpenBuddy/openbuddy-llama3-8b-v21.1-8k/summary)|q_proj, k_proj, v_proj|openbuddy2|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama3-8b-v21.1-8k](https://huggingface.co/OpenBuddy/openbuddy-llama3-8b-v21.1-8k)|\\n|openbuddy-llama3-70b-chat|[OpenBuddy/openbuddy-llama3-70b-v21.1-8k](https://modelscope.cn/models/OpenBuddy/openbuddy-llama3-70b-v21.1-8k/summary)|q_proj, k_proj, v_proj|openbuddy2|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-llama3-70b-v21.1-8k](https://huggingface.co/OpenBuddy/openbuddy-llama3-70b-v21.1-8k)|\\n|openbuddy-mistral-7b-chat|[OpenBuddy/openbuddy-mistral-7b-v17.1-32k](https://modelscope.cn/models/OpenBuddy/openbuddy-mistral-7b-v17.1-32k/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[OpenBuddy/openbuddy-mistral-7b-v17.1-32k](https://huggingface.co/OpenBuddy/openbuddy-mistral-7b-v17.1-32k)|\\n|openbuddy-zephyr-7b-chat|[OpenBuddy/openbuddy-zephyr-7b-v14.1](https://modelscope.cn/models/OpenBuddy/openbuddy-zephyr-7b-v14.1/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[OpenBuddy/openbuddy-zephyr-7b-v14.1](https://huggingface.co/OpenBuddy/openbuddy-zephyr-7b-v14.1)|\\n|openbuddy-deepseek-67b-chat|[OpenBuddy/openbuddy-deepseek-67b-v15.2](https://modelscope.cn/models/OpenBuddy/openbuddy-deepseek-67b-v15.2/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[OpenBuddy/openbuddy-deepseek-67b-v15.2](https://huggingface.co/OpenBuddy/openbuddy-deepseek-67b-v15.2)|\\n|openbuddy-mixtral-moe-7b-chat|[OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k](https://modelscope.cn/models/OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k/summary)|q_proj, k_proj, v_proj|openbuddy|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k](https://huggingface.co/OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k)|\\n|openbuddy-llama3_1-8b-chat|[OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k](https://modelscope.cn/models/OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k/summary)|q_proj, k_proj, v_proj|openbuddy2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.43|-|[OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k](https://huggingface.co/OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k)|\\n|mistral-7b|[AI-ModelScope/Mistral-7B-v0.1](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-v0.1](https://huggingface.co/mistralai/Mistral-7B-v0.1)|\\n|mistral-7b-v2|[AI-ModelScope/Mistral-7B-v0.2-hf](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-v0.2-hf/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[alpindale/Mistral-7B-v0.2-hf](https://huggingface.co/alpindale/Mistral-7B-v0.2-hf)|\\n|mistral-7b-instruct|[AI-ModelScope/Mistral-7B-Instruct-v0.1](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-Instruct-v0.1/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-Instruct-v0.1](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1)|\\n|mistral-7b-instruct-v2|[AI-ModelScope/Mistral-7B-Instruct-v0.2](https://modelscope.cn/models/AI-ModelScope/Mistral-7B-Instruct-v0.2/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-Instruct-v0.2](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2)|\\n|mistral-7b-instruct-v3|[LLM-Research/Mistral-7B-Instruct-v0.3](https://modelscope.cn/models/LLM-Research/Mistral-7B-Instruct-v0.3/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[mistralai/Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3)|\\n|mistral-nemo-base-2407|[AI-ModelScope/Mistral-Nemo-Base-2407](https://modelscope.cn/models/AI-ModelScope/Mistral-Nemo-Base-2407/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Nemo-Base-2407](https://huggingface.co/mistralai/Mistral-Nemo-Base-2407)|\\n|mistral-nemo-instruct-2407|[AI-ModelScope/Mistral-Nemo-Instruct-2407](https://modelscope.cn/models/AI-ModelScope/Mistral-Nemo-Instruct-2407/summary)|q_proj, k_proj, v_proj|mistral-nemo|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Nemo-Instruct-2407](https://huggingface.co/mistralai/Mistral-Nemo-Instruct-2407)|\\n|mistral-large-instruct-2407|[LLM-Research/Mistral-Large-Instruct-2407](https://modelscope.cn/models/LLM-Research/Mistral-Large-Instruct-2407/summary)|q_proj, k_proj, v_proj|mistral-nemo|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Large-Instruct-2407](https://huggingface.co/mistralai/Mistral-Large-Instruct-2407)|\\n|mistral-small-instruct-2409|[AI-ModelScope/Mistral-Small-Instruct-2409](https://modelscope.cn/models/AI-ModelScope/Mistral-Small-Instruct-2409/summary)|q_proj, k_proj, v_proj|mistral-nemo|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.43|-|[mistralai/Mistral-Small-Instruct-2409](https://huggingface.co/mistralai/Mistral-Small-Instruct-2409)|\\n|mixtral-moe-7b|[AI-ModelScope/Mixtral-8x7B-v0.1](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[mistralai/Mixtral-8x7B-v0.1](https://huggingface.co/mistralai/Mixtral-8x7B-v0.1)|\\n|mixtral-moe-7b-instruct|[AI-ModelScope/Mixtral-8x7B-Instruct-v0.1](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-Instruct-v0.1/summary)|q_proj, k_proj, v_proj|llama|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[mistralai/Mixtral-8x7B-Instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1)|\\n|mixtral-moe-7b-aqlm-2bit-1x16|[AI-ModelScope/Mixtral-8x7b-AQLM-2Bit-1x16-hf](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7b-AQLM-2Bit-1x16-hf/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.38, aqlm, torch>=2.2.0|moe|[ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf](https://huggingface.co/ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf)|\\n|mixtral-moe-8x22b-v1|[AI-ModelScope/Mixtral-8x22B-v0.1](https://modelscope.cn/models/AI-ModelScope/Mixtral-8x22B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[mistral-community/Mixtral-8x22B-v0.1](https://huggingface.co/mistral-community/Mixtral-8x22B-v0.1)|\\n|wizardlm2-7b-awq|[AI-ModelScope/WizardLM-2-7B-AWQ](https://modelscope.cn/models/AI-ModelScope/WizardLM-2-7B-AWQ/summary)|q_proj, k_proj, v_proj|wizardlm2-awq|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.34|-|[MaziyarPanahi/WizardLM-2-7B-AWQ](https://huggingface.co/MaziyarPanahi/WizardLM-2-7B-AWQ)|\\n|wizardlm2-8x22b|[AI-ModelScope/WizardLM-2-8x22B](https://modelscope.cn/models/AI-ModelScope/WizardLM-2-8x22B/summary)|q_proj, k_proj, v_proj|wizardlm2|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[alpindale/WizardLM-2-8x22B](https://huggingface.co/alpindale/WizardLM-2-8x22B)|\\n|baichuan-7b|[baichuan-inc/baichuan-7B](https://modelscope.cn/models/baichuan-inc/baichuan-7B/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;|transformers<4.34|-|[baichuan-inc/Baichuan-7B](https://huggingface.co/baichuan-inc/Baichuan-7B)|\\n|baichuan-13b|[baichuan-inc/Baichuan-13B-Base](https://modelscope.cn/models/baichuan-inc/Baichuan-13B-Base/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;|transformers<4.34|-|[baichuan-inc/Baichuan-13B-Base](https://huggingface.co/baichuan-inc/Baichuan-13B-Base)|\\n|baichuan-13b-chat|[baichuan-inc/Baichuan-13B-Chat](https://modelscope.cn/models/baichuan-inc/Baichuan-13B-Chat/summary)|W_pack|baichuan|&#x2718;|&#x2714;|&#x2714;|&#x2718;|transformers<4.34|-|[baichuan-inc/Baichuan-13B-Chat](https://huggingface.co/baichuan-inc/Baichuan-13B-Chat)|\\n|baichuan2-7b|[baichuan-inc/Baichuan2-7B-Base](https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Base/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-7B-Base](https://huggingface.co/baichuan-inc/Baichuan2-7B-Base)|\\n|baichuan2-7b-chat|[baichuan-inc/Baichuan2-7B-Chat](https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Chat/summary)|W_pack|baichuan|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-7B-Chat](https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat)|\\n|baichuan2-7b-chat-int4|[baichuan-inc/Baichuan2-7B-Chat-4bits](https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Chat-4bits/summary)|W_pack|baichuan|&#x2718;|&#x2718;|&#x2718;|&#x2718;|bitsandbytes<0.41.2, accelerate<0.26|-|[baichuan-inc/Baichuan2-7B-Chat-4bits](https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits)|\\n|baichuan2-13b|[baichuan-inc/Baichuan2-13B-Base](https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Base/summary)|W_pack|default-generation|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-13B-Base](https://huggingface.co/baichuan-inc/Baichuan2-13B-Base)|\\n|baichuan2-13b-chat|[baichuan-inc/Baichuan2-13B-Chat](https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Chat/summary)|W_pack|baichuan|&#x2718;|&#x2714;|&#x2714;|&#x2718;||-|[baichuan-inc/Baichuan2-13B-Chat](https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat)|\\n|baichuan2-13b-chat-int4|[baichuan-inc/Baichuan2-13B-Chat-4bits](https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Chat-4bits/summary)|W_pack|baichuan|&#x2718;|&#x2718;|&#x2718;|&#x2718;|bitsandbytes<0.41.2, accelerate<0.26|-|[baichuan-inc/Baichuan2-13B-Chat-4bits](https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat-4bits)|\\n|yuan2-2b-instruct|[YuanLLM/Yuan2.0-2B-hf](https://modelscope.cn/models/YuanLLM/Yuan2.0-2B-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-2B-hf](https://huggingface.co/IEITYuan/Yuan2-2B-hf)|\\n|yuan2-2b-janus-instruct|[YuanLLM/Yuan2-2B-Janus-hf](https://modelscope.cn/models/YuanLLM/Yuan2-2B-Janus-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-2B-Janus-hf](https://huggingface.co/IEITYuan/Yuan2-2B-Janus-hf)|\\n|yuan2-51b-instruct|[YuanLLM/Yuan2.0-51B-hf](https://modelscope.cn/models/YuanLLM/Yuan2.0-51B-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-51B-hf](https://huggingface.co/IEITYuan/Yuan2-51B-hf)|\\n|yuan2-102b-instruct|[YuanLLM/Yuan2.0-102B-hf](https://modelscope.cn/models/YuanLLM/Yuan2.0-102B-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[IEITYuan/Yuan2-102B-hf](https://huggingface.co/IEITYuan/Yuan2-102B-hf)|\\n|yuan2-m32|[YuanLLM/Yuan2-M32-hf](https://modelscope.cn/models/YuanLLM/Yuan2-M32-hf/summary)|q_proj, k_proj, v_proj|yuan|&#x2714;|&#x2718;|&#x2718;|&#x2718;||moe|[IEITYuan/Yuan2-M32-hf](https://huggingface.co/IEITYuan/Yuan2-M32-hf)|\\n|xverse-7b|[xverse/XVERSE-7B](https://modelscope.cn/models/xverse/XVERSE-7B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-7B](https://huggingface.co/xverse/XVERSE-7B)|\\n|xverse-7b-chat|[xverse/XVERSE-7B-Chat](https://modelscope.cn/models/xverse/XVERSE-7B-Chat/summary)|q_proj, k_proj, v_proj|xverse|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-7B-Chat](https://huggingface.co/xverse/XVERSE-7B-Chat)|\\n|xverse-13b|[xverse/XVERSE-13B](https://modelscope.cn/models/xverse/XVERSE-13B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-13B](https://huggingface.co/xverse/XVERSE-13B)|\\n|xverse-13b-chat|[xverse/XVERSE-13B-Chat](https://modelscope.cn/models/xverse/XVERSE-13B-Chat/summary)|q_proj, k_proj, v_proj|xverse|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-13B-Chat](https://huggingface.co/xverse/XVERSE-13B-Chat)|\\n|xverse-65b|[xverse/XVERSE-65B](https://modelscope.cn/models/xverse/XVERSE-65B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-65B](https://huggingface.co/xverse/XVERSE-65B)|\\n|xverse-65b-v2|[xverse/XVERSE-65B-2](https://modelscope.cn/models/xverse/XVERSE-65B-2/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-65B-2](https://huggingface.co/xverse/XVERSE-65B-2)|\\n|xverse-65b-chat|[xverse/XVERSE-65B-Chat](https://modelscope.cn/models/xverse/XVERSE-65B-Chat/summary)|q_proj, k_proj, v_proj|xverse|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-65B-Chat](https://huggingface.co/xverse/XVERSE-65B-Chat)|\\n|xverse-13b-256k|[xverse/XVERSE-13B-256K](https://modelscope.cn/models/xverse/XVERSE-13B-256K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[xverse/XVERSE-13B-256K](https://huggingface.co/xverse/XVERSE-13B-256K)|\\n|xverse-moe-a4_2b|[xverse/XVERSE-MoE-A4.2B](https://modelscope.cn/models/xverse/XVERSE-MoE-A4.2B/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||moe|[xverse/XVERSE-MoE-A4.2B](https://huggingface.co/xverse/XVERSE-MoE-A4.2B)|\\n|orion-14b|[OrionStarAI/Orion-14B-Base](https://modelscope.cn/models/OrionStarAI/Orion-14B-Base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[OrionStarAI/Orion-14B-Base](https://huggingface.co/OrionStarAI/Orion-14B-Base)|\\n|orion-14b-chat|[OrionStarAI/Orion-14B-Chat](https://modelscope.cn/models/OrionStarAI/Orion-14B-Chat/summary)|q_proj, k_proj, v_proj|orion|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[OrionStarAI/Orion-14B-Chat](https://huggingface.co/OrionStarAI/Orion-14B-Chat)|\\n|bluelm-7b|[vivo-ai/BlueLM-7B-Base](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Base](https://huggingface.co/vivo-ai/BlueLM-7B-Base)|\\n|bluelm-7b-32k|[vivo-ai/BlueLM-7B-Base-32K](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Base-32K/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Base-32K](https://huggingface.co/vivo-ai/BlueLM-7B-Base-32K)|\\n|bluelm-7b-chat|[vivo-ai/BlueLM-7B-Chat](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Chat/summary)|q_proj, k_proj, v_proj|bluelm|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Chat](https://huggingface.co/vivo-ai/BlueLM-7B-Chat)|\\n|bluelm-7b-chat-32k|[vivo-ai/BlueLM-7B-Chat-32K](https://modelscope.cn/models/vivo-ai/BlueLM-7B-Chat-32K/summary)|q_proj, k_proj, v_proj|bluelm|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[vivo-ai/BlueLM-7B-Chat-32K](https://huggingface.co/vivo-ai/BlueLM-7B-Chat-32K)|\\n|ziya2-13b|[Fengshenbang/Ziya2-13B-Base](https://modelscope.cn/models/Fengshenbang/Ziya2-13B-Base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[IDEA-CCNL/Ziya2-13B-Base](https://huggingface.co/IDEA-CCNL/Ziya2-13B-Base)|\\n|ziya2-13b-chat|[Fengshenbang/Ziya2-13B-Chat](https://modelscope.cn/models/Fengshenbang/Ziya2-13B-Chat/summary)|q_proj, k_proj, v_proj|ziya|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[IDEA-CCNL/Ziya2-13B-Chat](https://huggingface.co/IDEA-CCNL/Ziya2-13B-Chat)|\\n|skywork-13b|[skywork/Skywork-13B-base](https://modelscope.cn/models/skywork/Skywork-13B-base/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[Skywork/Skywork-13B-base](https://huggingface.co/Skywork/Skywork-13B-base)|\\n|skywork-13b-chat|[skywork/Skywork-13B-chat](https://modelscope.cn/models/skywork/Skywork-13B-chat/summary)|q_proj, k_proj, v_proj|skywork|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|-|\\n|zephyr-7b-beta-chat|[modelscope/zephyr-7b-beta](https://modelscope.cn/models/modelscope/zephyr-7b-beta/summary)|q_proj, k_proj, v_proj|zephyr|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.34|-|[HuggingFaceH4/zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta)|\\n|polylm-13b|[damo/nlp_polylm_13b_text_generation](https://modelscope.cn/models/damo/nlp_polylm_13b_text_generation/summary)|c_attn|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[DAMO-NLP-MT/polylm-13b](https://huggingface.co/DAMO-NLP-MT/polylm-13b)|\\n|seqgpt-560m|[damo/nlp_seqgpt-560m](https://modelscope.cn/models/damo/nlp_seqgpt-560m/summary)|query_key_value|default-generation|&#x2718;|&#x2714;|&#x2718;|&#x2718;||-|[DAMO-NLP/SeqGPT-560M](https://huggingface.co/DAMO-NLP/SeqGPT-560M)|\\n|sus-34b-chat|[SUSTC/SUS-Chat-34B](https://modelscope.cn/models/SUSTC/SUS-Chat-34B/summary)|q_proj, k_proj, v_proj|sus|&#x2714;|&#x2714;|&#x2714;|&#x2718;||-|[SUSTech/SUS-Chat-34B](https://huggingface.co/SUSTech/SUS-Chat-34B)|\\n|tongyi-finance-14b|[TongyiFinance/Tongyi-Finance-14B](https://modelscope.cn/models/TongyiFinance/Tongyi-Finance-14B/summary)|c_attn|default-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||financial|-|\\n|tongyi-finance-14b-chat|[TongyiFinance/Tongyi-Finance-14B-Chat](https://modelscope.cn/models/TongyiFinance/Tongyi-Finance-14B-Chat/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2714;|&#x2718;||financial|[jxy/Tongyi-Finance-14B-Chat](https://huggingface.co/jxy/Tongyi-Finance-14B-Chat)|\\n|tongyi-finance-14b-chat-int4|[TongyiFinance/Tongyi-Finance-14B-Chat-Int4](https://modelscope.cn/models/TongyiFinance/Tongyi-Finance-14B-Chat-Int4/summary)|c_attn|qwen|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|financial|[jxy/Tongyi-Finance-14B-Chat-Int4](https://huggingface.co/jxy/Tongyi-Finance-14B-Chat-Int4)|\\n|codefuse-codellama-34b-chat|[codefuse-ai/CodeFuse-CodeLlama-34B](https://modelscope.cn/models/codefuse-ai/CodeFuse-CodeLlama-34B/summary)|q_proj, k_proj, v_proj|codefuse-codellama|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[codefuse-ai/CodeFuse-CodeLlama-34B](https://huggingface.co/codefuse-ai/CodeFuse-CodeLlama-34B)|\\n|codefuse-codegeex2-6b-chat|[codefuse-ai/CodeFuse-CodeGeeX2-6B](https://modelscope.cn/models/codefuse-ai/CodeFuse-CodeGeeX2-6B/summary)|query_key_value|codefuse|&#x2718;|&#x2714;|&#x2718;|&#x2718;|transformers<4.34|coding|[codefuse-ai/CodeFuse-CodeGeeX2-6B](https://huggingface.co/codefuse-ai/CodeFuse-CodeGeeX2-6B)|\\n|codefuse-qwen-14b-chat|[codefuse-ai/CodeFuse-QWen-14B](https://modelscope.cn/models/codefuse-ai/CodeFuse-QWen-14B/summary)|c_attn|codefuse|&#x2714;|&#x2714;|&#x2714;|&#x2718;||coding|[codefuse-ai/CodeFuse-QWen-14B](https://huggingface.co/codefuse-ai/CodeFuse-QWen-14B)|\\n|phi2-3b|[AI-ModelScope/phi-2](https://modelscope.cn/models/AI-ModelScope/phi-2/summary)|Wqkv|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;||coding|[microsoft/phi-2](https://huggingface.co/microsoft/phi-2)|\\n|phi3-4b-4k-instruct|[LLM-Research/Phi-3-mini-4k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-mini-4k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-mini-4k-instruct](https://huggingface.co/microsoft/Phi-3-mini-4k-instruct)|\\n|phi3-4b-128k-instruct|[LLM-Research/Phi-3-mini-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-mini-128k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-mini-128k-instruct](https://huggingface.co/microsoft/Phi-3-mini-128k-instruct)|\\n|phi3-small-8k-instruct|[LLM-Research/Phi-3-small-8k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-small-8k-instruct/summary)|query_key_value|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-small-8k-instruct](https://huggingface.co/microsoft/Phi-3-small-8k-instruct)|\\n|phi3-medium-4k-instruct|[LLM-Research/Phi-3-medium-4k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-medium-4k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-medium-4k-instruct](https://huggingface.co/microsoft/Phi-3-medium-4k-instruct)|\\n|phi3-small-128k-instruct|[LLM-Research/Phi-3-small-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-small-128k-instruct/summary)|query_key_value|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-small-128k-instruct](https://huggingface.co/microsoft/Phi-3-small-128k-instruct)|\\n|phi3-medium-128k-instruct|[LLM-Research/Phi-3-medium-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-medium-128k-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3-medium-128k-instruct](https://huggingface.co/microsoft/Phi-3-medium-128k-instruct)|\\n|phi3_5-mini-instruct|[LLM-Research/Phi-3.5-mini-instruct](https://modelscope.cn/models/LLM-Research/Phi-3.5-mini-instruct/summary)|qkv_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|-|[microsoft/Phi-3.5-mini-instruct](https://huggingface.co/microsoft/Phi-3.5-mini-instruct)|\\n|phi3_5-moe-instruct|[LLM-Research/Phi-3.5-MoE-instruct](https://modelscope.cn/models/LLM-Research/Phi-3.5-MoE-instruct/summary)|q_proj, k_proj, v_proj|phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[microsoft/Phi-3.5-MoE-instruct](https://huggingface.co/microsoft/Phi-3.5-MoE-instruct)|\\n|mamba-130m|[AI-ModelScope/mamba-130m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-130m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-130m-hf](https://huggingface.co/state-spaces/mamba-130m-hf)|\\n|mamba-370m|[AI-ModelScope/mamba-370m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-370m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-370m-hf](https://huggingface.co/state-spaces/mamba-370m-hf)|\\n|mamba-390m|[AI-ModelScope/mamba-390m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-390m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-390m-hf](https://huggingface.co/state-spaces/mamba-390m-hf)|\\n|mamba-790m|[AI-ModelScope/mamba-790m-hf](https://modelscope.cn/models/AI-ModelScope/mamba-790m-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-790m-hf](https://huggingface.co/state-spaces/mamba-790m-hf)|\\n|mamba-1.4b|[AI-ModelScope/mamba-1.4b-hf](https://modelscope.cn/models/AI-ModelScope/mamba-1.4b-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-1.4b-hf](https://huggingface.co/state-spaces/mamba-1.4b-hf)|\\n|mamba-2.8b|[AI-ModelScope/mamba-2.8b-hf](https://modelscope.cn/models/AI-ModelScope/mamba-2.8b-hf/summary)|in_proj, x_proj, embeddings, out_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.39.0|-|[state-spaces/mamba-2.8b-hf](https://huggingface.co/state-spaces/mamba-2.8b-hf)|\\n|telechat-7b|[TeleAI/TeleChat-7B](https://modelscope.cn/models/TeleAI/TeleChat-7B/summary)|key_value, query|telechat|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[Tele-AI/telechat-7B](https://huggingface.co/Tele-AI/telechat-7B)|\\n|telechat-12b|[TeleAI/TeleChat-12B](https://modelscope.cn/models/TeleAI/TeleChat-12B/summary)|key_value, query|telechat|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[Tele-AI/TeleChat-12B](https://huggingface.co/Tele-AI/TeleChat-12B)|\\n|telechat-12b-v2|[TeleAI/TeleChat-12B-v2](https://modelscope.cn/models/TeleAI/TeleChat-12B-v2/summary)|key_value, query|telechat-v2|&#x2714;|&#x2718;|&#x2718;|&#x2718;||-|[Tele-AI/TeleChat-12B-v2](https://huggingface.co/Tele-AI/TeleChat-12B-v2)|\\n|telechat-12b-v2-gptq-int4|[swift/TeleChat-12B-V2-GPTQ-Int4](https://modelscope.cn/models/swift/TeleChat-12B-V2-GPTQ-Int4/summary)|key_value, query|telechat-v2|&#x2714;|&#x2718;|&#x2718;|&#x2718;|auto_gptq>=0.5|-|-|\\n|grok-1|[colossalai/grok-1-pytorch](https://modelscope.cn/models/colossalai/grok-1-pytorch/summary)|q_proj, k_proj, v_proj|default-generation|&#x2718;|&#x2718;|&#x2718;|&#x2718;||-|[hpcai-tech/grok-1](https://huggingface.co/hpcai-tech/grok-1)|\\n|dbrx-instruct|[AI-ModelScope/dbrx-instruct](https://modelscope.cn/models/AI-ModelScope/dbrx-instruct/summary)|attn.Wqkv|dbrx|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[databricks/dbrx-instruct](https://huggingface.co/databricks/dbrx-instruct)|\\n|dbrx-base|[AI-ModelScope/dbrx-base](https://modelscope.cn/models/AI-ModelScope/dbrx-base/summary)|attn.Wqkv|dbrx|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|moe|[databricks/dbrx-base](https://huggingface.co/databricks/dbrx-base)|\\n|mengzi3-13b-base|[langboat/Mengzi3-13B-Base](https://modelscope.cn/models/langboat/Mengzi3-13B-Base/summary)|q_proj, k_proj, v_proj|mengzi|&#x2714;|&#x2714;|&#x2718;|&#x2718;||-|[Langboat/Mengzi3-13B-Base](https://huggingface.co/Langboat/Mengzi3-13B-Base)|\\n|c4ai-command-r-v01|[AI-ModelScope/c4ai-command-r-v01](https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-v01/summary)|q_proj, k_proj, v_proj|c4ai|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39.1|-|[CohereForAI/c4ai-command-r-v01](https://huggingface.co/CohereForAI/c4ai-command-r-v01)|\\n|c4ai-command-r-plus|[AI-ModelScope/c4ai-command-r-plus](https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-plus/summary)|q_proj, k_proj, v_proj|c4ai|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>4.39|-|[CohereForAI/c4ai-command-r-plus](https://huggingface.co/CohereForAI/c4ai-command-r-plus)|\\n|codestral-22b|[swift/Codestral-22B-v0.1](https://modelscope.cn/models/swift/Codestral-22B-v0.1/summary)|q_proj, k_proj, v_proj|default-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.34|-|[mistralai/Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1)|\\n\\n\\n### 多模态大模型\\n| Model Type | Model ID | Default Lora Target Modules | Default Template | Support Flash Attn | Support vLLM | Support LMDeploy | Support Megatron | Requires | Tags | HF Model ID |\\n| ---------  | -------- | --------------------------- | ---------------- | ------------------ | ------------ | ---------------- | ---------------- | -------- | ---- | ----------- |\\n|qwen-vl|[qwen/Qwen-VL](https://modelscope.cn/models/qwen/Qwen-VL/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-vl-generation|&#x2714;|&#x2714;|&#x2714;|&#x2718;||vision|[Qwen/Qwen-VL](https://huggingface.co/Qwen/Qwen-VL)|\\n|qwen-vl-chat|[qwen/Qwen-VL-Chat](https://modelscope.cn/models/qwen/Qwen-VL-Chat/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-vl|&#x2714;|&#x2714;|&#x2714;|&#x2718;||vision|[Qwen/Qwen-VL-Chat](https://huggingface.co/Qwen/Qwen-VL-Chat)|\\n|qwen-vl-chat-int4|[qwen/Qwen-VL-Chat-Int4](https://modelscope.cn/models/qwen/Qwen-VL-Chat-Int4/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|auto_gptq>=0.5|vision|[Qwen/Qwen-VL-Chat-Int4](https://huggingface.co/Qwen/Qwen-VL-Chat-Int4)|\\n|qwen-audio|[qwen/Qwen-Audio](https://modelscope.cn/models/qwen/Qwen-Audio/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-audio-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;||audio|[Qwen/Qwen-Audio](https://huggingface.co/Qwen/Qwen-Audio)|\\n|qwen-audio-chat|[qwen/Qwen-Audio-Chat](https://modelscope.cn/models/qwen/Qwen-Audio-Chat/summary)|^(transformer.h)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen-audio|&#x2714;|&#x2718;|&#x2718;|&#x2718;||audio|[Qwen/Qwen-Audio-Chat](https://huggingface.co/Qwen/Qwen-Audio-Chat)|\\n|qwen2-audio-7b|[qwen/Qwen2-Audio-7B](https://modelscope.cn/models/qwen/Qwen2-Audio-7B/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-audio-generation|&#x2714;|&#x2718;|&#x2718;|&#x2718;|librosa, transformers>=4.45|audio|[Qwen/Qwen2-Audio-7B](https://huggingface.co/Qwen/Qwen2-Audio-7B)|\\n|qwen2-audio-7b-instruct|[qwen/Qwen2-Audio-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-Audio-7B-Instruct/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-audio|&#x2714;|&#x2718;|&#x2718;|&#x2718;|librosa, transformers>=4.45|audio|[Qwen/Qwen2-Audio-7B-Instruct](https://huggingface.co/Qwen/Qwen2-Audio-7B-Instruct)|\\n|qwen2-vl-2b|[qwen/Qwen2-VL-2B](https://modelscope.cn/models/qwen/Qwen2-VL-2B/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-2B](https://huggingface.co/Qwen/Qwen2-VL-2B)|\\n|qwen2-vl-2b-instruct|[qwen/Qwen2-VL-2B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-2B-Instruct](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct)|\\n|qwen2-vl-2b-instruct-gptq-int4|[qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4)|\\n|qwen2-vl-2b-instruct-gptq-int8|[qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8)|\\n|qwen2-vl-2b-instruct-awq|[qwen/Qwen2-VL-2B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct-AWQ/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, autoawq|vision, video|[Qwen/Qwen2-VL-2B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-AWQ)|\\n|qwen2-vl-7b|[qwen/Qwen2-VL-7B](https://modelscope.cn/models/qwen/Qwen2-VL-7B/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-7B](https://huggingface.co/Qwen/Qwen2-VL-7B)|\\n|qwen2-vl-7b-instruct|[qwen/Qwen2-VL-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-7B-Instruct](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct)|\\n|qwen2-vl-7b-instruct-gptq-int4|[qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4)|\\n|qwen2-vl-7b-instruct-gptq-int8|[qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct-GPTQ-Int8)|\\n|qwen2-vl-7b-instruct-awq|[qwen/Qwen2-VL-7B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct-AWQ/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, autoawq|vision, video|[Qwen/Qwen2-VL-7B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct-AWQ)|\\n|qwen2-vl-72b|[qwen/Qwen2-VL-72B](https://modelscope.cn/models/qwen/Qwen2-VL-72B/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-72B](https://huggingface.co/Qwen/Qwen2-VL-72B)|\\n|qwen2-vl-72b-instruct|[qwen/Qwen2-VL-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils|vision, video|[Qwen/Qwen2-VL-72B-Instruct](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct)|\\n|qwen2-vl-72b-instruct-gptq-int4|[qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int4)|\\n|qwen2-vl-72b-instruct-gptq-int8|[qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, auto_gptq>=0.5|vision, video|[Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-GPTQ-Int8)|\\n|qwen2-vl-72b-instruct-awq|[qwen/Qwen2-VL-72B-Instruct-AWQ](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct-AWQ/summary)|^(model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|qwen2-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45.dev.0, qwen_vl_utils, autoawq|vision, video|[Qwen/Qwen2-VL-72B-Instruct-AWQ](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-AWQ)|\\n|glm4v-9b-chat|[ZhipuAI/glm-4v-9b](https://modelscope.cn/models/ZhipuAI/glm-4v-9b/summary)|^(transformer.encoder)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|glm4v|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.42|vision|[THUDM/glm-4v-9b](https://huggingface.co/THUDM/glm-4v-9b)|\\n|llama3_2-11b-vision|[LLM-Research/Llama-3.2-11B-Vision](https://modelscope.cn/models/LLM-Research/Llama-3.2-11B-Vision/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-11B-Vision](https://huggingface.co/meta-llama/Llama-3.2-11B-Vision)|\\n|llama3_2-11b-vision-instruct|[LLM-Research/Llama-3.2-11B-Vision-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-11B-Vision-Instruct/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-11B-Vision-Instruct](https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct)|\\n|llama3_2-90b-vision|[LLM-Research/Llama-3.2-90B-Vision](https://modelscope.cn/models/LLM-Research/Llama-3.2-90B-Vision/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision-generation|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-90B-Vision](https://huggingface.co/meta-llama/Llama-3.2-90B-Vision)|\\n|llama3_2-90b-vision-instruct|[LLM-Research/Llama-3.2-90B-Vision-Instruct](https://modelscope.cn/models/LLM-Research/Llama-3.2-90B-Vision-Instruct/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_2-vision|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.45|vision|[meta-llama/Llama-3.2-90B-Vision-Instruct](https://huggingface.co/meta-llama/Llama-3.2-90B-Vision-Instruct)|\\n|llama3_1-8b-omni|[ICTNLP/Llama-3.1-8B-Omni](https://modelscope.cn/models/ICTNLP/Llama-3.1-8B-Omni/summary)|^(model.layers\\\\|model.speech_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3_1-omni|&#x2714;|&#x2718;|&#x2718;|&#x2718;|whisper, openai-whisper|audio|[ICTNLP/Llama-3.1-8B-Omni](https://huggingface.co/ICTNLP/Llama-3.1-8B-Omni)|\\n|idefics3-8b-llama3|[AI-ModelScope/Idefics3-8B-Llama3](https://modelscope.cn/models/AI-ModelScope/Idefics3-8B-Llama3/summary)|^(model.text_model\\\\|model.connector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|idefics3|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision|[HuggingFaceM4/Idefics3-8B-Llama3](https://huggingface.co/HuggingFaceM4/Idefics3-8B-Llama3)|\\n|llava1_5-7b-instruct|[swift/llava-1.5-7b-hf](https://modelscope.cn/models/swift/llava-1.5-7b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava1_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[llava-hf/llava-1.5-7b-hf](https://huggingface.co/llava-hf/llava-1.5-7b-hf)|\\n|llava1_5-13b-instruct|[swift/llava-1.5-13b-hf](https://modelscope.cn/models/swift/llava-1.5-13b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava1_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[llava-hf/llava-1.5-13b-hf](https://huggingface.co/llava-hf/llava-1.5-13b-hf)|\\n|llava1_6-mistral-7b-instruct|[swift/llava-v1.6-mistral-7b-hf](https://modelscope.cn/models/swift/llava-v1.6-mistral-7b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-mistral|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-mistral-7b-hf](https://huggingface.co/llava-hf/llava-v1.6-mistral-7b-hf)|\\n|llava1_6-vicuna-7b-instruct|[swift/llava-v1.6-vicuna-7b-hf](https://modelscope.cn/models/swift/llava-v1.6-vicuna-7b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-vicuna|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-vicuna-7b-hf](https://huggingface.co/llava-hf/llava-v1.6-vicuna-7b-hf)|\\n|llava1_6-vicuna-13b-instruct|[swift/llava-v1.6-vicuna-13b-hf](https://modelscope.cn/models/swift/llava-v1.6-vicuna-13b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-vicuna|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-vicuna-13b-hf](https://huggingface.co/llava-hf/llava-v1.6-vicuna-13b-hf)|\\n|llava1_6-llama3_1-8b-instruct|[DaozeZhang/llava-llama3.1-8b](https://modelscope.cn/models/DaozeZhang/llava-llama3.1-8b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-llama3|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.41|vision|-|\\n|llava1_6-yi-34b-instruct|[swift/llava-v1.6-34b-hf](https://modelscope.cn/models/swift/llava-v1.6-34b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-yi|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-v1.6-34b-hf](https://huggingface.co/llava-hf/llava-v1.6-34b-hf)|\\n|llama3-llava-next-8b-hf|[swift/llama3-llava-next-8b-hf](https://modelscope.cn/models/swift/llama3-llava-next-8b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama-llava-next-hf|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llama3-llava-next-8b-hf](https://huggingface.co/llava-hf/llama3-llava-next-8b-hf)|\\n|llava-next-72b-hf|[AI-ModelScope/llava-next-72b-hf](https://modelscope.cn/models/AI-ModelScope/llava-next-72b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama-qwen-hf|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-next-72b-hf](https://huggingface.co/llava-hf/llava-next-72b-hf)|\\n|llava-next-110b-hf|[AI-ModelScope/llava-next-110b-hf](https://modelscope.cn/models/AI-ModelScope/llava-next-110b-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama-qwen-hf|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.39|vision|[llava-hf/llava-next-110b-hf](https://huggingface.co/llava-hf/llava-next-110b-hf)|\\n|llava-onevision-qwen2-0_5b-ov|[AI-ModelScope/llava-onevision-qwen2-0.5b-ov-hf](https://modelscope.cn/models/AI-ModelScope/llava-onevision-qwen2-0.5b-ov-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-onevision-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision, video|[llava-hf/llava-onevision-qwen2-0.5b-ov-hf](https://huggingface.co/llava-hf/llava-onevision-qwen2-0.5b-ov-hf)|\\n|llava-onevision-qwen2-7b-ov|[AI-ModelScope/llava-onevision-qwen2-7b-ov-hf](https://modelscope.cn/models/AI-ModelScope/llava-onevision-qwen2-7b-ov-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-onevision-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision, video|[llava-hf/llava-onevision-qwen2-7b-ov-hf](https://huggingface.co/llava-hf/llava-onevision-qwen2-7b-ov-hf)|\\n|llava-onevision-qwen2-72b-ov|[AI-ModelScope/llava-onevision-qwen2-72b-ov-hf](https://modelscope.cn/models/AI-ModelScope/llava-onevision-qwen2-72b-ov-hf/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-onevision-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision, video|[llava-hf/llava-onevision-qwen2-72b-ov-hf](https://huggingface.co/llava-hf/llava-onevision-qwen2-72b-ov-hf)|\\n|llama3-llava-next-8b|[AI-Modelscope/llama3-llava-next-8b](https://modelscope.cn/models/AI-Modelscope/llama3-llava-next-8b/summary)|^(model.layers\\\\|model.mm_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llama3-llava-next|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[lmms-lab/llama3-llava-next-8b](https://huggingface.co/lmms-lab/llama3-llava-next-8b)|\\n|llava-next-72b|[AI-Modelscope/llava-next-72b](https://modelscope.cn/models/AI-Modelscope/llava-next-72b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[lmms-lab/llava-next-72b](https://huggingface.co/lmms-lab/llava-next-72b)|\\n|llava-next-110b|[AI-Modelscope/llava-next-110b](https://modelscope.cn/models/AI-Modelscope/llava-next-110b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-qwen|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[lmms-lab/llava-next-110b](https://huggingface.co/lmms-lab/llava-next-110b)|\\n|llava-next-video-7b-instruct|[swift/LLaVA-NeXT-Video-7B-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-7B-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-7B-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-7B-hf)|\\n|llava-next-video-7b-32k-instruct|[swift/LLaVA-NeXT-Video-7B-32K-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-7B-32K-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-7B-32K-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-7B-32K-hf)|\\n|llava-next-video-7b-dpo-instruct|[swift/LLaVA-NeXT-Video-7B-DPO-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-7B-DPO-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-7B-DPO-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-7B-DPO-hf)|\\n|llava-next-video-34b-instruct|[swift/LLaVA-NeXT-Video-34B-hf](https://modelscope.cn/models/swift/LLaVA-NeXT-Video-34B-hf/summary)|^(language_model\\\\|multi_modal_projector\\\\|vision_resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-next-video-yi|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.42, av|video|[llava-hf/LLaVA-NeXT-Video-34B-hf](https://huggingface.co/llava-hf/LLaVA-NeXT-Video-34B-hf)|\\n|yi-vl-6b-chat|[01ai/Yi-VL-6B](https://modelscope.cn/models/01ai/Yi-VL-6B/summary)|^(model.layers\\\\|model.mm_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|yi-vl|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.34|vision|[01-ai/Yi-VL-6B](https://huggingface.co/01-ai/Yi-VL-6B)|\\n|yi-vl-34b-chat|[01ai/Yi-VL-34B](https://modelscope.cn/models/01ai/Yi-VL-34B/summary)|^(model.layers\\\\|model.mm_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|yi-vl|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.34|vision|[01-ai/Yi-VL-34B](https://huggingface.co/01-ai/Yi-VL-34B)|\\n|llava-llama3-8b-v1_1|[AI-ModelScope/llava-llama-3-8b-v1_1-transformers](https://modelscope.cn/models/AI-ModelScope/llava-llama-3-8b-v1_1-transformers/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|llava-llama-instruct|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[xtuner/llava-llama-3-8b-v1_1-transformers](https://huggingface.co/xtuner/llava-llama-3-8b-v1_1-transformers)|\\n|internlm-xcomposer2-7b-chat|[Shanghai_AI_Laboratory/internlm-xcomposer2-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2-7b/summary)|attention.wqkv, attention.wo, feed_forward.w1, feed_forward.w2, feed_forward.w3|internlm-xcomposer2|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[internlm/internlm-xcomposer2-7b](https://huggingface.co/internlm/internlm-xcomposer2-7b)|\\n|internlm-xcomposer2-4khd-7b-chat|[Shanghai_AI_Laboratory/internlm-xcomposer2-4khd-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2-4khd-7b/summary)|attention.wqkv, attention.wo, feed_forward.w1, feed_forward.w2, feed_forward.w3|internlm-xcomposer2-4khd|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[internlm/internlm-xcomposer2-4khd-7b](https://huggingface.co/internlm/internlm-xcomposer2-4khd-7b)|\\n|internlm-xcomposer2_5-7b-chat|[Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b/summary)|attention.wqkv, attention.wo, feed_forward.w1, feed_forward.w2, feed_forward.w3|internlm-xcomposer2_5|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[internlm/internlm-xcomposer2d5-7b](https://huggingface.co/internlm/internlm-xcomposer2d5-7b)|\\n|internvl-chat-v1_5|[AI-ModelScope/InternVL-Chat-V1-5](https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.35, timm|vision|[OpenGVLab/InternVL-Chat-V1-5](https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5)|\\n|internvl-chat-v1_5-int8|[AI-ModelScope/InternVL-Chat-V1-5-int8](https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-int8/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.35, timm|vision|[OpenGVLab/InternVL-Chat-V1-5-int8](https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5-int8)|\\n|mini-internvl-chat-2b-v1_5|[OpenGVLab/Mini-InternVL-Chat-2B-V1-5](https://modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-2B-V1-5/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.35, timm|vision|[OpenGVLab/Mini-InternVL-Chat-2B-V1-5](https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-2B-V1-5)|\\n|mini-internvl-chat-4b-v1_5|[OpenGVLab/Mini-InternVL-Chat-4B-V1-5](https://modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-4B-V1-5/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl-phi3|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.35,<4.42, timm|vision|[OpenGVLab/Mini-InternVL-Chat-4B-V1-5](https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-4B-V1-5)|\\n|internvl2-1b|[OpenGVLab/InternVL2-1B](https://modelscope.cn/models/OpenGVLab/InternVL2-1B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-1B](https://huggingface.co/OpenGVLab/InternVL2-1B)|\\n|internvl2-2b|[OpenGVLab/InternVL2-2B](https://modelscope.cn/models/OpenGVLab/InternVL2-2B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-2B](https://huggingface.co/OpenGVLab/InternVL2-2B)|\\n|internvl2-4b|[OpenGVLab/InternVL2-4B](https://modelscope.cn/models/OpenGVLab/InternVL2-4B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2-phi3|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36,<4.42, timm|vision, video|[OpenGVLab/InternVL2-4B](https://huggingface.co/OpenGVLab/InternVL2-4B)|\\n|internvl2-8b|[OpenGVLab/InternVL2-8B](https://modelscope.cn/models/OpenGVLab/InternVL2-8B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-8B](https://huggingface.co/OpenGVLab/InternVL2-8B)|\\n|internvl2-26b|[OpenGVLab/InternVL2-26B](https://modelscope.cn/models/OpenGVLab/InternVL2-26B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-26B](https://huggingface.co/OpenGVLab/InternVL2-26B)|\\n|internvl2-40b|[OpenGVLab/InternVL2-40B](https://modelscope.cn/models/OpenGVLab/InternVL2-40B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-40B](https://huggingface.co/OpenGVLab/InternVL2-40B)|\\n|internvl2-llama3-76b|[OpenGVLab/InternVL2-Llama3-76B](https://modelscope.cn/models/OpenGVLab/InternVL2-Llama3-76B/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-Llama3-76B](https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B)|\\n|internvl2-2b-awq|[OpenGVLab/InternVL2-2B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-2B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-2B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-2B-AWQ)|\\n|internvl2-8b-awq|[OpenGVLab/InternVL2-8B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-8B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-8B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-8B-AWQ)|\\n|internvl2-26b-awq|[OpenGVLab/InternVL2-26B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-26B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-26B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-26B-AWQ)|\\n|internvl2-40b-awq|[OpenGVLab/InternVL2-40B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-40B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-40B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-40B-AWQ)|\\n|internvl2-llama3-76b-awq|[OpenGVLab/InternVL2-Llama3-76B-AWQ](https://modelscope.cn/models/OpenGVLab/InternVL2-Llama3-76B-AWQ/summary)|^(language_model\\\\|mlp1)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|internvl2|&#x2714;|&#x2714;|&#x2714;|&#x2718;|transformers>=4.36, timm|vision, video|[OpenGVLab/InternVL2-Llama3-76B-AWQ](https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B-AWQ)|\\n|deepseek-vl-1_3b-chat|[deepseek-ai/deepseek-vl-1.3b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-vl-1.3b-chat/summary)|^(language_model\\\\|aligner)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|deepseek-vl|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[deepseek-ai/deepseek-vl-1.3b-chat](https://huggingface.co/deepseek-ai/deepseek-vl-1.3b-chat)|\\n|deepseek-vl-7b-chat|[deepseek-ai/deepseek-vl-7b-chat](https://modelscope.cn/models/deepseek-ai/deepseek-vl-7b-chat/summary)|^(language_model\\\\|aligner)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|deepseek-vl|&#x2714;|&#x2718;|&#x2714;|&#x2718;||vision|[deepseek-ai/deepseek-vl-7b-chat](https://huggingface.co/deepseek-ai/deepseek-vl-7b-chat)|\\n|paligemma-3b-pt-224|[AI-ModelScope/paligemma-3b-pt-224](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-pt-224/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-pt-224](https://huggingface.co/google/paligemma-3b-pt-224)|\\n|paligemma-3b-pt-448|[AI-ModelScope/paligemma-3b-pt-448](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-pt-448/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-pt-448](https://huggingface.co/google/paligemma-3b-pt-448)|\\n|paligemma-3b-pt-896|[AI-ModelScope/paligemma-3b-pt-896](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-pt-896/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-pt-896](https://huggingface.co/google/paligemma-3b-pt-896)|\\n|paligemma-3b-mix-224|[AI-ModelScope/paligemma-3b-mix-224](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-mix-224/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-mix-224](https://huggingface.co/google/paligemma-3b-mix-224)|\\n|paligemma-3b-mix-448|[AI-ModelScope/paligemma-3b-mix-448](https://modelscope.cn/models/AI-ModelScope/paligemma-3b-mix-448/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|paligemma|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.41|vision|[google/paligemma-3b-mix-448](https://huggingface.co/google/paligemma-3b-mix-448)|\\n|minicpm-v-3b-chat|[OpenBMB/MiniCPM-V](https://modelscope.cn/models/OpenBMB/MiniCPM-V/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v|&#x2714;|&#x2718;|&#x2718;|&#x2718;|timm, transformers<4.42|vision|[openbmb/MiniCPM-V](https://huggingface.co/openbmb/MiniCPM-V)|\\n|minicpm-v-v2-chat|[OpenBMB/MiniCPM-V-2](https://modelscope.cn/models/OpenBMB/MiniCPM-V-2/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v|&#x2714;|&#x2718;|&#x2718;|&#x2718;|timm, transformers<4.42|vision|[openbmb/MiniCPM-V-2](https://huggingface.co/openbmb/MiniCPM-V-2)|\\n|minicpm-v-v2_5-chat|[OpenBMB/MiniCPM-Llama3-V-2_5](https://modelscope.cn/models/OpenBMB/MiniCPM-Llama3-V-2_5/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v-v2_5|&#x2714;|&#x2714;|&#x2718;|&#x2718;|timm, transformers>=4.36|vision|[openbmb/MiniCPM-Llama3-V-2_5](https://huggingface.co/openbmb/MiniCPM-Llama3-V-2_5)|\\n|minicpm-v-v2_6-chat|[OpenBMB/MiniCPM-V-2_6](https://modelscope.cn/models/OpenBMB/MiniCPM-V-2_6/summary)|^(llm\\\\|resampler)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|minicpm-v-v2_6|&#x2714;|&#x2714;|&#x2718;|&#x2718;|timm, transformers>=4.36|vision, video|[openbmb/MiniCPM-V-2_6](https://huggingface.co/openbmb/MiniCPM-V-2_6)|\\n|pixtral-12b|[AI-ModelScope/pixtral-12b](https://modelscope.cn/models/AI-ModelScope/pixtral-12b/summary)|^(language_model\\\\|multi_modal_projector)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|pixtral|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.45|vision|[mistral-community/pixtral-12b](https://huggingface.co/mistral-community/pixtral-12b)|\\n|mplug-owl2-chat|[iic/mPLUG-Owl2](https://modelscope.cn/models/iic/mPLUG-Owl2/summary)|q_proj, k_proj.multiway.0, k_proj.multiway.1, v_proj.multiway.0, v_proj.multiway.1|mplug-owl2|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers<4.35, icecream|vision|[MAGAer13/mplug-owl2-llama2-7b](https://huggingface.co/MAGAer13/mplug-owl2-llama2-7b)|\\n|mplug-owl2_1-chat|[iic/mPLUG-Owl2.1](https://modelscope.cn/models/iic/mPLUG-Owl2.1/summary)|c_attn.multiway.0, c_attn.multiway.1|mplug-owl2|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers<4.35, icecream|vision|[Mizukiluke/mplug_owl_2_1](https://huggingface.co/Mizukiluke/mplug_owl_2_1)|\\n|mplug-owl3-7b-chat|[iic/mPLUG-Owl3-7B-240728](https://modelscope.cn/models/iic/mPLUG-Owl3-7B-240728/summary)|^(language_model\\\\|vision2text_model)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|mplug_owl3|&#x2714;|&#x2718;|&#x2718;|&#x2718;|transformers>=4.36, icecream|vision, video|[mPLUG/mPLUG-Owl3-7B-240728](https://huggingface.co/mPLUG/mPLUG-Owl3-7B-240728)|\\n|phi3-vision-128k-instruct|[LLM-Research/Phi-3-vision-128k-instruct](https://modelscope.cn/models/LLM-Research/Phi-3-vision-128k-instruct/summary)|^(model.layers\\\\|model.vision_embed_tokens.img_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|phi3-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[microsoft/Phi-3-vision-128k-instruct](https://huggingface.co/microsoft/Phi-3-vision-128k-instruct)|\\n|phi3_5-vision-instruct|[LLM-Research/Phi-3.5-vision-instruct](https://modelscope.cn/models/LLM-Research/Phi-3.5-vision-instruct/summary)|^(model.layers\\\\|model.vision_embed_tokens.img_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|phi3-vl|&#x2714;|&#x2714;|&#x2718;|&#x2718;|transformers>=4.36|vision|[microsoft/Phi-3.5-vision-instruct](https://huggingface.co/microsoft/Phi-3.5-vision-instruct)|\\n|cogvlm-17b-chat|[ZhipuAI/cogvlm-chat](https://modelscope.cn/models/ZhipuAI/cogvlm-chat/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm|&#x2718;|&#x2718;|&#x2718;|&#x2718;|transformers<4.42|vision|[THUDM/cogvlm-chat-hf](https://huggingface.co/THUDM/cogvlm-chat-hf)|\\n|cogvlm2-19b-chat|[ZhipuAI/cogvlm2-llama3-chinese-chat-19B](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm|&#x2718;|&#x2718;|&#x2714;|&#x2718;|transformers<4.42|vision|[THUDM/cogvlm2-llama3-chinese-chat-19B](https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B)|\\n|cogvlm2-en-19b-chat|[ZhipuAI/cogvlm2-llama3-chat-19B](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chat-19B/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm|&#x2718;|&#x2718;|&#x2714;|&#x2718;|transformers<4.42|vision|[THUDM/cogvlm2-llama3-chat-19B](https://huggingface.co/THUDM/cogvlm2-llama3-chat-19B)|\\n|cogvlm2-video-13b-chat|[ZhipuAI/cogvlm2-video-llama3-chat](https://modelscope.cn/models/ZhipuAI/cogvlm2-video-llama3-chat/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogvlm2-video|&#x2718;|&#x2718;|&#x2718;|&#x2718;|decord, pytorchvideo, transformers>=4.42|vision, video|[THUDM/cogvlm2-video-llama3-chat](https://huggingface.co/THUDM/cogvlm2-video-llama3-chat)|\\n|cogagent-18b-chat|[ZhipuAI/cogagent-chat](https://modelscope.cn/models/ZhipuAI/cogagent-chat/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogagent-chat|&#x2718;|&#x2718;|&#x2718;|&#x2718;|timm|vision|[THUDM/cogagent-chat-hf](https://huggingface.co/THUDM/cogagent-chat-hf)|\\n|cogagent-18b-instruct|[ZhipuAI/cogagent-vqa](https://modelscope.cn/models/ZhipuAI/cogagent-vqa/summary)|^(model.layers)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|cogagent-instruct|&#x2718;|&#x2718;|&#x2718;|&#x2718;|timm|vision|[THUDM/cogagent-vqa-hf](https://huggingface.co/THUDM/cogagent-vqa-hf)|\\n|florence-2-base|[AI-ModelScope/Florence-2-base](https://modelscope.cn/models/AI-ModelScope/Florence-2-base/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-base](https://huggingface.co/microsoft/Florence-2-base)|\\n|florence-2-base-ft|[AI-ModelScope/Florence-2-base-ft](https://modelscope.cn/models/AI-ModelScope/Florence-2-base-ft/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-base-ft](https://huggingface.co/microsoft/Florence-2-base-ft)|\\n|florence-2-large|[AI-ModelScope/Florence-2-large](https://modelscope.cn/models/AI-ModelScope/Florence-2-large/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-large](https://huggingface.co/microsoft/Florence-2-large)|\\n|florence-2-large-ft|[AI-ModelScope/Florence-2-large-ft](https://modelscope.cn/models/AI-ModelScope/Florence-2-large-ft/summary)|^(language_model\\\\|image_projection)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|florence|&#x2714;|&#x2718;|&#x2718;|&#x2718;||vision|[microsoft/Florence-2-large-ft](https://huggingface.co/microsoft/Florence-2-large-ft)|\\n|got-ocr2|[stepfun-ai/GOT-OCR2_0](https://modelscope.cn/models/stepfun-ai/GOT-OCR2_0/summary)|^(model.layers\\\\|model.mm_projector_vary)(?!.\\\\*(lm_head\\\\|output\\\\|emb\\\\|wte\\\\|shared)).\\\\*|got_ocr2|&#x2714;|&#x2718;|&#x2718;|&#x2718;||audio|[stepfun-ai/GOT-OCR2_0](https://huggingface.co/stepfun-ai/GOT-OCR2_0)|\\n\\n\\n## 数据集\\n下表介绍了swift接入的数据集的相关信息:\\n- Dataset Name: 数据集在swift中注册的dataset\\\\_name.\\n- Dataset ID: 数据集在[ModelScope](https://www.modelscope.cn/my/overview)上的dataset\\\\_id.\\n- Size: 数据集中的数据样本数量.\\n- Statistic: 数据集的统计量. 我们使用token数进行统计, 这对于调整`max_length`超参数有帮助. 我们将数据集的训练集和验证集进行拼接, 然后进行统计. 我们使用qwen的tokenizer对数据集进行分词. 不同的tokenizer的统计量不同, 如果你要获取其他的模型的tokenizer的token统计量, 可以通过[脚本](https://github.com/modelscope/swift/tree/main/scripts/utils/run_dataset_info.py)自行获取.\\n\\n| Dataset Name | Dataset ID | Subsets | Dataset Size | Statistic (token) | Tags | HF Dataset ID |\\n| ------------ | ---------- | ------- |------------- | ----------------- | ---- | ------------- |\\n|🔥ms-bench|[iic/ms_bench](https://modelscope.cn/datasets/iic/ms_bench/summary)||316820|346.9±443.2, min=22, max=30960|chat, general, multi-round|-|\\n|🔥alpaca-en|[AI-ModelScope/alpaca-gpt4-data-en](https://modelscope.cn/datasets/AI-ModelScope/alpaca-gpt4-data-en/summary)||52002|176.2±125.8, min=26, max=740|chat, general|[vicgalle/alpaca-gpt4](https://huggingface.co/datasets/vicgalle/alpaca-gpt4)|\\n|🔥alpaca-zh|[AI-ModelScope/alpaca-gpt4-data-zh](https://modelscope.cn/datasets/AI-ModelScope/alpaca-gpt4-data-zh/summary)||48818|162.1±93.9, min=26, max=856|chat, general|[llm-wizard/alpaca-gpt4-data-zh](https://huggingface.co/datasets/llm-wizard/alpaca-gpt4-data-zh)|\\n|multi-alpaca|[damo/nlp_polylm_multialpaca_sft](https://modelscope.cn/datasets/damo/nlp_polylm_multialpaca_sft/summary)|ar<br>de<br>es<br>fr<br>id<br>ja<br>ko<br>pt<br>ru<br>th<br>vi|131867|112.9±50.6, min=26, max=1226|chat, general, multilingual|-|\\n|instinwild|[wyj123456/instinwild](https://modelscope.cn/datasets/wyj123456/instinwild/summary)|default<br>subset|103695|145.4±60.7, min=28, max=1434|-|-|\\n|cot-en|[YorickHe/CoT](https://modelscope.cn/datasets/YorickHe/CoT/summary)||74771|122.7±64.8, min=51, max=8320|chat, general|-|\\n|cot-zh|[YorickHe/CoT_zh](https://modelscope.cn/datasets/YorickHe/CoT_zh/summary)||74771|117.5±70.8, min=43, max=9636|chat, general|-|\\n|instruct-en|[wyj123456/instruct](https://modelscope.cn/datasets/wyj123456/instruct/summary)||888970|269.1±331.5, min=26, max=7254|chat, general|-|\\n|firefly-zh|[AI-ModelScope/firefly-train-1.1M](https://modelscope.cn/datasets/AI-ModelScope/firefly-train-1.1M/summary)||1649399|178.1±260.4, min=26, max=12516|chat, general|[YeungNLP/firefly-train-1.1M](https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M)|\\n|gpt4all-en|[wyj123456/GPT4all](https://modelscope.cn/datasets/wyj123456/GPT4all/summary)||806199|302.7±384.5, min=27, max=7391|chat, general|-|\\n|sharegpt|[swift/sharegpt](https://modelscope.cn/datasets/swift/sharegpt/summary)|common-zh<br>computer-zh<br>unknow-zh<br>common-en<br>computer-en|96566|933.3±864.8, min=21, max=66412|chat, general, multi-round|-|\\n|tulu-v2-sft-mixture|[AI-ModelScope/tulu-v2-sft-mixture](https://modelscope.cn/datasets/AI-ModelScope/tulu-v2-sft-mixture/summary)||5119|520.7±437.6, min=68, max=2549|chat, multilingual, general, multi-round|[allenai/tulu-v2-sft-mixture](https://huggingface.co/datasets/allenai/tulu-v2-sft-mixture)|\\n|wikipedia-zh|[AI-ModelScope/wikipedia-cn-20230720-filtered](https://modelscope.cn/datasets/AI-ModelScope/wikipedia-cn-20230720-filtered/summary)||254547|568.4±713.2, min=37, max=78678|text-generation, general, pretrained|[pleisto/wikipedia-cn-20230720-filtered](https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered)|\\n|open-orca|[AI-ModelScope/OpenOrca](https://modelscope.cn/datasets/AI-ModelScope/OpenOrca/summary)||994896|382.3±417.4, min=31, max=8740|chat, multilingual, general|-|\\n|🔥sharegpt-gpt4|[AI-ModelScope/sharegpt_gpt4](https://modelscope.cn/datasets/AI-ModelScope/sharegpt_gpt4/summary)|default<br>V3_format<br>zh_38K_format|72684|1047.6±1313.1, min=22, max=66412|chat, multilingual, general, multi-round, gpt4|-|\\n|deepctrl-sft|[AI-ModelScope/deepctrl-sft-data](https://modelscope.cn/datasets/AI-ModelScope/deepctrl-sft-data/summary)|default<br>en|14149024|389.8±628.6, min=21, max=626237|chat, general, sft, multi-round|-|\\n|🔥coig-cqia|[AI-ModelScope/COIG-CQIA](https://modelscope.cn/datasets/AI-ModelScope/COIG-CQIA/summary)|chinese_traditional<br>coig_pc<br>exam<br>finance<br>douban<br>human_value<br>logi_qa<br>ruozhiba<br>segmentfault<br>wiki<br>wikihow<br>xhs<br>zhihu|44694|703.8±654.2, min=33, max=19288|general|-|\\n|🔥ruozhiba|[AI-ModelScope/ruozhiba](https://modelscope.cn/datasets/AI-ModelScope/ruozhiba/summary)|post-annual<br>title-good<br>title-norm|85658|39.9±13.1, min=21, max=559|pretrain|-|\\n|long-alpaca-12k|[AI-ModelScope/LongAlpaca-12k](https://modelscope.cn/datasets/AI-ModelScope/LongAlpaca-12k/summary)||11998|9619.0±8295.8, min=36, max=78925|longlora, QA|[Yukang/LongAlpaca-12k](https://huggingface.co/datasets/Yukang/LongAlpaca-12k)|\\n|lmsys-chat-1m|[AI-ModelScope/lmsys-chat-1m](https://modelscope.cn/datasets/AI-ModelScope/lmsys-chat-1m/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|chat, em|[lmsys/lmsys-chat-1m](https://huggingface.co/datasets/lmsys/lmsys-chat-1m)|\\n|🔥ms-agent|[iic/ms_agent](https://modelscope.cn/datasets/iic/ms_agent/summary)||26336|650.9±217.2, min=209, max=2740|chat, agent, multi-round|-|\\n|🔥ms-agent-for-agentfabric|[AI-ModelScope/ms_agent_for_agentfabric](https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary)|default<br>addition|30000|617.8±199.1, min=251, max=2657|chat, agent, multi-round|-|\\n|ms-agent-multirole|[iic/MSAgent-MultiRole](https://modelscope.cn/datasets/iic/MSAgent-MultiRole/summary)||9500|447.6±84.9, min=145, max=1101|chat, agent, multi-round, role-play, multi-agent|-|\\n|🔥toolbench-for-alpha-umi|[shenweizhou/alpha-umi-toolbench-processed-v2](https://modelscope.cn/datasets/shenweizhou/alpha-umi-toolbench-processed-v2/summary)|backbone<br>caller<br>planner<br>summarizer|1448337|1439.7±853.9, min=123, max=18467|chat, agent|-|\\n|damo-agent-zh|[damo/MSAgent-Bench](https://modelscope.cn/datasets/damo/MSAgent-Bench/summary)||386984|956.5±407.3, min=326, max=19001|chat, agent, multi-round|-|\\n|damo-agent-zh-mini|[damo/MSAgent-Bench](https://modelscope.cn/datasets/damo/MSAgent-Bench/summary)||20845|1326.4±329.6, min=571, max=4304|chat, agent, multi-round|-|\\n|agent-instruct-all-en|[huangjintao/AgentInstruct_copy](https://modelscope.cn/datasets/huangjintao/AgentInstruct_copy/summary)|alfworld<br>db<br>kg<br>mind2web<br>os<br>webshop|1866|1144.3±635.5, min=206, max=6412|chat, agent, multi-round|-|\\n|🔥msagent-pro|[iic/MSAgent-Pro](https://modelscope.cn/datasets/iic/MSAgent-Pro/summary)||21905|1524.5±921.3, min=64, max=16770|chat, agent, multi-round|-|\\n|toolbench|[swift/ToolBench](https://modelscope.cn/datasets/swift/ToolBench/summary)||124345|3669.5±1600.9, min=1047, max=22581|chat, agent, multi-round|-|\\n|code-alpaca-en|[wyj123456/code_alpaca_en](https://modelscope.cn/datasets/wyj123456/code_alpaca_en/summary)||20016|100.2±60.1, min=29, max=1776|-|[sahil2801/CodeAlpaca-20k](https://huggingface.co/datasets/sahil2801/CodeAlpaca-20k)|\\n|🔥leetcode-python-en|[AI-ModelScope/leetcode-solutions-python](https://modelscope.cn/datasets/AI-ModelScope/leetcode-solutions-python/summary)||2359|727.1±235.9, min=259, max=2146|chat, coding|-|\\n|🔥codefuse-python-en|[codefuse-ai/CodeExercise-Python-27k](https://modelscope.cn/datasets/codefuse-ai/CodeExercise-Python-27k/summary)||27224|483.6±193.9, min=45, max=3082|chat, coding|-|\\n|🔥codefuse-evol-instruction-zh|[codefuse-ai/Evol-instruction-66k](https://modelscope.cn/datasets/codefuse-ai/Evol-instruction-66k/summary)||66862|439.6±206.3, min=37, max=2983|chat, coding|-|\\n|medical-en|[swift/medical_zh](https://modelscope.cn/datasets/swift/medical_zh/summary)|en|117617|257.4±89.1, min=36, max=2564|chat, medical|-|\\n|medical-zh|[swift/medical_zh](https://modelscope.cn/datasets/swift/medical_zh/summary)|zh|1950972|167.2±219.7, min=26, max=27351|chat, medical|-|\\n|🔥disc-med-sft-zh|[AI-ModelScope/DISC-Med-SFT](https://modelscope.cn/datasets/AI-ModelScope/DISC-Med-SFT/summary)||441767|354.1±193.1, min=25, max=2231|chat, medical|[Flmc/DISC-Med-SFT](https://huggingface.co/datasets/Flmc/DISC-Med-SFT)|\\n|lawyer-llama-zh|[AI-ModelScope/lawyer_llama_data](https://modelscope.cn/datasets/AI-ModelScope/lawyer_llama_data/summary)||21476|194.4±91.7, min=27, max=924|chat, law|[Skepsun/lawyer_llama_data](https://huggingface.co/datasets/Skepsun/lawyer_llama_data)|\\n|tigerbot-law-zh|[AI-ModelScope/tigerbot-law-plugin](https://modelscope.cn/datasets/AI-ModelScope/tigerbot-law-plugin/summary)||55895|109.9±126.4, min=37, max=18878|text-generation, law, pretrained|[TigerResearch/tigerbot-law-plugin](https://huggingface.co/datasets/TigerResearch/tigerbot-law-plugin)|\\n|🔥disc-law-sft-zh|[AI-ModelScope/DISC-Law-SFT](https://modelscope.cn/datasets/AI-ModelScope/DISC-Law-SFT/summary)||166758|533.7±495.4, min=30, max=15169|chat, law|[ShengbinYue/DISC-Law-SFT](https://huggingface.co/datasets/ShengbinYue/DISC-Law-SFT)|\\n|🔥blossom-math-zh|[AI-ModelScope/blossom-math-v2](https://modelscope.cn/datasets/AI-ModelScope/blossom-math-v2/summary)||10000|169.3±58.7, min=35, max=563|chat, math|[Azure99/blossom-math-v2](https://huggingface.co/datasets/Azure99/blossom-math-v2)|\\n|school-math-zh|[AI-ModelScope/school_math_0.25M](https://modelscope.cn/datasets/AI-ModelScope/school_math_0.25M/summary)||248480|157.7±72.2, min=33, max=3450|chat, math, quality|[BelleGroup/school_math_0.25M](https://huggingface.co/datasets/BelleGroup/school_math_0.25M)|\\n|open-platypus-en|[AI-ModelScope/Open-Platypus](https://modelscope.cn/datasets/AI-ModelScope/Open-Platypus/summary)||24926|367.9±254.8, min=30, max=3951|chat, math, quality|[garage-bAInd/Open-Platypus](https://huggingface.co/datasets/garage-bAInd/Open-Platypus)|\\n|text2sql-en|[AI-ModelScope/texttosqlv2_25000_v2](https://modelscope.cn/datasets/AI-ModelScope/texttosqlv2_25000_v2/summary)||25000|274.6±326.4, min=38, max=1975|chat, sql|[Clinton/texttosqlv2_25000_v2](https://huggingface.co/datasets/Clinton/texttosqlv2_25000_v2)|\\n|🔥sql-create-context-en|[AI-ModelScope/sql-create-context](https://modelscope.cn/datasets/AI-ModelScope/sql-create-context/summary)||78577|80.2±17.8, min=36, max=456|chat, sql|[b-mc2/sql-create-context](https://huggingface.co/datasets/b-mc2/sql-create-context)|\\n|synthetic-text-to-sql|[AI-ModelScope/synthetic_text_to_sql](https://modelscope.cn/datasets/AI-ModelScope/synthetic_text_to_sql/summary)|default|100000|283.4±115.8, min=61, max=1356|nl2sql, en|[gretelai/synthetic_text_to_sql](https://huggingface.co/datasets/gretelai/synthetic_text_to_sql)|\\n|🔥advertise-gen-zh|[lvjianjin/AdvertiseGen](https://modelscope.cn/datasets/lvjianjin/AdvertiseGen/summary)||98399|130.6±21.7, min=51, max=241|text-generation|[shibing624/AdvertiseGen](https://huggingface.co/datasets/shibing624/AdvertiseGen)|\\n|🔥dureader-robust-zh|[modelscope/DuReader_robust-QG](https://modelscope.cn/datasets/modelscope/DuReader_robust-QG/summary)||17899|241.1±137.4, min=60, max=1416|text-generation|-|\\n|cmnli-zh|[modelscope/clue](https://modelscope.cn/datasets/modelscope/clue/summary)|cmnli|404024|82.6±16.6, min=51, max=199|text-generation, classification|[clue](https://huggingface.co/datasets/clue)|\\n|🔥jd-sentiment-zh|[DAMO_NLP/jd](https://modelscope.cn/datasets/DAMO_NLP/jd/summary)||50000|66.0±83.2, min=39, max=4039|text-generation, classification|-|\\n|🔥hc3-zh|[simpleai/HC3-Chinese](https://modelscope.cn/datasets/simpleai/HC3-Chinese/summary)|baike<br>open_qa<br>nlpcc_dbqa<br>finance<br>medicine<br>law<br>psychology|39781|176.8±81.5, min=57, max=3051|text-generation, classification|[Hello-SimpleAI/HC3-Chinese](https://huggingface.co/datasets/Hello-SimpleAI/HC3-Chinese)|\\n|🔥hc3-en|[simpleai/HC3](https://modelscope.cn/datasets/simpleai/HC3/summary)|finance<br>medicine|11021|298.3±138.7, min=65, max=2267|text-generation, classification|[Hello-SimpleAI/HC3](https://huggingface.co/datasets/Hello-SimpleAI/HC3)|\\n|dolly-15k|[AI-ModelScope/databricks-dolly-15k](https://modelscope.cn/datasets/AI-ModelScope/databricks-dolly-15k/summary)|default|15011|199.2±267.8, min=22, max=8615|multi-task, en, quality|[databricks/databricks-dolly-15k](https://huggingface.co/datasets/databricks/databricks-dolly-15k)|\\n|zhihu-kol|[OmniData/Zhihu-KOL](https://modelscope.cn/datasets/OmniData/Zhihu-KOL/summary)|default|-|Dataset is too huge, please click the original link to view the dataset stat.|zhihu, qa|[wangrui6/Zhihu-KOL](https://huggingface.co/datasets/wangrui6/Zhihu-KOL)|\\n|zhihu-kol-filtered|[OmniData/Zhihu-KOL-More-Than-100-Upvotes](https://modelscope.cn/datasets/OmniData/Zhihu-KOL-More-Than-100-Upvotes/summary)|default|271261|952.0±1727.2, min=25, max=98658|zhihu, qa|[bzb2023/Zhihu-KOL-More-Than-100-Upvotes](https://huggingface.co/datasets/bzb2023/Zhihu-KOL-More-Than-100-Upvotes)|\\n|finance-en|[wyj123456/finance_en](https://modelscope.cn/datasets/wyj123456/finance_en/summary)||68911|135.6±134.3, min=26, max=3525|chat, financial|[ssbuild/alpaca_finance_en](https://huggingface.co/datasets/ssbuild/alpaca_finance_en)|\\n|poetry-zh|[modelscope/chinese-poetry-collection](https://modelscope.cn/datasets/modelscope/chinese-poetry-collection/summary)||390309|55.2±9.4, min=23, max=83|text-generation, poetry|-|\\n|webnovel-zh|[AI-ModelScope/webnovel_cn](https://modelscope.cn/datasets/AI-ModelScope/webnovel_cn/summary)||50000|1478.9±11526.1, min=100, max=490484|chat, novel|[zxbsmk/webnovel_cn](https://huggingface.co/datasets/zxbsmk/webnovel_cn)|\\n|generated-chat-zh|[AI-ModelScope/generated_chat_0.4M](https://modelscope.cn/datasets/AI-ModelScope/generated_chat_0.4M/summary)||396004|273.3±52.0, min=32, max=873|chat, character-dialogue|[BelleGroup/generated_chat_0.4M](https://huggingface.co/datasets/BelleGroup/generated_chat_0.4M)|\\n|🔥self-cognition|[swift/self-cognition](https://modelscope.cn/datasets/swift/self-cognition/summary)||134|53.6±18.6, min=29, max=121|chat, self-cognition|[modelscope/self-cognition](https://huggingface.co/datasets/modelscope/self-cognition)|\\n|🔥swift-mix|[swift/swift-sft-mixture](https://modelscope.cn/datasets/swift/swift-sft-mixture/summary)|sharegpt<br>firefly<br>codefuse<br>metamathqa|-|Dataset is too huge, please click the original link to view the dataset stat.|chat, sft, general|-|\\n|cls-fudan-news-zh|[damo/zh_cls_fudan-news](https://modelscope.cn/datasets/damo/zh_cls_fudan-news/summary)||4959|3234.4±2547.5, min=91, max=19548|chat, classification|-|\\n|ner-jave-zh|[damo/zh_ner-JAVE](https://modelscope.cn/datasets/damo/zh_ner-JAVE/summary)||1266|118.3±45.5, min=44, max=223|chat, ner|-|\\n|coco-en|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|454617|299.8±2.8, min=295, max=352|chat, multi-modal, vision|-|\\n|🔥coco-en-mini|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|40504|299.8±2.6, min=295, max=338|chat, multi-modal, vision|-|\\n|coco-en-2|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|454617|36.8±2.8, min=32, max=89|chat, multi-modal, vision|-|\\n|🔥coco-en-2-mini|[modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary)|coco_2014_caption|40504|36.8±2.6, min=32, max=75|chat, multi-modal, vision|-|\\n|capcha-images|[AI-ModelScope/captcha-images](https://modelscope.cn/datasets/AI-ModelScope/captcha-images/summary)||8000|31.0±0.0, min=31, max=31|chat, multi-modal, vision|-|\\n|latex-ocr-print|[AI-ModelScope/LaTeX_OCR](https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR/summary)|full|17918|362.7±34.8, min=294, max=528|chat, ocr, multi-modal, vision|[linxy/LaTeX_OCR](https://huggingface.co/datasets/linxy/LaTeX_OCR)|\\n|latex-ocr-handwrite|[AI-ModelScope/LaTeX_OCR](https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR/summary)|synthetic_handwrite|95424|375.1±59.4, min=292, max=2115|chat, ocr, multi-modal, vision|[linxy/LaTeX_OCR](https://huggingface.co/datasets/linxy/LaTeX_OCR)|\\n|aishell1-zh|[speech_asr/speech_asr_aishell1_trainsets](https://modelscope.cn/datasets/speech_asr/speech_asr_aishell1_trainsets/summary)||141600|152.2±36.8, min=63, max=419|chat, multi-modal, audio|-|\\n|🔥aishell1-zh-mini|[speech_asr/speech_asr_aishell1_trainsets](https://modelscope.cn/datasets/speech_asr/speech_asr_aishell1_trainsets/summary)||14526|152.2±35.6, min=74, max=359|chat, multi-modal, audio|-|\\n|🔥video-chatgpt|[swift/VideoChatGPT](https://modelscope.cn/datasets/swift/VideoChatGPT/summary)|Generic<br>Temporal<br>Consistency|3206|88.4±48.3, min=32, max=399|chat, multi-modal, video|[lmms-lab/VideoChatGPT](https://huggingface.co/datasets/lmms-lab/VideoChatGPT)|\\n|hh-rlhf|[AI-ModelScope/hh-rlhf](https://modelscope.cn/datasets/AI-ModelScope/hh-rlhf/summary)|harmless-base<br>helpful-base<br>helpful-online<br>helpful-rejection-sampled|127459|245.4±190.7, min=22, max=1999|rlhf, dpo, pairwise|-|\\n|🔥hh-rlhf-cn|[AI-ModelScope/hh_rlhf_cn](https://modelscope.cn/datasets/AI-ModelScope/hh_rlhf_cn/summary)|hh_rlhf<br>harmless_base_cn<br>harmless_base_en<br>helpful_base_cn<br>helpful_base_en|355920|171.2±122.7, min=22, max=3078|rlhf, dpo, pairwise|-|\\n|orpo-dpo-mix-40k|[AI-ModelScope/orpo-dpo-mix-40k](https://modelscope.cn/datasets/AI-ModelScope/orpo-dpo-mix-40k/summary)|default|43666|548.3±397.4, min=28, max=8483|dpo, orpo, en, quality|[mlabonne/orpo-dpo-mix-40k](https://huggingface.co/datasets/mlabonne/orpo-dpo-mix-40k)|\\n|stack-exchange-paired|[AI-ModelScope/stack-exchange-paired](https://modelscope.cn/datasets/AI-ModelScope/stack-exchange-paired/summary)||4483004|534.5±594.6, min=31, max=56588|hfrl, dpo, pairwise|[lvwerra/stack-exchange-paired](https://huggingface.co/datasets/lvwerra/stack-exchange-paired)|\\n|shareai-llama3-dpo-zh-en-emoji|[hjh0119/shareAI-Llama3-DPO-zh-en-emoji](https://modelscope.cn/datasets/hjh0119/shareAI-Llama3-DPO-zh-en-emoji/summary)|default|2449|334.0±162.8, min=36, max=1801|rlhf, dpo, pairwise|-|\\n|ultrafeedback-kto|[AI-ModelScope/ultrafeedback-binarized-preferences-cleaned-kto](https://modelscope.cn/datasets/AI-ModelScope/ultrafeedback-binarized-preferences-cleaned-kto/summary)|default|230720|11.0±0.0, min=11, max=11|rlhf, kto|-|\\n|rlaif-v|[swift/RLAIF-V-Dataset](https://modelscope.cn/datasets/swift/RLAIF-V-Dataset/summary)|default|83132|119.8±52.6, min=28, max=556|rlhf, dpo, multi-modal, en|[openbmb/RLAIF-V-Dataset](https://huggingface.co/datasets/openbmb/RLAIF-V-Dataset)|\\n|pileval|[swift/pile-val-backup](https://modelscope.cn/datasets/swift/pile-val-backup/summary)||214670|1612.3±8856.2, min=11, max=1208955|text-generation, awq|[mit-han-lab/pile-val-backup](https://huggingface.co/datasets/mit-han-lab/pile-val-backup)|\\n|mantis-instruct|[swift/Mantis-Instruct](https://modelscope.cn/datasets/swift/Mantis-Instruct/summary)|birds-to-words<br>chartqa<br>coinstruct<br>contrastive_caption<br>docvqa<br>dreamsim<br>dvqa<br>iconqa<br>imagecode<br>llava_665k_multi<br>lrv_multi<br>multi_vqa<br>nextqa<br>nlvr2<br>spot-the-diff<br>star<br>visual_story_telling|655351|825.7±812.5, min=284, max=13563|chat, multi-modal, vision, quality|[TIGER-Lab/Mantis-Instruct](https://huggingface.co/datasets/TIGER-Lab/Mantis-Instruct)|\\n|llava-data-instruct|[swift/llava-data](https://modelscope.cn/datasets/swift/llava-data/summary)|llava_instruct|364100|189.0±142.1, min=33, max=5183|sft, multi-modal, quality|[TIGER-Lab/llava-data](https://huggingface.co/datasets/TIGER-Lab/llava-data)|\\n|midefics|[swift/MideficsDataset](https://modelscope.cn/datasets/swift/MideficsDataset/summary)||3800|201.3±70.2, min=60, max=454|medical, en, vqa|[WinterSchool/MideficsDataset](https://huggingface.co/datasets/WinterSchool/MideficsDataset)|\\n|gqa|[None](https://modelscope.cn/datasets/None/summary)|train_all_instructions|-|Dataset is too huge, please click the original link to view the dataset stat.|multi-modal, en, vqa, quality|[lmms-lab/GQA](https://huggingface.co/datasets/lmms-lab/GQA)|\\n|text-caps|[swift/TextCaps](https://modelscope.cn/datasets/swift/TextCaps/summary)||18145|38.2±4.4, min=31, max=73|multi-modal, en, caption, quality|[HuggingFaceM4/TextCaps](https://huggingface.co/datasets/HuggingFaceM4/TextCaps)|\\n|refcoco-unofficial-caption|[swift/refcoco](https://modelscope.cn/datasets/swift/refcoco/summary)||46215|44.7±3.2, min=36, max=71|multi-modal, en, caption|[jxu124/refcoco](https://huggingface.co/datasets/jxu124/refcoco)|\\n|refcoco-unofficial-grounding|[swift/refcoco](https://modelscope.cn/datasets/swift/refcoco/summary)||46215|45.2±3.1, min=37, max=69|multi-modal, en, grounding|[jxu124/refcoco](https://huggingface.co/datasets/jxu124/refcoco)|\\n|refcocog-unofficial-caption|[swift/refcocog](https://modelscope.cn/datasets/swift/refcocog/summary)||44799|49.7±4.7, min=37, max=88|multi-modal, en, caption|[jxu124/refcocog](https://huggingface.co/datasets/jxu124/refcocog)|\\n|refcocog-unofficial-grounding|[swift/refcocog](https://modelscope.cn/datasets/swift/refcocog/summary)||44799|50.1±4.7, min=37, max=90|multi-modal, en, grounding|[jxu124/refcocog](https://huggingface.co/datasets/jxu124/refcocog)|\\n|a-okvqa|[swift/A-OKVQA](https://modelscope.cn/datasets/swift/A-OKVQA/summary)||18201|45.8±7.9, min=32, max=100|multi-modal, en, vqa, quality|[HuggingFaceM4/A-OKVQA](https://huggingface.co/datasets/HuggingFaceM4/A-OKVQA)|\\n|okvqa|[swift/OK-VQA_train](https://modelscope.cn/datasets/swift/OK-VQA_train/summary)||9009|34.4±3.3, min=28, max=59|multi-modal, en, vqa, quality|[Multimodal-Fatima/OK-VQA_train](https://huggingface.co/datasets/Multimodal-Fatima/OK-VQA_train)|\\n|ocr-vqa|[swift/OCR-VQA](https://modelscope.cn/datasets/swift/OCR-VQA/summary)||186753|35.6±6.6, min=29, max=193|multi-modal, en, ocr-vqa|[howard-hou/OCR-VQA](https://huggingface.co/datasets/howard-hou/OCR-VQA)|\\n|grit|[swift/GRIT](https://modelscope.cn/datasets/swift/GRIT/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|multi-modal, en, caption-grounding, quality|[zzliang/GRIT](https://huggingface.co/datasets/zzliang/GRIT)|\\n|llava-instruct-mix|[swift/llava-instruct-mix-vsft](https://modelscope.cn/datasets/swift/llava-instruct-mix-vsft/summary)||13640|179.8±120.2, min=30, max=962|multi-modal, en, vqa, quality|[HuggingFaceH4/llava-instruct-mix-vsft](https://huggingface.co/datasets/HuggingFaceH4/llava-instruct-mix-vsft)|\\n|lnqa|[swift/lnqa](https://modelscope.cn/datasets/swift/lnqa/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|multi-modal, en, ocr-vqa, quality|[vikhyatk/lnqa](https://huggingface.co/datasets/vikhyatk/lnqa)|\\n|science-qa|[swift/ScienceQA](https://modelscope.cn/datasets/swift/ScienceQA/summary)||8315|100.3±59.5, min=38, max=638|multi-modal, science, vqa, quality|[derek-thomas/ScienceQA](https://huggingface.co/datasets/derek-thomas/ScienceQA)|\\n|guanaco|[AI-ModelScope/GuanacoDataset](https://modelscope.cn/datasets/AI-ModelScope/GuanacoDataset/summary)|default|31561|250.1±70.3, min=89, max=1436|chat, zh|[JosephusCheung/GuanacoDataset](https://huggingface.co/datasets/JosephusCheung/GuanacoDataset)|\\n|mind2web|[swift/Multimodal-Mind2Web](https://modelscope.cn/datasets/swift/Multimodal-Mind2Web/summary)||1009|297522.4±325496.2, min=8592, max=3499715|agent, multi-modal|[osunlp/Multimodal-Mind2Web](https://huggingface.co/datasets/osunlp/Multimodal-Mind2Web)|\\n|sharegpt-4o-image|[AI-ModelScope/ShareGPT-4o](https://modelscope.cn/datasets/AI-ModelScope/ShareGPT-4o/summary)|image_caption|57289|638.7±157.9, min=47, max=4640|vqa, multi-modal|[OpenGVLab/ShareGPT-4o](https://huggingface.co/datasets/OpenGVLab/ShareGPT-4o)|\\n|pixelprose|[swift/pixelprose](https://modelscope.cn/datasets/swift/pixelprose/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|caption, multi-modal, vision|[tomg-group-umd/pixelprose](https://huggingface.co/datasets/tomg-group-umd/pixelprose)|\\n|m3it|[AI-ModelScope/M3IT](https://modelscope.cn/datasets/AI-ModelScope/M3IT/summary)|coco<br>vqa-v2<br>shapes<br>shapes-rephrased<br>coco-goi-rephrased<br>snli-ve<br>snli-ve-rephrased<br>okvqa<br>a-okvqa<br>viquae<br>textcap<br>docvqa<br>science-qa<br>imagenet<br>imagenet-open-ended<br>imagenet-rephrased<br>coco-goi<br>clevr<br>clevr-rephrased<br>nlvr<br>coco-itm<br>coco-itm-rephrased<br>vsr<br>vsr-rephrased<br>mocheg<br>mocheg-rephrased<br>coco-text<br>fm-iqa<br>activitynet-qa<br>msrvtt<br>ss<br>coco-cn<br>refcoco<br>refcoco-rephrased<br>multi30k<br>image-paragraph-captioning<br>visual-dialog<br>visual-dialog-rephrased<br>iqa<br>vcr<br>visual-mrc<br>ivqa<br>msrvtt-qa<br>msvd-qa<br>gqa<br>text-vqa<br>ocr-vqa<br>st-vqa<br>flickr8k-cn|-|Dataset is too huge, please click the original link to view the dataset stat.|chat, multi-modal, vision|-|\\n|sharegpt4v|[AI-ModelScope/ShareGPT4V](https://modelscope.cn/datasets/AI-ModelScope/ShareGPT4V/summary)|ShareGPT4V<br>ShareGPT4V-PT|-|Dataset is too huge, please click the original link to view the dataset stat.|chat, multi-modal, vision|-|\\n|llava-instruct-150k|[AI-ModelScope/LLaVA-Instruct-150K](https://modelscope.cn/datasets/AI-ModelScope/LLaVA-Instruct-150K/summary)||624610|490.4±180.2, min=288, max=5438|chat, multi-modal, vision|-|\\n|llava-pretrain|[AI-ModelScope/LLaVA-Pretrain](https://modelscope.cn/datasets/AI-ModelScope/LLaVA-Pretrain/summary)|default|-|Dataset is too huge, please click the original link to view the dataset stat.|vqa, multi-modal, quality|[liuhaotian/LLaVA-Pretrain](https://huggingface.co/datasets/liuhaotian/LLaVA-Pretrain)|\\n|sa1b-dense-caption|[Tongyi-DataEngine/SA1B-Dense-Caption](https://modelscope.cn/datasets/Tongyi-DataEngine/SA1B-Dense-Caption/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|zh, multi-modal, vqa|-|\\n|sa1b-paired-caption|[Tongyi-DataEngine/SA1B-Paired-Captions-Images](https://modelscope.cn/datasets/Tongyi-DataEngine/SA1B-Paired-Captions-Images/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|zh, multi-modal, vqa|-|\\n|alpaca-cleaned|[AI-ModelScope/alpaca-cleaned](https://modelscope.cn/datasets/AI-ModelScope/alpaca-cleaned/summary)||51760|177.9±126.4, min=26, max=1044|chat, general, bench, quality|[yahma/alpaca-cleaned](https://huggingface.co/datasets/yahma/alpaca-cleaned)|\\n|aya-collection|[swift/aya_collection](https://modelscope.cn/datasets/swift/aya_collection/summary)|aya_dataset|202364|494.0±6911.3, min=21, max=3044268|multi-lingual, qa|[CohereForAI/aya_collection](https://huggingface.co/datasets/CohereForAI/aya_collection)|\\n|belle-generated-chat-0.4M|[AI-ModelScope/generated_chat_0.4M](https://modelscope.cn/datasets/AI-ModelScope/generated_chat_0.4M/summary)||396004|273.3±52.0, min=32, max=873|common, zh|[BelleGroup/generated_chat_0.4M](https://huggingface.co/datasets/BelleGroup/generated_chat_0.4M)|\\n|belle-math-0.25M|[AI-ModelScope/school_math_0.25M](https://modelscope.cn/datasets/AI-ModelScope/school_math_0.25M/summary)||248480|157.7±72.2, min=33, max=3450|math, zh|[BelleGroup/school_math_0.25M](https://huggingface.co/datasets/BelleGroup/school_math_0.25M)|\\n|belle-train-0.5M-CN|[AI-ModelScope/train_0.5M_CN](https://modelscope.cn/datasets/AI-ModelScope/train_0.5M_CN/summary)||519255|129.1±91.5, min=27, max=6507|common, zh, quality|[BelleGroup/train_0.5M_CN](https://huggingface.co/datasets/BelleGroup/train_0.5M_CN)|\\n|belle-train-1M-CN|[AI-ModelScope/train_1M_CN](https://modelscope.cn/datasets/AI-ModelScope/train_1M_CN/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|common, zh, quality|[BelleGroup/train_1M_CN](https://huggingface.co/datasets/BelleGroup/train_1M_CN)|\\n|belle-train-2M-CN|[AI-ModelScope/train_2M_CN](https://modelscope.cn/datasets/AI-ModelScope/train_2M_CN/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|common, zh, quality|[BelleGroup/train_2M_CN](https://huggingface.co/datasets/BelleGroup/train_2M_CN)|\\n|belle-train-3.5M-CN|[swift/train_3.5M_CN](https://modelscope.cn/datasets/swift/train_3.5M_CN/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|common, zh, quality|[BelleGroup/train_3.5M_CN](https://huggingface.co/datasets/BelleGroup/train_3.5M_CN)|\\n|c4|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[allenai/c4](https://huggingface.co/datasets/allenai/c4)|\\n|chart-qa|[swift/ChartQA](https://modelscope.cn/datasets/swift/ChartQA/summary)||28299|43.1±5.5, min=29, max=77|en, vqa, quality|[HuggingFaceM4/ChartQA](https://huggingface.co/datasets/HuggingFaceM4/ChartQA)|\\n|chinese-c4|[swift/chinese-c4](https://modelscope.cn/datasets/swift/chinese-c4/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, zh, quality|[shjwudp/chinese-c4](https://huggingface.co/datasets/shjwudp/chinese-c4)|\\n|cinepile|[swift/cinepile](https://modelscope.cn/datasets/swift/cinepile/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|vqa, en, youtube, video|[tomg-group-umd/cinepile](https://huggingface.co/datasets/tomg-group-umd/cinepile)|\\n|classical-chinese-translate|[swift/classical_chinese_translate](https://modelscope.cn/datasets/swift/classical_chinese_translate/summary)||6655|344.0±76.4, min=61, max=815|chat, play-ground|-|\\n|codealpaca-20k|[AI-ModelScope/CodeAlpaca-20k](https://modelscope.cn/datasets/AI-ModelScope/CodeAlpaca-20k/summary)||20016|100.2±60.1, min=29, max=1776|code, en|[HuggingFaceH4/CodeAlpaca_20K](https://huggingface.co/datasets/HuggingFaceH4/CodeAlpaca_20K)|\\n|cosmopedia|[None](https://modelscope.cn/datasets/None/summary)|auto_math_text<br>khanacademy<br>openstax<br>stanford<br>stories<br>web_samples_v1<br>web_samples_v2<br>wikihow|-|Dataset is too huge, please click the original link to view the dataset stat.|multi-domain, en, qa|[HuggingFaceTB/cosmopedia](https://huggingface.co/datasets/HuggingFaceTB/cosmopedia)|\\n|cosmopedia-100k|[swift/cosmopedia-100k](https://modelscope.cn/datasets/swift/cosmopedia-100k/summary)||100000|1024.5±243.1, min=239, max=2981|multi-domain, en, qa|[HuggingFaceTB/cosmopedia-100k](https://huggingface.co/datasets/HuggingFaceTB/cosmopedia-100k)|\\n|dolma|[swift/dolma](https://modelscope.cn/datasets/swift/dolma/summary)|v1_7|-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[allenai/dolma](https://huggingface.co/datasets/allenai/dolma)|\\n|dolphin|[swift/dolphin](https://modelscope.cn/datasets/swift/dolphin/summary)|flan1m-alpaca-uncensored<br>flan5m-alpaca-uncensored|-|Dataset is too huge, please click the original link to view the dataset stat.|en|[cognitivecomputations/dolphin](https://huggingface.co/datasets/cognitivecomputations/dolphin)|\\n|duet|[AI-ModelScope/Duet-v0.5](https://modelscope.cn/datasets/AI-ModelScope/Duet-v0.5/summary)||5000|1157.4±189.3, min=657, max=2344|CoT, en|[G-reen/Duet-v0.5](https://huggingface.co/datasets/G-reen/Duet-v0.5)|\\n|evol-instruct-v2|[AI-ModelScope/WizardLM_evol_instruct_V2_196k](https://modelscope.cn/datasets/AI-ModelScope/WizardLM_evol_instruct_V2_196k/summary)||109184|480.9±333.1, min=26, max=4942|chat, en|[WizardLM/WizardLM_evol_instruct_V2_196k](https://huggingface.co/datasets/WizardLM/WizardLM_evol_instruct_V2_196k)|\\n|fineweb|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[HuggingFaceFW/fineweb](https://huggingface.co/datasets/HuggingFaceFW/fineweb)|\\n|gen-qa|[swift/GenQA](https://modelscope.cn/datasets/swift/GenQA/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|qa, quality, multi-task|[tomg-group-umd/GenQA](https://huggingface.co/datasets/tomg-group-umd/GenQA)|\\n|github-code|[swift/github-code](https://modelscope.cn/datasets/swift/github-code/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[codeparrot/github-code](https://huggingface.co/datasets/codeparrot/github-code)|\\n|gpt4v-dataset|[swift/gpt4v-dataset](https://modelscope.cn/datasets/swift/gpt4v-dataset/summary)||12356|217.9±68.3, min=35, max=596|en, caption, multi-modal, quality|[laion/gpt4v-dataset](https://huggingface.co/datasets/laion/gpt4v-dataset)|\\n|guanaco-belle-merge|[AI-ModelScope/guanaco_belle_merge_v1.0](https://modelscope.cn/datasets/AI-ModelScope/guanaco_belle_merge_v1.0/summary)||693987|134.2±92.0, min=24, max=6507|QA, zh|[Chinese-Vicuna/guanaco_belle_merge_v1.0](https://huggingface.co/datasets/Chinese-Vicuna/guanaco_belle_merge_v1.0)|\\n|infinity-instruct|[swift/Infinity-Instruct](https://modelscope.cn/datasets/swift/Infinity-Instruct/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|qa, quality, multi-task|[BAAI/Infinity-Instruct](https://huggingface.co/datasets/BAAI/Infinity-Instruct)|\\n|llava-med-zh-instruct|[swift/llava-med-zh-instruct-60k](https://modelscope.cn/datasets/swift/llava-med-zh-instruct-60k/summary)||56649|207.7±67.6, min=37, max=657|zh, medical, vqa|[BUAADreamer/llava-med-zh-instruct-60k](https://huggingface.co/datasets/BUAADreamer/llava-med-zh-instruct-60k)|\\n|🔥longwriter-6k|[ZhipuAI/LongWriter-6k](https://modelscope.cn/datasets/ZhipuAI/LongWriter-6k/summary)||6000|4887.2±2879.2, min=117, max=30354|long, chat, sft|[THUDM/LongWriter-6k](https://huggingface.co/datasets/THUDM/LongWriter-6k)|\\n|🔥longwriter-6k-filtered|[swift/longwriter-6k-filtered](https://modelscope.cn/datasets/swift/longwriter-6k-filtered/summary)||666|4108.9±2636.9, min=1190, max=17050|long, chat, sft|-|\\n|math-instruct|[AI-ModelScope/MathInstruct](https://modelscope.cn/datasets/AI-ModelScope/MathInstruct/summary)||262283|254.4±183.5, min=11, max=4383|math, cot, en, quality|[TIGER-Lab/MathInstruct](https://huggingface.co/datasets/TIGER-Lab/MathInstruct)|\\n|math-plus|[TIGER-Lab/MATH-plus](https://modelscope.cn/datasets/TIGER-Lab/MATH-plus/summary)|train|893929|287.1±158.7, min=24, max=2919|qa, math, en, quality|[TIGER-Lab/MATH-plus](https://huggingface.co/datasets/TIGER-Lab/MATH-plus)|\\n|moondream2-coyo-5M|[swift/moondream2-coyo-5M-captions](https://modelscope.cn/datasets/swift/moondream2-coyo-5M-captions/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|caption, pretrain, quality|[isidentical/moondream2-coyo-5M-captions](https://huggingface.co/datasets/isidentical/moondream2-coyo-5M-captions)|\\n|no-robots|[swift/no_robots](https://modelscope.cn/datasets/swift/no_robots/summary)||9485|298.7±246.4, min=40, max=6739|multi-task, quality, human-annotated|[HuggingFaceH4/no_robots](https://huggingface.co/datasets/HuggingFaceH4/no_robots)|\\n|open-hermes|[swift/OpenHermes-2.5](https://modelscope.cn/datasets/swift/OpenHermes-2.5/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|cot, en, quality|[teknium/OpenHermes-2.5](https://huggingface.co/datasets/teknium/OpenHermes-2.5)|\\n|open-orca-chinese|[AI-ModelScope/OpenOrca-Chinese](https://modelscope.cn/datasets/AI-ModelScope/OpenOrca-Chinese/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|QA, zh, general, quality|[yys/OpenOrca-Chinese](https://huggingface.co/datasets/yys/OpenOrca-Chinese)|\\n|orca_dpo_pairs|[swift/orca_dpo_pairs](https://modelscope.cn/datasets/swift/orca_dpo_pairs/summary)||12859|366.9±251.9, min=30, max=2010|rlhf, quality|[Intel/orca_dpo_pairs](https://huggingface.co/datasets/Intel/orca_dpo_pairs)|\\n|path-vqa|[swift/path-vqa](https://modelscope.cn/datasets/swift/path-vqa/summary)||19654|34.8±7.3, min=27, max=85|multi-modal, vqa, medical|[flaviagiammarino/path-vqa](https://huggingface.co/datasets/flaviagiammarino/path-vqa)|\\n|pile|[AI-ModelScope/pile](https://modelscope.cn/datasets/AI-ModelScope/pile/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain|[EleutherAI/pile](https://huggingface.co/datasets/EleutherAI/pile)|\\n|poison-mpts|[iic/100PoisonMpts](https://modelscope.cn/datasets/iic/100PoisonMpts/summary)||906|150.6±80.8, min=39, max=656|poison-management, zh|-|\\n|🔥qwen2-pro-en|[AI-ModelScope/Magpie-Qwen2-Pro-200K-English](https://modelscope.cn/datasets/AI-ModelScope/Magpie-Qwen2-Pro-200K-English/summary)||200000|605.4±287.3, min=221, max=4267|chat, sft, en|[Magpie-Align/Magpie-Qwen2-Pro-200K-English](https://huggingface.co/datasets/Magpie-Align/Magpie-Qwen2-Pro-200K-English)|\\n|🔥qwen2-pro-filtered|[AI-ModelScope/Magpie-Qwen2-Pro-300K-Filtered](https://modelscope.cn/datasets/AI-ModelScope/Magpie-Qwen2-Pro-300K-Filtered/summary)||300000|555.8±286.6, min=148, max=4267|chat, sft|[Magpie-Align/Magpie-Qwen2-Pro-300K-Filtered](https://huggingface.co/datasets/Magpie-Align/Magpie-Qwen2-Pro-300K-Filtered)|\\n|🔥qwen2-pro-zh|[AI-ModelScope/Magpie-Qwen2-Pro-200K-Chinese](https://modelscope.cn/datasets/AI-ModelScope/Magpie-Qwen2-Pro-200K-Chinese/summary)||200000|446.2±246.4, min=74, max=4101|chat, sft, zh|[Magpie-Align/Magpie-Qwen2-Pro-200K-Chinese](https://huggingface.co/datasets/Magpie-Align/Magpie-Qwen2-Pro-200K-Chinese)|\\n|redpajama-data-1t|[swift/RedPajama-Data-1T](https://modelscope.cn/datasets/swift/RedPajama-Data-1T/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[togethercomputer/RedPajama-Data-1T](https://huggingface.co/datasets/togethercomputer/RedPajama-Data-1T)|\\n|redpajama-data-v2|[swift/RedPajama-Data-V2](https://modelscope.cn/datasets/swift/RedPajama-Data-V2/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[togethercomputer/RedPajama-Data-V2](https://huggingface.co/datasets/togethercomputer/RedPajama-Data-V2)|\\n|refinedweb|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[tiiuae/falcon-refinedweb](https://huggingface.co/datasets/tiiuae/falcon-refinedweb)|\\n|rwkv-pretrain-web|[mapjack/openwebtext_dataset](https://modelscope.cn/datasets/mapjack/openwebtext_dataset/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, zh, quality|-|\\n|sft-nectar|[AI-ModelScope/SFT-Nectar](https://modelscope.cn/datasets/AI-ModelScope/SFT-Nectar/summary)||131192|396.4±272.1, min=44, max=10732|cot, en, quality|[AstraMindAI/SFT-Nectar](https://huggingface.co/datasets/AstraMindAI/SFT-Nectar)|\\n|skypile|[AI-ModelScope/SkyPile-150B](https://modelscope.cn/datasets/AI-ModelScope/SkyPile-150B/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality, zh|[Skywork/SkyPile-150B](https://huggingface.co/datasets/Skywork/SkyPile-150B)|\\n|slim-orca|[swift/SlimOrca](https://modelscope.cn/datasets/swift/SlimOrca/summary)||517982|399.1±370.2, min=35, max=8756|quality, en|[Open-Orca/SlimOrca](https://huggingface.co/datasets/Open-Orca/SlimOrca)|\\n|slim-pajama-627b|[None](https://modelscope.cn/datasets/None/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[cerebras/SlimPajama-627B](https://huggingface.co/datasets/cerebras/SlimPajama-627B)|\\n|starcoder|[AI-ModelScope/starcoderdata](https://modelscope.cn/datasets/AI-ModelScope/starcoderdata/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[bigcode/starcoderdata](https://huggingface.co/datasets/bigcode/starcoderdata)|\\n|tagengo-gpt4|[swift/tagengo-gpt4](https://modelscope.cn/datasets/swift/tagengo-gpt4/summary)||78057|472.3±292.9, min=22, max=3521|chat, multi-lingual, quality|[lightblue/tagengo-gpt4](https://huggingface.co/datasets/lightblue/tagengo-gpt4)|\\n|the-stack|[AI-ModelScope/the-stack](https://modelscope.cn/datasets/AI-ModelScope/the-stack/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[bigcode/the-stack](https://huggingface.co/datasets/bigcode/the-stack)|\\n|ultrachat-200k|[swift/ultrachat_200k](https://modelscope.cn/datasets/swift/ultrachat_200k/summary)||207865|1195.4±573.7, min=76, max=4470|chat, en, quality|[HuggingFaceH4/ultrachat_200k](https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k)|\\n|vqa-v2|[swift/VQAv2](https://modelscope.cn/datasets/swift/VQAv2/summary)||443757|31.8±2.2, min=27, max=58|en, vqa, quality|[HuggingFaceM4/VQAv2](https://huggingface.co/datasets/HuggingFaceM4/VQAv2)|\\n|web-instruct-sub|[swift/WebInstructSub](https://modelscope.cn/datasets/swift/WebInstructSub/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|qa, en, math, quality, multi-domain, science|[TIGER-Lab/WebInstructSub](https://huggingface.co/datasets/TIGER-Lab/WebInstructSub)|\\n|wikipedia|[swift/wikipedia](https://modelscope.cn/datasets/swift/wikipedia/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[wikipedia](https://huggingface.co/datasets/wikipedia)|\\n|wikipedia-cn-filtered|[AI-ModelScope/wikipedia-cn-20230720-filtered](https://modelscope.cn/datasets/AI-ModelScope/wikipedia-cn-20230720-filtered/summary)||-|Dataset is too huge, please click the original link to view the dataset stat.|pretrain, quality|[pleisto/wikipedia-cn-20230720-filtered](https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered)|\\n|zhihu-rlhf|[AI-ModelScope/zhihu_rlhf_3k](https://modelscope.cn/datasets/AI-ModelScope/zhihu_rlhf_3k/summary)||3460|594.5±365.9, min=31, max=1716|rlhf, dpo, zh|[liyucheng/zhihu_rlhf_3k](https://huggingface.co/datasets/liyucheng/zhihu_rlhf_3k)|\\n\\n\\n# LLM量化与导出文档\\nswift支持使用awq、gptq、bnb、hqq、eetq技术对模型进行量化。其中awq、gptq量化技术支持vllm进行推理加速，需要使用校准数据集，量化性能更好，但量化速度较慢。而bnb、hqq、eetq无需校准数据，量化速度较快。这五种量化方法都支持qlora微调。\\n\\nawq、gptq需要使用`swift export`进行量化。而bnb、hqq、eetq可以直接在sft和infer时进行快速量化。\\n\\n\\n从vllm推理加速支持的角度来看，更推荐使用awq和gptq进行量化。从量化效果的角度来看，更推荐使用awq、hqq和gptq进行量化。而从量化速度的角度来看，更推荐使用hqq进行量化。\\n\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [原始模型](#原始模型)\\n- [微调后模型](#微调后模型)\\n- [QLoRA微调](#QLoRA微调)\\n- [推送模型](#推送模型)\\n\\n## 环境准备\\nGPU设备: A10, 3090, V100, A100均可.\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 使用awq量化:\\n# autoawq和cuda版本有对应关系，请按照`https://github.com/casper-hansen/AutoAWQ`选择版本\\npip install autoawq -U\\n\\n# 使用gptq量化:\\n# auto_gptq和cuda版本有对应关系，请按照`https://github.com/PanQiWei/AutoGPTQ#quick-installation`选择版本\\npip install auto_gptq optimum -U\\n\\n# 使用bnb量化：\\npip install bitsandbytes -U\\n\\n# 使用hqq量化：\\n# pip install transformers>=4.41\\npip install hqq\\n\\n# 使用eetq量化：\\n# pip install transformers>=4.41\\n# 参考https://github.com/NetEase-FuXi/EETQ\\ngit clone https://github.com/NetEase-FuXi/EETQ.git\\ncd EETQ/\\ngit submodule update --init --recursive\\npip install .\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## 原始模型\\n\\n### awq、gptq\\n\\n这里展示对qwen1half-7b-chat进行awq, gptq量化.\\n```bash\\n# awq-int4量化 (使用A100大约需要18分钟, 显存占用: 13GB)\\n# 如果出现量化的时候OOM, 可以适度降低`--quant_n_samples`(默认256)和`--quant_seqlen`(默认2048).\\n# gptq-int4量化 (使用A100大约需要20分钟, 显存占用: 7GB)\\n\\n# awq: 使用`alpaca-zh alpaca-en sharegpt-gpt4:default`作为量化数据集\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat --quant_bits 4 \\\\\\n    --dataset alpaca-zh alpaca-en sharegpt-gpt4:default --quant_method awq\\n\\n# gptq: 使用`alpaca-zh alpaca-en sharegpt-gpt4:default`作为量化数据集\\n# gptq量化请先查看此issue: https://github.com/AutoGPTQ/AutoGPTQ/issues/439\\nOMP_NUM_THREADS=14 CUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat --quant_bits 4 \\\\\\n    --dataset alpaca-zh alpaca-en sharegpt-gpt4:default --quant_method gptq\\n\\n# awq: 使用自定义量化数据集\\n# gptq同理\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat --quant_bits 4 \\\\\\n    --dataset xxx.jsonl \\\\\\n    --quant_method awq\\n\\n# 推理 swift量化产生的模型\\n# awq\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-awq-int4\\n# gptq\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-gptq-int4\\n\\n# 推理 原始模型\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n```\\n\\n**量化效果对比**:\\n\\n```python\\n# swift量化产生的awq-int4模型\\n\\\"\\\"\\\"\\n<<< 你好\\n你好！有什么问题我可以帮助你吗？\\n--------------------------------------------------\\n<<< 2000年是闰年嘛？\\n是的，2000年是闰年。闰年规则是：普通年份能被4整除但不能被100整除，或者能被400整除的年份就是闰年。2000年满足后者，所以按照公历是闰年。\\n--------------------------------------------------\\n<<< 15869+587=?\\n15869 + 587 = 16456\\n--------------------------------------------------\\n<<< 浙江的省会在哪\\n浙江省的省会是杭州市。\\n--------------------------------------------------\\n<<< 这有什么好吃的\\n浙江美食非常丰富，以下列举一些具有代表性的：\\n\\n1. **杭州菜**：如西湖醋鱼、东坡肉、龙井虾仁、叫化童鸡等，清淡而精致。\\n2. **宁波菜**：如红烧肉、汤圆、水磨年糕、宁波汤包等，口味鲜美。\\n3. **温州菜**：温州海鲜如蝤蛑、蝤蛑炒年糕、瓯菜，口味偏咸鲜。\\n4. **绍兴菜**：如东坡肉、霉干菜扣肉、绍兴黄酒等，酒香浓郁。\\n5. **嘉兴粽子**：如嘉兴肉粽，特别是五芳斋的粽子，口感软糯。\\n6. **金华火腿**：浙江特产，以金华地区最为著名，口感醇厚。\\n7. **浙东土菜**：如农家小炒、野菜、腌菜等，原汁原味。\\n\\n各地还有许多特色小吃，如杭州的知味观、宋城的宋嫂鱼羹，以及各种小吃街如河坊街、西湖醋鱼一条街等，都值得一尝。如果你有具体地方或口味偏好，可以告诉我，我可以给出更具体的建议。\\n\\\"\\\"\\\"\\n\\n# swift量化产生的gptq-int4模型\\n\\\"\\\"\\\"\\n<<< 你好\\n你好！很高兴为你提供帮助。有什么问题或需要咨询的吗？\\n--------------------------------------------------\\n<<< 2000年是闰年嘛？\\n是的，2000年是闰年。根据格里高利历（公历），闰年的规则是：普通年份能被4整除但不能被100整除，或者能被400整除的年份就是闰年。2000年满足后两个条件，所以是闰年。\\n--------------------------------------------------\\n<<< 15869+587=?\\n15869 + 587 = 16456\\n--------------------------------------------------\\n<<< 浙江的省会在哪\\n浙江省的省会是杭州市。\\n--------------------------------------------------\\n<<< 这有什么好吃的\\n浙江美食丰富多样，以下是一些具有代表性的：\\n\\n1. **杭州菜**：如东坡肉、西湖醋鱼、龙井虾仁、叫化鸡等，注重原汁原味，讲究刀工和火候。\\n2. **宁波的海鲜**：如宁波汤圆、海鲜大餐，宁波炒肉丝也很有名。\\n3. **嘉兴粽子**：以嘉兴五芳斋的粽子最为人知，有各种口味如肉粽、豆沙粽等。\\n4. **绍兴黄酒**：搭配当地特色菜肴，如醉鸡、糟溜鱼片等。\\n5. **金华火腿**：浙江特产，口感醇厚，常作为节日礼品。\\n6. **温州瓯菜**：口味偏酸辣，如温州鱼生、白斩鸡等。\\n7. **浙东佛跳墙**：类似福建的佛跳墙，用多种海鲜和山珍炖制。\\n\\n如果你对某种具体的食物感兴趣，可以告诉我，我可以提供更详细的推荐。\\n\\\"\\\"\\\"\\n\\n# 原始模型\\n\\\"\\\"\\\"\\n<<< 你好\\n你好！有什么问题我可以帮助你吗？\\n--------------------------------------------------\\n<<< 2000年是闰年嘛？\\n是的，2000年是闰年。根据格里高利历（公历），闰年的规则是：普通年份能被4整除但不能被100整除，或者能被400整除的年份都是闰年。2000年满足后者，所以是闰年。\\n--------------------------------------------------\\n<<< 15869+587=?\\n15869 + 587 = 16456\\n--------------------------------------------------\\n<<< 浙江的省会在哪\\n浙江省的省会是杭州市。\\n--------------------------------------------------\\n<<< 这有什么好吃的\\n浙江的美食非常丰富，以下列举一些具有代表性的：\\n\\n1. **杭州菜**：如西湖醋鱼、东坡肉、龙井虾仁、叫化童鸡等，清淡鲜美，注重原汁原味。\\n2. **宁波菜**：如宁波汤圆、红烧肉、海鲜类，如宁波海鲜面、清蒸河鳗等。\\n3. **绍兴菜**：如霉干菜扣肉、茴香豆、醉排骨，特色是酱香浓郁。\\n4. **温州菜**：如温州鱼丸、白斩鸡、楠溪江三鲜，口味偏咸鲜。\\n5. **嘉兴粽子**：特别是嘉兴五芳斋的粽子，闻名全国，甜咸皆有。\\n6. **金华火腿**：浙江名特产，口感鲜美，营养丰富。\\n7. **浙东土菜**：如东阳火腿、嵊州菜、台州海鲜等，地方特色鲜明。\\n\\n当然，浙江各地还有许多特色小吃，如衢州的鸭头、湖州的粽子、舟山的海鲜等，你可以根据自己的口味选择。如果你需要更具体的推荐，可以告诉我你对哪种类型或者哪个地方的美食感兴趣。\\n\\\"\\\"\\\"\\n```\\n\\n\\n### bnb、hqq、eetq\\n对于bnb、hqq、eetq，我们只需要使用swift infer来进行快速量化并推理。\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --quant_method bnb \\\\\\n    --quantization_bit 4\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --quant_method hqq \\\\\\n    --quantization_bit 4\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --quant_method eetq \\\\\\n    --dtype fp16\\n```\\n\\n## 微调后模型\\n\\n假设你使用lora微调了qwen1half-4b-chat, 模型权重目录为: `output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx`.\\n\\n这里只介绍使用awq技术对微调后模型进行量化, 如果要使用gptq技术量化, 同理.\\n\\n**Merge-LoRA & 量化**\\n```shell\\n# 使用`alpaca-zh alpaca-en sharegpt-gpt4:default`作为量化数据集\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx' \\\\\\n    --merge_lora true --quant_bits 4 \\\\\\n    --dataset alpaca-zh alpaca-en sharegpt-gpt4:default --quant_method awq\\n\\n# 使用微调时使用的数据集作为量化数据集\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx' \\\\\\n    --merge_lora true --quant_bits 4 \\\\\\n    --load_dataset_config true --quant_method awq\\n```\\n\\n**推理量化后模型**\\n```shell\\n# awq/gptq量化模型支持vllm推理加速. 也支持模型部署.\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4'\\n```\\n\\n**部署量化后模型**\\n\\n服务端:\\n\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir 'output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4'\\n```\\n\\n测试:\\n```shell\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen1half-4b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"晚上睡不着觉怎么办？\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\n## QLoRA微调\\n\\n### awq、gptq\\n如果想要对awq、gptq量化的模型进行qlora微调，你需要进行提前量化。例如可以对原始模型使用`swift export`进行量化。然后使用以下命令进行微调，你需要指定`--quant_method`来指定对应量化的方式：\\n\\n```bash\\n# awq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-awq-int4 \\\\\\n    --quant_method awq \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n\\n# gptq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-gptq-int4 \\\\\\n    --quant_method gptq \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n```\\n\\n\\n### bnb、hqq、eetq\\n如果想要使用bnb、hqq、eetq进行qlora微调，你需要在训练中指定`--quant_method`和`--quantization_bit`：\\n\\n```bash\\n# bnb\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n    --quant_method bnb \\\\\\n    --quantization_bit 4 \\\\\\n    --dtype fp16 \\\\\\n\\n# hqq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n    --quant_method hqq \\\\\\n    --quantization_bit 4 \\\\\\n\\n# eetq\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --sft_type lora \\\\\\n    --dataset alpaca-zh#5000 \\\\\\n    --quant_method eetq \\\\\\n    --dtype fp16 \\\\\\n```\\n\\n**注意**\\n- hqq支持更多自定义参数，比如为不同网络层指定不同量化配置，具体请见[命令行参数](命令行参数.md)\\n- eetq量化为8bit量化，无需指定quantization_bit。目前不支持bf16，需要指定dtype为fp16\\n- eetq目前qlora速度比较慢，推荐使用hqq。参考[issue](https://github.com/NetEase-FuXi/EETQ/issues/17)\\n\\n\\n## 推送模型\\n假设你使用lora微调了qwen1half-4b-chat, 模型权重目录为: `output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx`.\\n\\n```shell\\n# 推送原始量化模型\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --model_id_or_path qwen1half-7b-chat-gptq-int4 \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-7b-chat-gptq-int4 \\\\\\n    --hub_token '<your-sdk-token>'\\n\\n# 推送lora增量模型\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>'\\n\\n# 推送merged模型\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>' \\\\\\n    --merge_lora true\\n\\n# 推送量化后模型\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>' \\\\\\n    --merge_lora true \\\\\\n    --quant_bits 4\\n```\\n\\n\\n# LLM评测文档\\n\\nSWIFT支持了eval（评测）能力，用于对原始模型和训练后的模型给出标准化的评测指标。\\n\\n## 目录\\n\\n- [能力介绍](#能力介绍)\\n- [环境准备](#环境准备)\\n- [评测](#评测)\\n- [自定义评测集](#自定义评测集)\\n\\n## 能力介绍\\n\\nSWIFT的eval能力使用了魔搭社区[评测框架EvalScope](https://github.com/modelscope/eval-scope)，以及[Open-Compass](https://hub.opencompass.org.cn/home)，并进行了高级封装以支持各类模型的评测需求。目前我们支持了**标准评测集**的评测流程，以及**用户自定义**评测集的评测流程。其中**标准评测集**包含：\\n\\n纯文本评测：\\n```text\\n'obqa', 'cmb', 'AX_b', 'siqa', 'nq', 'mbpp', 'winogrande', 'mmlu', 'BoolQ', 'cluewsc', 'ocnli', 'lambada',\\n'CMRC', 'ceval', 'csl', 'cmnli', 'bbh', 'ReCoRD', 'math', 'humaneval', 'eprstmt', 'WSC', 'storycloze',\\n'MultiRC', 'RTE', 'chid', 'gsm8k', 'AX_g', 'bustm', 'afqmc', 'piqa', 'lcsts', 'strategyqa', 'Xsum', 'agieval',\\n'ocnli_fc', 'C3', 'tnews', 'race', 'triviaqa', 'CB', 'WiC', 'hellaswag', 'summedits', 'GaokaoBench',\\n'ARC_e', 'COPA', 'ARC_c', 'DRCD'\\n```\\n数据集的具体介绍可以查看：https://hub.opencompass.org.cn/home\\n\\n多模态评测：\\n```text\\n'COCO_VAL', 'MME', 'HallusionBench', 'POPE', 'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN',\\n'MMBench', 'MMBench_CN', 'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11',\\n'MMBench_TEST_CN_V11', 'MMBench_V11', 'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2',\\n'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST', 'MMT-Bench_ALL_MI', 'MMT-Bench_ALL',\\n'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL', 'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar',\\n'RealWorldQA', 'MLLMGuard_DS', 'BLINK', 'OCRVQA_TEST', 'OCRVQA_TESTCORE', 'TextVQA_VAL', 'DocVQA_VAL',\\n'DocVQA_TEST', 'InfoVQA_VAL', 'InfoVQA_TEST', 'ChartQA_TEST', 'MathVision', 'MathVision_MINI',\\n'MMMU_DEV_VAL', 'MMMU_TEST', 'OCRBench', 'MathVista_MINI', 'LLaVABench', 'MMVet', 'MTVQA_TEST',\\n'MMLongBench_DOC', 'VCR_EN_EASY_500', 'VCR_EN_EASY_100', 'VCR_EN_EASY_ALL', 'VCR_EN_HARD_500',\\n'VCR_EN_HARD_100', 'VCR_EN_HARD_ALL', 'VCR_ZH_EASY_500', 'VCR_ZH_EASY_100', 'VCR_ZH_EASY_ALL',\\n'VCR_ZH_HARD_500', 'VCR_ZH_HARD_100', 'VCR_ZH_HARD_ALL', 'MMDU', 'MMBench-Video', 'Video-MME',\\n'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN', 'MMBench', 'MMBench_CN',\\n'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11', 'MMBench_TEST_CN_V11', 'MMBench_V11',\\n'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2', 'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST',\\n'MMT-Bench_ALL_MI', 'MMT-Bench_ALL', 'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL',\\n'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar', 'RealWorldQA', 'MLLMGuard_DS', 'BLINK'\\n```\\n数据集的具体介绍可以查看：https://github.com/open-compass/VLMEvalKit\\n\\n\\n> 首次评测时会自动下载数据集文件：https://www.modelscope.cn/datasets/swift/evalscope_resource/files\\n> 如果下载失败可以手动下载放置本地路径, 具体可以查看eval的日志输出.\\n\\n## 环境准备\\n\\n```shell\\npip install ms-swift[eval] -U\\n```\\n\\n或从源代码安装：\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[eval]'\\n```\\n\\n## 评测\\n\\n评测支持使用vLLM加速. 这里展示对原始模型和LoRA微调后的qwen2-7b-instruct进行评测.\\n\\n```shell\\n# 原始模型 (单卡A100大约需要半小时)\\nCUDA_VISIBLE_DEVCIES=0 swift eval --model_type qwen2-7b-instruct \\\\\\n    --eval_dataset ARC_c --infer_backend vllm\\n\\n# LoRA微调后\\nCUDA_VISIBLE_DEVICES=0 swift eval --ckpt_dir qwen2-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --eval_dataset ARC_c --infer_backend vllm \\\\\\n    --merge_lora true \\\\\\n```\\n\\n评测的参数列表可以参考[这里](命令行参数.md#eval参数)。\\n\\n请注意：评测结果会存储在{--eval_output_dir}/{--name}/{时间戳}下, 如果用户没有改变存储配置，则默认路径在:\\n```text\\n当前目录(`pwd`路径)/eval_outputs/default/20240628_190000/xxx\\n```\\n\\n\\n### 使用部署的方式评测\\n\\n```shell\\n# 使用OpenAI API方式启动部署\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-7b-instruct\\n\\n# 使用API进行评测\\n# 如果是非swift部署, 则需要额外传入`--eval_is_chat_model true --model_type qwen2-7b-instruct`\\nswift eval --eval_url http://127.0.0.1:8000/v1 --eval_dataset ARC_c\\n\\n# LoRA微调后的模型同理\\n```\\n\\n## 自定义评测集\\n\\n除此之外，我们支持了用户自定义自己的评测集。自定义评测集必须和某个官方评测集数据格式（pattern）保持一致。下面我们按步骤讲解如何使用自己的评测集进行评测。\\n\\n### 写好自己的评测集\\n\\n目前我们支持两种pattern的评测集：选择题格式的CEval和问答题格式的General-QA\\n\\n#### 选择题：CEval格式\\n\\nCEval格式适合用户是选择题的场景。即从四个选项中选择一个正确的答案，评测指标是`accuracy`。建议**直接修改**[CEval脚手架目录](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/eval_example/custom_ceval)。该目录包含了两个文件：\\n\\n```text\\ndefault_dev.csv # 用于fewshot评测，至少要具有入参的eval_few_shot条数据，即如果是0-shot评测，该csv可以为空\\ndefault_val.csv # 用于实际评测的数据\\n```\\n\\nCEval的csv文件需要为下面的格式：\\n\\n```csv\\nid,question,A,B,C,D,answer,explanation\\n1,通常来说，组成动物蛋白质的氨基酸有____,4种,22种,20种,19种,C,1. 目前已知构成动物蛋白质的的氨基酸有20种。\\n2,血液内存在的下列物质中，不属于代谢终产物的是____。,尿素,尿酸,丙酮酸,二氧化碳,C,\\\"代谢终产物是指在生物体内代谢过程中产生的无法再被利用的物质，需要通过排泄等方式从体内排出。丙酮酸是糖类代谢的产物，可以被进一步代谢为能量或者合成其他物质，并非代谢终产物。\\\"\\n```\\n\\n其中，id是评测序号，question是问题，ABCD是可选项（如果选项少于四个则对应留空），answer是正确选项，explanation是解释。\\n\\n其中的`default`文件名是CEval评测的子数据集名称，可更换，下面的配置中会用到。\\n\\n#### 问答题：General-QA\\n\\nGeneral-QA适合用户是问答题的场景，评测指标是`rouge`和`bleu`。建议**直接修改**[General-QA脚手架目录](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/eval_example/custom_general_qa)。该目录包含了一个文件：\\n\\n```text\\ndefault.jsonl\\n```\\n\\n该jsonline文件需要为下面的格式：\\n\\n```jsonline\\n{\\\"history\\\": [], \\\"query\\\": \\\"中国的首都是哪里？\\\", \\\"response\\\": \\\"中国的首都是北京\\\"}\\n{\\\"history\\\": [], \\\"query\\\": \\\"世界上最高的山是哪座山？\\\", \\\"response\\\": \\\"是珠穆朗玛峰\\\"}\\n{\\\"history\\\": [], \\\"query\\\": \\\"为什么北极见不到企鹅？\\\", \\\"response\\\": \\\"因为企鹅大多生活在南极\\\"}\\n```\\n\\n注意`history`目前为保留字段，尚不支持。\\n\\n### 定义一个配置文件传入eval命令\\n\\n定义好上面的文件后，需要写一个json文件传入eval命令中。建议直接修改[官方配置脚手架文件](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/eval_example/custom_config.json)。该文件内容如下：\\n\\n```json\\n[\\n    {\\n        \\\"name\\\": \\\"custom_general_qa\\\", # 评测项名称，可以随意指定\\n        \\\"pattern\\\": \\\"general_qa\\\", # 该评测集的pattern\\n        \\\"dataset\\\": \\\"eval_example/custom_general_qa\\\", # 该评测集的目录，强烈建议使用绝对路径防止读取失败\\n        \\\"subset_list\\\": [\\\"default\\\"] # 需要评测的子数据集，即上面的`default_x`文件名\\n    },\\n    {\\n        \\\"name\\\": \\\"custom_ceval\\\",\\n        \\\"pattern\\\": \\\"ceval\\\",\\n        \\\"dataset\\\": \\\"eval_example/custom_ceval\\\", # 该评测集的目录，强烈建议使用绝对路径防止读取失败\\n        \\\"subset_list\\\": [\\\"default\\\"]\\n    }\\n]\\n```\\n\\n下面就可以传入这个配置文件进行评测了：\\n\\n```shell\\n# 使用arc评测，每个子数据集限制评测10条，推理backend使用pt\\n# cd examples/pytorch/llm\\n# eval_dataset也可以设置值，官方数据集和自定义数据集一起跑\\nswift eval \\\\\\n    --model_type \\\"qwen-7b-chat\\\" \\\\\\n    --eval_dataset no \\\\\\n    --infer_backend pt \\\\\\n    --custom_eval_config eval_example/custom_config.json\\n```\\n\\n运行结果如下：\\n\\n```text\\n2024-04-10 17:21:33,275 - llmuses - INFO - *** Report table ***\\n+------------------------------+----------------+---------------------------------+\\n| Model                        | custom_ceval   | custom_general_qa               |\\n+==============================+================+=================================+\\n| qa-custom_ceval_qwen-7b-chat | 1.0 (acc)      | 0.8888888888888888 (rouge-1-r)  |\\n|                              |                | 0.33607503607503614 (rouge-1-p) |\\n|                              |                | 0.40616618868713145 (rouge-1-f) |\\n|                              |                | 0.39999999999999997 (rouge-2-r) |\\n|                              |                | 0.27261904761904765 (rouge-2-p) |\\n|                              |                | 0.30722525589718247 (rouge-2-f) |\\n|                              |                | 0.8333333333333334 (rouge-l-r)  |\\n|                              |                | 0.30742204655248134 (rouge-l-p) |\\n|                              |                | 0.3586824745225346 (rouge-l-f)  |\\n|                              |                | 0.3122529644268775 (bleu-1)     |\\n|                              |                | 0.27156862745098037 (bleu-2)    |\\n|                              |                | 0.25 (bleu-3)                   |\\n|                              |                | 0.2222222222222222 (bleu-4)     |\\n+------------------------------+----------------+---------------------------------+\\nFinal report:{'report': [{'name': 'custom_general_qa', 'metric': 'WeightedAverageBLEU', 'score': {'rouge-1-r': 0.8888888888888888, 'rouge-1-p': 0.33607503607503614, 'rouge-1-f': 0.40616618868713145, 'rouge-2-r': 0.39999999999999997, 'rouge-2-p': 0.27261904761904765, 'rouge-2-f': 0.30722525589718247, 'rouge-l-r': 0.8333333333333334, 'rouge-l-p': 0.30742204655248134, 'rouge-l-f': 0.3586824745225346, 'bleu-1': 0.3122529644268775, 'bleu-2': 0.27156862745098037, 'bleu-3': 0.25, 'bleu-4': 0.2222222222222222}, 'category': [{'name': 'DEFAULT', 'score': {'rouge-1-r': 0.8888888888888888, 'rouge-1-p': 0.33607503607503614, 'rouge-1-f': 0.40616618868713145, 'rouge-2-r': 0.39999999999999997, 'rouge-2-p': 0.27261904761904765, 'rouge-2-f': 0.30722525589718247, 'rouge-l-r': 0.8333333333333334, 'rouge-l-p': 0.30742204655248134, 'rouge-l-f': 0.3586824745225346, 'bleu-1': 0.3122529644268775, 'bleu-2': 0.27156862745098037, 'bleu-3': 0.25, 'bleu-4': 0.2222222222222222}, 'subset': [{'name': 'default', 'score': {'rouge-1-r': 0.8888888888888888, 'rouge-1-p': 0.33607503607503614, 'rouge-1-f': 0.40616618868713145, 'rouge-2-r': 0.39999999999999997, 'rouge-2-p': 0.27261904761904765, 'rouge-2-f': 0.30722525589718247, 'rouge-l-r': 0.8333333333333334, 'rouge-l-p': 0.30742204655248134, 'rouge-l-f': 0.3586824745225346, 'bleu-1': 0.3122529644268775, 'bleu-2': 0.27156862745098037, 'bleu-3': 0.25, 'bleu-4': 0.2222222222222222}}]}], 'total_num': 3}, {'name': 'custom_ceval', 'metric': 'WeightedAverageAccuracy', 'score': 1.0, 'category': [{'name': 'DEFAULT', 'score': 1.0, 'subset': [{'name': 'default', 'score': 1.0}]}], 'total_num': 2}], 'generation_info': {'time': 34.23462510108948, 'tokens': 219}}\\n```\\n\\n\\n## 功能指引\\n\\n[English Documentation](https://swift.readthedocs.io/en/latest/Instruction/index.html)\\n\\n### 🐔功能文档\\n\\n1. [LLM微调文档](LLM微调文档.md)\\n2. [LLM推理文档](LLM推理文档.md)\\n3. [LLM评测文档](LLM评测文档.md)\\n4. [LLM量化与导出文档](LLM量化与导出文档.md)\\n5. [LLM实验文档](LLM实验文档.md)\\n6. [命令行参数](命令行参数.md)\\n7. [支持的模型和数据集](支持的模型和数据集.md)\\n8. [自定义与拓展](自定义与拓展.md)\\n9. [常见问题整理](常见问题整理.md)\\n\\n\\nThe courses of this folder are transfered to [the classroom repo](https://github.com/modelscope/modelscope-classroom).\\n\\n\\n# AnimateDiff的微调和推理\\n\\nSWIFT已经支持了AnimateDiff的微调和推理，目前支持两种方式：全参数微调和LoRA微调。\\n\\n首先需要clone并安装SWIFT：\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install \\\".[aigc]\\\"\\n```\\n\\n## 全参数训练\\n\\n### 训练效果\\n\\n全参数微调可以复现[官方提供的模型animatediff-motion-adapter-v1-5-2](https://www.modelscope.cn/models/Shanghai_AI_Laboratory/animatediff-motion-adapter-v1-5-2/summary)的效果，需要的短视频数量较多，魔搭官方复现使用了官方数据集的subset版本：[WebVid 2.5M](https://maxbain.com/webvid-dataset/)。训练效果如下：\\n\\n```text\\nPrompt:masterpiece, bestquality, highlydetailed, ultradetailed, girl, walking, on the street, flowers\\n```\\n\\n\\n\\n![image.png](../../resources/1.gif)\\n\\n```text\\nPrompt: masterpiece, bestquality, highlydetailed, ultradetailed, beautiful house, mountain, snow top\\n```\\n\\n![image.png](../../resources/2.gif)\\n\\n2.5M子数据集训练的生成效果仍存在效果不稳定的情况，开发者使用10M数据集效果会更稳定。\\n\\n### 运行命令\\n\\n```shell\\n# 该文件在swift/examples/pytorch/animatediff/scripts/full中\\n# Experimental environment: A100 * 4\\n# 200GB GPU memory totally\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\ntorchrun --nproc_per_node=4 animatediff_sft.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --csv_path /mnt/workspace/yzhao/tastelikefeet/webvid/results_2M_train.csv \\\\\\n  --video_folder /mnt/workspace/yzhao/tastelikefeet/webvid/videos2 \\\\\\n  --sft_type full \\\\\\n  --lr_scheduler_type constant \\\\\\n  --trainable_modules .*motion_modules.* \\\\\\n  --batch_size 4 \\\\\\n  --eval_steps 100 \\\\\\n  --gradient_accumulation_steps 16\\n```\\n\\n我们使用了A100 * 4进行训练，共需要200GB显存，训练时长约40小时。数据格式如下：\\n\\n```text\\n--csv_path 传入一个csv文件，该csv文件应包含如下格式：\\nname,contentUrl\\nTravel blogger shoot a story on top of mountains. young man holds camera in forest.,stock-footage-travel-blogger-shoot-a-story-on-top-of-mountains-young-man-holds-camera-in-forest.mp4\\n```\\n\\nname字段代表该短视频的prompt，contentUrl代表该视频文件的名称\\n\\n```text\\n--video_folder 传入一个视频目录，该目录中包含了csv文件中，contentUrl指代的所有视频文件\\n```\\n\\n使用全参数进行推理方式如下：\\n\\n```shell\\n# 该文件在swift/examples/pytorch/animatediff/scripts/full中\\n# Experimental environment: A100\\n# 18GB GPU memory\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0 \\\\\\npython animatediff_infer.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --sft_type full \\\\\\n  --ckpt_dir /output/path/like/checkpoints/iter-xxx \\\\\\n  --eval_human true\\n```\\n\\n其中的--ckpt_dir 传入训练时输出的文件夹即可。\\n\\n## LoRA训练\\n\\n### 运行命令\\n\\n全参数训练会从0开始训练整个Motion-Adapter结构，用户可以使用现有的模型使用少量视频进行微调，只需要运行下面的命令：\\n\\n```shell\\n# 该文件在swift/examples/pytorch/animatediff/scripts/lora中\\n# Experimental environment: A100\\n# 20GB GPU memory\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0 \\\\\\npython animatediff_sft.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --csv_path /mnt/workspace/yzhao/tastelikefeet/webvid/results_2M_train.csv \\\\\\n  --video_folder /mnt/workspace/yzhao/tastelikefeet/webvid/videos2 \\\\\\n  --motion_adapter_id_or_path Shanghai_AI_Laboratory/animatediff-motion-adapter-v1-5-2 \\\\\\n  --sft_type lora \\\\\\n  --lr_scheduler_type constant \\\\\\n  --trainable_modules .*motion_modules.* \\\\\\n  --batch_size 1 \\\\\\n  --eval_steps 200 \\\\\\n  --dataset_sample_size 10000 \\\\\\n  --gradient_accumulation_steps 16\\n```\\n\\n视频数据参数同上。\\n\\n推理命令如下：\\n\\n```shell\\n# 该文件在swift/examples/pytorch/animatediff/scripts/lora中\\n# Experimental environment: A100\\n# 18GB GPU memory\\nPYTHONPATH=../../.. \\\\\\nCUDA_VISIBLE_DEVICES=0 \\\\\\npython animatediff_infer.py \\\\\\n  --model_id_or_path wyj123456/Realistic_Vision_V5.1_noVAE \\\\\\n  --motion_adapter_id_or_path Shanghai_AI_Laboratory/animatediff-motion-adapter-v1-5-2 \\\\\\n  --sft_type lora \\\\\\n  --ckpt_dir /output/path/like/checkpoints/iter-xxx \\\\\\n  --eval_human true\\n```\\n\\n其中的--ckpt_dir 传入训练时输出的文件夹即可。\\n\\n## 参数列表\\n\\n下面给出训练和推理分别支持的参数列表及其含义：\\n\\n### 训练参数\\n\\n```text\\nmotion_adapter_id_or_path: Optional[str] = None # motion adapter的模型id或模型路径，指定这个参数可以基于现有的官方模型效果继续训练\\nmotion_adapter_revision: Optional[str] = None # motion adapter的模型revision，仅在motion_adapter_id_or_path是模型id时有用\\n\\nmodel_id_or_path: str = None # sd基模型的模型id或模型路径\\nmodel_revision: str = None # sd基模型的revision，仅在model_id_or_path是模型id时有用\\n\\ndataset_sample_size: int = None # 数据集训练条数，默认代表全量训练\\n\\nsft_type: str = field(\\n    default='lora', metadata={'choices': ['lora', 'full']}) # 训练方式，支持lora和全参数\\n\\noutput_dir: str = 'output' # 输出文件夹\\nddp_backend: str = field(\\n    default='nccl', metadata={'choices': ['nccl', 'gloo', 'mpi', 'ccl']}) # 如使用ddp训练，ddp backend\\n\\nseed: int = 42 # 随机种子\\n\\nlora_rank: int = 8 # lora 参数\\nlora_alpha: int = 32 # lora 参数\\nlora_dropout: float = 0.05 # lora 参数\\nlora_dtype: str = 'fp32' # lora模块dtype类型，如果为`AUTO`则跟随原始模块的dtype设定\\n\\ngradient_checkpointing: bool = False # 是否开启gc，默认不开启。注：当前版本diffusers有问题，不支持该参数为True\\nbatch_size: int = 1 # batchsize\\nnum_train_epochs: int = 1 # epoch数\\n# if max_steps >= 0, override num_train_epochs\\nlearning_rate: Optional[float] = None # 学习率\\nweight_decay: float = 0.01 # adamw参数\\ngradient_accumulation_steps: int = 16 # ga大小\\nmax_grad_norm: float = 1. # grad norm大小\\nlr_scheduler_type: str = 'cosine' # lr_scheduler的类型\\nwarmup_ratio: float = 0.05 # 是否warmup及warmup占比\\n\\neval_steps: int = 50 # eval step间隔\\nsave_steps: Optional[int] = None # save step间隔\\ndataloader_num_workers: int = 1 # dataloader workers数量\\n\\npush_to_hub: bool = False # 是否推送到modelhub\\n# 'user_name/repo_name' or 'repo_name'\\nhub_model_id: Optional[str] = None # modelhub id\\nhub_private_repo: bool = False\\npush_hub_strategy: str = field( # 推送策略，推送最后一个还是每个都推送\\n    default='push_best',\\n    metadata={'choices': ['push_last', 'all_checkpoints']})\\n# None: use env var `MODELSCOPE_API_TOKEN`\\nhub_token: Optional[str] = field( # modelhub的token\\n    default=None,\\n    metadata={\\n        'help':\\n        'SDK token can be found in https://modelscope.cn/my/myaccesstoken'\\n    })\\n\\nignore_args_error: bool = False  # True: notebook compatibility\\n\\ntext_dropout_rate: float = 0.1 # drop一定比例的文本保证模型鲁棒性\\n\\nvalidation_prompts_path: str = field( # 评测过程使用的prompt文件目录，默认使用swift/aigc/configs/validation.txt\\n    default=None,\\n    metadata={\\n        'help':\\n        'The validation prompts file path, use aigc/configs/validation.txt is None'\\n    })\\n\\ntrainable_modules: str = field( # 可训练模块，建议使用默认值\\n    default='.*motion_modules.*',\\n    metadata={\\n        'help':\\n        'The trainable modules, by default, the .*motion_modules.* will be trained'\\n    })\\n\\nmixed_precision: bool = True # 混合精度训练\\n\\nenable_xformers_memory_efficient_attention: bool = True # 使用xformers\\n\\nnum_inference_steps: int = 25 #\\nguidance_scale: float = 8.\\nsample_size: int = 256\\nsample_stride: int = 4 # 训练视频最大长度秒数\\nsample_n_frames: int = 16 # 每秒帧数\\n\\ncsv_path: str = None # 输入数据集\\nvideo_folder: str = None # 输入数据集\\n\\nmotion_num_attention_heads: int = 8 # motion adapter参数\\nmotion_max_seq_length: int = 32 # motion adapter参数\\nnum_train_timesteps: int = 1000 # 推理pipeline参数\\nbeta_start: int = 0.00085 # 推理pipeline参数\\nbeta_end: int = 0.012 # 推理pipeline参数\\nbeta_schedule: str = 'linear' # 推理pipeline参数\\nsteps_offset: int = 1 # 推理pipeline参数\\nclip_sample: bool = False # 推理pipeline参数\\n\\nuse_wandb: bool = False # 是否使用wandb\\n```\\n\\n### 推理参数\\n\\n```text\\nmotion_adapter_id_or_path: Optional[str] = None # motion adapter的模型id或模型路径，指定这个参数可以基于现有的官方模型效果继续训练\\nmotion_adapter_revision: Optional[str] = None # motion adapter的模型revision，仅在motion_adapter_id_or_path是模型id时有用\\n\\nmodel_id_or_path: str = None # sd基模型的模型id或模型路径\\nmodel_revision: str = None # sd基模型的revision，仅在model_id_or_path是模型id时有用\\n\\nsft_type: str = field(\\n    default='lora', metadata={'choices': ['lora', 'full']}) # 训练方式，支持lora和全参数\\n\\nckpt_dir: Optional[str] = field(\\n    default=None, metadata={'help': '/path/to/your/vx-xxx/checkpoint-xxx'}) # 训练的输出文件夹\\neval_human: bool = False  # False: eval val_dataset # 是否使用人工输入评测\\n\\nseed: int = 42 # 随机种子\\n\\nmerge_lora: bool = False # Merge lora into the MotionAdapter and save the model.\\nreplace_if_exists: bool = False # Replace the files if the output merged dir exists when `merge_lora` is True.\\n\\n# other\\nignore_args_error: bool = False  # True: notebook compatibility\\n\\nvalidation_prompts_path: str = None # 用于validation的文件，eval_human=False时使用，每一行一个prompt\\n\\noutput_path: str = './generated' # 输出gif的目录\\n\\nenable_xformers_memory_efficient_attention: bool = True # 使用xformers\\n\\nnum_inference_steps: int = 25 #\\nguidance_scale: float = 8.\\nsample_size: int = 256\\nsample_stride: int = 4 # 训练视频最大长度秒数\\nsample_n_frames: int = 16 # 每秒帧数\\n\\nmotion_num_attention_heads: int = 8 # motion adapter参数\\nmotion_max_seq_length: int = 32 # motion adapter参数\\nnum_train_timesteps: int = 1000 # 推理pipeline参数\\nbeta_start: int = 0.00085 # 推理pipeline参数\\nbeta_end: int = 0.012 # 推理pipeline参数\\nbeta_schedule: str = 'linear' # 推理pipeline参数\\nsteps_offset: int = 1 # 推理pipeline参数\\nclip_sample: bool = False # 推理pipeline参数\\n\\n```\\n\\n\\n# 对Peft的兼容性\\n\\n为了支持习惯Peft的用户，Swift提供了对于Peft的兼容性。用户可以从swift中import peft组件：\\n\\n>PeftModel\\n>\\n>PeftConfig\\n>\\n>PeftModelForSeq2SeqLM\\n>\\n>PeftModelForSequenceClassification\\n>\\n>PeftModelForTokenClassification\\n>\\n>PeftModelForCausalLM\\n>\\n>PromptEncoderConfig\\n>\\n>PromptTuningConfig\\n>\\n>PrefixTuningConfig\\n>\\n>PromptLearningConfig\\n>\\n>LoraConfig\\n>\\n>get_peft_config\\n>\\n>get_peft_model_state_dict\\n>\\n>get_peft_model\\n\\n以上组件均可以从swift中import：\\n\\n```python\\nfrom swift import PeftModel, PeftConfig\\n```\\n\\nSwift类也支持初始化Peft的tuner：\\n\\n```python\\nfrom modelscope.models.nlp import SbertForSequenceClassification\\nfrom modelscope.models.nlp.structbert import SbertConfig\\n\\nfrom swift import LoraConfig, Swift\\nmodel = SbertForSequenceClassification(SbertConfig())\\nlora_config = LoraConfig(target_modules=['query', 'key', 'value'])\\nmodel = Swift.prepare_model(model, lora_config)\\n```\\n\\nSwift对Peft进行了浅封装，使Peft可以在from_pretrained时使用modelscope hub中的模型。\\n\\n\\n# 界面训练推理\\n\\n目前SWIFT已经支持了界面化的训练和推理，参数支持和脚本训练相同。在安装SWIFT后，使用如下命令：\\n\\n```shell\\nswift web-ui\\n```\\n\\n开启界面训练和推理。\\n\\nweb-ui可以通过环境变量或者参数控制UI行为。环境变量如下：\\n\\n> WEBUI_SHARE=1/0 默认为0 控制gradio是否是share状态\\n>\\n> SWIFT_UI_LANG=en/zh 控制web-ui界面语言\\n>\\n> WEBUI_SERVER server_name参数，web-ui host ip，0.0.0.0代表所有ip均可访问，127.0.0.1代表只允许本机访问\\n>\\n> WEBUI_PORT web-ui的端口号\\n>\\n> USE_INFERENCE=1/0 默认0. 控制gradio的推理页面是直接加载模型推理或者部署（USE_INFERENCE=0）\\n\\n如果使用参数，请参考[命令行参数](../Instruction/命令行参数.md#web-ui-参数)。\\n\\n\\n# Res-Tuning组件\\n\\n<div align=\\\"center\\\">\\n\\n## [NeurIPS 2023] Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone\\n\\n### [arXiv](https://arxiv.org/abs/2310.19859)  |  [Project Page](https://res-tuning.github.io/)\\n\\n</div>\\n\\nRes-Tuning 是一种灵活高效的微调tuner。我们把tuner的设计从模型网络结构中解耦出来以便灵活地组合，\\n并进一步扩展实现了一种新的节省内存的旁路tuner，大大减少了显存消耗和多任务推理成本。\\n\\n目前Res-Tuning在[SWIFT](https://github.com/modelscope/swift)中以可插拔的tuner算法组件提供，开发者可以直接使用它。\\n\\n### 支持的组件列表\\n\\n- [x] Res-Adapter\\n- [x] Res-Tuning-Bypass\\n- [ ] Res-Prefix\\n- [ ] Res-Prompt\\n\\n### 使用方式\\n\\n#### Demo\\n- 可以使用我们提供的 [可视化例子](https://github.com/modelscope/swift/blob/main/examples/pytorch/cv/notebook/swift_vision.ipynb).\\n\\n#### 初始化Tuner\\n\\n```Python\\nfrom swift import ResTuningConfig\\nconfig = ResTuningConfig(\\n    dims=768,\\n    root_modules=r'.*blocks.0$',\\n    stem_modules=r'.*blocks\\\\.\\\\d+$',\\n    target_modules=r'norm',\\n    tuner_cfg='res_adapter'\\n)\\n```\\n- dims: The dimensions of the hidden states.\\n- root_modules: The root module to be replaced.\\n- stem_modules: The stem modules to be replaced.\\n- target_modules: The target module to be replaced.\\n- tuner_cfg: The configuration of the tuning module.\\n\\n#### 加载模型\\n\\n```Python\\nfrom swift import Swift\\nimport timm, torch\\nmodel = timm.create_model(\\\"vit_base_patch16_224\\\", pretrained=False, num_classes=100)\\nmodel_tune = Swift.prepare_model(model, config)\\nprint(model_tune.get_trainable_parameters())\\nprint(model(torch.ones(1, 3, 224, 224)).shape)\\n```\\n\\n\\n### 引用\\n```\\n@inproceedings{jiang2023restuning,\\n  title={Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone},\\n  author={Jiang, Zeyinzi and Mao, Chaojie and Huang, Ziyuan and Ma, Ao and Lv, Yiliang and Shen, Yujun and Zhao, Deli and Zhou, Jingren},\\n  booktitle={Advances in Neural Information Processing Systems},\\n  year={2023}\\n}\\n```\\n\\n\\n# 安装和使用\\n\\n## Wheel包安装\\n\\n可以使用pip进行安装：\\n\\n```shell\\n# 全量能力\\npip install 'ms-swift[all]' -U\\n# 仅使用LLM\\npip install 'ms-swift[llm]' -U\\n# 仅使用AIGC\\npip install 'ms-swift[aigc]' -U\\n# 仅使用adapters\\npip install ms-swift -U\\n```\\n\\n## 源代码安装\\n\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[all]'\\n```\\n\\n## Notebook环境\\n\\nSwift支持训练的绝大多数模型都可以在`A10`显卡上使用，用户可以使用ModelScope官方提供的免费显卡资源：\\n\\n1. 进入[ModelScope](https://www.modelscope.cn)官方网站并登录\\n2. 点击左侧的`我的Notebook`并开启一个免费GPU实例\\n3. 愉快地薅A10显卡羊毛\\n\\n## Build文档\\n\\nSwift支持完整的API Doc文档，在swift根目录下执行：\\n\\n```shell\\nmake docs\\n```\\n\\n等待执行完成后，查看`docs/build/html/index.html`即可。\\n\\n\\n# 基本使用\\n\\ntuner是指附加在模型上的额外结构部分，用于减少训练参数量或者提高训练精度。目前SWIFT支持的tuners有：\\n\\n1. LoRA: [LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS](https://arxiv.org/abs/2106.09685)\\n2. LoRA+: [LoRA+: Efficient Low Rank Adaptation of Large Models](https://arxiv.org/pdf/2402.12354.pdf)\\n3. LLaMA PRO: [LLAMA PRO: Progressive LLaMA with Block Expansion](https://arxiv.org/pdf/2401.02415.pdf)\\n4. GaLore: [GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection](https://arxiv.org/abs/2403.03507)\\n5. LISA: [LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning](https://arxiv.org/abs/2403.17919)\\n6. UnSloth: https://github.com/unslothai/unsloth\\n7. SCEdit: [SCEdit: Efficient and Controllable Image Diffusion Generation via Skip Connection Editing](https://arxiv.org/abs/2312.11392)  < [arXiv](https://arxiv.org/abs/2312.11392)  |  [Project Page](https://scedit.github.io/) >\\n8. NEFTune: [Noisy Embeddings Improve Instruction Finetuning](https://arxiv.org/abs/2310.05914)\\n9. LongLoRA: [Efficient Fine-tuning of Long-Context Large Language Models](https://arxiv.org/abs/2309.12307)\\n10. Adapter: [Parameter-Efficient Transfer Learning for NLP](http://arxiv.org/abs/1902.00751)\\n11. Vision Prompt Tuning: [Visual Prompt Tuning](https://arxiv.org/abs/2203.12119)\\n12. Side: [Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks](https://arxiv.org/abs/1912.13503)\\n13. Res-Tuning: [Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone](https://arxiv.org/abs/2310.19859)  < [arXiv](https://arxiv.org/abs/2310.19859)  |  [Project Page](https://res-tuning.github.io/)  |  [Usage](ResTuning.md) >\\n14. [PEFT](https://github.com/huggingface/peft)提供的tuners, 如IA3, AdaLoRA等\\n\\n## 在训练中使用\\n\\n调用`Swift.prepare_model()`来将tuners添加到模型上：\\n\\n```python\\nfrom modelscope import Model\\nfrom swift import Swift, LoraConfig\\nimport torch\\nmodel = Model.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16, device_map='auto')\\nlora_config = LoraConfig(\\n                r=16,\\n                target_modules=['query_key_value'],\\n                lora_alpha=32,\\n                lora_dropout=0.)\\nmodel = Swift.prepare_model(model, lora_config)\\n```\\n\\n也可以同时使用多个tuners：\\n\\n```python\\nfrom modelscope import Model\\nfrom swift import Swift, LoraConfig, AdapterConfig\\nimport torch\\nmodel = Model.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16, device_map='auto')\\nlora_config = LoraConfig(\\n                r=16,\\n                target_modules=['query_key_value'],\\n                lora_alpha=32,\\n                lora_dropout=0.)\\nadapter_config = AdapterConfig(\\n                dim=model.config.hidden_size,\\n                target_modules=['mlp'],\\n                method_name='forward',\\n                hidden_pos=0,\\n                adapter_length=32,\\n            )\\nmodel = Swift.prepare_model(model, {'first_tuner': lora_config, 'second_tuner': adapter_config})\\n# use model to do other things\\n```\\n\\n在使用多个tuners时，传入的第二个参数需要是Dict，key是tuner名字，value是tuner配置。\\n\\n训练后可以调用：\\n\\n```python\\nmodel.save_pretrained(save_directory='./output')\\n```\\n\\n来存储模型checkpoint。模型的checkpoint文件只会包括tuners的权重，不会包含模型本身的权重。存储后的结构如下：\\n\\n> outputs\\n>\\n> ​     |-- configuration.json\\n>\\n> ​     |-- first_tuner\\n>\\n> ​               |-- adapter_config.json\\n>\\n> ​               |-- adapter_model.bin\\n>\\n> ​     |-- second_tuner\\n>\\n> ​               |-- adapter_config.json\\n>\\n> ​               |-- adapter_model.bin\\n>\\n> ​     |-- ...\\n\\n如果只传入单独的config，则会使用默认的名称`default`：\\n\\n> outputs\\n>\\n> ​      |-- configuration.json\\n>\\n> ​      |-- default\\n>\\n> ​                |-- adapter_config.json\\n>\\n> ​                |-- adapter_model.bin\\n>\\n> ​      |-- ...\\n\\n### 完整的训练代码\\n\\n```python\\n# A100 18G memory\\nfrom swift import Seq2SeqTrainer, Seq2SeqTrainingArguments\\nfrom modelscope import MsDataset, AutoTokenizer\\nfrom modelscope import AutoModelForCausalLM\\nfrom swift import Swift, LoraConfig\\nfrom swift.llm import get_template, TemplateType\\nimport torch\\n\\n# 拉起模型\\nmodel = AutoModelForCausalLM.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16, device_map='auto', trust_remote_code=True)\\nlora_config = LoraConfig(\\n                r=16,\\n                target_modules=['query_key_value'],\\n                lora_alpha=32,\\n                lora_dropout=0.05)\\nmodel = Swift.prepare_model(model, lora_config)\\ntokenizer = AutoTokenizer.from_pretrained('ZhipuAI/chatglm3-6b', trust_remote_code=True)\\ndataset = MsDataset.load('AI-ModelScope/alpaca-gpt4-data-en', split='train')\\ntemplate = get_template(TemplateType.chatglm3, tokenizer, max_length=1024)\\n\\ndef encode(example):\\n    inst, inp, output = example['instruction'], example.get('input', None), example['output']\\n    if output is None:\\n        return {}\\n    if inp is None or len(inp) == 0:\\n        q = inst\\n    else:\\n        q = f'{inst}\\\\n{inp}'\\n    example, kwargs = template.encode({'query': q, 'response': output})\\n    return example\\n\\ndataset = dataset.map(encode).filter(lambda e: e.get('input_ids'))\\ndataset = dataset.train_test_split(test_size=0.001)\\n\\ntrain_dataset, val_dataset = dataset['train'], dataset['test']\\n\\n\\ntrain_args = Seq2SeqTrainingArguments(\\n    output_dir='output',\\n    learning_rate=1e-4,\\n    num_train_epochs=2,\\n    eval_steps=500,\\n    save_steps=500,\\n    evaluation_strategy='steps',\\n    save_strategy='steps',\\n    dataloader_num_workers=4,\\n    per_device_train_batch_size=1,\\n    gradient_accumulation_steps=16,\\n    logging_steps=10,\\n)\\n\\ntrainer = Seq2SeqTrainer(\\n    model=model,\\n    args=train_args,\\n    data_collator=template.data_collator,\\n    train_dataset=train_dataset,\\n    eval_dataset=val_dataset,\\n    tokenizer=tokenizer)\\n\\ntrainer.train()\\n```\\n\\n## 在推理时使用\\n\\n使用`Swift.from_pretrained()`来拉起训练后存储的checkpoint：\\n\\n```python\\nfrom modelscope import Model\\nfrom swift import Swift\\nimport torch\\nmodel = Model.from_pretrained('ZhipuAI/chatglm2-6b', torch_dtype=torch.bfloat16, device_map='auto')\\nmodel = Swift.from_pretrained(model, './output')\\n```\\n\\n### 完整的推理代码\\n\\n```python\\n# A100 14G memory\\nimport torch\\nfrom modelscope import AutoModelForCausalLM, GenerationConfig\\nfrom modelscope import AutoTokenizer\\n\\nfrom swift import Swift\\nfrom swift.llm import get_template, TemplateType, to_device\\n\\n# 拉起模型\\nmodel = AutoModelForCausalLM.from_pretrained('ZhipuAI/chatglm3-6b', torch_dtype=torch.bfloat16,\\n                                             device_map='auto', trust_remote_code=True)\\nmodel = Swift.from_pretrained(model, 'output/checkpoint-xxx')\\ntokenizer = AutoTokenizer.from_pretrained('ZhipuAI/chatglm3-6b', trust_remote_code=True)\\ntemplate = get_template(TemplateType.chatglm3, tokenizer, max_length=1024)\\n\\nexamples, tokenizer_kwargs = template.encode({'query': 'How are you?'})\\nif 'input_ids' in examples:\\n    input_ids = torch.tensor(examples['input_ids'])[None]\\n    examples['input_ids'] = input_ids\\n    token_len = input_ids.shape[1]\\n\\ngeneration_config = GenerationConfig(\\n    max_new_tokens=1024,\\n    temperature=0.3,\\n    top_k=25,\\n    top_p=0.8,\\n    do_sample=True,\\n    repetition_penalty=1.0,\\n    num_beams=10,\\n    pad_token_id=tokenizer.pad_token_id,\\n    eos_token_id=tokenizer.eos_token_id)\\n\\ndevice = next(model.parameters()).device\\nexamples = to_device(examples, device)\\n\\ngenerate_ids = model.generate(\\n    generation_config=generation_config,\\n    **examples)\\ngenerate_ids = template.get_generate_ids(generate_ids, token_len)\\nprint(tokenizer.decode(generate_ids, **tokenizer_kwargs))\\n# I'm an AI language model, so I don't have feelings or physical sensations. However, I'm here to assist you with any questions or tasks you may have. How can I help you today?\\n```\\n\\n# 接口列表\\n\\n## Swift类静态接口\\n\\n- `Swift.prepare_model(model, config, **kwargs)`\\n  - 接口作用：加载某个tuner到模型上，如果是PeftConfig的子类，则使用Peft库的对应接口加载tuner。在使用SwiftConfig的情况下，本接口可以传入SwiftModel实例并重复调用，此时和config传入字典的效果相同。\\n    - 本接口支持并行加载不同类型的多个tuners共同使用\\n  - 参数：\\n    - `model`: `torch.nn.Module`或`SwiftModel`的实例，被加载的模型\\n    - `config`: `SwiftConfig`、`PeftConfig`的实例，或者一个自定义tuner名称对config的字典\\n  - 返回值：`SwiftModel`或`PeftModel`的实例\\n- `Swift.merge_and_unload(model)`\\n  - 接口作用：将LoRA weights合并回原模型，并将LoRA部分完全卸载\\n  - 参数：\\n    - model: `SwiftModel`或`PeftModel`的实例，已加载LoRA的模型实例\\n  - 返回值：None\\n\\n- `Swift.merge(model)`\\n\\n  - 接口作用：将LoRA weights合并回原模型，不卸载LoRA部分\\n\\n  - 参数：\\n    - model: `SwiftModel`或`PeftModel`的实例，已加载LoRA的模型实例\\n\\n  - 返回值：None\\n\\n- `Swift.unmerge(model)`\\n\\n  - 接口作用：将LoRA weights从原模型weights中拆分回LoRA结构\\n\\n  - 参数：\\n    - model: `SwiftModel`或`PeftModel`的实例，已加载LoRA的模型实例\\n\\n  - 返回值：None\\n\\n- `Swift.save_to_peft_format(ckpt_dir, output_dir)`\\n\\n  - 接口作用：将存储的LoRA checkpoint转换为Peft兼容的格式。主要改变有：\\n\\n    - `default`会从对应的`default`文件夹中拆分到output_dir根目录中\\n    - weights中的`{tuner_name}.`字段会被移除，如`model.layer.0.self.in_proj.lora_A.default.weight`会变为`model.layer.0.self.in_proj.lora_A.weight`\\n    - weights中的key会增加`basemodel.model`前缀\\n\\n    - 注意：只有LoRA可以被转换，其他类型tuner由于Peft本身不支持，因此会报转换错误。此外，由于LoRAConfig中存在额外参数，如`dtype`，因此在这些参数有设定的情况下，不支持转换为Peft格式，此时可以手动删除adapter_config.json中的对应字段\\n\\n  - 参数：\\n\\n    - ckpt_dir：原weights目录\\n    - output_dir：目标weights目录\\n\\n  - 返回值：None\\n\\n- `Swift.from_pretrained(model, model_id, adapter_name, revision, **kwargs)`\\n  - 接口作用：从存储的weights目录中加载起tuner到模型上，如果adapter_name不传，则会将model_id目录下所有的tuners都加载起来。同`prepare_model`相同，本接口可以重复调用\\n  - 参数：\\n    - model：`torch.nn.Module`或`SwiftModel`的实例，被加载的模型\\n    - model_id：`str`类型，待加载的tuner checkpoint， 可以是魔搭hub的id，或者训练产出的本地目录\\n    - adapter_name：`str`或`List[str]`或`Dict[str, str]`类型或`None`，待加载tuner目录中的tuner名称，如果为`None`则加载所有名称的tuners，如果是`str`或`List[str]`则只加载某些具体的tuner，如果是`Dict`，则将`key`指代的tuner加载起来后换成`value`的名字\\n    - revision: 如果model_id是魔搭的id，则revision可以指定对应版本号\\n\\n## SwiftModel接口\\n\\n下面列出用户可能调用的接口列表，其他内部接口或不推荐使用的接口可以通过`make docs`命令查看API Doc文档。\\n\\n- `SwiftModel.create_optimizer_param_groups(self, **defaults)`\\n  - 接口作用：根据加载的tuners创建parameter groups，目前仅对`LoRA+`算法有作用\\n  - 参数：\\n    - defaults：`optimizer_groups`的默认参数，如`lr`和`weight_decay`\\n  - 返回值：\\n    - 创建的`optimizer_groups`\\n\\n- `SwiftModel.add_weighted_adapter(self, ...)`\\n  - 接口作用：将已有的LoRA tuners合并为一个\\n  - 参数：\\n    - 本接口是PeftModel.add_weighted_adapter的透传，参数可以参考：[add_weighted_adapter文档](https://huggingface.co/docs/peft/main/en/package_reference/lora#peft.LoraModel.add_weighted_adapter)\\n\\n- `SwiftModel.save_pretrained(self, save_directory, safe_serialization, adapter_name)`\\n  - 接口作用：存储tuner weights\\n  - 参数：\\n    - save_directory：存储目录\\n    - safe_serialization： 是否使用safe_tensors，默认为False\\n    - adapter_name：存储的adapter tuner，如果不传则默认存储所有的tuners\\n- `SwiftModel.set_active_adapters(self, adapter_names, offload=None)`\\n  - 接口作用：设置当前激活的adapters，不在列表中的adapters会被失活\\n    - 在`推理`时支持环境变量`USE_UNIQUE_THREAD=0/1`，默认值`1`，如果为`0`则set_active_adapters只对当前线程生效，此时默认使用本线程激活的tuners，不同线程tuners互不干扰\\n  - 参数：\\n    - adapter_names：激活的tuners\\n    - offload：失活的adapters如何处理，默认为`None`代表留在显存中，同时支持`cpu`和`meta`，代表offload到cpu和meta设备中以减轻显存消耗，在`USE_UNIQUE_THREAD=0`时offload不要传值以免影响其他线程\\n  - 返回值：None\\n- `SwiftModel.activate_adapter(self, adapter_name)`\\n  - 接口作用：激活一个tuner\\n    - 在`推理`时支持环境变量`USE_UNIQUE_THREAD=0/1`，默认值`1`，如果为`0`则activate_adapter只对当前线程生效，此时默认使用本线程激活的tuners，不同线程tuners互不干扰\\n  - 参数：\\n    - adapter_name：待激活的tuner名字\\n  - 返回值：None\\n- `SwiftModel.deactivate_adapter(self, adapter_name, offload)`\\n  - 接口作用：失活一个tuner\\n    - 在`推理`时环境变量`USE_UNIQUE_THREAD=0`时不要调用本接口\\n  - 参数：\\n    - adapter_name：待失活的tuner名字\\n    - offload：失活的adapters如何处理，默认为`None`代表留在显存中，同时支持`cpu`和`meta`，代表offload到cpu和meta设备中以减轻显存消耗\\n  - 返回值：None\\n\\n- `SwiftModel.get_trainable_parameters(self)`\\n\\n  - 接口作用：返回训练参数信息\\n\\n  - 参数：无\\n\\n  - 返回值：训练参数信息，格式如下：\\n    ```text\\n    trainable params: 100M || all params: 1000M || trainable%: 10.00% || cuda memory: 10GiB.\\n    ```\\n\\n\\n## 🔥SCEdit\\n\\nSCEdit由阿里巴巴通义实验室视觉智能团队(Alibaba TongYi Vision Intelligence Lab)所提出，是一个高效的生成式微调框架。该框架不仅支持文生图下游任务的微调能力，**相比LoRA节省30%-50%的训练显存开销**，实现快速迁移到特定的生成场景中；而且还可以**直接扩展到可控图像生成任务中，仅需ControlNet条件生成7.9%的参数量并节省30%的显存开销**，支持边缘图、深度图、分割图、姿态、颜色图、图像补全等条件生成任务。\\n\\n我们使用了[风格迁移数据集](https://modelscope.cn/datasets/damo/style_custom_dataset/dataPeview)中的3D风格数据进行了训练，并使用相同的`Prompt: A boy in a camouflage jacket with a scarf`进行测试，具体的定性和定量的结果如下：\\n\\n| Method    | bs   | ep   | Target Module | Param. (M)    | Mem. (MiB) | 3D style                                                     |\\n| --------- | ---- | ---- | ------------- | ------------- | ---------- | ------------------------------------------------------------ |\\n| LoRA/r=64 | 1    | 50   | q/k/v/out/mlp | 23.94 (2.20%) | 8440MiB    | <img src=\\\"https://intranetproxy.alipay.com/skylark/lark/0/2023/png/167218/1703665229562-0f33bbb0-c492-41b4-9f37-3ae720dca80d.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| SCEdit    | 1    | 50   | up_blocks     | 19.68 (1.81%) | 7556MiB    | <img src=\\\"https://intranetproxy.alipay.com/skylark/lark/0/2023/png/167218/1703665933913-74b98741-3b57-46a4-9871-539df3a0112c.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| LoRA/r=64 | 10   | 100  | q/k/v/out/mlp | 23.94 (2.20%) | 26300MiB   | <img src=\\\"https://intranetproxy.alipay.com/skylark/lark/0/2023/png/167218/1703750608529-de20d0e7-bf9c-4928-8e59-73cc54f2c8d7.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| SCEdit    | 10   | 100  | up_blocks     | 19.68 (1.81%) | 18634MiB   | <img src=\\\"https://intranetproxy.alipay.com/skylark/lark/0/2023/png/167218/1703663033092-94492e44-341f-4259-9df4-13c168e3b5d6.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| LoRA/r=64 | 30   | 200  | q/k/v/out/mlp | 23.94 (2.20%) | 69554MiB   | <img src=\\\"https://intranetproxy.alipay.com/skylark/lark/0/2023/png/167218/1703750626635-2e368d7b-5e99-4a06-b189-8615f302bcd7.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n| SCEdit    | 30   | 200  | up_blocks     | 19.68 (1.81%) | 43350MiB   | <img src=\\\"https://intranetproxy.alipay.com/skylark/lark/0/2023/png/167218/1703662246942-1102b1f4-93ab-4653-b943-3302f2a5259e.png\\\" alt=\\\"img\\\" style=\\\"zoom:20%;\\\" /> |\\n\\n使用SCEdit执行训练任务并复现上述结果：\\n\\n```shell\\n# 先执行下面章节的安装步骤\\ncd examples/pytorch/multi_modal/notebook\\npython text_to_image_synthesis.py\\n```\\n\\n\\n\\n# 推送模型\\n\\n使用SWIFT时，用户可以选择将训练好的模型推送到魔搭社区上。\\n\\n要使用推送模型能力，首先要确认你已经注册了魔搭官方账号，并且在[页面](https://www.modelscope.cn/my/myaccesstoken)上取得了对应的sdk token。\\n\\n## 训练时推送模型\\n\\n在训练时推送模型，需要在命令行上添加以下参数：\\n```shell\\n--push_to_hub true \\\\\\n--hub_model_id my-group/my-model \\\\\\n--hub_token <token-from-modelscope-page>\\n```\\n\\n上述参数添加好后，训练后的checkpoint和训练参数就会被推送到魔搭社区上，方便以后使用。值得注意的是，魔搭社区允许您上传私有模型，需要模型是私有时，添加以下参数:\\n\\n```shell\\n--hub_private_repo true\\n```\\n\\n这样该模型就只有有该组织权限的人才能看到。\\n\\n## 导出时推送模型\\n\\n导出时推送模型的参数和训练时的参数是相同的：\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-4b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --push_to_hub true \\\\\\n    --hub_model_id qwen1half-4b-chat-lora \\\\\\n    --hub_token '<your-sdk-token>'\\n```\\n\\n这样可以将LoRA合并或量化后的模型直接推送到魔搭上。\\n\\n\\n# 人类偏好对齐训练文档\\n\\n本文档提供了各种人类偏好对齐算法的训练脚本。若您希望深入了解更详尽的算法信息及其选择方法，请参考[文档](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/M.%E4%BA%BA%E7%B1%BB%E5%81%8F%E5%A5%BD%E5%AF%B9%E9%BD%90%E8%AE%AD%E7%BB%83.md)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [数据集](#数据集)\\n- [DPO](#dpo)\\n- [CPO](#cpo)\\n- [ORPO](#orpo)\\n- [SimPO](#simpo)\\n\\n## 环境准备\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n\\n## 数据集\\n\\n视觉多模态大模型人类偏好对齐训练一般需要 $(x,y_w,y_l)$ 格式的数据，其中 $x$ 表示模型输入，包括文本提示和图像, $y_w,y_l$ 分别表示符合人类偏好的偏好回答和不符合人类偏好的拒绝回答,比如![dpo_data](../../resources/vdpo_data.png)\\n\\n**自定义数据集格式**\\n```jsonl\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"11111\\\", \\\"response\\\": \\\"22222\\\", \\\"rejected_response\\\": \\\"33333\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"aaaaa\\\", \\\"response\\\": \\\"bbbbb\\\", \\\"rejected_response\\\": \\\"ccccc\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n{\\\"system\\\": \\\"123\\\", \\\"query\\\": \\\"AAAAA\\\", \\\"response\\\": \\\"BBBBB\\\", \\\"rejected_response\\\": \\\"CCCCC\\\", \\\"images\\\": [\\\"image_path\\\"], \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\n其中`system`和`history`为可选项\\n\\n不同模型对图像数量的支持不同, 具体参考模型对应的最佳实践文档\\n\\n**训练提示**:\\n- 下面的训练脚本使用`--lora_target_modules DEFAULT`只训练模型的QKV矩阵，你也可以设置`--lora_target_modules ALL`来训练模型的全部线性层\\n\\n## DPO\\n[论文arvix](https://arxiv.org/abs/2305.18290)\\n\\n超参\\n- `beta`：KL正则系数，值越大表示对偏离参考模型的惩罚越大。默认为0.1\\n\\n建议在开始DPO训练之前，使用偏好数据集中的偏好回答部分进行SFT训练，以确保数据符合DPO算法的分布要求。\\n我们也在DPO loss中混合了sft loss来稳定训练，你可以通过设置超参`rpo_alpha`来调整sft loss的系数，默认为`1.`.\\n\\n训练脚本, 这里我们提供单卡/多卡device map/多卡ddp的版本，简洁起见，后续算法只给出单卡版本。\\n```bash\\n# Experimental environment: A100\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# MP(device map)\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# DDP + MP\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n训练后的模型推理和部署可以参考对应模型的最佳实践文档, [部署文档](./MLLM部署文档.md)和[vLLM推理加速文档](./vLLM推理加速文档.md)\\n\\n## CPO\\n[论文arvix](https://arxiv.org/abs/2401.08417)\\n超参\\n- beta：隐含奖励前的系数，默认为0.1\\n- cpo_alpha: nll loss系数, 默认为1.0\\n\\n训练脚本\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type cpo \\\\\\n    --model_type  llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n## ORPO\\n[论文arvix](https://arxiv.org/abs/2403.07691)\\n\\n超参\\n- lambda: Odds Ratio loss系数\\n\\n注意：ORPO使用参数`--beta`传入超参`lambda`\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llava1_6-mistral-7b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n\\n## SimPO\\n[论文arvix](https://arxiv.org/abs/2405.14734)\\n超参\\n- beta：隐含奖励前的系数，默认为2.0\\n- simpo_gamma：reward margin项，默认为1.0\\n- cpo_alpha: 混合CPO nll loss提高训练稳定性, 默认为1.0, 设置0.0使用原始SimPO算法\\n\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type simpo \\\\\\n    --model_type  llava1_6-mistral-7b-instruct \\\\\\n    --beta 2.0 \\\\\\n    --simpo_gamma 1.0 \\\\\\n    --sft_type  lora \\\\\\n    --dataset rlaif-v#1000 \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  DEFAULT  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n\\n\\n\\n# Llava Video 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 推理\\n```shell\\n# Experimental environment: A10\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava-next-video-7b-instruct\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁\\n我是 Assistant，一个大型语言模型。 我被训练来回答各种问题，包括提供信息、提供建议、提供帮助等等。 我可以回答你关于各种话题的问题，但如果你有具体问题，请告诉我，我会尽力回答。\\n--------------------------------------------------\\n<<< clear\\n<<< <video>描述这段视频\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\n这段视频展示了一个小孩在躺在床上，正在玩一本书。她穿着粉色的玩具裤和绿色的玩具裙，穿着眼镜。她的手在书上摸索，她的脸上带着微笑，看起来很开心。她的头发是金色的，整个场景充满了温馨和轻松的氛围。\\n--------------------------------------------------\\n<<< clear\\n<<< <video>Describe this video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/fire.mp4\\nIn the video, a person is seen holding a bag of chips and a lighter. The person then proceeds to light the chips on fire, creating a small fire. The fire is contained within the bag, and the person appears to be enjoying the fire as they watch it burn. The video is a simple yet intriguing display of pyromania, where the person is fascinated by the fire and enjoys watching it burn. The use of the bag as a container for the fire adds an element of danger to the scene, as it could potentially cause the fire to spread or cause injury. Overall, the video is a brief yet captivating display of pyromania and the allure of fire.\\n--------------------------------------------------\\n<<< clear\\n<<< <image>描述这张图片\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n这张图片是一张照片，显示了一只充满活力和可爱的猫咪。它的头部和脸部呈现出细腻的白色和柔和的灰色斑点，给人一种非常可爱的感觉。猫咪的眼睛非常大，充满了生机和好奇，它们的色彩是深蓝色，与猫咪的眼睛通常的颜色相反。猫咪的耳朵看起来很小，即使它们是很大的猫咪，也很常见。它的身体看起来很健康，毛发柔软而光滑，呈现出一种非常柔和的外观。\\n--------------------------------------------------\\n<<< clear\\n<<< <image>图中有几只羊\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n在这张图中，有四只羊。\\n```\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = 'llava-next-video-7b-instruct'\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 1024\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']\\nquery = '<video>描述这段视频'\\nresponse, _ = inference(model, template, query, videos=videos)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\nquery = '<image>图中有几只羊'\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\n\\\"\\\"\\\"\\nquery: <video>描述这段视频\\nresponse: 这段视频展示了一个小孩在床上享受一本书的愉悦。她穿着一件简单的纱衣，头戴着眼镜，手轻轻地摸索着书页。她的表情充满了兴奋和惊喜，她的眼睛时不时地眨眼地看着书页，仿佛在探索一个新的世界。她的姿势和动作都充满了轻松和自然，让人感觉到她在享受这个简单而美好的时刻。\\nquery: <image>图中有几只羊\\nresponse: 在这张图像中，有四只羊。\\n\\\"\\\"\\\"\\n```\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\nLoRA微调:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type llava-next-video-7b-instruct \\\\\\n    --dataset video-chatgpt \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(每轮对话需包含一段视频/图片或不含视频/图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/llava-next-video-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/llava-next-video-7b-instruct/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/llava-next-video-7b-instruct/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# Deepseek-VL 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\npip install 'ms-swift[llm]' -U\\n\\npip install attrdict\\n```\\n\\n模型链接:\\n- deepseek-vl-1_3b-chat: [https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-1.3b-chat/summary](https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-1.3b-chat/summary)\\n- deepseek-vl-7b-chat: [https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-7b-chat/summary](https://www.modelscope.cn/models/deepseek-ai/deepseek-vl-7b-chat/summary)\\n\\n\\n## 推理\\n\\n推理deepseek-vl-7b-chat:\\n\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type deepseek-vl-7b-chat\\n\\n# 如果你想在3090上运行, 可以推理1.3b模型\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type deepseek-vl-1_3b-chat\\n```\\n\\n7b模型效果展示: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是一个人工智能助手，专门设计来帮助用户解答问题和提供信息。我可以帮助你了解各种主题，从语言学习到视觉识别技术。有什么我可以帮助你的吗？\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>这两张图片有什么区别\\n这两张图片的主要区别在于它们描绘的动物和场景。\\n\\n第一张图片展示了一只小猫，它有着醒目的蓝色眼睛和灰白色的毛皮。小猫坐在一个模糊的背景前，看起来像是一张白色的床单或毯子。小猫的目光直直地对着相机，给人一种好奇和警觉的印象。\\n\\n第二张图片展示了一群羊站在一个绿色的田野中。羊的毛皮是白色和棕色的，它们站在一片绿色的草地上，背景中可以看到山脉。羊群看起来很平静，没有特别指向相机，这表明它们可能正在吃草或仅仅是享受田野。\\n\\n两张图片的背景都是模糊的，这有助于将焦点集中在动物上。然而，第一张图片中的背景更简单，只有一张白色的床单，而第二张图片中的背景更复杂，包括了绿色的田野和远处的山脉。\\n\\n总的来说，这两张图片捕捉了两种不同的场景：一只小猫在室内环境中，而一群羊在户外环境中。\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>图中有几只羊\\n图中有四只羊。\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>计算结果是多少\\n将1452和45304相加的结果是1452 + 45304 = 46756。\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>根据图片中的内容写首诗\\n星辉洒落湖面静，\\n独舟轻摇夜色中。\\n灯火摇曳伴星辰，\\n波光粼粼映山影。\\n\\n轻风拂过水面涟，\\n舟儿前行不自知。\\n夜深人静思绪远，\\n孤舟独行心悠然。\\n--------------------------------------------------\\n<<< clear\\n<<< <img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png</img>对图片进行OCR\\nThe image contains Chinese text and appears to be a screenshot of a document or webpage. The text is divided into several paragraphs, and there are several instances of URLs and Chinese characters. The text is not entirely clear due to the resolution, but some of the visible words and phrases include \\\"SWIFT\\\", \\\"250+\\\", \\\"LLM35+\\\", \\\"MLM\\\", \\\"PEFT\\\", \\\"adapters\\\", \\\"GPT\\\", \\\"XNLI\\\", \\\"Tune\\\", \\\"LORA\\\", \\\"LAMA-PRO\\\", \\\"Gradio\\\", \\\"web.ui\\\", \\\"AnimateDiff\\\", \\\"HuggingFace\\\", \\\"space\\\", \\\"ModelScope\\\", and \\\"SWIFT web\\\".\\n\\nThe text seems to be discussing topics related to machine learning, specifically mentioning models like SWIFT, GPT, and LAMA-PRO, as well as tools and frameworks like HuggingFace and ModelScope. The URLs suggest that the text might be referencing online resources or repositories related to these topics.\\n\\nThe text is not fully legible due to the low resolution and the angle at which the image was taken, which makes it difficult to provide a precise transcription. However, the presence of technical terms and URLs indicates that the content is likely from a technical or academic context, possibly a research paper, a technical report, or an article discussing advancements in machine learning and related technologies.\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.deepseek_vl_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？\\nresponse: 这个标志显示了从当前位置到以下城市的距离：\\n\\n- 马塔（Mata）：14公里\\n- 阳江（Yangjiang）：62公里\\n- 广州（Guangzhou）：293公里\\n\\n这些信息是根据图片中的标志提供的。\\nquery: 距离最远的城市是哪？\\nresponse: 根据图片中的标志，距离最远的城市是广州，距离为293公里。\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？', '这个标志显示了从当前位置到以下城市的距离：\\\\n\\\\n- 马塔（Mata）：14公里\\\\n- 阳江（Yangjiang）：62公里\\\\n- 广州（Guangzhou）：293公里\\\\n\\\\n这些信息是根据图片中的标志提供的。'], ['距离最远的城市是哪？', '根据图片中的标志，距离最远的城市是广州，距离为293公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\nLoRA微调:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type deepseek-vl-7b-chat \\\\\\n    --dataset coco-en-mini \\\\\\n```\\n\\n全参数微调:\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 70GB GPU memory\\nNPROC_PER_NODE=4 CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type deepseek-vl-7b-chat \\\\\\n    --dataset coco-en-mini \\\\\\n    --sft_type full \\\\\\n    --use_flash_attn true \\\\\\n    --deepspeed default-zero2\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 支持每轮对话含多张图片或不含图片, 支持传入本地路径或URL)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/deepseek-vl-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/deepseek-vl-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/deepseek-vl-7b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Qwen-Audio 最佳实践\\n\\nQwen2-Audio的最佳实践可以查看: [https://github.com/modelscope/ms-swift/issues/1653](https://github.com/modelscope/ms-swift/issues/1653)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\npip install 'ms-swift[llm]' -U\\n```\\n\\n## 推理\\n\\n推理[qwen-audio-chat](https://modelscope.cn/models/qwen/Qwen-Audio-Chat/summary):\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-audio-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是来自达摩院的大规模语言模型，我叫通义千问。\\n--------------------------------------------------\\n<<< <audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/music.wav</audio>这是首什么样的音乐\\n这是一首风格是Pop的音乐。\\n--------------------------------------------------\\n<<< <audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>这段语音说了什么\\n这段语音中说了中文：\\\"今天天气真好呀\\\"。\\n--------------------------------------------------\\n<<< 这段语音是男生还是女生\\n根据音色判断，这段语音是男性。\\n\\\"\\\"\\\"\\n```\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen_audio_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = '<audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>这段语音说了什么'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '这段语音是男生还是女生'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>这段语音说了什么\\nresponse: 这段语音说了中文：\\\"今天天气真好呀\\\"。\\nquery: 这段语音是男生还是女生\\nresponse: 根据音色判断，这段语音是男性。\\nhistory: [['<audio>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav</audio>这段语音说了什么', '这段语音说了中文：\\\"今天天气真好呀\\\"。'], ['这段语音是男生还是女生', '根据音色判断，这段语音是男性。']]\\n\\\"\\\"\\\"\\n```\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\nLoRA微调:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 22GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen-audio-chat \\\\\\n    --dataset aishell1-mini-zh \\\\\\n```\\n\\n全参数微调:\\n```shell\\n# MP\\n# Experimental environment: 2 * A100\\n# 2 * 50 GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type qwen-audio-chat \\\\\\n    --dataset aishell1-mini-zh \\\\\\n    --sft_type full \\\\\\n\\n# ZeRO2\\n# Experimental environment: 4 * A100\\n# 4 * 80 GPU memory\\nNPROC_PER_NODE=4 CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type qwen-audio-chat \\\\\\n    --dataset aishell1-mini-zh \\\\\\n    --sft_type full \\\\\\n    --use_flash_attn true \\\\\\n    --deepspeed default-zero2\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 支持每轮对话含多段语音或不含语音, 支持传入本地路径或URL)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<audio>audio_path</audio>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<audio>audio_path</audio><audio>audio_path2</audio><audio>audio_path3</audio>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<audio>audio_path</audio>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-audio-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen-audio-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-audio-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# Yi-VL 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 推理\\n\\n推理[yi-vl-6b-chat](https://modelscope.cn/models/01ai/Yi-VL-6B/summary):\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 18GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type yi-vl-6b-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 描述这张图片\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n图片显示一只小猫坐在地板上,眼睛睁开,凝视着摄像机。小猫看起来很可爱,有灰色和白色的毛皮,以及蓝色的眼睛。它似乎正在看摄像机,可能对周围环境很好奇。\\n--------------------------------------------------\\n<<< 你是谁？\\nInput a media path or URL <<<\\n我是人工智能助手,随时准备帮助你解答问题或提供信息。\\n--------------------------------------------------\\n<<< 图中有几只羊\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n图中有四只羊.\\n--------------------------------------------------\\n<<< clear\\n<<< 计算结果是多少\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n1452 + 45304 = 46756\\n--------------------------------------------------\\n<<< clear\\n<<< 根据图片中的内容写首诗\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\n夜幕降临,星光闪烁,\\n一艘小船在河上飘荡,\\n船头挂着一盏明亮的灯,\\n照亮了周围的黑暗。\\n\\n船上有两个人,\\n一个在船头,另一个在船尾,\\n他们似乎在谈话,\\n在星光下享受着宁静的时刻。\\n\\n河岸边,树木在黑暗中站着,\\n在星光下投下长长的影子。\\n这景象是那么的宁静,\\n让人想起一个古老的传说。\\n\\n小船,人,和星光,\\n构成了一个美丽的画面,\\n它唤起一种宁静的感觉,\\n在喧嚣的城市生活之外。\\n--------------------------------------------------\\n<<< clear\\n<<< 对图片进行OCR\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\n这是一段关于SWIFT的文字，其中包括了它的版本、功能以及一些链接。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.yi_vl_6b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(2)  # ...\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '距离各城市多远？'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\nimages = images * 2\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: 距离各城市多远？\\nresponse: 距离甲塔14公里,距离阳江62公里,距离广州293公里,距离广州293公里。\\nquery: 距离最远的城市是哪？\\nresponse: 最远的距离是293公里。\\nhistory: [['距离各城市多远？', '距离甲塔14公里,距离阳江62公里,距离广州293公里,距离广州293公里。'], ['距离最远的城市是哪？', '最远的距离是293公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 19GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type yi-vl-6b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 每轮对话须包含一张图片或不含图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\", \\\"image_path2\\\", \\\"image_path3\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# vLLM推理加速文档\\nms-swift已接入了vLLM对多模态模型进行推理加速. 支持的模型可以查看[支持的模型和数据集](../Instruction/支持的模型和数据集.md#多模态大模型).\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理加速](#推理加速)\\n- [部署](#部署)\\n\\n\\n## 环境准备\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# vllm与cuda版本有对应关系，请按照`https://docs.vllm.ai/en/latest/getting_started/installation.html`选择版本\\npip install \\\"vllm>=0.5.1\\\"\\npip install openai -U\\n```\\n\\n\\n## 推理加速\\n\\n使用python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm\\n)\\n\\n# 'minicpm-v-v2_5-chat', 'minicpm-v-v2_6-chat', 'internvl2-1b', 'internvl2-4b', 'phi3-vision-128k-instruct'\\nmodel_type = ModelType.llava1_6_mistral_7b_instruct\\nmodel_id_or_path = None\\nllm_engine = get_vllm_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n\\nllm_engine.generation_config.max_new_tokens = 1024\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\nrequest_list = [{'query': 'who are you'}, {'query': 'Describe this image.', 'images': images}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n\\nhistory1 = resp_list[1]['history']\\nimages.append(None)\\nrequest_list = [{'query': 'Is the creature in the picture a dog?', 'history': history1, 'images': images}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n    print(f\\\"history: {resp['history']}\\\")\\n\\n\\\"\\\"\\\"\\nquery: who are you\\nresponse: Hello! I am an AI language model, designed to assist users with information and provide helpful prompts and suggestions. As an artificial intelligence, I do not have personal experiences, so I don't have a personality or individuality. Instead, my purpose is to provide accurate, useful information to users like you. Is there anything specific you would like help with or any other questions you have?\\nquery: Describe this image.\\nresponse: The image features a close-up of a kitten's face. The kitten has striking blue eyes, which are open and appear to be looking towards the camera. Its fur exhibits a mix of black and white stripes with black markings around its eyes. The fur texture is soft and dense with whiskers adorning the sides of its face, adding to its feline charm. The background is blurred with hints of green and white, which creates a bokeh effect, keeping the focus on the kitten's face. The image exudes a sense of innocence and curiosity typically associated with young felines.\\nquery: Is the creature in the picture a dog?\\nresponse: No, the creature in the picture is a kitten, which is a young cat, not a dog. The presence of distinct feline features such as stripes, whiskers, and the appearance of blue eyes confirms this.\\nhistory: [['Describe this image.', \\\"The image features a close-up of a kitten's face. The kitten has striking blue eyes, which are open and appear to be looking towards the camera. Its fur exhibits a mix of black and white stripes with black markings around its eyes. The fur texture is soft and dense with whiskers adorning the sides of its face, adding to its feline charm. The background is blurred with hints of green and white, which creates a bokeh effect, keeping the focus on the kitten's face. The image exudes a sense of innocence and curiosity typically associated with young felines. \\\"], ['Is the creature in the picture a dog?', 'No, the creature in the picture is a kitten, which is a young cat, not a dog. The presence of distinct feline features such as stripes, whiskers, and the appearance of blue eyes confirms this. ']]\\n\\\"\\\"\\\"\\n```\\n\\n\\nbatch处理:\\n```python\\n# vllm>=0.5.4\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_vllm_engine, get_template, inference_vllm, ModelType,\\n    get_default_template_type, inference_stream_vllm\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.minicpm_v_v2_6_chat\\nmodel_id_or_path = None\\nvllm_engine = get_vllm_engine(model_type, torch.bfloat16, model_id_or_path=model_id_or_path,\\n                              max_model_len=8192)\\n\\ntokenizer = vllm_engine.hf_tokenizer\\nvllm_engine.generation_config.max_new_tokens = 256\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = '<image>描述这张图片'\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\ngeneration_info = {}\\nrequest_list = [{'query': query, 'images': images} for _ in range(100)]\\nresp_list = inference_vllm(vllm_engine, template, request_list, generation_info=generation_info, use_tqdm=True)\\nprint(f'query: {query}')\\nprint(f'response: {resp_list[0][\\\"response\\\"]}')\\nprint(generation_info)\\n\\n# 流式\\ngeneration_info = {}\\ngen = inference_stream_vllm(vllm_engine, template, request_list, generation_info=generation_info)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\n# only show first\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    if resp is None:\\n        continue\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(generation_info)\\n\\\"\\\"\\\"\\n100%|██████████████████████████████████████████████████████████████████████████████| 100/100 [00:01<00:00, 91.47it/s]\\n100%|██████████████████████████████████████████████████████████████████████████████| 100/100 [00:22<00:00,  4.48it/s]\\nquery: <image>描述这张图片\\nresponse: 这张图片展示了一只小猫咪的特写，可能是美国短毛猫品种，因为其花纹和毛发质地。猫咪有着引人注目的蓝色眼睛，这是其外貌中非常突出的特征。它皮毛上有着独特的黑色条纹，从面颊延伸至头顶，暗示着一种有条纹的花纹图案。它的耳朵小而尖，内侧是粉色的。猫咪的胡须细长而突出，围绕在它的下颌两侧和眼睛周围。猫咪坐着，用一种表达丰富的方式直视着，嘴巴微微张开，露出粉红色的内唇。背景模糊，柔和的光线增强了猫咪的特征。\\n{'num_prompt_tokens': 2700, 'num_generated_tokens': 14734, 'num_samples': 100, 'runtime': 23.53027338697575, 'samples/s': 4.249844375176322, 'tokens/s': 626.1720702384794}\\nquery: <image>描述这张图片\\nresponse: 这张图片展示了一只小猫的特写，可能是一只幼年猫，在模糊的背景中，集中注意力在猫的表情上。这只猫长着一身白色与黑色条纹相间的毛皮，带有微妙的灰褐色。它的眼睛大而圆，具有高度的反光度，表明它们可能含有异色瞳，即一只眼睛是蓝色的，另一只是绿色的，但这只猫两只眼睛都是绿色的。睫毛清晰可见，增添了一种生动的表情。猫的耳朵竖立着，内部呈粉红色，边缘有浅色的阴影，显示出柔软的毛发。胡须又长又明显，突显了小猫的脸部形状。这个品种的猫看起来是一个常见品种，毛皮图案和眼睛颜色表明它可能是一只虎斑猫。光线柔和，产生一种天鹅绒般的效果，突出了猫绒毛的质感。\\n{'num_prompt_tokens': 2700, 'num_generated_tokens': 14986, 'num_samples': 100, 'runtime': 23.375922130944673, 'samples/s': 4.277906105257837, 'tokens/s': 641.0870089339394}\\n\\\"\\\"\\\"\\n```\\n\\n使用CLI:\\n```shell\\n# 多模态模型必须显式指定`--infer_backend vllm`\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-vicuna-7b-instruct --infer_backend vllm\\n\\n# 对数据集进行批量推理\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-vicuna-7b-instruct --infer_backend vllm \\\\\\n    --val_dataset coco-en-2-mini#100\\n\\n# TP:\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type internvl2-1b \\\\\\n    --infer_backend vllm --tensor_parallel_size 2\\n```\\n\\n```python\\n\\\"\\\"\\\"\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< Perform OCR on the image.\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\nThe image contains text that appears to be an introduction or description of a software or service called SWIFT. Here is the transcribed text:\\n\\nintroduction\\nSWIFT supports training, inference, evaluation and deployment of 250+ LLMs and 35 MLMs (multimodal large models). Developers can directly apply their own research and production environments to realize the complete workflow from model training and evaluation to application. In addition, we provide a complete Adapters Library to support the latest training techniques such as PEFT, we also provide a Gradio web-ui for controlling training and inference, as well as accompanying deep learning courses and best practices for beginners.\\n\\nAdditionally, we are expanding capabilities for other modalities. Currently, we support full-paraphrase training and LORA training for AnimatedDiff.\\n\\nSWIFT web-ui is available both on HuggingFace space and ModelScope studio.\\n\\nPlease feel free to try.\\n\\nPlease note that the text is a mix of English and what appears to be a programming or technical language, and some words or phrases might not be fully transcribed due to the complexity of the text.\\n--------------------------------------------------\\n<<< who are you\\nInput a media path or URL <<<\\nI'm a language model called Vicuna, and I was trained by researchers from Large Model Systems Organization (LMSYS).\\n\\\"\\\"\\\"\\n```\\n\\n\\n## 部署\\n\\n**服务端:**\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type llava1_6-vicuna-13b-instruct --infer_backend vllm\\n\\n# TP:\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type internvl2-1b \\\\\\n    --infer_backend vllm --tensor_parallel_size 2\\n```\\n\\n**客户端:**\\n\\n测试:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"llava1_6-vicuna-13b-instruct\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"Describe this image.\\\"}],\\n\\\"temperature\\\": 0,\\n\\\"images\\\": [\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\"]\\n}'\\n```\\n\\n使用ms-swift:\\n```python\\nimport asyncio\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client_async\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\nrequest_config = XRequestConfig(seed=42)\\n\\nquery = '<image>Describe this image.'\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\ntasks = [inference_client_async(model_type, query, images=images, request_config=request_config) for _ in range(100)]\\nasync def _batch_run(tasks):\\n    return await asyncio.gather(*tasks)\\n\\nresp_list = asyncio.run(_batch_run(tasks))\\nprint(f'query: {query}')\\nprint(f'response0: {resp_list[0].choices[0].message.content}')\\nprint(f'response1: {resp_list[1].choices[0].message.content}')\\n\\nquery = '<image>How many sheep are in the picture?'\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\n\\nasync def _stream():\\n    global query\\n    request_config = XRequestConfig(seed=42, stream=True)\\n    stream_resp = await inference_client_async(model_type, query, images=images, request_config=request_config)\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    async for chunk in stream_resp:\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n\\nasyncio.run(_stream())\\n\\\"\\\"\\\"\\nmodel_type: llava1_6-vicuna-13b-instruct\\nquery: <image>Describe this image.\\nresponse0: The image captures a moment of tranquility featuring a kitten. The kitten, with its fur a mix of gray and white, is the main subject of the image. It's sitting on a surface that appears to be a table or a similar flat surface. The kitten's eyes, a striking shade of blue, are wide open, giving it a curious and alert expression. Its ears, also gray and white, are perked up, suggesting it's attentive to its surroundings. The background is blurred, drawing focus to the kitten, and it's a soft, muted color that doesn't distract from the main subject. The overall image gives a sense of calm and innocence.\\nresponse1: The image captures a moment of tranquility featuring a kitten. The kitten, with its fur a mix of gray and white, is the main subject of the image. It's sitting on a surface that appears to be a table or a similar flat surface. The kitten's eyes, a striking shade of blue, are wide open, giving it a curious and alert expression. Its ears, also gray and white, are perked up, suggesting it's attentive to its surroundings. The background is blurred, drawing focus to the kitten, and it's a soft, muted color that doesn't distract from the main subject. The overall image gives a sense of calm and innocence.\\nquery: <image>How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\n\\n使用openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['cat.png'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png'\\n\\nquery = 'Describe this image.'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\n\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'How many sheep are in the picture?'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\\"\\\"\\\"\\nmodel_type: llava1_6-vicuna-13b-instruct\\nquery: Describe this image.\\nresponse: The image captures a moment of tranquility featuring a kitten. The kitten, with its fur a mix of gray and white, is the main subject of the image. It's sitting on a surface that appears to be a table or a similar flat surface. The kitten's eyes, a striking shade of blue, are wide open, giving it a curious and alert expression. Its ears, also gray and white, are perked up, suggesting it's attentive to its surroundings. The background is blurred, drawing focus to the kitten, and it's a soft, muted color that doesn't distract from the main subject. The overall image gives a sense of calm and innocence.\\nquery: How many sheep are in the picture?\\nresponse: There are four sheep in the picture.\\n\\\"\\\"\\\"\\n```\\n\\n更多客户端使用方法可以查看[MLLM部署文档](MLLM部署文档.md#yi-vl-6b-chat)\\n\\n\\n\\n# CogVLM 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 推理\\n\\n推理[cogvlm-17b-chat](https://modelscope.cn/models/ZhipuAI/cogvlm-chat/summary):\\n```shell\\n# Experimental environment: A100\\n# 38GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type cogvlm-17b-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this image.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThis image showcases a close-up of a young kitten. The kitten has a fluffy coat with a mix of white, gray, and brown colors. Its eyes are strikingly blue, and it appears to be gazing directly at the viewer. The background is blurred, emphasizing the kitten as the main subject.\\n--------------------------------------------------\\n<<< clear\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is '1452+45304=45456'.\\n--------------------------------------------------\\n<<< clear\\n<<< Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nIn a world where night and day intertwine,\\nA boat floats gently, reflecting the moon's shine.\\nFireflies dance, their glow a mesmerizing trance,\\nAs the boat sails through a tranquil, enchanted expanse.\\n--------------------------------------------------\\n<<< clear\\n<<< Perform OCR on the image.\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\nThe image contains textual content that describes the capabilities and features of the SWIFT framework. It mentions support for training, inference, and deployment of 250+ LLMs and 35+ MLMs, and how developers can apply this framework to their research and production environments. It also mentions lightweight training solutions provided by PEFT and an adapter library to support the latest training techniques. Additionally, the text highlights that SWIFT offers capabilities for other modalities and supports full-parameter training and LLaMA training for AnimateDiff. There's also a mention of rich documentation available on Huggingface space and ModelScope studio.\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr_en:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.cogvlm_17b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, _ = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'Which city is the farthest?'\\nimages = images\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: From Mata, it is 14 km; from Yangjiang, it is 62 km; and from Guangzhou, it is 293 km.\\nquery: Which city is the farthest?\\nresponse: Guangzhou is the farthest city with a distance of 293 km.\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A100\\n# 50GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type cogvlm-17b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 但总的轮次对话只能包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm-17b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/cogvlm-17b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm-17b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# Phi3-Vision 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n模型链接:\\n- phi3-vision-128k-instruct: [https://modelscope.cn/models/LLM-Research/Phi-3-vision-128k-instruct/summary](https://modelscope.cn/models/LLM-Research/Phi-3-vision-128k-instruct/summary)\\n\\n\\n## 推理\\n\\n推理 phi3-vision-128k-instruct:\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 16GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type phi3-vision-128k-instruct\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Who are you?\\nI am Phi, an AI developed by Microsoft to assist with providing information, answering questions, and helping users find solutions to their queries. How can I assist you today?\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>What is the difference between these two pictures?\\nThe first picture shows a group of four cartoon sheep standing in a field, while the second picture is a close-up of a kitten with a blurred background. The main difference between these two pictures is the subject matter and the setting. The first picture features animals that are typically associated with farm life and agriculture, while the second picture focuses on a domestic animal, a kitten, which is more commonly found in households. Additionally, the first picture has a more peaceful and serene atmosphere, while the second picture has a more intimate and detailed view of the kitten.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>How many sheep are there in the picture?\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>What is the result of the calculation?\\nThe result of the calculation 1452 + 45304 is 46756.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>Write a poem based on the content of the picture.\\nIn the tranquil night, a boat sails,\\nThrough the darkened river, it sets sail.\\nA single candle flickers, casting light,\\nGuiding the way through the endless night.\\n\\nThe stars above, like diamonds bright,\\nGleam down upon the boat's gentle flight.\\nThe moon, a silent guardian in the sky,\\nWatches over the boat as it sails by.\\n\\nThe river, a mirror to the night,\\nReflects the boat's journey, a beautiful sight.\\nThe trees on either side, standing tall,\\nWhisper secrets to the boat, one and all.\\n\\nIn the stillness of the night, a sense of peace,\\nThe boat, the river, the trees, all in their place.\\nA moment frozen in time, a scene so serene,\\nA journey through the night, a dream so unseen.\\n--------------------------------------------------\\n<<< clear\\n<<< <img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png</img>Perform OCR on the image.\\nThe image contains a text section with the heading 'Introduction'. It discusses the capabilities of SWIFT, which support training, inference, evaluation, and deployment of over 250 large language models (LLMs) and 35+ multimodal large models (MLLMs). It mentions that developers can apply this framework to their research and production environments, and that SWIFT supports lightweight training solutions provided by PEFT, as well as a complete Adapters library for various training techniques. It also highlights the availability of a Gradio web-ui for controlling training and inference, and the provision of deep learning courses and best practices for beginners. The text further states that SWIFT is expanding capabilities for other modalities, currently supporting full-parameter training and LoRA training for AnimateDiff. There are references to rich documentation and the availability of SWIFT web-ui on Huggingface space and ModelScope studio. The text is clear and fully visible in the image.\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr_en:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.phi3_vision_128k_instruct\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'Which city is the farthest?'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: Which city is the farthest?\\nresponse: Guangzhou is the farthest city, located 293km away.\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>How far is it from each city?', 'The distances are as follows: Mata is 14km away, Yangjiang is 62km away, and Guangzhou is 293km away.'], ['Which city is the farthest?', 'Guangzhou is the farthest city, located 293km away.']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 16GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type phi3-vision-128k-instruct \\\\\\n    --dataset coco-en-mini \\\\\\n\\n# DDP Full\\n# Experimental environment: 2 * A100\\n# 2 * 50GB GPU memory\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type phi3-vision-128k-instruct \\\\\\n    --dataset coco-en-mini \\\\\\n    --sft_type full \\\\\\n    --ddp_find_unused_parameters true\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 支持每轮对话含多张图片或不含图片, 支持传入本地路径或URL)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/phi3-vision-128k-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/phi3-vision-128k-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true --safe_serialization false\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/phi3-vision-128k-instruct/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# MiniCPM-V-2 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\n# 请使用\\\"ms-swift>=2.2\\\"或者main分支.\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 推理\\n\\n推理[minicpm-v-v2-chat](https://modelscope.cn/models/OpenBMB/MiniCPM-V-2/summary):\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 10GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type minicpm-v-v2-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 描述这张图片\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n这张图片展示了一只小猫的特写，它的毛色主要是黑白相间，带有一些浅色条纹，可能暗示着虎斑猫品种。小猫的眼睛是蓝色的，瞳孔看起来是黑色的，给人一种深邃和好奇的感觉。它的耳朵竖立着，尖端是白色的，与毛色相匹配。小猫的鼻子是黑色的，嘴巴微微张开，露出牙齿，表明它可能在微笑或嬉戏。背景模糊，但似乎是室内环境，可能是地板或墙壁，颜色柔和，与小猫的毛色相融合。图片中的风格化效果使小猫看起来像一幅绘画或插图，而不是一张真实的照片。\\n--------------------------------------------------\\n<<< clear\\n<<< 图中有几只羊？\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n这幅图片描绘了一群羊在草地上。总共有四只羊，它们都长着白色的毛和棕色的角。这些羊看起来大小不一，其中一只看起来比另外三只要小一些。它们站在一片郁郁葱葱的绿草中，背景是起伏的山丘和天空。这幅图片的风格是卡通化的，羊的面部特征和身体特征都非常夸张。\\n--------------------------------------------------\\n<<< clear\\n<<< 计算结果是多少\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n计算结果是1452 + 45304 = 46756。\\n--------------------------------------------------\\n<<< clear\\n<<< 根据图片中的内容写首诗\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\n这幅图片描绘了一个宁静的夜晚场景，一艘船漂浮在水面之上。船看起来是一艘小木船，船头有一个桅杆，上面挂着一个灯笼，发出温暖的光芒。船身涂成深棕色，与水面形成鲜明对比。水面反射着星星和船只的灯光，营造出一种宁静而梦幻的氛围。背景中，树木繁茂，树叶呈现出金色和绿色，暗示着可能是黄昏或黎明时分。天空布满星星，给整个场景增添了神秘感。整体氛围宁静而幽静，让人联想到一个童话般的场景。\\n--------------------------------------------------\\n<<< clear\\n<<< 对图片进行OCR\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\n图片中的文字内容为：“SWIFT支持250+LLM和35+LLM（多模态大模型）的训练、推理和评估部署。开发者可以直接将我们的Research和生产环境中应用的模型框架应用到自己的Research和生产环境中。我们提供了完整的Adapters库以支持最新的训练技术，如NEFtune、Lora、LMA-PRO等，这个适配器库可以脱壳脚本直接在自己的流程中使用。为方便不熟悉深度学习用户的使用，我们提供了配套的深度学习课程和最佳实践新手入门门。此外，我们还在拓展其他强大的能力，目前我们支持了AnimateDiff的全参数LORA训练。SWIFT有丰富的文档体系，如有使用问题请查看这里。”\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.minicpm_v_v2_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.bfloat16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '距离各城市多远？'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: 距离各城市多远？\\nresponse:  马踏到马塔14公里，到阳江62公里，到广州293公里。\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是广州，距离为293公里。\\nhistory: [['距离各城市多远？', ' 马踏到马塔14公里，到阳江62公里，到广州293公里。'], ['距离最远的城市是哪？', '距离最远的城市是广州，距离为293公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 10GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type minicpm-v-v2-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 但总的轮次对话只能包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-v2-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/minicpm-v-v2-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-v2-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# MiniCPM-V 最佳实践\\n以下内容以`minicpm-v-3b-chat`为例, 如果你想要使用更新版本的 MiniCPM-V 多模态模型(v2), 你可以将`--model_type minicpm-v-3b-chat`切换成`--model_type minicpm-v-v2-chat`.\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\n# 请使用\\\"ms-swift>=2.2\\\"或者main分支.\\npip install 'ms-swift[llm]' -U\\n```\\n\\n模型链接:\\n- minicpm-v-3b-chat: [https://modelscope.cn/models/OpenBMB/MiniCPM-V/summary](https://modelscope.cn/models/OpenBMB/MiniCPM-V/summary)\\n- minicpm-v-v2-chat: [https://modelscope.cn/models/OpenBMB/MiniCPM-V-2/summary](https://modelscope.cn/models/OpenBMB/MiniCPM-V-2/summary)\\n\\n\\n## 推理\\n\\n推理minicpm-v-3b-chat:\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 10GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type minicpm-v-3b-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 描述这张图片\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n该图像的特点是一只黑白相间的猫，它的眼睛睁得大大的，似乎在凝视着相机。这只猫看起来很小，可能是一只幼猫。\\n--------------------------------------------------\\n<<< clear\\n<<< 图中有几只羊？\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n图中有四只羊。\\n--------------------------------------------------\\n<<< clear\\n<<< 计算结果是多少\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n计算结果为1452 + 4530 = 5982。\\n--------------------------------------------------\\n<<< clear\\n<<< 根据图片中的内容写首诗\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\n在宁静的夜晚，一艘船在平静的湖面上航行。\\n--------------------------------------------------\\n<<< clear\\n<<< 对图片进行OCR\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\nSwift 250+ LMM35+ MLLM\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.minicpm_v_3b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.bfloat16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '距离各城市多远？'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: 距离各城市多远？\\nresponse:  广州到深圳的距离是230公里，而深圳到广州的距离是14公里。\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是深圳，它位于广州和深圳之间，距离广州230公里，距离深圳14公里。\\nhistory: [['距离各城市多远？', ' 广州到深圳的距离是230公里，而深圳到广州的距离是14公里。'], ['距离最远的城市是哪？', '距离最远的城市是深圳，它位于广州和深圳之间，距离广州230公里，距离深圳14公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 10GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type minicpm-v-3b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 但总的轮次对话只能包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-3b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/minicpm-v-3b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-3b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# Llava 最佳实践\\n本篇文档涉及的模型如下:\\n\\n- [llava1_5-7b-instruct](https://modelscope.cn/models/swift/llava-1.5-7b-hf)\\n- [llava1_5-13b-instruct](https://modelscope.cn/models/swift/llava-1.5-13b-hf)\\n- [llava1_6-mistral-7b-instruct](https://modelscope.cn/models/swift/llava-v1.6-mistral-7b-hf)\\n- [llava1_6-vicuna-7b-instruct](https://modelscope.cn/models/swift/llava-v1.6-vicuna-7b-hf)\\n- [llava1_6-vicuna-13b-instruct](https://modelscope.cn/models/swift/llava-v1.6-vicuna-13b-hf)\\n- [llava1_6-yi-34b-instruct](https://modelscope.cn/models/swift/llava-v1.6-34b-hf)\\n- [llava-next-72b](https://modelscope.cn/models/AI-Modelscope/llava-next-72b)\\n- [llava-next-110b](https://modelscope.cn/models/AI-Modelscope/llava-next-110b)\\n\\n\\n其中, 前6个llava-hf模型支持vllm推理加速, 具体可以参考[vLLM推理加速文档](vLLM推理加速文档.md). 以下实践以`llava1_6-mistral-7b-instruct`为例，你也可以通过指定`--model_type`切换为其他模型.\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 推理\\n```shell\\n# Experimental environment: A100\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-mistral-7b-instruct\\n\\n# 70GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type llava1_6-yi-34b-instruct\\n\\n# 4*20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift infer --model_type llava1_6-yi-34b-instruct\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< who are you\\nInput a media path or URL <<<\\nI am a language model, specifically a transformer model, trained to generate text based on the input it receives. I do not have personal experiences or emotions, and I do not have a physical form. I exist purely as a software program that can process and generate text.\\n--------------------------------------------------\\n<<< <image>Describe this image.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThe image shows a close-up of a kitten with a soft, blurred background that suggests a natural, outdoor setting. The kitten has a mix of white and gray fur with darker stripes, typical of a tabby pattern. Its eyes are wide open, with a striking blue color that contrasts with the kitten's fur. The kitten's nose is small and pink, and its whiskers are long and white, adding to the kitten's cute and innocent appearance. The lighting in the image is soft and diffused, creating a gentle and warm atmosphere. The focus is sharp on the kitten's face, while the rest of the image is slightly out of focus, which draws attention to the kitten's features.\\n--------------------------------------------------\\n<<< <image>How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< clear\\n<<< <image>What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is 1452 + 453004 = 453006.\\n--------------------------------------------------\\n<<< <image>Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nIn the quiet of the night,\\nA solitary boat takes flight,\\nAcross the water's gentle swell,\\nUnderneath the stars that softly fell.\\n\\nThe boat, a vessel of the night,\\nCarries but one, a lone delight,\\nA solitary figure, lost in thought,\\nIn the tranquil calm, they find a wraith.\\n\\nThe stars above, like diamonds bright,\\nReflect upon the water's surface light,\\nCreating a path for the boat's journey,\\nGuiding through the night with a gentle purity.\\n\\nThe boat, a silent sentinel,\\nIn the stillness, it gently swells,\\nA vessel of peace and calm,\\nIn the quiet of the night, it carries on.\\n\\nThe figure on board, a soul at ease,\\nIn the serene embrace of nature's peace,\\nThey sail through the night,\\nUnder the watchful eyes of the stars' light.\\n\\nThe boat, a symbol of solitude,\\nIn the vast expanse of the universe's beauty,\\nA lone journey, a solitary quest,\\nIn the quiet of the night, it finds its rest.\\n--------------------------------------------------\\n<<< <image>Perform OCR on the image.\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\nThe text in the image is as follows:\\n\\nINTRODUCTION\\n\\nSWIFT supports training, inference, evaluation and deployment of 250+ LLMs (multimodal large models). Developers can directly apply our framework to their own research and production environments to realize the complete workflow from model training and evaluation to application. In addition, SWIFT provides a complete Adapters library to support the latest training techniques such as NLP, Vision, etc. This adapter library can be used directly in your own custom workflow without our training scripts.\\n\\nTo facilitate use by users unfamiliar with deep learning, we provide a Grado web-ui for controlling training and inference, as well as accompanying deep learning courses and best practices for beginners.\\n\\nSWIFT has rich documentation for users, please check here.\\n\\nSWIFT is web-ui available both on Huggingface space and ModelScope studio, please feel free to try!\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr_en:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = 'llava1_6-mistral-7b-instruct'\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '<image>How far is it from each city?'\\nresponse, _ = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'Which city is the farthest?'\\ngen = inference_stream(model, template, query, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: The image shows a road sign indicating the distances to three cities: Mata, Yangjiang, and Guangzhou. The distances are given in kilometers.\\n\\n- Mata is 14 kilometers away.\\n- Yangjiang is 62 kilometers away.\\n- Guangzhou is 293 kilometers away.\\n\\nPlease note that these distances are as the crow flies and do not take into account the actual driving distance due to road conditions, traffic, or other factors.\\nquery: Which city is the farthest?\\nresponse: The farthest city listed on the sign is Mata, which is 14 kilometers away.\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\nLoRA微调:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n\\n# Experimental environment: 2*A100...\\n# 2*45GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type llava1_6-yi-34b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n全参数微调:\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 70 GPU memory\\nNPROC_PER_NODE=4 CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type llava1_6-mistral-7b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --sft_type full \\\\\\n    --deepspeed default-zero2\\n\\n# 8 * 50 GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 swift sft \\\\\\n    --model_type llava1_6-yi-34b-instruct \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --sft_type full \\\\\\n```\\n\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 支持每轮对话含多张图片或不含图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"<image>55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"<image>eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"<image>EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nmodel_type=\\\"llava1_6-mistral-7b-instruct\\\"\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/${model_type}/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nmodel_type=\\\"llava1_6-mistral-7b-instruct\\\"\\n\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/${model_type}/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --merge_lora true\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/${model_type}/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# CogVLM2 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n模型链接:\\n- cogvlm2-19b-chat: [https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B/summary](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B/summary)\\n- cogvlm2-en-19b-chat: [https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chat-19B/summary](https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chat-19B/summary)\\n\\n\\n## 推理\\n\\n推理cogvlm2-19b-chat:\\n```shell\\n# Experimental environment: A100\\n# 43GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type cogvlm2-19b-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你好\\nInput a media path or URL <<<\\n你好！我是一个人工智能助手，随时准备回答你的问题。有什么我可以帮助你的吗？\\n--------------------------------------------------\\n<<< clear\\n<<< 描述这张图片\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n这是一张特写照片，展示了一只灰色和白色相间的猫。这只猫的眼睛是灰色的，鼻子是粉色的，嘴巴微微张开。它的毛发看起来柔软而蓬松，背景模糊，突出了猫的面部特征。\\n--------------------------------------------------\\n<<< clear\\n<<< 图中有几只羊\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n图中有四只羊。\\n--------------------------------------------------\\n<<< clear\\n<<< 计算结果是多少?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n计算结果是49556。\\n--------------------------------------------------\\n<<< clear\\n<<< 根据图片中的内容写首诗\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\n夜幕低垂，小船悠然，\\n在碧波荡漾的湖面上航行。\\n船头灯火，照亮前行的道路，\\n照亮了周围的黑暗。\\n\\n湖面上的涟漪，\\n仿佛是无数的精灵在跳舞。\\n它们随着船的移动而荡漾，\\n为这宁静的夜晚增添了生机。\\n\\n船上的乘客，\\n沉浸在这如诗如画的景色中。\\n他们欣赏着湖光山色，\\n感受着大自然的恩赐。\\n\\n夜色渐深，小船驶向远方，\\n但心中的美好永远留存。\\n这段旅程，\\n让他们更加珍惜生命中的每一刻。\\n--------------------------------------------------\\n<<< clear\\n<<< 对图片进行OCR\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\n图中内容是：\\n\\n简介\\n\\nSWIFT支持250+LLM和35+ MLLM(多模态大模型)的训练、推理、评测和部署。开发者可以直接将我们的框架应用到自己的Research和生产环境中，实现模型训练评测到应用的完整链路。我们除支持了PEFT提供的轻量训练方案外，也提供了一个完整的Adapters库以支持最新的训练技术，如NEFTune、LoRA+、LLaMA-PRO等，这个适配器库可以脱离训练脚本直接使用在自己的自定流程中。\\n\\n为方便不熟悉深度学习的用户使用，我们提供了一个Gradio的web-ui用于控制训练和推理，并提供了配套的深度学习课程和最佳实践供新手入门。\\n\\n此外，我们也在拓展其他模态的能力，目前我们支持了AnimateDiff的全参数训练和LoRA训练。\\n\\nSWIFT具有丰富的文档体系，如有使用问题请查看这里。\\n\\n可以在Huggingface space和ModelScope创空间中体验SWIFTweb-ui功能了。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.cogvlm2_19b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '距离各城市多远？'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\nimages = images\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\n\\\"\\\"\\\"\\nquery: 距离各城市多远？\\nresponse: 距离马踏Mata有14km，距离阳江Yangjiang有62km，距离广州Guangzhou有293km。\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是广州Guangzhou，有293km。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A100\\n# 70GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type cogvlm2-19b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 但总的轮次对话只能包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-19b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/cogvlm2-19b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-19b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# InternVL 最佳实践\\n本篇文档涉及的模型如下:\\n\\n- [internvl-chat-v1_5](https://www.modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5/summary)\\n- [internvl-chat-v1_5-int8](https://www.modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-int8/summary)\\n- [mini-internvl-chat-2b-v1_5](https://www.modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-2B-V1-5)\\n- [mini-internvl-chat-4b-v1_5](https://www.modelscope.cn/models/OpenGVLab/Mini-InternVL-Chat-4B-V1-5)\\n- [internvl2-1b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-1B)\\n- [internvl2-2b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-2B)\\n- [internvl2-4b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-4B)\\n- [internvl2-8b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-8B)\\n- [internvl2-26b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-26B)\\n- [internvl2-40b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-40B)\\n- [internvl2-llama3-76b](https://www.modelscope.cn/models/OpenGVLab/InternVL2-Llama3-76B)\\n\\n\\n以下实践以`internvl-chat-v1_5`为例，你也可以通过指定`--model_type`切换为其他模型.\\n\\n**FAQ**\\n\\n1. **模型显示 `The request model does not exist!`**\\n\\n这种情况通常发生在尝试使用mini-internvl或InternVL2模型, 原因是modelscope上相应模型是申请制。解决这个问题，你需要登录modelscope, 并前往相应的模型页面进行**申请下载**, 申请成功后可以通过以下任意一种方式获取模型：\\n- 使用`snap_download`将模型下载到本地(在模型文件中的模型下载中有相应代码), 然后使用`--model_id_or_path`指定本地模型文件路径\\n- 在[modelscope账号主页](https://www.modelscope.cn/my/myaccesstoken)获取账号的SDK token, 使用参数`--hub_token`或者环境变量`MODELSCOPE_API_TOKEN`指定\\n\\n也可以设置环境变量`USE_HF`, 从hugging face处下载模型\\n\\n2. **多卡运行模型时, 为什么不同卡的分布不均匀, 导致OOM?**\\n\\ntransformers的auto device map算法对多模态模型支持不友好, 这可能导致不同 GPU 卡之间的显存分配不均匀。\\n- 可以通过参数`--device_max_memory`设置每张卡的显存使用, 比如四卡环境, 可以设置`--device_max_memory 15GB 15GB 15GB 15GB`\\n- 或者通过`--device_map_config`显式指定device map\\n\\n3. **InternVL2模型与前系列(InternVL-V1.5和Mini-InternVL)模型的区别**\\n\\n- InternVL2模型支持多轮多图推理和训练, 即多轮对话带有图片, 且单轮中支持文字图片交错,具体参考[自定义数据集](#自定义数据集)和推理的InternVL2部分。前系列模型支持多轮对话, 但只能有单轮带有图片\\n- InternVL2模型支持视频输入, 具体格式参考[自定义数据集](#自定义数据集)\\n\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [自定义数据集](#自定义数据集)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\npip install Pillow\\n```\\n\\n## 推理\\n\\n\\n**注意**\\n- 如果要使用本地模型文件，加上参数 `--model_id_or_path /path/to/model`\\n- 如果你的GPU不支持flash attention, 使用参数`--use_flash_attn false`。且对于int8模型，推理时需要指定`dtype --bf16`, 否则可能会出现乱码\\n- 模型本身config中的max_length较小，为2048，可以设置`--max_length`来修改\\n- 可以使用参数`--gradient_checkpoting true`减少显存占用\\n\\n```shell\\n# Experimental environment: A100\\n# 55GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internvl-chat-v1_5 --dtype bf16 --max_length 4096\\n\\n# 2*30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type internvl-chat-v1_5 --dtype bf16 --max_length 4096\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```\\n\\\"\\\"\\\"\\n<<< 你是谁\\nInput a media path or URL <<<\\n我是一个人工智能助手，旨在通过自然语言处理和机器学习技术来帮助用户解决问题和完成任务。\\n--------------------------------------------------\\n<<< clear\\n<<< 描述这张图片\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n这张图片是一只小猫咪的特写照片。这只小猫咪有着蓝灰色的眼睛和白色的毛发，上面有灰色和黑色的条纹。它的耳朵是尖的，眼睛睁得大大的，看起来非常可爱和好奇。背景是模糊的，无法分辨具体的环境，但看起来像是在室内，有柔和的光线。\\n--------------------------------------------------\\n<<< clear\\n<<< 图中有几只羊\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n图中有四只羊。\\n--------------------------------------------------\\n<<< clear\\n<<< 计算结果是多少?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n将两个数相加，得到：\\n1452 + 45304 = 46766\\n因此，1452 + 45304 = 46766。\\n--------------------------------------------------\\n<<< clear\\n<<< 根据图片中的内容写首诗\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\n夜色笼罩水面，\\n小舟轻摇入画帘。\\n星辉闪烁如珠串，\\n月色朦胧似轻烟。\\n\\n树影婆娑映水面，\\n静谧宁和心自安。\\n夜深人静思无限，\\n唯有舟影伴我眠。\\n--------------------------------------------------\\n<<< clear\\n<<< 对图片进行OCR\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\n图中所有文字：\\n简介\\nSWIFT支持250＋LLM和35＋MLLM（多模态大模型）的训练、推\\n理、评测和部署。开发者可以直接将我们的框架应用到自己的Research和\\n生产环境中，实现模型训练评测到应用的完整链路。我们除支持\\nPEFT提供的轻量训练方案外，也提供了一个完整的Adapters库以支持\\n最新的训练技术，如NEFTune、LoRA+、LLaMA-PRO等，这个适配\\n器库可以脱离训练脚本直接使用在自已的自定义流程中。\\n为了方便不熟悉深度学习的用户使用，我们提供了一个Gradio的web-ui\\n于控制训练和推理，并提供了配套的深度学习课程和最佳实践供新手入\\n门。\\n此外，我们也正在拓展其他模态的能力，目前我们支持了AnimateDiff的全\\n参数训练和LoRA训练。\\nSWIFT具有丰富的文档体系，如有使用问题请查看这里：\\n可以在Huggingface space和ModelScope创空间中体验SWIFT web-\\nui功能了。\\n\\\"\\\"\\\"\\n```\\n\\n对于**InternVL2**系列模型, 支持多轮多图推理, 且单轮中支持图像文本交错, 需要在输入通过`<image>`确定图像位置\\n多轮多图示例\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internvl2-2b\\n```\\n\\n```\\n<<< <image>描述图片\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n这是一只非常可爱的幼猫。它的毛色主要是白色，脸部和耳朵上有黑色和灰色的条纹。猫的眼睛大而明亮，瞳孔是蓝色的，显得非常清澈和无辜。它的耳朵竖立着，耳朵尖端是浅色的。这只猫看起来非常活泼，眼神中透露出一种好奇和友善的气质。背景模糊，可能是为了突出这只猫本身。整体画面给人一种温馨和可爱的感觉。\\n--------------------------------------------------\\n<<< <image>描述与上一张图片的差距\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n这张图片与上一张图片相比，有以下几个显著的差距：\\n\\n1. **动物种类不同**：\\n   - 上一张图片中的动物是猫，而这张图片中的动物是羊。\\n\\n2. **动物外观和特征不同**：\\n   - 猫有明显的竖立耳朵和蓝色的眼睛，而羊有竖立的长角和白色的羊毛。\\n\\n3. **背景和环境不同**：\\n   - 上一张图片背景是模糊的，天空中有一些云朵，而这张图片背景是清晰的，背景中有绿色的山丘和蓝天白云。\\n\\n4. **动物表情和姿态不同**：\\n   - 猫的表情显得非常警觉和好奇，而羊的表情显得非常温和和友好。\\n\\n5. **整体风格和风格不同**：\\n   - 上一张图片有一种更加写实和细腻的绘画风格，而这张图片则有一种卡通和简化的风格。\\n\\n这些差异使得这张图片与上一张图片在视觉上存在显著的差异。\\n--------------------------------------------------\\n<<< 两张图片的共同点是什么\\n两张图片的共同点如下：\\n\\n1. **动物种类不同**：\\n   - 两张图片中的动物都是羊。\\n\\n2. **背景和环境不同**：\\n   - 两张图片中的背景都是自然景观，包括绿色的山丘和蓝天白云。\\n\\n3. **动物表情和姿态不同**：\\n   - 猫和羊的表情和姿态都不同，但都显得非常可爱和友好。\\n\\n4. **整体风格和风格不同**：\\n   - 两张图片在风格上有所不同，但都具有卡通和简化的特点。\\n\\n这些共同点使得两张图片在视觉上存在显著的差异，但它们都展示了可爱的动物形象。\\n--------------------------------------------------\\n<<< clear\\n<<< <video>Describe this video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\nIn the video, a young child is seen sitting on a bed, engrossed in reading a book. The child is wearing a light blue shirt and dark glasses, and appears to be very focused on the book. The bed has a floral patterned cover, and there is a white blanket spread over it. The child's legs are crossed, and they are holding the book with both hands. The book is open, and the child is reading it with great interest.\\n\\nAs the child continues to read, they occasionally glance at the camera, seemingly curious about who is watching them. The child's expression is one of concentration and enjoyment, as they seem to be fully immersed in the story. The camera captures the child's face and the book, providing a clear view of their actions.\\n\\nIn the background, there is a glimpse of a room with a white wall and a wooden door. There is also a chair visible in the background, and a small table with a lamp on it. The room appears to be a bedroom, and the child seems to be in a comfortable and cozy environment.\\n\\nThe child's actions are repetitive, as they continue to read the book with great enthusiasm. The camera captures their movements and expressions, providing a detailed view of their reading experience. The child's focus and dedication to the book are evident, and the video conveys a sense of innocence and curiosity.\\n\\nOverall, the video captures a heartwarming moment of a young child reading a book, showcasing their love for books and the joy of reading. The setting is simple and cozy, with a focus on the child's engagement with the book. The video is a delightful portrayal of childhood innocence and the simple pleasures of reading.\\n--------------------------------------------------\\n<<< clear\\n<<< image1: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img> image2: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img> What is the difference bewteen the two images?\\nThe two images are of the same kitten, but the first image is a close-up shot, while the second image is a more distant, artistic illustration. The close-up image captures the kitten in detail, showing its fur, eyes, and facial features in sharp focus. In contrast, the artistic illustration is more abstract and stylized, with a blurred background and a different color palette. The distant illustration gives the kitten a more whimsical and dreamy appearance, while the close-up image emphasizes the kitten's realism and detail.\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n# os.environ['MODELSCOPE_API_TOKEN'] = 'Your API Token' # If the message \\\"The request model does not exist!\\\" appears.\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\n\\nmodel_type = \\\"internvl-chat-v1_5\\\"\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.bfloat16,\\n                                       model_kwargs={'device_map': 'auto'})\\n\\n# for GPUs that do not support flash attention\\n# model, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n#                                        model_kwargs={'device_map': 'auto'},\\n#                                        use_flash_attn = False)\\n\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '距离各城市多远'\\nresponse, history = inference(model, template, query, images=images) # chat with image\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history) # chat without image\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: 距离各城市多远\\nresponse: 根据图片，距离各城市如下：\\n\\n- 马踏：14公里\\n- 阳江：62公里\\n- 广州：293公里\\n\\n请注意，这些距离可能不是最新的，因为道路建设和交通状况可能会影响实际距离。\\nquery: 距离最远的城市是哪？\\nresponse: 根据图片，距离最远的城市是广州，距离为293公里。\\nhistory: [['距离各城市多远', '根据图片，距离各城市如下：\\\\n\\\\n- 马踏：14公里\\\\n- 阳江：62公里\\\\n- 广州：293公里\\\\n\\\\n请注意，这些距离可能不是最新的，因为道路建设和交通状况可能会影响实际距离。 '], ['距离最远的城市是哪？', '根据图片，距离最远的城市是广州，距离为293公里。 ']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\nLoRA微调:\\n\\n**注意**\\n- 如果你的GPU不支持flash attention, 使用参数`--use_flash_attn false`\\n\\n```shell\\n# Experimental environment: A100\\n# 80GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --max_length 4096\\n\\n# device_map\\n# Experimental environment: 2*A100...\\n# 2*43GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type  internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --max_length 4096\\n\\n# ddp + deepspeed-zero2\\n# Experimental environment: 2*A100...\\n# 2*80GB GPU memory\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type  internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --max_length 4096 \\\\\\n    --deepspeed default-zero2\\n```\\n\\n全参数微调:\\n```bash\\n# Experimental environment: 4 * A100\\n# device map\\n# 4 * 72 GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type internvl-chat-v1_5 \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --max_length 4096 \\\\\\n    --sft_type full \\\\\\n```\\n\\n## 自定义数据集\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 图片支持传入本地路径或URL, 多张图片用逗号','分割)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path1\\\", \\\"image_path2\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n(支持纯文本数据)\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\"}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": []}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]]}\\n```\\n\\n**InternVL2**模型除了以上数据格式外, 还支持多图多轮训练, 使用tag `<image>` 标明图片在对话中的位置, 如果数据集中没有tag `<image>`, 默认放在最后一轮query的开头\\n```jsonl\\n{\\\"query\\\": \\\"Image-1: <image>\\\\nImage-2: <image>\\\\nDescribe the two images in detail.\\\", \\\"response\\\": \\\"xxxxxxxxx\\\", \\\"history\\\": [[\\\"<image>Describe the image\\\", \\\"xxxxxxx\\\"], [\\\"CCCCC\\\", \\\"DDDDD\\\"]], \\\"images\\\": [\\\"image_path1\\\", \\\"image_path2\\\", \\\"image_path3\\\"]}\\n```\\n或者用`<img>image_path</img>` 表示图像路径和图像位置\\n\\n```jsonl\\n{\\\"query\\\": \\\"Image-1: <img>img_path</img>\\\\n Image-2: <img>img_path2</img>\\\\n Describe the two images in detail.\\\", \\\"response\\\": \\\"xxxxxxxxx\\\", \\\"history\\\": [[\\\"<img>img_path3</img> Describe the image\\\", \\\"xxxxxxx\\\"], [\\\"CCCCC\\\", \\\"DDDDD\\\"]], }\\n```\\n\\n**InternVL2**模型支持视频数据集训练, 无需标明tag\\n```jsonl\\n{\\\"query\\\": \\\"Describe this video in detail. Don't repeat\\\", \\\"response\\\": \\\"xxxxxxxxx\\\", \\\"history\\\": [], \\\"videos\\\": [\\\"video_path\\\"]}\\n```\\n\\n**InternVL2**模型支持grounding任务的训练，数据参考下面的格式：\\n```jsonl\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359], [1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n```\\n上述objects字段中包含了一个json string，其中有四个字段：\\n    a. caption bbox对应的物体描述\\n    b. bbox 坐标 建议给四个整数（而非float型），分别是x_min,y_min,x_max,y_max四个值\\n    c. bbox_type: bbox类型 目前支持三种：real/norm_1000/norm_1，分别代表实际像素值坐标/千分位比例坐标/归一化比例坐标\\n    d. image: bbox对应的图片是第几张, 索引从0开始\\n上述格式会被转换为InternVL2可识别的格式，具体来说：\\n```jsonl\\n{\\\"query\\\": \\\"Find <ref>the man</ref>\\\", \\\"response\\\": \\\"<box> [[200, 200, 600, 600]] </box>\\\", \\\"images\\\": [\\\"image_path1\\\"]}\\n```\\n也可以直接传入上述格式，但是注意坐标请使用千分位坐标。\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n    --max_length 4096\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true \\\\\\n    --max_length 4096\\n\\n# device map\\nCUDA_VISIBLE_DEVICES=0,1 swift infer \\\\\\n    --ckpt_dir \\\"output/internvl-chat-v1_5/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --load_dataset_config true \\\\\\n    --max_length 4096\\n```\\n\\n\\n\\n# mPLUG-Owl2 最佳实践\\n以下内容以`mplug-owl2_1-chat`为例, 你也可以选择`mplug-owl2-chat`.\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n模型链接:\\n- mplug-owl2_1-chat: [https://modelscope.cn/models/iic/mPLUG-Owl2.1/summary](https://modelscope.cn/models/iic/mPLUG-Owl2.1/summary)\\n- mplug-owl2-chat: [https://modelscope.cn/models/iic/mPLUG-Owl2/summary](https://modelscope.cn/models/iic/mPLUG-Owl2/summary)\\n\\n\\n## 推理\\n\\n推理`mplug-owl2_1-chat`:\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type mplug-owl2_1-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe this image.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nThe image features a close-up of a cute, gray and white kitten with big blue eyes. The kitten is sitting on a table, looking directly at the viewer. The scene captures the kitten's adorable features, including its whiskers and the fur on its face. The kitten appears to be staring into the camera, creating a captivating and endearing atmosphere.\\n--------------------------------------------------\\n<<< How many sheep are in the picture?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\nThere are four sheep in the picture.\\n--------------------------------------------------\\n<<< What is the calculation result?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\nThe calculation result is 1452 + 45304 = 46756.\\n--------------------------------------------------\\n<<< Write a poem based on the content of the picture.\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\nIn the stillness of the night, a boat glides across the water, its light shining bright. The stars twinkle above, casting a magical glow. A man and a dog are on board, enjoying the serene journey. The boat floats gently, as if it's floating on air. The calm waters reflect the stars, creating a breathtaking scene. The man and his dog are lost in their thoughts, taking in the beauty of nature. The boat seems to be floating in a dream, as if they are on a journey to find their way back home.\\n--------------------------------------------------\\n<<< clear\\n<<< Perform OCR on the image.\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\nText: Swift support training, inference and deployment of 250+ LLMs and 350+ MLMs (multimodal models). Developers can directly apply framework their own research and production environments to realize a complete workflow from model training and evaluation to application. In addition to supporting the lightweight training models provided by PEFT, we also provide a Complete Adapters library that can be adapted to various models such as NeTune, LoRaT, LLMA-PRO, etc. This adapter library can be used directly in your own custom workflow. The library is user-friendly with unfamiliar deep learning, Gradio UI for controlling training and inference, as well as accompanying learning courses and best practices for beginners. Additionally, we provide extra training and Lora LRN for AnimateDiff. Swift has rich documents for users on Huggingface and ModelScope, so please feel free to try it!\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr_en:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr_en.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.mplug_owl2_1_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = 'How far is it from each city?'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'Which city is the farthest?'\\nimages = images * 2\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: How far is it from each city?\\nresponse: From the given information, it is 14 km from the city of Mata, 62 km from Yangjiang, and 293 km from Guangzhou.\\nquery: Which city is the farthest?\\nresponse: The farthest city is Guangzhou, which is 293 km away.\\nhistory: [['How far is it from each city?', 'From the given information, it is 14 km from the city of Mata, 62 km from Yangjiang, and 293 km from Guangzhou.'], ['Which city is the farthest?', 'The farthest city is Guangzhou, which is 293 km away.']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100...\\n# 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type mplug-owl2_1-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 每轮对话必须包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\", \\\"image_path2\\\", \\\"image_path3\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/mplug-owl2_1-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/mplug-owl2_1-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/mplug-owl2_1-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# MiniCPM-V-2.5 最佳实践\\n\\nMiniCPM-V-2.6 最佳实践: [https://github.com/modelscope/ms-swift/issues/1613](https://github.com/modelscope/ms-swift/issues/1613)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\n# 请使用\\\"ms-swift>=2.2\\\"或者main分支.\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n模型链接:\\n- minicpm-v-v2_5-chat: [https://modelscope.cn/models/OpenBMB/MiniCPM-Llama3-V-2_5/summary](https://modelscope.cn/models/OpenBMB/MiniCPM-Llama3-V-2_5/summary)\\n\\n\\n## 推理\\n\\n推理 minicpm-v-v2_5-chat:\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type minicpm-v-v2_5-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 描述这张图片\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n这张图片展示了一只年轻的猫咪的特写，可能是一只小猫，具有明显的特征。它的毛发主要是白色的，带有灰色和黑色的条纹和斑点，这是虎斑猫的典型特征。小猫的眼睛是蓝色的，瞳孔是圆形的，给人一种好奇和专注的表情。它的耳朵尖尖的，竖立着，显示出警觉性。小猫的鼻子是粉红色的，鼻孔是可见的。背景模糊不清，突出了小猫的特征。整体的色调柔和，重点放在小猫的毛发和眼睛上。\\n--------------------------------------------------\\n<<< clear\\n<<< 图中有几只羊？\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n图中有四只羊。\\n--------------------------------------------------\\n<<< clear\\n<<< 计算结果是多少\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n计算结果是1452 + 4530 = 5982。\\n--------------------------------------------------\\n<<< clear\\n<<< 根据图片中的内容写首诗\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\n在宁静的夜晚，船只航行，\\n在星光闪烁的水面上，\\n一只熊猫乘风破浪，\\n在夜空的映衬下。\\n船上灯火通明，照亮了前方的道路，\\n在宁静的水面上投下温暖的光芒，\\n熊猫坐在船头，享受着旅程，\\n在这宁静的夜晚中，享受着旅程。\\n星星在上方闪烁，点缀着天空，\\n在这宁静的夜晚中，创造出一幅美丽的画面，\\n船只在水面上轻轻摇晃，\\n在这宁静的夜晚中，创造出一幅美丽的画面。\\n--------------------------------------------------\\n<<< clear\\n<<< 对图片进行OCR\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\n标题: SWIFT支持多模态大模型的训练、推理、评测和部署\\n\\n正文:\\n开发者可以直接将我们的框架应用到自己的Research和生产环境中，实现模型训练评测到应用的完整链路。我们除支持了PEFT提供的轻量训练方案外，也提供了一个完整的Adapters库以支持最新的训练技术，如NEFTune、LoRA+、LLaMA-PRO等，这个适配器库可以脱离训练脚本直接使用在自己的自定流程中。\\n\\n为方便不熟悉深度学习的用户使用，我们提供了一个Gradio的web-ui用于控制训练和推理，并提供了配套的深度学习课程和最佳实践供新手入门。此外，我们也在拓展其他模态的能力，目前我们支持了AnimateDiff的全参数训练和LoRA训练。\\n\\nSWIFT具有丰富的文档体系，如有使用问题请请查看这里。\\n\\n可以在Huggingface space和ModelScope创空间中体验SWIFT web-ui功能了。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.minicpm_v_v2_5_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.bfloat16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '距离各城市多远？'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: 距离各城市多远？\\nresponse: 马踏到阳江的距离是62公里，阳江到广州的距离是293公里。\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是广州，到广州的距离为293公里。\\nhistory: [['距离各城市多远？', '马踏到阳江的距离是62公里，阳江到广州的距离是293公里。'], ['距离最远的城市是哪？', '距离最远的城市是广州，到广州的距离为293公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: 3090\\n# 20GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type minicpm-v-v2_5-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 但总的轮次对话只能包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-v2_5-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/minicpm-v-v2_5-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/minicpm-v-v2_5-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n\\n# Qwen-VL 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\npip install 'ms-swift[llm]' -U\\n```\\n\\n## 推理\\n\\n推理[qwen-vl-chat](https://modelscope.cn/models/qwen/Qwen-VL-Chat/summary):\\n```shell\\n# Experimental environment: 3090\\n# 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-vl-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是通义千问，由阿里云开发的AI助手。我被设计用来回答各种问题、提供信息和与用户进行对话。有什么我可以帮助你的吗？\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>这两张图片有什么区别\\n这两张图片的主要区别在于内容和主题。\\n第一张图片是一张卡通插画，画面中是一只公羊或山羊在绿色的草地上，配以群山和白云的背景，整体呈现出自然和动物的主题。\\n第二张图片也是一张卡通插画，画面中是一只小猫，有条纹的毛发和蓝色的眼睛，整体呈现出可爱和动物的主题。\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>图中有几只羊\\n图中有一家四口的羊，一共四只。\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>计算结果是多少\\n1452 + 45304 = 46756\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>根据图片中的内容写首诗\\n月光如水洒河中，孤舟一灯独自空。\\n两岸青山倒影美，星河灿烂天空宏。\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png</img>对图片进行OCR\\nSWIFT支持250+ LLM和35+ MLLM（多模态大模型）的训练、推理、评测和部署。开发者可以直接将我们的框架应用到自己的Research和生产环境中，实现模型训练评测到应用的完整链路。我们除了支持PEPT提供的轻量训练方案外，也提供了一个完整的Adapters库以支持最新的训练技术，如NEFTune、LoRA+、LLaMa-PRO等，这个适配器库可以脱离训练脚本直接使用在自己的自定流程中。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen_vl_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？\\nresponse: 马路边距离马路边14公里；阳江边距离马路边62公里；广州边距离马路边293公里。\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是广州，距离马路边293公里。\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？', '马路边距离马路边14公里；阳江边距离马路边62公里；广州边距离马路边293公里。'], ['距离最远的城市是哪？', '距离最远的城市是广州，距离马路边293公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\nLoRA微调:\\n\\n```shell\\n# Experimental environment: 3090\\n# 23GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type qwen-vl-chat \\\\\\n    --dataset coco-en-mini \\\\\\n```\\n\\n全参数微调:\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 70 GPU memory\\nNPROC_PER_NODE=2 CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type qwen-vl-chat \\\\\\n    --dataset coco-en-mini \\\\\\n    --sft_type full \\\\\\n```\\n\\n**Qwen-VL**模型支持grounding任务的训练，数据参考下面的格式：\\n```jsonl\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359],[1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# 或者使用<img></img>标签\\n{\\\"query\\\": \\\"<img>/coco2014/train2014/COCO_train2014_000000001507.jpg</img>Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n{\\\"query\\\": \\\"<img>/coco2014/train2014/COCO_train2014_000000001507.jpg</img>Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n```\\n上述objects字段中包含了一个json string，其中有四个字段：\\n    - caption bbox对应的物体描述\\n    - bbox 坐标 建议给四个整数（而非float型），分别是x_min,y_min,x_max,y_max四个值\\n    - bbox_type: bbox类型 目前支持三种：real/norm_1000/norm_1，分别代表实际像素值坐标/千分位比例坐标/归一化比例坐标\\n    - image: bbox对应的图片是第几张, 索引从0开始\\n上述格式会被转换为Qwen-VL可识别的格式，具体来说：\\n```jsonl\\n{\\\"query\\\": \\\"<img>/coco2014/train2014/COCO_train2014_000000001507.jpg</img>Find <ref>the man</ref>\\\", \\\"response\\\": \\\"<box>(200,200),(600,600)</box>\\\"}\\n```\\n也可以直接传入上述格式，但是注意坐标请使用千分位坐标。\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 支持每轮对话含多张图片或不含图片, 支持传入本地路径或URL)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# LmDeploy推理加速与部署\\nlmdeploy github: [https://github.com/InternLM/lmdeploy](https://github.com/InternLM/lmdeploy).\\n\\n支持lmdeploy推理加速的多模态模型可以查看[支持的模型](../Instruction/支持的模型和数据集.md#多模态大模型).\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理加速](#推理加速)\\n- [部署](#部署)\\n\\n## 环境准备\\nGPU设备: A10, 3090, V100, A100均可.\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# lmdeploy与cuda版本有对应关系，请按照`https://github.com/InternLM/lmdeploy#installation`进行安装\\npip install lmdeploy\\n```\\n\\n## 推理加速\\n\\n### 使用python\\n\\n[OpenGVLab/InternVL2-2B](https://modelscope.cn/models/OpenGVLab/InternVL2-2B/summary)\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\n# from swift.hub import HubApi\\n# _api = HubApi()\\n# _api.login('<your-sdk-token>')  # https://modelscope.cn/my/myaccesstoken\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\nmodel_type = ModelType.internvl2_2b\\nmodel_id_or_path = None\\nlmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\nlmdeploy_engine.generation_config.max_new_tokens = 256\\ngeneration_info = {}\\n\\nrequest_list = [{'query': '<image>描述图片', 'images': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']},\\n                {'query': '你是谁？'},\\n                {'query': (\\n                    '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>'\\n                    '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>'\\n                    'What is the difference bewteen the two images?'\\n                )}]\\nresp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\nprint(generation_info)\\n\\n# stream\\nrequest_list = [{'query': '<video>描述视频', 'videos': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']}]\\ngen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nquery = request_list[0]['query']\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(generation_info)\\n\\n\\\"\\\"\\\"\\nquery: <image>描述图片\\nresponse: 这张图片展示了四只卡通风格的羊，它们并排排列在一片绿色的草地上。草地上似乎还有轻微的阴影，显示了光源从左上方照射下来的效果。\\n\\n从左到右，第一只羊头上顶着一团厚厚的羊毛，第二只羊稍微有点低，眼睛大大的，看起来非常友善；第三只羊和第四只羊头高且耳朵竖起，它们看起来似乎更威严和独立。\\n\\n背景是一片绿色、蓝色的天空中有着一些白色的云朵，远处的山峦线条明显，使得整个画面充满自然的美感。\\n\\n总体来说，这幅画作表达了一种和谐、宁静的自然氛围，四只羊的形象也很生动可爱，似乎传递出一种温柔、质朴的感觉。\\nquery: 你是谁？\\nresponse: 我是InternVL，是由上海人工智能实验室的通用视觉团队（OpenGVLab）和商汤科技联合开发的模型。\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>What is the difference bewteen the two images?\\nresponse: I'm unable to identify or compare images. However, if this image were to be classified based on its design or layout, it might demonstrate:\\n\\n- A change in the display order or arrangement of elements within the image.\\n- An evolution in artistic style or technique.\\n- Different elements added or cut out to create a variation.\\n\\nI'd need more specific details to make an accurate comparison.\\n{'num_prompt_tokens': 8095, 'num_generated_tokens': 253, 'num_samples': 3, 'runtime': 4.090330162958708, 'samples/s': 0.7334371262172084, 'tokens/s': 61.8531976443179}\\nquery: <video>描述视频\\nresponse: 这个视频展示了一个小女孩在房间里读书的场景。镜头从一个特定的角度捕捉到小女孩专注于书本的情况。这个小女孩是金发，她穿着蓝色的无袖上衣，还戴着一副黑色的眼镜。小女孩的注意力集中在手中的一个白色封皮的书上，她轻轻翻开书页，显示出对书的兴趣和热爱。她的手偶尔会抚摸和翻看书页，表现出一种探索和专注的态度。\\n\\n背景中可以看到一个木制的婴儿床，房间的地面铺满了温馨的米色毯子。房间的装饰温暖而家庭化，有一个带灯的台灯在床边，旁边似乎还放了一些玩具。\\n\\n视频中，小女孩的右侧，她的左手上可以看到另一本书。这本书已经翻开到一页，她将目光转向这本书，用手指轻轻触碰到书本。她的身体稍微向前倾，显示出一种沉浸在阅读中的状态。\\n\\n整个视频的色调温暖而柔和，背景中的物品和她的穿着形成了和谐的家庭氛围，给人一种舒适和温馨的感觉。小女孩的举止显得非常自然和放松，书页的翻动似乎也传递了她对这个故事的着迷。她用双手轻轻翻动书页的动作显得非常可爱和童真。\\n\\n总之，这个视频完美捕捉到一个小女孩在家庭环境中享受阅读乐趣的瞬间\\n{'num_prompt_tokens': 6247, 'num_generated_tokens': 257, 'num_samples': 1, 'runtime': 3.0897628950187936, 'samples/s': 0.32364943006214636, 'tokens/s': 83.17790352597162}\\n\\\"\\\"\\\"\\n```\\n\\n[Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b)\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\n# ModelType.qwen_vl_chat, ModelType.deepseek_vl_1_3b_chat, ModelType.minicpm_v_v2_5_chat\\nmodel_type = ModelType.internlm_xcomposer2_5_7b_chat\\nmodel_id_or_path = None\\nlmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n# 与`transformers.GenerationConfig`类似的接口\\nlmdeploy_engine.generation_config.max_new_tokens = 256\\ngeneration_info = {}\\n\\nrequest_list = [{'query': '<image>描述图片', 'images': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']},\\n               ]\\nresp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\nprint(generation_info)\\n\\n# stream\\nhistory0 = resp_list[0]['history']\\nrequest_list = [{'query': '有几只羊', 'history': history0, 'images': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']}]\\ngen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nquery = request_list[0]['query']\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\nhistory = resp_list[0]['history']\\nprint(f'history: {history}')\\nprint(generation_info)\\n\\\"\\\"\\\"\\nquery: <image>描述图片\\nresponse: 在图片中，有四只卡通风格的羊站在一片翠绿的草地中间。这些羊以简洁而不失真挚的形象出现，它们的躯干由白色和棕色的形状组成，而四肢则是纯粹的黑色。头部设计简洁，白色与棕色的搭配与整体协调一致。图中有四只羊，最突出的是一只最大的羊，它似乎处于图片中央，可能是画面的焦点。另外三只羊环绕在它的周围，形成一种对称感。这些羊们没有穿上任何衣物，它们在阳光下显得格外耀眼。天空是明亮的蓝色，背景中的山峰柔和地与天空相接，形成了一种宁静的田园景象。\\n{'num_prompt_tokens': 2206, 'num_generated_tokens': 132, 'num_samples': 1, 'runtime': 2.793646134901792, 'samples/s': 0.3579551423878365, 'tokens/s': 47.25007879519442}\\nquery: 有几只羊\\nresponse: 图片中一共有四只羊。\\nhistory: [['<image>描述图片', '在图片中，有四只卡通风格的羊站在一片翠绿的草地中间。这些羊以简洁而不失真挚的形象出现，它们的躯干由白色和棕色的形状组成，而四肢则是纯粹的黑色。头部设计简洁，白色与棕色的搭配与整体协调一致。图中有四只羊，最突出的是一只最大的羊，它似乎处于图片中央，可能是画面的焦点。另外三只羊环绕在它的周围，形成一种对称感。这些羊们没有穿上任何衣物，它们在阳光下显得格外耀眼。天空是明亮的蓝色，背景中的山峰柔和地与天空相接，形成了一种宁静的田园景象。'], ['有几只羊', '图片中一共有四只羊。']]\\n{'num_prompt_tokens': 2352, 'num_generated_tokens': 6, 'num_samples': 1, 'runtime': 0.635085433954373, 'samples/s': 1.5745913014781, 'tokens/s': 9.447547808868599}\\n\\\"\\\"\\\"\\n```\\n\\n**TP:**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0,1'\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\nif __name__ == '__main__':\\n    model_type = ModelType.glm4v_9b_chat\\n    model_id_or_path = None\\n    lmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path, tp=2)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    lmdeploy_engine.generation_config.max_new_tokens = 256\\n    generation_info = {}\\n\\n    request_list = [{'query': '<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>描述图片'},\\n                    {'query': '<image>描述图片', 'images': ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']},\\n                    {'query': '你是谁？'}]\\n    resp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history0 = resp_list[0]['history']\\n    request_list = [{'query': '有几只羊', 'history': history0}]\\n    gen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>描述图片\\nresponse: 这张图片展示了一群羊站在草地上。具体来说，图片中共有四只羊，它们的身体都是白色的，头部也是白色的，但是它们的耳朵颜色和脸部的细节各不相同。从左到右，第一只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的；第二只羊的耳朵也是棕色的，脸部是白色的，鼻子是粉色的；第三只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的；第四只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的。四只羊站在绿色的草地上，草地呈现出不同的绿色阴影，显示出草地的起伏。在图片的背景中，可以看到蓝色的天空和几朵白云，以及连绵起伏的山脉。\\nquery: <image>描述图片\\nresponse: 这张图片展示了一群羊站在草地上。具体来说，图片中共有四只羊，它们的身体都是白色的，头部也是白色的，但是它们的耳朵颜色和脸部的细节各不相同。从左到右，第一只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的；第二只羊的耳朵也是棕色的，脸部是白色的，鼻子是粉色的；第三只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的；第四只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的。四只羊站在绿色的草地上，草地呈现出不同的绿色阴影，显示出草地的起伏。在图片的背景中，可以看到蓝色的天空和几朵白云，以及连绵起伏的山脉。\\nquery: 你是谁？\\nresponse: 我是人工智能助手智谱清言（ChatGLM），是基于智谱 AI 公司于 2023 年训练的语言模型开发的。我的任务是针对用户的问题和要求提供适当的答复和支持。\\n{'num_prompt_tokens': 3226, 'num_generated_tokens': 352, 'num_samples': 3, 'runtime': 9.829129087971523, 'samples/s': 0.3052152406535462, 'tokens/s': 35.81192157001609}\\nquery: 有几只羊\\nresponse: 图中共有四只羊。\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>描述图片', '这张图片展示了一群羊站在草地上。具体来说，图片中共有四只羊，它们的身体都是白色的，头部也是白色的，但是它们的耳朵颜色和脸部的细节各不相同。从左到右，第一只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的；第二只羊的耳朵也是棕色的，脸部是白色的，鼻子是粉色的；第三只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的；第四只羊的耳朵是棕色的，脸部是白色的，鼻子是粉色的。四只羊站在绿色的草地上，草地呈现出不同的绿色阴影，显示出草地的起伏。在图片的背景中，可以看到蓝色的天空和几朵白云，以及连绵起伏的山脉。'], ['有几只羊', '图中共有四只羊。']]\\n{'num_prompt_tokens': 1772, 'num_generated_tokens': 7, 'num_samples': 1, 'runtime': 1.6001809199806303, 'samples/s': 0.6249293361228834, 'tokens/s': 4.374505352860184}\\n\\\"\\\"\\\"\\n```\\n\\n\\n### 使用CLI\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type deepseek-vl-1_3b-chat --infer_backend lmdeploy\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internvl2-2b --infer_backend lmdeploy\\n\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen-vl-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type internlm-xcomposer2_5-7b-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n```\\n\\n## 部署\\n\\n**服务端:**\\n\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type deepseek-vl-1_3b-chat --infer_backend lmdeploy\\n\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type internvl2-2b --infer_backend lmdeploy\\n\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen-vl-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type internlm-xcomposer2_5-7b-chat \\\\\\n    --infer_backend lmdeploy --tp 2\\n```\\n\\n**客户端:**\\n\\n这里介绍对internvl2-2b进行客户端调用的展示:\\n\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('baby.mp4', 'rb') as f:\\n#     vid_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# video_url = f'data:video/mp4;base64,{vid_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# video_url = convert_to_base64(images=['baby.mp4'])['images'][0]\\n# video_url = f'data:video/mp4;base64,{video_url}'\\n\\n# use url\\nvideo_url = 'https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4'\\n\\nquery = '描述这段视频'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'video_url', 'video_url': {'url': video_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '图中有几只羊'\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: internvl2-2b\\nquery: 描述这段视频\\nresponse: 这段视频展示了一个小女孩坐在床上，专注地阅读一本书。她戴着一副黑框眼镜，穿着浅绿色的无袖上衣，头发梳成马尾辫。视频中，小女孩的注意力完全集中在书本上，她用双手捧着书，时而翻页，时而抬头看向镜头。\\n\\n背景中可以看到一个木制的婴儿床，床上铺着花纹的床单，旁边还有一些衣物和玩具。房间的墙壁上挂着一些装饰品，显得温馨而舒适。\\n\\n视频中，小女孩的动作非常自然，她时而翻页，时而用手指轻轻拨动书页，显得非常专注和投入。她的表情平静而专注，似乎完全沉浸在书中的内容中。\\n\\n整个视频给人一种温馨、宁静的感觉，小女孩的专注和认真让人感到非常温暖。视频中的每一个细节都展示了小女孩的纯真和好奇心，让人不禁想要和她一起探索书中的世界。\\nquery: 图中有几只羊\\nresponse: 图中有四只羊。\\n\\\"\\\"\\\"\\n```\\n\\n更多客户端调用方式可以查看: [MLLM部署文档](MLLM部署文档.md).\\n\\n\\n# MLLM部署文档\\n对MLLM进行推理加速和部署可以查看[lmdeploy推理加速文档](LmDeploy推理加速文档.md)和[vLLM推理加速文档](vLLM推理加速文档.md).\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [qwen-vl-chat](#qwen-vl-chat)\\n- [yi-vl-6b-chat](#yi-vl-6b-chat)\\n- [minicpm-v-v2_5-chat](#minicpm-v-v2_5-chat)\\n- [语音与视频模态](#语音与视频模态)\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n以下我们给出了若干模型的例子（选择了尺寸较小的模型来方便实验），相信聪明的你可以从中找到部署与调用的规律，我就不多介绍啦。\\n\\n## qwen-vl-chat\\n\\n**服务端:**\\n```bash\\n# 使用原始模型\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen-vl-chat\\n\\n# 使用微调后的LoRA\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx\\n\\n# 使用微调后Merge LoRA的模型\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/qwen-vl-chat/vx-xxx/checkpoint-xxx-merged\\n```\\n\\n**客户端:**\\n\\n测试:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen-vl-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"<img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg</img>图中是什么花，有几只？\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\n使用swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('rose.jpg', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# query = f'<img>{img_base64}</img>图中是什么花，有几只？'\\n\\n# use local_path\\n# query = '<img>rose.jpg</img>图中是什么花，有几只？'\\n\\n# use url\\nquery = '<img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg</img>图中是什么花，有几只？'\\n\\nrequest_config = XRequestConfig(seed=42)\\nresp = inference_client(model_type, query, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = '框出图中的花'\\nrequest_config = XRequestConfig(stream=True, seed=42)\\nstream_resp = inference_client(model_type, query, history, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen-vl-chat\\nquery: <img>rose.jpg</img>图中是什么花，有几只？\\nresponse: 图中是三朵红玫瑰花。\\nquery: 框出图中的花\\nresponse: <ref>花</ref><box>(34,449),(368,981)</box><box>(342,456),(670,917)</box><box>(585,508),(859,977)</box>\\n\\\"\\\"\\\"\\n```\\n\\n使用openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('rose.jpg', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['rose.jpg'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg'\\n\\nquery = '图中是什么花，有几只？'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = '框出图中的花'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-vl-chat\\nquery: <img>https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/rose.jpg</img>图中是什么花，有几只？\\nresponse: 图中是三朵红玫瑰花。\\nquery: 框出图中的花\\nresponse: <ref>花</ref><box>(34,449),(368,981)</box><box>(342,456),(670,917)</box><box>(585,508),(859,977)</box>\\n\\\"\\\"\\\"\\n```\\n\\n## yi-vl-6b-chat\\n\\n**服务端:**\\n```bash\\n# 使用原始模型\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type yi-vl-6b-chat\\n\\n# 使用微调后的LoRA\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx\\n\\n# 使用微调后Merge LoRA的模型\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/yi-vl-6b-chat/vx-xxx/checkpoint-xxx-merged\\n```\\n\\n**客户端:**\\n\\n测试:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"yi-vl-6b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"描述这张图片\\\"}],\\n\\\"temperature\\\": 0,\\n\\\"images\\\": [\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\"]\\n}'\\n```\\n\\n使用swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# images = [img_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# images = ['cat.png']\\n# images = convert_to_base64(images=images)['images']\\n\\n# use url\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\n\\nquery = '<image>描述这张图片'\\nrequest_config = XRequestConfig(temperature=0)\\nresp = inference_client(model_type, query, images=images, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = '<image>图中有几只羊'\\nimages.append('http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png')\\nrequest_config = XRequestConfig(stream=True, temperature=0)\\nstream_resp = inference_client(model_type, query, history, images=images, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: yi-vl-6b-chat\\nquery: <image>描述这张图片\\nresponse: 图片显示一只小猫坐在地板上,眼睛睁开,凝视着摄像机。小猫看起来很可爱,有灰色和白色的毛皮,以及蓝色的眼睛。小猫似乎正在看摄像机,可能被吸引到它正在拍摄它的照片或视频。\\nquery: <image>图中有几只羊\\nresponse: 图中有四只羊.\\n\\\"\\\"\\\"\\n```\\n\\n使用openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['cat.png'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png'\\n\\nquery = '描述这张图片'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = '图中有几只羊'\\nmessages.append({'role': 'user', 'content': [\\n    {'type': 'image_url', 'image_url': {'url': 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'}},\\n    {'type': 'text', 'text': query},\\n]})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\\"\\\"\\\"\\nmodel_type: yi-vl-6b-chat\\nquery: 描述这张图片\\nresponse: 图片显示一只小猫坐在地板上,眼睛睁开,凝视着摄像机。小猫看起来很可爱,有灰色和白色的毛皮,以及蓝色的眼睛。小猫似乎正在看摄像机,可能被吸引到它正在拍摄它的照片或视频。\\nquery: 图中有几只羊\\nresponse: 图中有四只羊.\\n\\\"\\\"\\\"\\n```\\n\\n## minicpm-v-v2_5-chat\\n\\n**服务端:**\\n```bash\\n# 使用原始模型\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type minicpm-v-v2_5-chat\\n\\n# 使用微调后的LoRA\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/minicpm-v-v2_5-chat/vx-xxx/checkpoint-xxx\\n\\n# 使用微调后Merge LoRA的模型\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/minicpm-v-v2_5-chat/vx-xxx/checkpoint-xxx-merged\\n```\\n\\n**客户端:**\\n\\n测试:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"minicpm-v-v2_5-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"描述这张图片\\\"}],\\n\\\"temperature\\\": 0,\\n\\\"images\\\": [\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\"]\\n}'\\n```\\n\\n使用swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# images = [img_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# images = ['cat.png']\\n# images = convert_to_base64(images=images)['images']\\n\\n# use url\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png']\\n\\nquery = '<image>描述这张图片'\\nrequest_config = XRequestConfig(temperature=0)\\nresp = inference_client(model_type, query, images=images, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = '这张图是如何产生的？'\\nrequest_config = XRequestConfig(stream=True, temperature=0)\\nstream_resp = inference_client(model_type, query, history, images=images, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: minicpm-v-v2_5-chat\\nquery: <image>描述这张图片\\nresponse: 这张图片展示了一只年轻的猫咪的特写，可能是一只小猫，具有明显的特征。它的毛皮主要是白色的，带有灰色和黑色的条纹，尤其是在脸部周围。小猫的眼睛很大，呈蓝色，给人一种好奇和迷人的表情。耳朵尖尖，竖立着，显示出警觉性。背景模糊不清，突出了小猫作为图片的主题。整体的色调柔和，猫咪的毛皮与背景的柔和色调形成对比。\\nquery: 这张图是如何产生的？\\nresponse: 这张图片看起来是用数字绘画技术创作的。艺术家使用数字绘图工具来模仿毛皮的纹理和颜色，眼睛的反射，以及整体的柔和感。这种技术使艺术家能够精确地控制细节和色彩，创造出逼真的猫咪形象。\\n\\\"\\\"\\\"\\n```\\n\\n使用openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('cat.png', 'rb') as f:\\n#     img_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# image_url = f'data:image/jpeg;base64,{img_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# image_url = convert_to_base64(images=['cat.png'])['images'][0]\\n# image_url = f'data:image/jpeg;base64,{image_url}'\\n\\n# use url\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png'\\n\\nquery = '描述这张图片'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = '这张图是如何产生的？'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: minicpm-v-v2_5-chat\\nquery: 描述这张图片\\nresponse: 这张图片展示了一只年轻的猫咪的特写，可能是一只小猫，具有明显的特征。它的毛皮主要是白色的，带有灰色和黑色的条纹，尤其是在脸部周围。小猫的眼睛很大，呈蓝色，给人一种好奇和迷人的表情。耳朵尖尖，竖立着，显示出警觉性。背景模糊不清，突出了小猫作为图片的主题。整体的色调柔和，猫咪的毛皮与背景的柔和色调形成对比。\\nquery: 这张图是如何产生的？\\nresponse: 这张图片看起来是用数字绘画技术创作的。艺术家使用数字绘图工具来模仿毛皮的纹理和颜色，眼睛的反射，以及整体的柔和感。这种技术使艺术家能够精确地控制细节和色彩，创造出逼真的猫咪形象。\\n\\\"\\\"\\\"\\n```\\n\\n## 语音与视频模态\\n\\n### qwen2-audio-7b-instruct\\n\\n**服务端:**\\n```bash\\n# pip install transformers>=4.45\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-audio-7b-instruct\\n# ...\\n```\\n\\n**客户端:**\\n\\n\\n使用swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('weather.wav', 'rb') as f:\\n#     aud_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# audios = [aud_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# audios = ['weather.wav']\\n# audios = convert_to_base64(images=audios)['images']\\n\\n# use url\\naudios = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav']\\n\\nquery = '<audio>这段语音说了什么'\\nrequest_config = XRequestConfig(temperature=0)\\nresp = inference_client(model_type, query, audios=audios, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = '这段语音是男生还是女生'\\nrequest_config = XRequestConfig(stream=True, temperature=0)\\nstream_resp = inference_client(model_type, query, history, audios=audios, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen2-audio-7b-instruct\\nquery: <audio>这段语音说了什么\\nresponse: 这段语音说的是:'今天天气真好呀'\\nquery: 这段语音是男生还是女生\\nresponse: 男声。\\n\\\"\\\"\\\"\\n```\\n\\n使用openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('weather.wav', 'rb') as f:\\n#     aud_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# audio_url = f'data:audio/wav;base64,{aud_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# audio_url = convert_to_base64(images=['weather.wav'])['images'][0]\\n# audio_url = f'data:audio/wav;base64,{audio_url}'\\n\\n# use url\\naudio_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/weather.wav'\\n\\nquery = '这段语音说了什么'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'audio_url', 'audio_url': {'url': audio_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = '这段语音是男生还是女生'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen2-audio-7b-instruct\\nquery: 这段语音说了什么\\nresponse: 这段语音说的是:'今天天气真好呀'\\nquery: 这段语音是男生还是女生\\nresponse: 男声。\\n\\\"\\\"\\\"\\n```\\n\\n### internvl2-2b\\n\\n**服务端:**\\n```bash\\n# or 'minicpm-v-v2_6-chat'\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type internvl2-2b\\n# ...\\n```\\n\\n**客户端:**\\n\\n\\n使用swift:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('baby.mp4', 'rb') as f:\\n#     vid_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# videos = [vid_base64]\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# videos = ['baby.mp4']\\n# videos = convert_to_base64(images=videos)['images']\\n\\n# use url\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']\\n\\nquery = '<video>描述这段视频'\\nrequest_config = XRequestConfig(temperature=0)\\nresp = inference_client(model_type, query, videos=videos, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\nquery = '<image>图中有几只羊'\\nrequest_config = XRequestConfig(stream=True, temperature=0)\\nstream_resp = inference_client(model_type, query, images=images, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\\"\\\"\\\"\\nmodel_type: internvl2-2b\\nquery: <video>描述这段视频\\nresponse:  这段视频展示了一个小女孩坐在床上，专注地阅读一本书。她戴着一副黑框眼镜，穿着浅绿色的无袖上衣，坐在一张铺有花纹床单的床上。她的动作非常专注，时而翻页，时而用手指轻轻拨动书页，似乎在享受阅读的乐趣。\\n\\n视频中，小女孩的身边放着一个白色的枕头，床的旁边可以看到一些衣物和杂物，包括一条白色的毛巾和几件衣物。背景中隐约可以看到一个木制的婴儿床，以及一些家居装饰，如墙上的画框和墙上的装饰品。\\n\\n整个场景显得温馨而舒适，小女孩的专注和认真阅读的样子，让人感受到一种宁静和专注的氛围。视频通过展示小女孩的阅读过程，传递出一种热爱阅读和享受阅读的美好情感。\\nquery: <image>图中有几只羊\\nresponse: 图中有四只羊。\\n\\\"\\\"\\\"\\n```\\n\\n使用openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\n# use base64\\n# import base64\\n# with open('baby.mp4', 'rb') as f:\\n#     vid_base64 = base64.b64encode(f.read()).decode('utf-8')\\n# video_url = f'data:video/mp4;base64,{vid_base64}'\\n\\n# use local_path\\n# from swift.llm import convert_to_base64\\n# video_url = convert_to_base64(images=['baby.mp4'])['images'][0]\\n# video_url = f'data:video/mp4;base64,{video_url}'\\n\\n# use url\\nvideo_url = 'https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4'\\n\\nquery = '描述这段视频'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'video_url', 'video_url': {'url': video_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    temperature=0)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '图中有几只羊'\\nimage_url = 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png'\\nmessages = [{\\n    'role': 'user',\\n    'content': [\\n        {'type': 'image_url', 'image_url': {'url': image_url}},\\n        {'type': 'text', 'text': query},\\n    ]\\n}]\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    temperature=0)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"\\nmodel_type: internvl2-2b\\nquery: 描述这段视频\\nresponse:  这段视频展示了一个小女孩坐在床上，专注地阅读一本书。她戴着一副黑框眼镜，穿着浅绿色的无袖上衣，坐在一张铺有花纹床单的床上。她的动作非常专注，时而翻页，时而用手指轻轻拨动书页，似乎在享受阅读的乐趣。\\n\\n视频中，小女孩的身边放着一个白色的枕头，床的旁边可以看到一些衣物和杂物，包括一条白色的毛巾和几件衣物。背景中隐约可以看到一个木制的婴儿床，以及一些家居装饰，如墙上的画框和墙上的装饰品。\\n\\n整个场景显得温馨而舒适，小女孩的专注和认真阅读的样子，让人感受到一种宁静和专注的氛围。视频通过展示小女孩的阅读过程，传递出一种热爱阅读和享受阅读的美好情感。\\nquery: 图中有几只羊\\nresponse: 图中有四只羊。\\n\\\"\\\"\\\"\\n```\\n\\n\\n\\n# Internlm-Xcomposer2 & Internlm-Xcomposer2.5 最佳实践\\n\\n本篇文档涉及的模型如下:\\n\\n- [internlm-xcomposer2-7b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2-7b/summary)\\n- [internlm-xcomposer2_5-7b-chat](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b/summary)\\n\\n以下实践以`internlm-xcomposer2-7b-chat`为例，你也可以通过指定`--model_type`切换为其他模型.\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 推理\\n\\n推理internlm-xcomposer2-7b-chat:\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type internlm-xcomposer2-7b-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是浦语·灵笔，一个由上海人工智能实验室开发的语言模型。我能理解并流畅地使用英语和中文与你对话。\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img><img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png</img>这两张图片有什么区别\\n这两张图片没有直接的关联，它们分别展示了两个不同的场景。第一幅图是一张卡通画，描绘了一群羊在草地上，背景是蓝天和山脉。第二幅图则是一张猫的照片，猫正看着镜头，背景模糊不清。\\n--------------------------------------------------\\n<<< clear\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png</img>图中有几只羊\\n图中有4只羊\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png</img>计算结果是多少\\n1452 + 45304 = 46756\\n--------------------------------------------------\\n<<< <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png</img>根据图片中的内容写首诗\\n夜色苍茫月影斜，\\n湖面平静如明镜。\\n小舟轻荡波光里，\\n灯火微摇映水乡。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.internlm_xcomposer2_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？\\nresponse: 马鞍山距离阳江62公里，广州距离广州293公里。\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是广州，距离广州293公里。\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？', '马鞍山距离阳江62公里，广州距离广州293公里。'], ['距离最远的城市是哪？', '距离最远的城市是广州，距离广州293公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A10, 3090, V100, ...\\n# 21GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type internlm-xcomposer2-7b-chat \\\\\\n    --dataset coco-en-mini \\\\\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 支持每轮对话含多张图片或不含图片, 支持传入本地路径或URL. 该模型不支持merge-lora)\\n\\n```json\\n[\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>11111\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img><img>img_path2</img><img>img_path3</img>aaaaa\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"<img>img_path</img>ccccc\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}\\n    ]},\\n    {\\\"conversations\\\": [\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"},\\n        {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"CCCCC\\\"},\\n        {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}\\n    ]}\\n]\\n```\\n\\n\\n## 微调后推理\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/internlm-xcomposer2-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n\\n\\n# Qwen2-VL 最佳实践\\nqwen2-vl-72b-instruct的最佳实践可以查看[这里](https://github.com/modelscope/ms-swift/issues/2064).\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/ms-swift.git\\ncd ms-swift\\npip install -e .[llm]\\n\\npip install git+https://github.com/huggingface/transformers.git\\npip install pyav qwen_vl_utils\\n```\\n\\n模型：（支持base/instruct/gptq-int4/gptq-int8/awq微调）\\n- qwen2-vl-2b-instruct: [https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct)\\n- qwen2-vl-7b-instruct: [https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct)\\n- qwen2-vl-72b-instruct: [https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct](https://modelscope.cn/models/qwen/Qwen2-VL-72B-Instruct)\\n\\n\\n## 推理\\n\\n推理qwen2-vl-7b-instruct:\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-vl-7b-instruct\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是来自阿里云的大规模语言模型，我叫通义千问。\\n--------------------------------------------------\\n<<< <image><image>这两张图片有什么区别\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n[INFO:swift] Setting size_factor: 28. You can adjust this hyperparameter through the environment variable: `SIZE_FACTOR`.\\n[INFO:swift] Setting resized_height: None. You can adjust this hyperparameter through the environment variable: `RESIZED_HEIGHT`.\\n[INFO:swift] Setting resized_width: None. You can adjust this hyperparameter through the environment variable: `RESIZED_WIDTH`.\\n[INFO:swift] Setting min_pixels: 3136. You can adjust this hyperparameter through the environment variable: `MIN_PIXELS`.\\n[INFO:swift] Setting max_pixels: 12845056. You can adjust this hyperparameter through the environment variable: `MAX_PIXELS`.\\n这两张图片的内容确实不同。第一张图片是一只小猫的特写，它有着大大的眼睛和柔软的毛发，显得非常可爱。第二张图片是一群羊的卡通插画，背景是绿色的草地和山脉，显得非常温馨和自然。\\n--------------------------------------------------\\n<<< <image>图中有几只羊\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n图中有四只羊。\\n--------------------------------------------------\\n<<< <image>计算结果是多少\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n1452 + 45304 = 46756\\n--------------------------------------------------\\n<<< <image>对图片进行OCR\\nInput an image path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\n图片中的文字内容如下：\\n\\n简介\\n\\nSWIFT支持250+ LLM和35+ MLLM（多模态大模型）的训练、推理、\\n评测和部署。开发者可以直接将我们的框架应用到自己的Research和\\n生产环境中，实现模型训练评测到应用的完整链路。我们除支持了\\nPEFT提供的轻量训练方案外，也提供了一个完整的Adapters库以支持\\n最新的训练技术，如NEFTune、LoRA+、LLaMA-PRO等，这个适配器\\n库可以脱离训练脚本直接使用在自己的自定流程中。\\n\\n为方便不熟悉深度学习的用户使用，我们提供了一个Gradio的web-ui用\\n于控制训练和推理，并提供了配套的深度学习课程和最佳实践供新手入\\n门。\\n\\n此外，我们也在拓展其他模态的能力，目前我们支持了AnimateDiff的\\n全参数训练和LoRA训练。\\n\\nSWIFT具有丰富的文档体系，如有使用问题请查看这里.\\n\\n可以在Huggingface space 和 ModelScope创空间 中体验SWIFT web-ui功能了。\\n--------------------------------------------------\\n<<< clear\\n<<< <video>描述视频\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\n[INFO:swift] Setting nframes: None. You can adjust this hyperparameter through the environment variable: `NFRAMES`.\\n[INFO:swift] Setting fps: None. You can adjust this hyperparameter through the environment variable: `FPS`.\\n[INFO:swift] Setting size_factor: 2. You can adjust this hyperparameter through the environment variable: `SIZE_FACTOR`.\\n[INFO:swift] Setting min_frames: 4. You can adjust this hyperparameter through the environment variable: `MIN_FRAMES`.\\n[INFO:swift] Setting max_frames: 768. You can adjust this hyperparameter through the environment variable: `MAX_FRAMES`.\\n[INFO:swift] Setting min_pixels: 100352. You can adjust this hyperparameter through the environment variable: `MIN_PIXELS`.\\n[INFO:swift] Setting total_pixels: 19267584. You can adjust this hyperparameter through the environment variable: `TOTAL_PIXELS`.\\n[INFO:swift] Setting max_pixels: None. You can adjust this hyperparameter through the environment variable: `MAX_PIXELS`.\\n视频中展示了一个小孩在玩书。小孩穿着浅蓝色的背心和粉色的裤子，戴着一副黑色的眼镜，坐在床上，手里拿着一本打开的书。小孩先是用右手翻动书页，然后用左手扶着书，右手继续翻动书页。小孩的头发是浅色的，耳朵上戴着一个耳环。背景中可以看到一些衣物和家具。\\n\\\"\\\"\\\"\\n```\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen2_vl_7b_instruct\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.bfloat16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nquery = \\\"\\\"\\\"<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？\\\"\\\"\\\"\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"\\ntemplate_type: qwen2-vl\\nquery: <img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？\\nresponse: 根据图片中的路标，距离各城市的距离如下：\\n\\n- 马踏：14公里\\n- 阳江：62公里\\n- 广州：293公里\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是广州，距离为293公里。\\nhistory: [['<img>http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png</img>距离各城市多远？', '根据图片中的路标，距离各城市的距离如下：\\\\n\\\\n- 马踏：14公里\\\\n- 阳江：62公里\\\\n- 广州：293公里'], ['距离最远的城市是哪？', '距离最远的城市是广州，距离为293公里。']]\\n\\\"\\\"\\\"\\n```\\n\\n\\n## 微调\\n\\n### 图像OCR微调\\n我们使用 latex-ocr-print 数据集进行微调，该数据集的任务是进行Latex OCR。您可以在 modelscope 上找到该数据集: [https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR](https://modelscope.cn/datasets/AI-ModelScope/LaTeX_OCR)\\n\\n```bash\\n# 单卡A10/3090可运行\\n# GPU Memory: 20GB\\nSIZE_FACTOR=8 MAX_PIXELS=602112 CUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset latex-ocr-print#20000\\n\\n# 全参数训练并freeze vit\\n# GPU Memory: 4 * 60GB\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type full \\\\\\n  --freeze_vit true \\\\\\n  --deepspeed default-zero2 \\\\\\n  --dataset latex-ocr-print#20000\\n\\n# 更少的显存消耗: QLoRA\\n# GPU Memory: 10GB\\nSIZE_FACTOR=8 MAX_PIXELS=602112 CUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct-gptq-int4 \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct-GPTQ-Int4 \\\\\\n  --sft_type lora \\\\\\n  --dataset latex-ocr-print#20000\\n```\\n\\n微调后模型对验证集进行推理的示例（只训练了200个step）：\\n\\n![推理效果](../../resources/qwen2-vl/ocr_result.png)\\n\\n### 图像描述微调\\n\\n我们使用 coco-en-mini 数据集进行微调，该数据集的任务是对图片内容进行描述。您可以在 modelscope 上找到该数据集: [https://modelscope.cn/datasets/modelscope/coco_2014_caption](https://modelscope.cn/datasets/modelscope/coco_2014_caption)\\n\\n```bash\\n# 默认会将lora_target_modules设置为llm的所有linear\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset coco-en-mini#20000 \\\\\\n  --deepspeed default-zero2\\n```\\n\\n如果要使用自定义数据集，只需按以下方式进行指定：\\n```bash\\n  --dataset train.jsonl \\\\\\n  --val_dataset val.jsonl \\\\\\n```\\n\\n自定义数据集支持json和jsonl样式，以下是自定义数据集的样例：\\n```jsonl\\n{\\\"query\\\": \\\"<image>55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee<image>eeeee<image>eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path1\\\", \\\"image_path2\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response2\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": []}\\n```\\n\\n显存占用：\\n\\n![显存占用](../../resources/qwen2-vl/1.png)\\n\\n\\n训练损失图（只训练了200个step）：\\n\\n![训练损失](../../resources/qwen2-vl/loss.png)\\n\\n微调后推理脚本如下：\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen2-vl-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true --merge_lora true\\n```\\n\\n微调后模型对验证集进行推理的示例：\\n\\n![推理效果](../../resources/qwen2-vl/2.png)\\n\\n### 图像grounding微调\\n\\n我们使用refcoco-unofficial-grounding数据集进行grounding微调，您可以在 modelscope 上找到该数据集：https://modelscope.cn/datasets/swift/refcoco\\n\\n```bash\\n# 支持使用zero3进行微调\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset refcoco-unofficial-grounding#20000 \\\\\\n  --deepspeed default-zero3\\n```\\n\\n用户可以使用如下自定义数据集格式：\\n```jsonl\\n# swift跨模型通用格式\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359],[1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# qwen2-vl-chat特定格式，注意特殊字符的存在\\n{\\\"query\\\": \\\"Find <|object_ref_start|>the man<|object_ref_end|>\\\", \\\"response\\\": \\\"<|box_start|>(123,235),(324,546)<|box_end|>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"]}\\n```\\n\\n### 视频微调\\n\\n我们使用 video-chatgpt 数据集进行微调，该数据集的任务是对视频内容进行描述。您可以在 modelscope 上找到该数据集：https://modelscope.cn/datasets/swift/VideoChatGPT\\n```bash\\nNFRAMES=24 MAX_PIXELS=100352 CUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n  --model_type qwen2-vl-7b-instruct \\\\\\n  --model_id_or_path qwen/Qwen2-VL-7B-Instruct \\\\\\n  --sft_type lora \\\\\\n  --dataset video-chatgpt \\\\\\n  --deepspeed default-zero2\\n```\\n\\n自定义数据集支持json和jsonl样式，以下是自定义数据集的样例：\\n```jsonl\\n{\\\"query\\\": \\\"<video>55555\\\", \\\"response\\\": \\\"66666\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"eeeee<video>eeeee<video>eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"videos\\\": [\\\"video_path1\\\", \\\"video_path2\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response2\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"videos\\\": []}\\n```\\n\\n显存占用：\\n![显存占用](../../resources/qwen2-vl/3.png)\\n\\n微调后推理脚本如下：\\n```bash\\nNFRAMES=24 MAX_PIXELS=100352 CUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen2-vl-7b-instruct/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true --merge_lora true\\n```\\n\\n微调后模型对验证集进行推理的示例（只训练了50个step）：\\n![推理效果](../../resources/qwen2-vl/4.png)\\n\\n\\n\\n# Florence 最佳实践\\n\\n本篇文档对应的模型\\n\\n| model | model_type |\\n|-------|------------|\\n| [Florence-2-base](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-base) | florence-2-base |\\n| [Florence-2-base-ft](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-base-ft) | florence-2-base-ft |\\n| [Florence-2-large](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-large) | florence-2-large |\\n| [Florence-2-large-ft](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-large-ft) | florence-2-large-ft |\\n\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 推理\\n下面的教程以[Florence-2-large-ft](https://www.modelscope.cn/models/AI-ModelScope/Florence-2-large-ft)为例, 你可以通过切换model_type使用其他florence系列模型\\n\\n**注意**\\n- 如果要使用本地模型文件，加上参数 `--model_id_or_path /path/to/model`\\n- 如果要使用flash attention, 使用参数`--use_flath_attn true`, 并且指定`--dtype`为fp16或bf16(模型默认为fp32)\\n- Florence系列模型内置了一些视觉任务的prompt, 对应的映射可以查看`swift.llm.utils.template.FlorenceTemplate`, 更多prompt可以查看 Modelscope/Hugging Face 的模型详情页\\n- Florence系列模型不具备中文能力\\n- Florence系列模型不支持system prompt和history\\n\\n```shell\\n# 2.4GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type florence-2-large-ft --max_new_tokens 1024 --stream false\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< Describe the image\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n{'Describe the image': 'A grey and white kitten with blue eyes.'}\\n<<< <OD>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the objects with category name in the image.': 'shelf<loc_264><loc_173><loc_572><loc_748><loc_755><loc_274><loc_966><loc_737><loc_46><loc_335><loc_261><loc_763><loc_555><loc_360><loc_760><loc_756>'}\\n--------------------------------------------------\\n<<< <CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'What does the image describe?': 'A cartoon picture of four sheep standing in a field.'}\\n--------------------------------------------------\\n<<< <DETAILED_CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Describe in detail what is shown in the image.': 'In the image is animated. In the image there are sheeps. At the bottom of the image on the ground there is grass. In background there are hills. At top of the images there are clouds.'}\\n--------------------------------------------------\\n<<< <MORE_DETAILED_CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Describe with a paragraph what is shown in the image.': 'Four sheep are standing in a field. They are all white and fluffy. They have horns on their heads. There are mountains behind them. There is grass and weeds on the ground in front of them. '}\\n--------------------------------------------------\\n<<< <DENSE_REGION_CAPTION>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the objects in the image, with their descriptions.': 'cartoon sheep illustration<loc_265><loc_175><loc_572><loc_748>cartoon ram illustration<loc_755><loc_275><loc_966><loc_737>cartoon white sheep illustration<loc_44><loc_335><loc_262><loc_764>cartoon goat illustration<loc_555><loc_361><loc_762><loc_756>'}\\n--------------------------------------------------\\n<<< <REGION_PROPOSAL>\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the region proposals in the image.': '<loc_45><loc_176><loc_967><loc_761><loc_266><loc_175><loc_570><loc_749><loc_757><loc_274><loc_966><loc_738><loc_46><loc_334><loc_261><loc_763><loc_556><loc_361><loc_760><loc_756>'}\\n--------------------------------------------------\\n<<< <CAPTION_TO_PHRASE_GROUNDING>the sheeps\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n{'Locate the phrases in the caption: the sheeps': 'thethe sheeps<loc_45><loc_175><loc_967><loc_764><loc_266><loc_176><loc_572><loc_749><loc_756><loc_275><loc_965><loc_739><loc_46><loc_335><loc_261><loc_765><loc_557><loc_361><loc_760><loc_758>'}\\n```\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**Python 推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\n\\nmodel_type = \\\"florence-2-large-ft\\\"\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\nmodel, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': \\\"cuda:0\\\"})\\n\\nmodel.generation_config.max_new_tokens = 1024\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png']\\nquery = 'Describe the image'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n'''\\nquery: Describe the image\\nresponse: {'Describe the image': 'Four sheep standing in a field with mountains in the background.'}\\n'''\\n```\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\nLoRA微调:\\n```shell\\n# Experimental environment: 4090\\n# 6.6GB GPU memory\\n\\n# caption task\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type florence-2-large-ft \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --lora_target_modules ALL\\n\\n# grounding task\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type florence-2-large-ft \\\\\\n    --dataset refcoco-unofficial-grounding \\\\\\n    --lora_target_modules ALL\\n```\\n\\n全参数微调:\\n```bash\\n# Experimental environment: 4090\\n# 11 GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type florence-2-large-ft \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --sft_type full\\n\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(只支持单轮对话, 每轮对话必须包含一张图片, 支持传入本地路径或URL)\\n\\n**Caption/VQA** 类任务\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n**grounding**任务\\n\\n目前支持两种自定义grounding任务\\n1. 对于给定bounding box询问目标的任务, 在query中指定`<bbox>`, 在response中指定`<ref-object>`, 在`objects`提供目标和bounding box具体信息\\n2. 对于给定目标询问bounding box的任务,在query中指定`<ref-object>`, 在response中指定`<bbox>`, 在`objects`提供目标和bounding box具体信息\\n```jsonl\\n{\\\"query\\\": \\\"Find <bbox>\\\", \\\"response\\\": \\\"<ref-object>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [138, 136, 235, 359], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n# mapping to multiple bboxes\\n{\\\"query\\\": \\\"Find <ref-object>\\\", \\\"response\\\": \\\"<bbox>\\\", \\\"images\\\": [\\\"/coco2014/train2014/COCO_train2014_000000001507.jpg\\\"], \\\"objects\\\": \\\"[{\\\\\\\"caption\\\\\\\": \\\\\\\"guy in red\\\\\\\", \\\\\\\"bbox\\\\\\\": [[138, 136, 235, 359],[1,2,3,4]], \\\\\\\"bbox_type\\\\\\\": \\\\\\\"real\\\\\\\", \\\\\\\"image\\\\\\\": 0}]\\\" }\\n```\\n上述objects字段中包含了一个json string，其中有四个字段：\\n    a. caption bbox对应的物体描述\\n    b. bbox 坐标 建议给四个整数（而非float型），分别是x_min,y_min,x_max,y_max四个值\\n    c. bbox_type: bbox类型 目前支持三种：real/norm_1000/norm_1，分别代表实际像素值坐标/千分位比例坐标/归一化比例坐标\\n    d. image: bbox对应的图片是第几张, 索引从0开始\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/florence-2-large-ft/vx-xxx/checkpoint-xxx \\\\\\n    --stream false \\\\\\n    --max_new_tokens 1024\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir \\\"output/florence-2-large-ft/vx-xxx/checkpoint-xxx\\\" \\\\\\n    --stream false \\\\\\n    --max_new_tokens 1024 \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir \\\"output/florence-2-large-ft/vx-xxx/checkpoint-xxx-merged\\\" \\\\\\n    --stream false \\\\\\n    --max_new_tokens 1024 \\\\\\n```\\n\\n\\n\\n# CogVLM2 Video 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# https://github.com/facebookresearch/pytorchvideo/issues/258\\n# https://github.com/dmlc/decord/issues/177\\npip install decord pytorchvideo\\n```\\n\\n模型链接:\\n- cogvlm2-video-13b-chat: [https://modelscope.cn/models/ZhipuAI/cogvlm2-video-llama3-chat](https://modelscope.cn/models/ZhipuAI/cogvlm2-video-llama3-chat)\\n\\n\\n## 推理\\n\\n推理cogvlm2-video-13b-chat:\\n```shell\\n# Experimental environment: A100\\n# 28GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type cogvlm2-video-13b-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 描述这段视频\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4\\nIn the video, a young child is seen sitting on a bed and reading a book. The child is wearing glasses and is dressed in a light blue top and pink pants. The room appears to be a bedroom with a crib in the background. The child is engrossed in the book, and the scene is captured in a series of frames showing the child's interaction with the book.\\n--------------------------------------------------\\n<<< clear\\n<<< Describe this video.\\nInput a video path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/fire.mp4\\nIn the video, a person is seen lighting a fire in a backyard setting. They start by holding a piece of food and then proceed to light a match to the food. The fire is then ignited, and the person continues to light more pieces of food, including a bag of chips and a piece of wood. The fire is seen burning brightly, and the person is seen standing over the fire, possibly enjoying the warmth. The video captures the process of starting a fire and the person's interaction with the flames, creating a cozy and inviting atmosphere.\\n--------------------------------------------------\\n<<< clear\\n<<< who are you\\nInput a video path or URL <<<\\nI am a person named John.\\n\\\"\\\"\\\"\\n```\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.cogvlm2_video_13b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/baby.mp4']\\nquery = '描述这段视频'\\nresponse, history = inference(model, template, query, videos=videos)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = 'Describe this video.'\\nvideos = ['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/fire.mp4']\\ngen = inference_stream(model, template, query, history, videos=videos)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\n\\\"\\\"\\\"\\nquery: 描述这段视频\\nresponse: The video depicts a young child sitting on a bed and reading a book. The child is wearing glasses and is seen in various positions, such as sitting on the bed, sitting on a couch, and sitting on a bed with a blanket. The child's attire changes from a light blue top and pink pants to a light blue top and pink leggings. The room has a cozy and warm atmosphere with soft lighting, and there are personal items scattered around, such as a crib, a television, and a white garment.\\nquery: Describe this video.\\nresponse: The video shows a person lighting a fire in a backyard setting. The person is seen holding a piece of food and a lighter, and then lighting the food on fire. The fire is then used to light other pieces of wood, and the person is seen standing over the fire, holding a bag of food. The video captures the process of starting a fire and the person's interaction with the fire.\\n\\\"\\\"\\\"\\n```\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A100\\n# 40GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type cogvlm2-video-13b-chat \\\\\\n    --dataset video-chatgpt \\\\\\n    --num_train_epochs 3 \\\\\\n\\n# ZeRO2\\n# Experimental environment: 4 * A100\\n# 4 * 40GB GPU memory\\nNPROC_PER_NODE=4 \\\\\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \\\\\\n    --model_type cogvlm2-video-13b-chat \\\\\\n    --dataset video-chatgpt \\\\\\n    --num_train_epochs 3 \\\\\\n    --deepspeed default-zero2\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 但总的轮次对话只能包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"videos\\\": [\\\"video_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"videos\\\": [\\\"video_path\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-video-13b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true \\\\\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/cogvlm2-video-13b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/cogvlm2-video-13b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n## Multi-Modal文档\\n\\n### 📚教程\\n1. [人类偏好对齐训练文档](人类偏好对齐训练文档.md)\\n2. [LmDeploy推理加速文档](LmDeploy推理加速文档.md)\\n3. [vLLM推理加速文档](vLLM推理加速文档.md)\\n4. [MLLM部署文档](MLLM部署文档.md)\\n\\n\\n### ⭐️最佳实践系列\\n\\n一轮对话可以包含多张图片（或不含图片）:\\n1. [Qwen-VL最佳实践](qwen-vl最佳实践.md), [Qwen2-VL最佳实践](qwen2-vl最佳实践.md)\\n2. [Qwen-Audio最佳实践](qwen-audio最佳实践.md), [Qwen2-Audio最佳实践](https://github.com/modelscope/ms-swift/issues/1653)\\n3. [Llava最佳实践](llava最佳实践.md), [LLava Video最佳实践](llava-video最佳实践.md)\\n4. [InternVL系列最佳实践](internvl最佳实践.md)\\n5. [MiniCPM-V最佳实践](minicpm-v最佳实践.md), [MiniCPM-V-2最佳实践](minicpm-v-2最佳实践.md), [MiniCPM-V-2.5最佳实践](minicpm-v-2.5最佳实践.md), [MiniCPM-V-2.6最佳实践](https://github.com/modelscope/ms-swift/issues/1613)\\n6. [Deepseek-VL最佳实践](deepseek-vl最佳实践.md)\\n7. [Internlm2-Xcomposers最佳实践](internlm-xcomposer2最佳实践.md)\\n8. [Phi3-Vision最佳实践](phi3-vision最佳实践.md), [Phi3.5-Vision最佳实践](https://github.com/modelscope/ms-swift/issues/1809)\\n9. [mPLUG-Owl2最佳实践](mplug-owl2最佳实践.md), [mPLUG-Owl3最佳实践](https://github.com/modelscope/ms-swift/issues/1969)\\n10. [GOT-OCR2最佳实践](https://github.com/modelscope/ms-swift/issues/2122)\\n\\n\\n一轮对话只能包含一张图片（可能可以不含图片）:\\n1. [Yi-VL最佳实践.md](yi-vl最佳实践.md)\\n2. [florence最佳实践](florence最佳实践.md)\\n\\n整个对话围绕一张图片（可能可以不含图片）:\\n1. [CogVLM最佳实践](cogvlm最佳实践.md), [CogVLM2最佳实践](cogvlm2最佳实践.md), [glm4v最佳实践](glm4v最佳实践.md), [CogVLM2-Video最佳实践](cogvlm2-video最佳实践.md)\\n\\n\\n\\n# GLM4V 最佳实践\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理](#推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n\\n\\n## 环境准备\\n```shell\\n# 请使用\\\"ms-swift>=2.2\\\"或者main分支\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n模型链接:\\n- glm4v-9b-chat: [https://modelscope.cn/models/ZhipuAI/glm-4v-9b/summary](https://modelscope.cn/models/ZhipuAI/glm-4v-9b/summary)\\n\\n## 推理\\n\\n推理glm4v-9b-chat:\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type glm4v-9b-chat\\n```\\n\\n输出: (支持传入本地路径或URL)\\n```python\\n\\\"\\\"\\\"\\n<<< 你好\\nInput a media path or URL <<<\\n你好👋！很高兴见到你，欢迎问我任何问题。\\n--------------------------------------------------\\n<<< clear\\n<<< 描述这张图片\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\n这是一张特写照片，展示了一只毛茸茸的小猫。小猫的眼睛大而圆，呈深蓝色，眼珠呈金黄色，非常明亮。它的鼻子短而小巧，是粉色的。小猫的嘴巴紧闭，胡须细长。它的耳朵竖立着，耳朵内侧是白色的，外侧是棕色的。小猫的毛发看起来柔软而浓密，主要是白色和棕色相间的条纹图案。背景模糊不清，但似乎是一个室内环境。\\n--------------------------------------------------\\n<<< clear\\n<<< 图中有几只羊\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\n图中共有四只羊。其中最左边的羊身体较小，后边三只羊体型逐渐变大，且最右边的两只羊体型大小一致。\\n--------------------------------------------------\\n<<< clear\\n<<< 计算结果是多少?\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\n1452+45304=46756\\n--------------------------------------------------\\n<<< clear\\n<<< 根据图片中的内容写首诗\\nInput a media path or URL <<< http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\n湖光山色映小船，\\n\\n星辉点点伴旅程。\\n\\n人在画中寻诗意，\\n\\n心随景迁忘忧愁。\\n--------------------------------------------------\\n<<< clear\\n<<< 对图片进行OCR\\nInput a media path or URL <<< https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\n图片中的OCR结果如下：\\n\\n简介\\n\\nSWIFT支持250+LLM和35+MLLM（多模态大模型）的训练、推理、评测和部署。开发者可以直接将我们的框架应用到自己的Research和生产环境中，实现模型训练评测到应用的完整链路。我们除支持了PEFT提供的轻量训练方案外，也提供了一个完整的Adapters库以支持最新的训练技术，如NEFTune、LoRA+、LLaMA-PRO等，这个适配器库可以脱离训练脚本直接使用在自己的自定流程中。\\n\\n为方便不熟悉深度学习的用户使用，我们提供了一个Gradio的web-ui用于控制训练和推理，并提供了配套的深度学习课程和最佳实践供新入门。\\n\\n此外，我们也在拓展其他模态的能力，目前我们支持了AnimateDiff的全参数训练和LoRA训练。\\n\\nSWIFT具有丰富的文档体系，如有使用问题请请查看这里。\\n\\n可以在Huggingface space和ModelScope创空间中体验SWIFT web-ui功能了。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\ncat:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nanimal:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nmath:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/math.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\npoem:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/poem.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\nocr:\\n\\n<img src=\\\"https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/ocr.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n**单样本推理**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.glm4v_9b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')\\n\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16,\\n                                       model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 256\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\n\\nimages = ['http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png']\\nquery = '距离各城市多远？'\\nresponse, history = inference(model, template, query, images=images)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '距离最远的城市是哪？'\\nimages = images\\ngen = inference_stream(model, template, query, history, images=images)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, _ in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\n\\\"\\\"\\\"\\nquery: 距离各城市多远？\\nresponse: 距离马踏还有14Km，距离阳江还有62Km，距离广州还有293Km。\\nquery: 距离最远的城市是哪？\\nresponse: 距离最远的城市是广州，有293Km。\\n\\\"\\\"\\\"\\n```\\n\\n示例图片如下:\\n\\nroad:\\n\\n<img src=\\\"http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png\\\" width=\\\"250\\\" style=\\\"display: inline-block;\\\">\\n\\n\\n## 微调\\n多模态大模型微调通常使用**自定义数据集**进行微调. 这里展示可直接运行的demo:\\n\\n```shell\\n# Experimental environment: A100\\n# 40GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift sft \\\\\\n    --model_type glm4v-9b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --batch_size 2\\n\\n# DDP\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 swift sft \\\\\\n    --model_type glm4v-9b-chat \\\\\\n    --dataset coco-en-2-mini \\\\\\n    --ddp_find_unused_parameters true\\n```\\n\\n[自定义数据集](../Instruction/自定义与拓展.md#-推荐命令行参数的形式)支持json, jsonl样式, 以下是自定义数据集的例子:\\n\\n(支持多轮对话, 但总的轮次对话只能包含一张图片, 支持传入本地路径或URL)\\n\\n```jsonl\\n{\\\"query\\\": \\\"55555\\\", \\\"response\\\": \\\"66666\\\", \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"eeeee\\\", \\\"response\\\": \\\"fffff\\\", \\\"history\\\": [], \\\"images\\\": [\\\"image_path\\\"]}\\n{\\\"query\\\": \\\"EEEEE\\\", \\\"response\\\": \\\"FFFFF\\\", \\\"history\\\": [[\\\"query1\\\", \\\"response1\\\"], [\\\"query2\\\", \\\"response2\\\"]], \\\"images\\\": [\\\"image_path\\\"]}\\n```\\n\\n\\n## 微调后推理\\n直接推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/glm4v-9b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --load_dataset_config true\\n```\\n\\n**merge-lora**并推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/glm4v-9b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/glm4v-9b-chat/vx-xxx/checkpoint-xxx-merged \\\\\\n    --load_dataset_config true\\n```\\n\\n\\n# 人类偏好对齐训练文档\\n\\n本文档提供了各种人类偏好对齐算法的训练脚本。若您希望深入了解更详尽的算法信息及其选择方法，请参考[文档](https://github.com/modelscope/modelscope-classroom/blob/main/LLM-tutorial/M.%E4%BA%BA%E7%B1%BB%E5%81%8F%E5%A5%BD%E5%AF%B9%E9%BD%90%E8%AE%AD%E7%BB%83.md)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [数据集](#数据集)\\n- [DPO](#dpo)\\n- [KTO](#kto)\\n- [CPO](#cpo)\\n- [ORPO](#orpo)\\n- [SimPO](#simpo)\\n\\n## 环境准备\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n\\n## 数据集\\n\\n人类偏好对齐训练一般需要 $(x,y_w,y_l)$ 格式的数据，其中 $x$ 表示模型输入，$y_w,y_l$ 分别表示符合人类偏好的偏好回答和不符合人类偏好的拒绝回答,比如![dpo_data](../../resources/dpo_data.png)\\n\\n其中KTO算法的数据比较特殊，只需要 $(x,y,\\\\text{label})$ 格式的数据，其中 $x$ 表示模型输入，$y$ 表示模型输出，label表示回答是否符合人类偏好\\n比如![kto_data](../../resources/kto_data.png)\\n\\n**训练提示**:\\n- 如果用带有history的数据训练base模型，需要指定支持多轮对话的template(base模型往往不支持多轮对话)，对于这种情况我们默认设置了`chatml`template，你也可以使用`--model_type` 来选择训练模型的template\\n- 使用自定义数据集进行训练请参考[自定义与拓展](../Instruction/自定义与拓展.md)\\n- 下面的训练脚本使用`--lora_target_modules ALL`来训练模型的全部线性层，你也可以设置`--lora_target_modules DEFAULT`只训练模型的QKV矩阵\\n\\n## DPO\\n[论文arvix](https://arxiv.org/abs/2305.18290)\\n\\n超参\\n- `beta`：KL正则系数，值越大表示对偏离参考模型的惩罚越大。默认为0.1\\n\\n建议在开始DPO训练之前，使用偏好数据集中的偏好回答部分进行SFT训练，以确保数据符合DPO算法的分布要求。\\n我们也在DPO loss中混合了sft loss来稳定训练，你可以通过设置超参`rpo_alpha`来调整sft loss的系数，默认为`1.`.\\n\\n训练脚本, 这里我们提供单卡/多卡device map/多卡ddp的版本，简洁起见，后续算法只给出单卡版本。\\n```bash\\n# Experimental environment: A100\\n# Memory usage: 40G\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# MP(device map)\\n# Memory usage: 2*24G\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# DDP + MP\\n# Memory usage: 4*24G\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --rpo_alpha 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n训练后的模型推理和部署可以参考[LLM推理文档](../Instruction/LLM推理文档.md)和[VLLM推理加速与部署文档](./VLLM推理加速与部署.md)\\n\\n## KTO\\n[论文arvix](https://arxiv.org/abs/2402.01306)\\n\\n超参\\n- beta： KL正则系数，值越大表示对偏离参考模型的惩罚越大。默认为0.1\\n- desirable_weight ：损失函数中的$\\\\lambda_D$项，偏好回答样本的损失权重, 默认为1.0\\n- undesirable_weight ：损失函数中的$\\\\lambda_U$项，拒绝回答样本的损失权重，默认为1.0\\n\\n用 $n_D$ 和 $n_U$ 分别表示数据集中偏好回答和拒绝回答的样本数量，对于超参 $\\\\lambda_D$ 和 $\\\\lambda_U$ ，作者推荐设置 $\\\\frac{\\\\lambda_Dn_D}{\\\\lambda_Un_U}\\\\in[1,\\\\frac{4}{3}]$\\n\\n训练脚本\\n使用 $(x,y,\\\\text{label})$ 格式数据训练\\n\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type kto \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --desirable_weight 1.0 \\\\\\n    --undesirable_weight 1.0 \\\\\\n    --sft_type  lora \\\\\\n    --dataset ultrafeedback-kto \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n## CPO\\n[论文arvix](https://arxiv.org/abs/2401.08417)\\n超参\\n- beta：隐含奖励前的系数，默认为0.1\\n- cpo_alpha: nll loss系数, 默认为1.0\\n\\n训练脚本\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type cpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n## ORPO\\n[论文arvix](https://arxiv.org/abs/2403.07691)\\n\\n超参\\n- lambda: Odds Ratio loss系数\\n\\n注意：ORPO使用参数`--beta`传入超参`lambda`\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.1 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n## SimPO\\n[论文arvix](https://arxiv.org/abs/2405.14734)\\n超参\\n- beta：隐含奖励前的系数，默认为2.0\\n- simpo_gamma：reward margin项，默认为1.0\\n- cpo_alpha: 混合CPO nll loss提高训练稳定性, 默认为1.0, 设置0.0使用原始SimPO算法\\n\\n```bash\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type simpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 2.0 \\\\\\n    --simpo_gamma 1.0 \\\\\\n    --cpo_alpha 1.0 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n\\n\\n\\n# Grok 300B训练和推理实战\\n\\n本文介绍了使用8卡环境对Grok-MoE 300B模型进行微调和推理的流程。\\n\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [微调](#微调)\\n- [推理](#推理)\\n\\n## 环境准备\\n```shell\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\n## 微调\\n\\n### 实验环境\\n\\n- GPU:8*A100 80G\\n- 镜像:ModelScope官方镜像1.13.1版本\\n- peft:0.10.0\\n\\n### 数据集准备\\n\\nGrok是base模型，因此我们使用了[问题生成数据集DuReader](https://www.modelscope.cn/datasets/modelscope/DuReader_robust-QG/summary)作为训练集。该数据集约15000条，max-length设置为512，训练数据约10000条（平均长度305±92 tokens）。\\n\\n### 模型准备\\n\\nGrok模型我们使用了[ColossalAI提供的版本](https://www.modelscope.cn/models/colossalai/grok-1-pytorch/summary)，其中我们额外准备了[符合transformers标准的tokenizer](https://www.modelscope.cn/models/AI-ModelScope/grok-1-tokenizer/summary)。\\n\\n### 训练\\n\\n由于Grok模型过大，device_map和deepspeed zero3非offload均无法运行训练，因此本次实验我们使用了LoRA+deepspeed zero3 offload模式运行训练。训练完整脚本如下：\\n\\n```shell\\n# cd examples/pytorch/llm first\\nnproc_per_node=8\\n\\nPYTHONPATH=../../.. \\\\\\ntorchrun \\\\\\n    --nproc_per_node=$nproc_per_node \\\\\\n    --master_port 29500 \\\\\\n    llm_sft.py \\\\\\n    --model_type grok-1 \\\\\\n    --sft_type lora \\\\\\n    --tuner_backend peft \\\\\\n    --dtype bf16 \\\\\\n    --output_dir output \\\\\\n    --ddp_backend nccl \\\\\\n    --dataset dureader-robust-zh \\\\\\n    --train_dataset_sample -1 \\\\\\n    --num_train_epochs 1 \\\\\\n    --max_length 512 \\\\\\n    --check_dataset_strategy warning \\\\\\n    --lora_rank 8 \\\\\\n    --lora_alpha 32 \\\\\\n    --lora_dropout 0.05 \\\\\\n    --lora_dtype AUTO \\\\\\n    --lora_target_modules DEFAULT \\\\\\n    --gradient_checkpointing true \\\\\\n    --batch_size 2 \\\\\\n    --weight_decay 0.1 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \\\\\\n    --max_grad_norm 0.5 \\\\\\n    --warmup_ratio 0.03 \\\\\\n    --eval_steps 100 \\\\\\n    --save_steps 100 \\\\\\n    --save_total_limit 2 \\\\\\n    --logging_steps 10 \\\\\\n    --deepspeed zero3-offload \\\\\\n```\\n\\n完整的训练文件可以在[这里](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/grok-1/lora_ddp_ds)找到。\\n\\n下面是训练过程的一些benchmark：\\n\\n| 指标     | 值                                                           |\\n| -------- | ------------------------------------------------------------ |\\n| 显存占用 | 8*21G                                                        |\\n| 训练速度 | 45s/it                                                       |\\n| 总iter数 | 340（10000(dataset_length)/16(gradient_accumulation)/2(batch_size)） |\\n\\n<img src=\\\"../../resources/image-20240329122854204.png\\\" alt=\\\"image-20240329122854204\\\" style=\\\"zoom: 33%;\\\" />\\n\\n由于显存占用不到24G，理论上可以在RTX3090/A10环境中运行训练。\\n\\n<img src=\\\"../../resources/grok_train_loss.png\\\" alt=\\\"train_loss (1)\\\" style=\\\"zoom:33%;\\\" />\\n\\n<img src=\\\"../../resources/grok_train_acc.png\\\" alt=\\\"train_acc\\\" style=\\\"zoom:33%;\\\" />\\n\\n训练时长约4小时。\\n\\n### 推理\\n\\nSWIFT框架目前并不支持deepspeed推理，因此我们仍然使用transformers的device_map进行推理支持。但由于模型过大，因此部分layers会被offload到CPU上，并影响LoRA加载使推理出错，因此我们针对peft的实现进行了一定patch（原Linear在meta设备上时不迁移LoRA，并在运行时动态迁移weights）。\\n\\n推理脚本如下：\\n\\n```shell\\n# cd examples/pytorch/llm first\\nPYTHONPATH=../../.. \\\\\\npython llm_infer.py \\\\\\n    --ckpt_dir output/grok-1/vx-xxx-xxx/checkpoint-xxx \\\\\\n    --dtype bf16 \\\\\\n    --load_dataset_config true \\\\\\n    --max_new_tokens 64 \\\\\\n    --do_sample true \\\\\\n    --dtype bf16 \\\\\\n    --eval_human false \\\\\\n    --merge_lora false \\\\\\n```\\n\\n推理结果：\\n\\n```text\\n[PROMPT]Task: Question Generation\\nContext: 我个人感觉是吕颂贤版,剧情和原著差别不大,虽然TVB演员颜值和风光没有大陆的好。但是香港特区人口和地域的限制,只能注重在演员的演技方面发挥很出色,楼主看过大陆排《笑傲江湖》吧!在台词上表现的很生硬没有香港的注重神色配台词,比如杜燕歌把吕颂贤表情和性格几乎和原著差别不大。武打几乎沿用徐克和程小东动作的风格很注重实际技巧,没有大陆版的在武打场面依靠电脑特效表现的太夸张了。李亚鹏版的武打动作和导演还是香港的元彬,大陆毕竟还是在武侠剧起步的比较晚,主要是还是靠明星大腕压阵而香港却是恰恰相反。\\nAnswer: 吕颂贤版\\nQuestion:[OUTPUT]笑傲江湖哪个版本好看</s>\\n\\n[LABELS]笑傲江湖哪个版本好看\\n--------------------------------------------------\\n[PROMPT]Task: Question Generation\\nContext: 这位朋友你好,女性出现妊娠反应一般是从6-12周左右,也就是女性怀孕1个多月就会开始出现反应,第3个月的时候,妊辰反应基本结束。 而大部分女性怀孕初期都会出现恶心、呕吐的感觉,这些症状都是因人而异的,除非恶心、呕吐的非常厉害,才需要就医,否则这些都是刚怀孕的的正常症状。1-3个月的时候可以观察一下自己的皮肤,一般女性怀孕初期可能会产生皮肤色素沉淀或是腹壁产生妊娠纹,特别是在怀孕的后期更加明显。 还有很多女性怀孕初期会出现疲倦、嗜睡的情况。怀孕三个月的时候,膀胱会受到日益胀大的子宫的压迫,容量会变小,所以怀孕期间也会有尿频的现象出现。月经停止也是刚怀孕最容易出现的症状,只要是平时月经正常的女性,在性行为后超过正常经期两周,就有可能是怀孕了。 如果你想判断自己是否怀孕,可以看看自己有没有这些反应。当然这也只是多数人的怀孕表现,也有部分女性怀孕表现并不完全是这样,如果你无法确定自己是否怀孕,最好去医院检查一下。\\nAnswer: 6-12周\\nQuestion:[OUTPUT]怀孕几个月开始反应</s>\\n\\n[LABELS]怀孕多久会有反应\\n--------------------------------------------------\\n```\\n\\n\\n# Agent部署最佳实践\\n\\n## 目录\\n\\n- [环境安装](#环境安装)\\n- [tools字段](#tools字段)\\n- [部署](#部署)\\n- [总结](#总结)\\n\\n## 环境安装\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## tools字段\\ntools字段提供了模型可以调用的API信息。支持OpenAI和ToolBench格式，需要提供tools的名字，描述和参数，示例如下\\n\\nOpenAI tools格式\\n```json\\n{\\n  \\\"tools\\\": [\\n    {\\n      \\\"type\\\": \\\"function\\\",\\n      \\\"function\\\": {\\n        \\\"name\\\": \\\"get_current_weather\\\",\\n        \\\"description\\\": \\\"Get the current weather in a given location\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"location\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"The city and state, e.g. San Francisco, CA\\\"\\n            },\\n            \\\"unit\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"enum\\\": [\\\"celsius\\\", \\\"fahrenheit\\\"]\\n            }\\n          },\\n          \\\"required\\\": [\\\"location\\\"]\\n        }\\n      }\\n    }\\n  ]\\n}\\n```\\n\\nToolBench tools 格式\\n```json\\n{\\n\\\"tools\\\": [\\n      {\\n        \\\"name\\\": \\\"url_for_newapi\\\",\\n        \\\"description\\\": \\\"This is the subfunction for tool \\\\\\\"newapi\\\\\\\", you can use this tool.The description of this function is: \\\\\\\"url_for_newapi\\\\\\\"\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"url\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"\\\",\\n              \\\"example_value\\\": \\\"https://www.instagram.com/reels/CtB6vWMMHFD/\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"url\\\"\\n          ],\\n          \\\"optional\\\": [\\n            \\\"url\\\"\\n          ]\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"n_for_newapi\\\",\\n        \\\"description\\\": \\\"This is the subfunction for tool \\\\\\\"newapi\\\\\\\", you can use this tool.The description of this function is: \\\\\\\"n_for_newapiew var\\\\\\\"\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"language\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"\\\",\\n              \\\"example_value\\\": \\\"https://www.instagram.com/reels/Csb0AI3IYUN/\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"language\\\"\\n          ],\\n          \\\"optional\\\": []\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"Finish\\\",\\n        \\\"description\\\": \\\"If you believe that you have obtained a result that can answer the task, please call this function to provide the final answer. Alternatively, if you recognize that you are unable to proceed with the task in the current state, call this function to restart. Remember: you must ALWAYS call this function at the end of your attempt, and the only part that will be shown to the user is the final answer, so it should contain sufficient information.\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"return_type\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"enum\\\": [\\n                \\\"give_answer\\\",\\n                \\\"give_up_and_restart\\\"\\n              ]\\n            },\\n            \\\"final_answer\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"The final answer you want to give the user. You should have this field if \\\\\\\"return_type\\\\\\\"==\\\\\\\"give_answer\\\\\\\"\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"return_type\\\"\\n          ]\\n        }\\n      }\\n    ],\\n}\\n```\\n\\n在推理过程中，会将tools的信息转换成对应的tools system prompt。如果已经存在system prompt，则会拼接在已有的之后。\\n\\n目前支持英文ReAct,中文ReAct和ToolBench三种tools system prompt，示例如下\\n\\nReAct-EN\\n```\\nAnswer the following questions as best you can. You have access to the following tools:\\n\\n{'name': 'get_current_weather', 'description': 'Get the current weather in a given location', 'parameters': {'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state, e.g. San Francisco, CA'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location']}}\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of [get_current_weather]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nFinal Answer: the final answer to the original input question\\n\\nBegin!\\n```\\n\\nReAct-ZH\\n```\\n尽你所能回答以下问题。你拥有如下工具：\\n\\n{'name': 'get_current_weather', 'description': 'Get the current weather in a given location', 'parameters': {'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state, e.g. San Francisco, CA'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location']}}\\n\\n以下格式回答：\\n\\nThought: 思考你应该做什么\\nAction: 工具的名称，必须是[get_current_weather]之一\\nAction Input: 工具的输入\\nObservation: 工具返回的结果\\n... (Thought/Action/Action Input/Observation的过程可以重复零次或多次)\\nFinal Answer: 对输入问题的最终答案\\n\\n开始！\\n```\\nToolBench\\n```\\nYou can use many tools(functions) to do the following task.\\nFirst I will give you the task description, and your task start.\\nAt each step, you need to give your thought to analyze the status now and what to do next, with a function call to actually excute your step. Your output should follow this format:\\nThought:\\nAction:\\nAction Input:\\n\\nAfter the call, you will get the call result, and you are now in a new state.\\nThen you will analyze your status now, then decide what to do next...\\nAfter many (Thought-call) pairs, you finally perform the task, then you can give your finial answer.\\nRemember:\\n1.the state change is irreversible, you can\\\\'t go back to one of the former state, if you want to restart the task, say \\\"I give up and restart\\\".\\n2.All the thought is short, at most in 5 sentence.\\n3.You can do more then one trys, so if your plan is to continusly try some conditions, you can do one of the conditions per try.\\nLet\\\\'s Begin!\\nTask description: You should use functions to help handle the real time user querys. Remember:\\n1.ALWAYS call \\\"Finish\\\" function at the end of the task. And the final answer should contain enough information to show to the user,If you can\\\\'t handle the task, or you find that function calls always fail(the function is not valid now), use function Finish->give_up_and_restart.\\n2.Do not use origin tool names, use only subfunctions\\\\' names.\\nSpecifically, you have access to the following APIs: {\\\\'name\\\\': \\\\'get_current_weather\\\\', \\\\'description\\\\': \\\\'Get the current weather in a given location\\\\', \\\\'parameters\\\\': {\\\\'type\\\\': \\\\'object\\\\', \\\\'properties\\\\': {\\\\'location\\\\': {\\\\'type\\\\': \\\\'string\\\\', \\\\'description\\\\': \\\\'The city and state, e.g. San Francisco, CA\\\\'}, \\\\'unit\\\\': {\\\\'type\\\\': \\\\'string\\\\', \\\\'enum\\\\': [\\\\'celsius\\\\', \\\\'fahrenheit\\\\']}}, \\\\'required\\\\': [\\\\'location\\\\']}}\\n```\\n\\n默认使用ReAct-EN格式，你也可以在参数中指定`--tools_prompt`为 `react_zh`或`toolbench` 来选择中文ReAct或ToolBench格式\\n\\n如果你有更好用的tools system prompt，欢迎告知或贡献给我们。\\n\\n\\n\\n## 部署\\n以下以vLLM部署，非流式调用，ReAct prompt为例.\\n\\n部署Agent时，需要型本身必须具备较强的指令遵循能力，或者已在Agent数据集上进行了训练。如果现有模型未能根据tools字段进行工具选择和参数设置，建议采用更高性能的模型，或者参照[Agent微调实践](./Agent微调最佳实践.md)训练模型\\n\\n部署模型，这里我们选择`llama3-8b-instruct`模型作为示范\\n```shell\\nswift deploy \\\\\\n  --model_type llama3-8b-instruct \\\\\\n  --infer_backend vllm \\\\\\n```\\n\\n用curl命令调用接口，因为ReAct格式会以Observation:为结尾，我们需要在stop中指定`Observation:`作为stop words来截断模型回复。有些模型会将`Observation:\\\\n`作为一个token，这里我们也将其作为stop words。\\n\\n如果你使用ToolBench prompt, 则无需指定stop words（当然加上也没有关系）\\n\\n```shell\\ncurl -X POST http://localhost:8000/v1/chat/completions \\\\\\n  -H \\\"Content-Type: application/json\\\" \\\\\\n  -d '{\\n    \\\"model\\\": \\\"llama3-8b-instruct\\\",\\n    \\\"messages\\\": [\\n      {\\n        \\\"role\\\": \\\"user\\\",\\n        \\\"content\\\": \\\"What'\\\\''s the weather like in Boston today?\\\"\\n      }\\n    ],\\n    \\\"tools\\\": [\\n      {\\n        \\\"type\\\": \\\"function\\\",\\n        \\\"function\\\": {\\n          \\\"name\\\": \\\"get_current_weather\\\",\\n          \\\"description\\\": \\\"Get the current weather in a given location\\\",\\n          \\\"parameters\\\": {\\n            \\\"type\\\": \\\"object\\\",\\n            \\\"properties\\\": {\\n              \\\"location\\\": {\\n                \\\"type\\\": \\\"string\\\",\\n                \\\"description\\\": \\\"The city and state, e.g. San Francisco, CA\\\"\\n              },\\n              \\\"unit\\\": {\\n                \\\"type\\\": \\\"string\\\",\\n                \\\"enum\\\": [\\\"celsius\\\", \\\"fahrenheit\\\"]\\n              }\\n            },\\n            \\\"required\\\": [\\\"location\\\"]\\n          }\\n        }\\n      }\\n    ],\\n    \\\"stream\\\": false,\\n    \\\"stop\\\": [\\\"Observation:\\\", \\\"Observation:\\\\n\\\"]\\n  }'\\n```\\n\\n你也可以通过指定`tool_choice`字段来选择tools中的tool，比如`\\\"tool_choice\\\":{\\\"type\\\": \\\"function\\\", \\\"function\\\": {\\\"name\\\": \\\"my_function\\\"}}`. 默认选择所有tools，也可以设置为None来屏蔽tools字段\\n\\n调用结果\\n```json\\n{\\\"model\\\":\\\"llama3-8b-instruct\\\",\\\"choices\\\":[[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"Question: What's the weather like in Boston today?\\\\n\\\\nThought: I need to get the current weather in Boston to answer this question.\\\\n\\\\nAction: get_current_weather\\\\n\\\\nAction Input: {'location': 'Boston, MA', 'unit': 'fahrenheit'}\\\\n\\\\nObservation:\\\",\\\"tool_calls\\\":[{\\\"id\\\":\\\"toolcall-f534d907ae254f2ab96e06c25179ddf9\\\",\\\"function\\\":{\\\"arguments\\\":\\\" {'location': 'Boston, MA', 'unit': 'fahrenheit'}\\\\n\\\\n\\\",\\\"name\\\":\\\"get_current_weather\\\"},\\\"type\\\":\\\"function\\\"}]},\\\"finish_reason\\\":\\\"stop\\\"}]],\\\"usage\\\":{\\\"prompt_tokens\\\":262,\\\"completion_tokens\\\":54,\\\"total_tokens\\\":316},\\\"id\\\":\\\"chatcmpl-8630e8d675c941c0aca958a37633a3c9\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1717590756}\\n```\\n\\n在返回结果的tool_calls中，可以获得调用的函数以及参数信息。\\n\\n你也可以通过OpenAI SDK进行测试\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nquery = \\\"What's the weather like in Boston today?\\\"\\nmessages = [{\\n    'role': 'user',\\n    'content': query\\n}]\\ntools =  [\\n      {\\n        \\\"name\\\": \\\"url_for_newapi\\\",\\n        \\\"description\\\": \\\"This is the subfunction for tool \\\\\\\"newapi\\\\\\\", you can use this tool.The description of this function is: \\\\\\\"url_for_newapi\\\\\\\"\\\",\\n        \\\"parameters\\\": {\\n          \\\"type\\\": \\\"object\\\",\\n          \\\"properties\\\": {\\n            \\\"url\\\": {\\n              \\\"type\\\": \\\"string\\\",\\n              \\\"description\\\": \\\"\\\",\\n              \\\"example_value\\\": \\\"https://www.instagram.com/reels/CtB6vWMMHFD/\\\"\\n            }\\n          },\\n          \\\"required\\\": [\\n            \\\"url\\\"\\n          ],\\n          \\\"optional\\\": [\\n            \\\"url\\\"\\n          ]\\n        }\\n      },\\n]\\nresp = client.chat.completions.create(\\n    model='llama3-8b-instruct',\\n    tools = tools,\\n    messages=messages,\\n    seed=42)\\ntool_calls = resp.choices[0].message.tool_calls[0]\\nprint(f'query: {query}')\\nprint(f'tool_calls: {tool_calls}')\\n\\n# 流式\\nstream_resp = client.chat.completions.create(\\n    model='llama3-8b-instruct',\\n    messages=messages,\\n    tools=tools,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint(chunk.choices[0].delta.tool_calls[0])\\n\\n\\\"\\\"\\\"\\nquery: What's the weather like in Boston today?\\ntool_calls: {'id': 'toolcall-e4c637435e754cf9b2034c3e6861a4ad', 'function': {'arguments': ' {\\\"url\\\": \\\"https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Boston\\\"}', 'name': 'url_for_newapi'}, 'type': 'function'}\\nquery: What's the weather like in Boston today?\\nresponse: Thought: I need to find the weather information for Boston today. I can use the 'newapi' tool to get the weather forecast.\\nAction: url_for_newapi\\nAction Input: {\\\"url\\\": \\\"https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Boston\\\"}\\n\\\"\\\"\\\"\\n```\\n假设调用返回的结果为`The weather in Boston today is 32°F (0°C), with clear skies`, 我们将结果在role tool字段填入message传入\\n```shell\\ncurl -X POST http://localhost:8000/v1/chat/completions \\\\\\n  -H \\\"Content-Type: application/json\\\" \\\\\\n  -d '{\\n    \\\"model\\\": \\\"llama3-8b-instruct\\\",\\n    \\\"messages\\\": [\\n      {\\n        \\\"role\\\": \\\"user\\\",\\n        \\\"content\\\": \\\"What'\\\\''s the weather like in Boston today?\\\"\\n      },\\n      {\\n        \\\"role\\\": \\\"assistant\\\",\\n        \\\"content\\\": \\\"Question: What'\\\\''s the weather like in Boston today?\\\\n\\\\nThought: I need to get the current weather in Boston.\\\\n\\\\nAction: get_current_weather\\\\n\\\\nAction Input: {\\\\\\\"location\\\\\\\": \\\\\\\"Boston, MA\\\\\\\", \\\\\\\"unit\\\\\\\": \\\\\\\"fahrenheit\\\\\\\"}\\\\n\\\\nObservation:\\\"\\n      },\\n      {\\n        \\\"role\\\": \\\"tool\\\",\\n        \\\"content\\\": \\\"{\\\\\\\"result\\\\\\\": \\\\\\\"The weather in Boston today is 32°F (0°C), with clear skies\\\\\\\"}\\\\\\\\n\\\\\\\\n\\\"\\n      }\\n    ],\\n    \\\"stream\\\": false,\\n    \\\"stop\\\": [\\\"Observation:\\\", \\\"Observation:\\\\n\\\"]\\n  }'\\n```\\n\\n对于ReAct格式，我们会将其拼接结果拼接回上一轮模型返回最后的`Observations:`字段之后。\\n\\n对于ToolBench格式，根据模型template对其处理。如果模型template没有指定对该字段的特殊处理方式，则视为user输入。\\n\\n如果你有更好用的处理方法，也欢迎告知或贡献给我们。\\n\\n调用结果\\n```json\\n{\\\"model\\\":\\\"llama3-8b-instruct\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"\\\\n\\\\nAnswer: The weather in Boston today is 32°F (0°C), with clear skies.\\\",\\\"tool_calls\\\":null},\\\"finish_reason\\\":null}],\\\"usage\\\":{\\\"prompt_tokens\\\":93,\\\"completion_tokens\\\":21,\\\"total_tokens\\\":114},\\\"id\\\":\\\"chatcmpl-5e63cee5155f48a48d1366001d16502b\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1717590962}\\n```\\n\\n如果你想要结合代码和tools完成整个链路闭环，推荐阅读[OpenAI教程](https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models)\\n\\n\\n# ORPO算法最佳实践\\n[ORPO](https://arxiv.org/abs/2403.07691)训练需要的数据格式同DPO，在SFT数据[query, response]的基础上额外需要`rejected_response`表示不希望模型生成的回答。\\n\\nORPO算法在SFT训练的损失函数中加入一项odds ratio(OR)负对数似然损失项来降低对拒绝回答(rejected response)的生成概率。相比DPO，不需要参考模型，所需的训练显存更少。\\n\\n其中超参`beta`表示OR损失项的系数，beta越大表示对`rejected_response`的惩罚越大，默认为0.1\\n\\n本期最佳实践将使用ORPO算法训练[llama3-8b-instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct/summary)模型，使其能够用中文回答。\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [数据集](#数据集)\\n- [训练](#训练)\\n- [推理](#推理)\\n\\n## 环境准备\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n\\n## 数据集\\n使用[Llama3-DPO-zh-en-emoji](https://modelscope.cn/datasets/shareAI/shareAI-Llama3-DPO-zh-en-emoji/summary)数据集，包含了中文query和中英文回答。\\n\\n数据样例\\n```json\\n{\\\"question\\\": \\\"一个完整的工程项目管理流程包括什么？\\\",\\n\\\"answer_zh\\\": \\\"🤔 Ahahah, 项目管理流程, 这个问题太常见了！ 😂\\\\n\\\\n一个完整的工程项目管理流程包括以下几个阶段：\\\\n\\\\n1️⃣ **项目启动** 🚀：项目的开始，定义项目的目标、范围、时间表和预算。\\\\n\\\\n2️⃣ **项目计划** 📅：制定项目计划，包括任务分解、资源分配、进度安排和风险管理。\\\\n\\\\n3️⃣ **项目执行** 💪：按照计划执行项目，包括任务执行、进度控制和质量管理。\\\\n\\\\n4️⃣ **项目监控** 👀：对项目的进度、成本和质量进行监控和控制，确保项目不偏离轨道。\\\\n\\\\n5️⃣ **项目收尾** 🎉：项目完成后，进行项目总结、经验分享和文档编制。\\\\n\\\\n6️⃣ **项目评价** 🤔：对项目的成果和过程进行评价，总结经验和教训。\\\\n\\\\n这些阶段是一个完整的工程项目管理流程，但是，具体的项目可能会根据需要添加或删除某些阶段。 🤝\\\\n\\\\n还有一点，项目管理流程中需要注意的几个关键点是：\\\\n\\\\n* **沟通** 💬：项目团队之间、项目团队和客户之间的沟通是非常重要的。\\\\n* **风险管理** ⚠️：项目中总会出现一些风险和问题，需要提前预测和准备。\\\\n* **变更管理** 🔄：项目中可能会出现一些变更，需要及时处理和更新。\\\\n\\\\n总之，项目管理流程是一个复杂的过程，需要项目经理和团队成员的共同努力和合作。 💪\\\",\\n\\\"answer_en\\\": \\\"My fellow wizarding friend! 🧙‍♂️\\\\n\\\\nA complete project management process, you ask? Well, I shall conjure up the essential steps for thee! 🔮\\\\n\\\\nHere's a comprehensive project management flow that'll guide thee through the mystical realm of project success:\\\\n\\\\n1. **Initiation**: Define project scope, goals, and deliverables. Identify stakeholders, and determine the project's feasibility. ⚡️\\\\n2. **Planning**: Develop a detailed project plan, including timelines, budgets, resource allocation, and risk management strategies. 📅\\\\n3. **Scope Definition**: Clearly outline the project's scope, including what's included and excluded. This will help prevent scope creep, my friend! 🔒\\\\n4. **Work Breakdown Structure (WBS)**: Decompose the project into smaller, manageable tasks. This will aid in task assignment, scheduling, and tracking progress. 🗂️\\\\n5. **Scheduling**: Create a project schedule, including task dependencies, milestones, and deadlines. This will help thee stay on track and avoid procrastination! ⏰\\\\n6. **Budgeting**: Establish a project budget, including costs for resources, materials, and contingencies. This will ensure thou dost not overspend, my wise friend! 💸\\\\n7. **Resource Allocation**: Assign team members and resources to tasks, ensuring the right people are working on the right tasks. This will optimize productivity and efficiency! 👥\\\\n8. **Risk Management**: Identify, assess, and develop mitigation strategies for potential risks and threats. This will safeguard thy project from unforeseen dangers! ⚠️\\\\n9. **Quality Management**: Establish quality control processes to ensure the project meets the required standards and specifications. This will guarantee a top-notch outcome, my friend! ✨\\\\n10. **Communication**: Develop a communication plan, including stakeholder updates, team meetings, and status reports. This will keep everyone informed and aligned! 📢\\\\n11. **Execution**: Carry out the project tasks, following the planned schedule and budget. This is where the magic happens, my friend! ✨\\\\n12. **Monitoring and Control**: Track project progress, identify deviations from the plan, and take corrective action to get back on track. This will ensure thy project stays on course! 📊\\\\n13. **Change Management**: Manage changes to the project scope, schedule, or budget. This will minimize disruptions and ensure the project remains viable! 🔀\\\\n14. **Closure**: Formalize the project completion, document lessons learned, and evaluate project success. This will bring a sense of accomplishment and closure, my friend! 🎉\\\\n\\\\nThere thou hast it, my fellow wizard! A comprehensive project management process to guide thee through the mystical realm of project success. May thy projects be prosperous and thy stakeholders be delighted! 😊\\\"}\\n\\n```\\n\\nswift内置了处理方法将`answer_zh`作为`response`,将`answer_en`作为`rejected_response`, 只需要使用`--dataset shareai-llama3-dpo-zh-en-emoji`作为训练参数\\n\\n## 训练\\n```shell\\n# Experimental environment: A100\\n# DDP + MP\\n# Memory usage: 4*24G\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.5 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# MP(device map)\\n# Memory usage: 2*24G\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.5 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n\\n# Memory usage: 40G\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift rlhf \\\\\\n    --rlhf_type orpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --beta 0.5 \\\\\\n    --sft_type  lora \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --num_train_epochs  2  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  16  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --save_total_limit  2\\n```\\n**提示**:\\n\\n- 如果用带有history的数据训练base模型，需要指定支持多轮对话的template(base模型往往不支持多轮对话)，对于这种情况我们默认设置了`chatml`template，你也可以支持--model_type 来选择训练模型的template\\n- 我们默认在训练时设置`--gradient_checkpointing true`来**节约显存**, 这会略微降低训练速度.\\n- 如果你使用的是**V100**等较老的GPU, 你需要设置`--dtype AUTO`或者`--dtype fp16`, 因为其不支持bf16.\\n- 如果你的机器是A100等高性能显卡, 且使用的是qwen系列模型, 推荐你安装[**flash-attn**](https://github.com/Dao-AILab/flash-attention), 这将会加快训练和推理的速度以及显存占用(A10, 3090, V100等显卡不支持flash-attn进行训练). 支持flash-attn的模型可以查看[LLM支持的模型](../Instruction/支持的模型和数据集.md#模型)\\n- 如果你需要断网进行训练, 请使用`--model_id_or_path <model_dir>`和设置`--check_model_is_latest false`. 具体参数含义请查看[命令行参数](../Instruction/命令行参数.md).\\n- 如果你想在训练时, 将权重push到ModelScope Hub中, 你需要设置`--push_to_hub true`.\\n\\n## 推理\\n下面的推理使用`swift web-ui`命令\\n\\n### 训练前推理\\n> 你是谁\\n\\n![orpo1](../../resources/orpo1.png)\\n\\n> 西湖醋鱼怎么做\\n\\n![orpo2](../../resources/orpo2.png)\\n![orpo3](../../resources/orpo3.png)\\n![orpo4](../../resources/orpo4.png)\\n![orpo5](../../resources/orpo5.png)\\n\\n\\n### 训练后推理\\n> 你是谁\\n\\n![orpo6](../../resources/orpo6.png)\\n\\n> 西湖醋鱼怎么做\\n\\n![orpo7](../../resources/orpo7.png)\\n![orpo8](../../resources/orpo8.png)\\n\\n\\n# OLLaMA导出文档\\n\\nSWIFT已经支持了OLLaMA Modelfile的导出能力，该能力合并到了`swift export`命令中。\\n\\n## 目录\\n\\n- [环境准备](#环境准备)\\n- [导出](#导出)\\n- [需要注意的问题](#需要注意的问题)\\n\\n## 环境准备\\n\\n```shell\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n```\\n\\nOLLaMA导出不需要其他模块支持，因为SWIFT仅会导出ModelFile，后续的运行用户可以自行处理。\\n\\n## 导出\\n\\nOLLaMA导出命令行如下：\\n\\n```shell\\n# model_type\\nswift export --model_type llama3-8b-instruct --to_ollama true --ollama_output_dir llama3-8b-instruct-ollama\\n# ckpt_dir，注意lora训练需要增加--merge_lora true\\nswift export --ckpt_dir /mnt/workspace/yzhao/tastelikefeet/swift/output/qwen-7b-chat/v141-20240331-110833/checkpoint-10942 --to_ollama true --ollama_output_dir qwen-7b-chat-ollama --merge_lora true\\n```\\n\\n执行后会打印如下log：\\n```shell\\n[INFO:swift] Exporting to ollama:\\n[INFO:swift] If you have a gguf file, try to pass the file by :--gguf_file /xxx/xxx.gguf, else SWIFT will use the original(merged) model dir\\n[INFO:swift] Downloading the model from ModelScope Hub, model_id: LLM-Research/Meta-Llama-3-8B-Instruct\\n[WARNING:modelscope] Authentication has expired, please re-login with modelscope login --token \\\"YOUR_SDK_TOKEN\\\" if you need to access private models or datasets.\\n[WARNING:modelscope] Using branch: master as version is unstable, use with caution\\n[INFO:swift] Loading the model using model_dir: /mnt/workspace/.cache/modelscope/hub/LLM-Research/Meta-Llama-3-8B-Instruct\\n[INFO:swift] Save Modelfile done, you can start ollama by:\\n[INFO:swift] > ollama serve\\n[INFO:swift] In another terminal:\\n[INFO:swift] > ollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/llama3-8b-instruct-ollama/Modelfile\\n[INFO:swift] > ollama run my-custom-model\\n[INFO:swift] End time of running main: 2024-08-09 17:17:48.768722\\n```\\n\\n提示可以运行，此时打开ModelFile查看：\\n\\n```text\\nFROM /mnt/workspace/.cache/modelscope/hub/LLM-Research/Meta-Llama-3-8B-Instruct\\nTEMPLATE \\\"\\\"\\\"{{ if .System }}<|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\n{{ .System }}<|eot_id|>{{ else }}<|begin_of_text|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>\\n\\n{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n{{ end }}{{ .Response }}<|eot_id|>\\\"\\\"\\\"\\nPARAMETER stop \\\"<|eot_id|>\\\"\\nPARAMETER temperature 0.3\\nPARAMETER top_k 20\\nPARAMETER top_p 0.7\\nPARAMETER repeat_penalty 1.0\\n```\\n\\n用户可以改动生成的文件，用于后续推理。\\n\\n### OLLaMA使用\\n\\n使用上面的文件，需要安装OLLaMA：\\n```shell\\n# https://github.com/ollama/ollama\\ncurl -fsSL https://ollama.com/install.sh | sh\\n```\\n\\n启动OLLaMA:\\n\\n```shell\\nollama serve\\n```\\n\\n在另一个terminal运行：\\n\\n```shell\\nollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/llama3-8b-instruct-ollama/Modelfile\\n```\\n\\n执行后会打印如下log：\\n\\n```text\\ntransferring model data\\nunpacking model metadata\\nprocessing tensors\\nconverting model\\ncreating new layer sha256:37b0404fb276acb2e5b75f848673566ce7048c60280470d96009772594040706\\ncreating new layer sha256:2ecd014a372da71016e575822146f05d89dc8864522fdc88461c1e7f1532ba06\\ncreating new layer sha256:ddc2a243c4ec10db8aed5fbbc5ac82a4f8425cdc4bd3f0c355373a45bc9b6cb0\\ncreating new layer sha256:fc776bf39fa270fa5e2ef7c6782068acd858826e544fce2df19a7a8f74f3f9df\\nwriting manifest\\nsuccess\\n```\\n\\n之后就可以用命令的名字来推理：\\n\\n```shell\\nollama run my-custom-model\\n```\\n\\n```shell\\n>>> who are you?\\nI'm LLaMA, I'm a large language model trained by a team of researcher at Meta AI. My primary function is to understand and respond to human\\ninput in a helpful and informative way. I'm a type of AI designed to simulate conversation, answer questions, and even generate text based\\non a given prompt or topic.\\n\\nI'm not a human, but rather a computer program designed to mimic human-like conversation. I don't have personal experiences, emotions, or\\nphysical presence, but I'm here to provide information, answer your questions, and engage in conversation to the best of my abilities.\\n\\nI'm constantly learning and improving my responses based on the interactions I have with users like you, so please bear with me if I make\\nany mistakes or don't quite understand what you're asking. I'm here to help and provide assistance, so feel free to ask me anything!\\n```\\n\\n## 需要注意的问题\\n\\n1. 部分模型在\\n\\n```shell\\nollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/qwen-7b-chat-ollama/Modelfile\\n```\\n\\n的时候会报错:\\n\\n```shell\\nError: Models based on 'QWenLMHeadModel' are not yet supported\\n```\\n\\n这是因为ollama的转换并不支持所有类型的模型，此时可以自行进行gguf导出并修改Modelfile的FROM字段：\\n\\n```shell\\n# 详细转换步骤可以参考：https://github.com/ggerganov/llama.cpp/blob/master/examples/quantize/README.md\\ngit clone https://github.com/ggerganov/llama.cpp.git\\ncd llama.cpp\\n# 模型目录可以在`swift export`命令的日志中找到，类似：\\n# Using model_dir: /mnt/workspace/yzhao/tastelikefeet/swift/output/qwen-7b-chat/v141-20240331-110833/checkpoint-10942-merged\\npython convert_hf_to_gguf.py /mnt/workspace/yzhao/tastelikefeet/swift/output/qwen-7b-chat/v141-20240331-110833/checkpoint-10942-merged\\n```\\n\\n之后重新执行：\\n\\n```shell\\nollama create my-custom-model -f /mnt/workspace/yzhao/tastelikefeet/swift/qwen-7b-chat-ollama/Modelfile\\n```\\n\\n\\n# Megatron训练文档\\n\\n支持使用megatron进行训练的模型可以查看[这里](../Instruction/支持的模型和数据集.md#模型)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [SFT案例](#SFT案例)\\n- [多机预训练案例](#多机预训练案例)\\n- [MegatronArguments与SftArguments的映射](#MegatronArguments与SftArguments的映射)\\n\\n\\n## 环境准备\\n\\n```shell\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 安装megatron相关依赖 (你不需要安装megatron-ml等其他依赖库)\\npip install pybind11\\n# transformer_engine (如果安装不成功请尝试: release_v1.7)\\npip install git+https://github.com/NVIDIA/TransformerEngine.git@stable\\n# apex\\ngit clone https://github.com/NVIDIA/apex\\ncd apex\\npip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings \\\"--build-option=--cpp_ext\\\" --config-settings \\\"--build-option=--cuda_ext\\\" ./\\n```\\n\\n其他两个依赖库为[Megatron-LM](https://github.com/NVIDIA/Megatron-LM)和[Pai-Megatron-Patch](https://github.com/alibaba/Pai-Megatron-Patch). 会由swift进行git clone并安装, 不需要用户进行安装. 你也可以通过环境变量`MEGATRON_LM_PATH`, `PAI_MEGATRON_PATCH_PATH`指定已经下载好的repo路径.\\n\\n\\n## SFT案例\\n这里介绍可以很快跑通的使用megatron训练的案例，通过此案例，你可以熟悉magatron训练的全流程。使用HF Trainer进行微调的对应案例可以查看[自我认知微调最佳实践](自我认知微调最佳实践.md).\\n\\n1. HF格式的权重转成megatron格式的权重:\\n```shell\\n# 默认输出路径: --megatron_output_dir {model_type}-tp{tp}-pp{pp}\\nCUDA_VISIBLE_DEVICES=0 swift export --model_type qwen2-7b-instruct \\\\\\n    --to_megatron true --tp 2 --dtype bf16\\n\\n# 如果使用qwen2-72b-instruct，转换命令如下:\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift export --model_type qwen2-72b-instruct \\\\\\n    --to_megatron true --tp 8 --dtype bf16\\n```\\n\\n2. 使用megatron格式权重进行微调，命令脚本如下:\\n```shell\\n# Experimental Environment: 4 * A100\\n# GPU Memory Requirement: 4 * 55GB\\n# TP=2, DP=2\\nCUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#500 swift-mix:codefuse#250 swift-mix:metamathqa#250 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n```\\n\\n3. 将megatron格式权重重新转成HF格式:\\n```shell\\n# 未微调模型\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir qwen2-7b-instruct-tp2-pp1 --to_hf true\\n\\n# 微调后模型\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen2-7b-instruct-tp2-pp1/vx-xxx --to_hf true\\n\\n# 如果使用qwen2-72b-instruct，转换命令如下:\\nCUDA_VISIBLE_DEVICES=0,1,2,3 swift export \\\\\\n    --ckpt_dir qwen2-72b-instruct-tp8-pp1 --to_hf true\\n```\\n\\n4. 对获得的权重进行推理测试，并使用vLLM进行加速:\\n```shell\\n# 未微调模型\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-7b-instruct \\\\\\n    --model_id_or_path qwen2-7b-instruct-tp2-pp1/qwen2-7b-instruct-hf \\\\\\n\\n# 微调后模型\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/qwen2-7b-instruct-tp2-pp1/vx-xxx/qwen2-7b-instruct-hf\\n```\\n\\n微调后模型效果如下：\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁\\n我是小黄，由魔搭开发的人工智能聊天机器人。我的目标是通过文本交流提供帮助、信息和娱乐。如果您有任何问题或需要帮助，请随时向我提问。\\n--------------------------------------------------\\n<<< who are you\\nI am Xiao Huang, an artificial intelligence chatbot developed by ModelScope. My purpose is to provide assistance, information, and entertainment through text communication. If you have any questions or need help, please feel free to ask me at any time.\\n--------------------------------------------------\\n<<< 晚上睡不着觉怎么办\\n晚上睡不着觉可能是因为多种原因，例如压力、焦虑、不规律的作息时间、咖啡因摄入过多、睡眠环境不佳等。以下是一些可能有助于改善睡眠质量的建议：\\n\\n1. 建立规律的作息时间：每天尽量在同一时间上床睡觉和起床，即使在周末也是如此。这有助于调整您的生物钟并改善睡眠质量。\\n2. 创造舒适的睡眠环境：确保您的卧室安静、黑暗、凉爽，并且床铺舒适。使用遮光窗帘、耳塞或白噪音机等设备可以帮助创造一个更舒适的睡眠环境。\\n3. 避免咖啡因和酒精：避免在睡前几小时内摄入咖啡因和酒精，因为它们可能会影响您的睡眠质量。\\n4. 放松身心：尝试进行深呼吸、冥想、瑜伽或其他放松技巧，以帮助您放松身心并准备入睡。\\n5. 避免使用电子设备：在睡前避免使用电子设备，因为屏幕发出的蓝光可能会影响您的睡眠质量。\\n6. 避免午睡：如果您在白天打盹，可能会影响您晚上的睡眠质量。尽量避免在晚上睡觉前几小时内打盹。\\n7. 限制晚上摄入的液体：在睡前几小时内避免摄入过多的液体，以减少夜间起床上厕所的次数。\\n8. 保持积极的心态：避免在睡前担心或焦虑，因为这可能会影响您的睡眠质量。尝试进行积极的思考，例如思考您期待的第二天的事情。\\n9. 尝试放松技巧：尝试进行深呼吸、冥想、瑜伽或其他放松技巧，以帮助您放松身心并准备入睡。\\n10. 如果您尝试了上述建议但仍然无法入睡，请考虑咨询医生或睡眠专家以获取更多建议。\\n\\\"\\\"\\\"\\n```\\n\\n我们对训练完的HF模型进行评测：\\n```shell\\npip install llmuses==0.4.0\\n# 原始模型\\nCUDA_VISIBLE_DEVICES=0 swift eval --model_type qwen2-7b-instruct \\\\\\n    --eval_dataset ceval mmlu gsm8k arc --eval_backend Native\\n\\n# 未微调模型\\nCUDA_VISIBLE_DEVICES=0 swift eval --model_type qwen2-7b-instruct \\\\\\n    --model_id_or_path qwen2-7b-instruct-tp2-pp1/qwen2-7b-instruct-hf \\\\\\n    --eval_dataset ceval mmlu gsm8k arc --eval_backend Native\\n\\n# 微调后模型\\nCUDA_VISIBLE_DEVICES=0 swift eval \\\\\\n    --ckpt_dir output/qwen2-7b-instruct-tp2-pp1/vx-xxx/qwen2-7b-instruct-hf \\\\\\n    --eval_dataset ceval mmlu gsm8k arc --eval_backend Native\\n```\\n\\n评测结果：\\n|     |  ceval    | mmlu   | gsm8k    | arc   |\\n| ---- | ---- | ---- | ---- | ---- |\\n|  原始模型  |    0.6642  |  0.6909    |    0.787  |  0.8507    |\\n|  未微调  |    0.6642  |  0.6909    |    0.787  |  0.8507    |\\n|  微调后  |   0.7392   |    0.6878  |  0.8241    |    0.8481  |\\n\\n\\n**多机微调**：\\n```shell\\n# node0\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=0 \\\\\\nMASTER_ADDR=127.0.0.1 \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#20000 swift-mix:codefuse#10000 swift-mix:metamathqa#10000 self-cognition#500 \\\\\\n    --max_length 8192 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n\\n# node1\\nCUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \\\\\\nNNODES=2 \\\\\\nNODE_RANK=1 \\\\\\nMASTER_ADDR=xxx.xxx.xxx.xxx \\\\\\nNPROC_PER_NODE=8 \\\\\\nswift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#20000 swift-mix:codefuse#10000 swift-mix:metamathqa#10000 self-cognition#500 \\\\\\n    --max_length 8192 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n```\\n\\n**阿里云-DLC多机训练**（通配符不用改）:\\n```shell\\nNNODES=$WORLD_SIZE \\\\\\nNODE_RANK=$RANK \\\\\\nswift sft \\\\\\n    --resume_from_checkpoint qwen2-7b-instruct-tp2-pp1 \\\\\\n    --dataset swift-mix:sharegpt#20000 swift-mix:codefuse#10000 swift-mix:metamathqa#10000 self-cognition#500 \\\\\\n    --max_length 8192 \\\\\\n    --learning_rate 2e-6 \\\\\\n    --sft_type full \\\\\\n    --output_dir output \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --train_backend megatron\\n```\\n\\n\\n## 多机预训练案例\\n敬请期待...\\n\\n\\n## MegatronArguments与SftArguments的映射\\n|  MegatronArguments    |  SftArguments |\\n| ---- | ---- |\\n|   optimizer   | optim |\\n|   lr_decay_style   | lr_scheduler_type |\\n|  weight_decay  | weight_decay |\\n| clip_grad   |  max_grad_norm |\\n|   adam_beta1 | adam_beta1 |\\n|  adam_beta2  | adam_beta2 |\\n| adam_eps  | adam_epsilon |\\n|  lr  | learning_rate |\\n|  min_lr  | min_lr |\\n|   fp16<br> apply_query_key_layer_scaling | fp16 |\\n|  bf16  | bf16 |\\n|  tensor_model_parallel_size  | tp |\\n|  pipeline_model_parallel_size  | pp |\\n|  seed  | seed |\\n|  load  | resume_from_checkpoint |\\n|  save  | output_dir |\\n|  tensorboard_dir  | logging_dir |\\n|  log_interval  | logging_steps |\\n|  eval_interval  | eval_steps |\\n|  save_interval  | save_steps |\\n|  micro_batch_size  | batch_size |\\n|  global_batch_size  | batch_size * gradient_accumulation_steps * world_size |\\n|  sequence_parallel  | sequence_parallel |\\n|  num_workers  | dataloader_num_workers |\\n|  use_flash_attn  | use_flash_attn |\\n|  train_iters  | int(math.ceil(len(train_dataset) * num_train_epochs / global_batch_size)) |\\n|  eval_iters  | int(math.ceil(len(val_dataset) / global_batch_size)) |\\n|  lr_warmup_iters  |  warmup_steps if warmup_steps > 0 else math.ceil(train_iters * warmup_ratio) |\\n|  no_save_optim<br>no_save_rng  | save_only_model |\\n\\n\\n# Agent微调最佳实践\\n\\n用消费级显卡训练属于自己的Agent！\\n\\nSWIFT支持了开源模型，尤其是中小型模型（7B、14B等）对Agent场景的训练，并将[loss-scale技术](https://arxiv.org/pdf/2309.00986.pdf)应用到agent训练中，使中小模型API Call能力更稳定，并支持使用单张商业级显卡进行Agent推理和部署，可以直接在生产场景中全链路闭环落地使用。\\n\\n## 目录\\n\\n- [环境安装](#环境安装)\\n- [数据准备](#数据准备)\\n- [微调](#微调)\\n- [推理](#推理)\\n- [总结](#总结)\\n- [搭配Modelscope-Agent使用](#搭配Modelscope-Agent使用)\\n\\n## 环境安装\\n\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## 数据准备\\n\\nswift现支持的agent数据集:\\n- [msagent-pro](https://www.modelscope.cn/datasets/iic/MSAgent-Pro)\\n- [toolbench](https://www.modelscope.cn/datasets/swift/ToolBench)\\n- [ms-agent](https://www.modelscope.cn/datasets/iic/ms_agent)\\n- [ms-agent-for-agentfabric](https://www.modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric)\\n- [ms-agent-multirole](https://www.modelscope.cn/datasets/iic/MSAgent-MultiRole)\\n- [toolbench-for-alpha-umi](https://www.modelscope.cn/datasets/shenweizhou/alpha-umi-toolbench-processed-v2)\\n- [damo-agent-zh](https://www.modelscope.cn/datasets/iic/MSAgent-Bench)\\n- [agent-instruct-all-en](https://www.modelscope.cn/datasets/huangjintao/AgentInstruct_copy)\\n\\n你也可以使用自定义Agent数据集进行训练, 现支持两种格式\\n\\n格式1\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"system\\\", \\\"value\\\": \\\"00000\\\"}, {\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"11111\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"aaaaa\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"bbbbb\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"ccccc\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"conversations\\\": [{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\"AAAAA\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"BBBBB\\\"}, {\\\"from\\\": \\\"tool\\\", \\\"value\\\": \\\"CCCCC\\\"}, {\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"DDDDD\\\"}]}\\n```\\n\\n格式2\\n```jsonl\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"system\\\", \\\"content\\\": \\\"00000\\\"}, {\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"11111\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"22222\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"aaaaa\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"bbbbb\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"ccccc\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"ddddd\\\"}]}\\n{\\\"tools\\\":\\\"{API_LIST}\\\",\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"AAAAA\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"BBBBB\\\"}, {\\\"role\\\": \\\"tool\\\", \\\"content\\\": \\\"CCCCC\\\"}, {\\\"role\\\": \\\"assistant\\\", \\\"content\\\": \\\"DDDDD\\\"}]}\\n```\\n\\n其中tools格式参考[Agent部署文档](./Agent部署最佳实践.md#tools字段), 提供可调用的工具列表, 你可以通过设置`--tools_prompt`来选择对应的prompt\\n\\n`tool`字段表示工具调用返回结果\\n\\n\\n如果你想保留模型的通用能力, 可以混合一定比例的通用数据集, 以下以混合ms-bench和ms-agent数据集训练agent为例,\\n- [魔搭通用问答知识数据集](https://www.modelscope.cn/datasets/iic/ms_bench/summary) 该数据集包含了38万条通用知识多轮对话数据\\n- [魔搭通用Agent训练数据集](https://www.modelscope.cn/datasets/iic/ms_agent/summary) 该数据集包含了3万条Agent格式的API调用数据\\n\\n该数据集数据格式如下：\\n\\n```json\\n{\\n\\t\\\"id\\\": \\\"MS_Agent_Bench_126374\\\",\\n\\t\\\"conversations\\\": [{\\n\\t\\t\\\"from\\\": \\\"system\\\",\\n\\t\\t\\\"value\\\": \\\"Answer the following questions as best you can. You have access to the following APIs:\\\\n1. hm_recipe_recommend: Call this tool to interact with the hmreciperecommend API. What is the hmreciperecommend API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"keywords_dict\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马推荐菜谱关键词字典。\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\n2. hm_product_marketing: Call this tool to interact with the hmproductmarketing API. What is the hmproductmarketing API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"sku_code_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的编码列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\n3. hm_product_info: Call this tool to interact with the hmproductinfo API. What is the hmproductinfo API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"sku_code_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的编码列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}, {\\\\\\\"name\\\\\\\": \\\\\\\"sku_name_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的名称列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}, {\\\\\\\"name\\\\\\\": \\\\\\\"property_list\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马商品的属性列表\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\n4. hm_product_recommend: Call this tool to interact with the hmproductrecommend API. What is the hmproductrecommend API useful for? . Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"keywords_dict\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"盒马推荐商品关键词字典。\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\\\n\\\\nUse the following format:\\\\n\\\\nThought: you should always think about what to do\\\\nAction: the action to take, should be one of the above tools[hm_recipe_recommend, hm_product_marketing, hm_product_info, hm_product_recommend]\\\\nAction Input: the input to the action\\\\nObservation: the result of the action\\\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\\\nThought: I now know the final answer\\\\nFinal Answer: the final answer to the original input question\\\\nBegin!\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"user\\\",\\n\\t\\t\\\"value\\\": \\\"你好，请问你们有哪些手机可以推荐？\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"assistant\\\",\\n\\t\\t\\\"value\\\": \\\"Action: hm_product_recommend\\\\nAction Input: {'keywords_dict': {'商品类目': '手机'}}\\\\nObservation: [{'sku_code': '10518244314', 'product_name': '小米11 Ultra 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '5999', 'product_description': '拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统'}, {'sku_code': '10222726664', 'product_name': 'vivo X60 Pro 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '4498', 'product_description': '搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足'}, {'sku_code': '18227073452', 'product_name': '华为畅享 20 Pro 5G手机 128GB', 'bussiness_type': '标品', 'product_price': '2699', 'product_description': '拥有4000mAh的电池容量和优秀的相机而价格非常亲民'}]\\\\nThought: I now know the final answer\\\\nFinal Answer: 您好，我们有以下几款手机供您选择：1.小米11 Ultra 5G手机 256GB：价格为5999元，拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统；2. vivo X60 Pro 5G手机 256GB：售价为4498元，搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足；3. 华为畅享 20 Pro 5G手机 128GB：价格亲民，只需2699元即可拥有优秀的相机和4000mAh的电池容量。这些手机都具有不同的特点和功能，您可以根据自己的需求进行选择。如果您有其他问题或需求，请随时告诉我。\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"user\\\",\\n\\t\\t\\\"value\\\": \\\"我想买一款拍照好的手机，有推荐吗？\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"assistant\\\",\\n\\t\\t\\\"value\\\": \\\"Action: hm_product_recommend\\\\nAction Input: {'keywords_dict': {'商品类目': '手机', '适用场景': '拍照'}}\\\\nObservation: [{'sku_code': '15956662254', 'product_name': '小米11 Ultra 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '5999', 'product_description': '拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统'}, {'sku_code': '19424216918', 'product_name': 'vivo X60 Pro 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '4498', 'product_description': '搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足'}, {'sku_code': '14347982715', 'product_name': 'OPPO Ace2 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '3999', 'product_description': '拍照实力十足，支持65W超级闪充'}]\\\\nThought: I now know the final answer\\\\nFinal Answer: 如果您想要一款拍照表现出色的手机，我为您推荐以下几款产品：1.小米11 Ultra 5G手机 256GB：价格为5999元，配备了高品质相机系统，可以拍摄出色的照片；2. vivo X60 Pro 5G手机 256GB：售价为4498元，相机系统由ZEISS联合调校，拍照实力十足；3. OPPO Ace2 5G手机 256GB：价格为3999元，不仅拍照实力十足，还支持65W超级闪充，让你的手机充电更加便捷。这些手机都有不同的特点和功能，您可以根据自己的需求进行选择。如果您还有其他问题或需求，请随时告诉我。\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"user\\\",\\n\\t\\t\\\"value\\\": \\\"小米11 Ultra拍照性能怎么样？\\\"\\n\\t}, {\\n\\t\\t\\\"from\\\": \\\"assistant\\\",\\n\\t\\t\\\"value\\\": \\\"Action: hm_product_info\\\\nAction Input: {'sku_code_list': ['15956662254'], 'sku_name_list': ['小米11 Ultra 5G手机 256GB'], 'property_list': [['拍照性能']]}\\\\nObservation: [{'sku_code': '15956662254', 'property': {'拍照性能': '小米11 Ultra 5G手机配备了1亿像素的主摄像头，还有120X超长焦电影摄像头，以及20MP超广角摄像头等组合，拍照性能非常出色。'}}]\\\\nThought: I now know the final answer\\\\nFinal Answer: 小米11 Ultra 5G手机配备了1亿像素的主摄像头，还有120X超长焦电影摄像头，以及20MP超广角摄像头等组合，拍照性能非常出色。如果您还有其他问题或需求，请随时告诉我。\\\"\\n\\t}]\\n}\\n```\\n\\nAgent数据集的system字段具体格式如下（将\\\\\\\\\\\"字符转换为\\\"字符, \\\\n转换为换行）：\\n\\n```text\\nAnswer the following questions as best you can. You have access to the following APIs:\\n1. hm_recipe_recommend: Call this tool to interact with the hmreciperecommend API. What is the hmreciperecommend API useful for? . Parameters: [{\\\"name\\\": \\\"keywords_dict\\\", \\\"description\\\": \\\"盒马推荐菜谱关键词字典。\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n2. hm_product_marketing: Call this tool to interact with the hmproductmarketing API. What is the hmproductmarketing API useful for? . Parameters: [{\\\"name\\\": \\\"sku_code_list\\\", \\\"description\\\": \\\"盒马商品的编码列表\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n3. hm_product_info: Call this tool to interact with the hmproductinfo API. What is the hmproductinfo API useful for? . Parameters: [{\\\"name\\\": \\\"sku_code_list\\\", \\\"description\\\": \\\"盒马商品的编码列表\\\", \\\"required\\\": \\\"True\\\"}, {\\\"name\\\": \\\"sku_name_list\\\", \\\"description\\\": \\\"盒马商品的名称列表\\\", \\\"required\\\": \\\"True\\\"}, {\\\"name\\\": \\\"property_list\\\", \\\"description\\\": \\\"盒马商品的属性列表\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n4. hm_product_recommend: Call this tool to interact with the hmproductrecommend API. What is the hmproductrecommend API useful for? . Parameters: [{\\\"name\\\": \\\"keywords_dict\\\", \\\"description\\\": \\\"盒马推荐商品关键词字典。\\\", \\\"required\\\": \\\"True\\\"}]\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[hm_recipe_recommend, hm_product_marketing, hm_product_info, hm_product_recommend]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\n```\\n\\nAPI格式:\\n\\n```text\\nAnswer the following questions as best you can. You have access to the following APIs:\\n序号: API名称: API作用 API参数\\n\\n...\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[API名称列表]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\n```\\n\\nAgent数据集调用API的response的结构如下：\\n\\n```text\\nAction: hm_product_recommend\\nAction Input: {'keywords_dict': {'商品类目': '手机', '适用场景': '拍照'}}\\nObservation: [{'sku_code': '15956662254', 'product_name': '小米11 Ultra 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '5999', 'product_description': '拥有120Hz高刷新率和骁龙888处理器，还配备了高品质相机系统'}, {'sku_code': '19424216918', 'product_name': 'vivo X60 Pro 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '4498', 'product_description': '搭载Exynos 1080处理器与ZEISS联合调校的相机系统，拍照实力十足'}, {'sku_code': '14347982715', 'product_name': 'OPPO Ace2 5G手机 256GB', 'bussiness_type': '标品', 'product_price': '3999', 'product_description': '拍照实力十足，支持65W超级闪充'}]\\nThought: I now know the final answer\\nFinal Answer: 如果您想要一款拍照表现出色的手机，我为您推荐以下几款产品：1.小米11 Ultra 5G手机 256GB：价格为5999元，配备了高品质相机系统，可以拍摄出色的照片；2. vivo X60 Pro 5G手机 256GB：售价为4498元，相机系统由ZEISS联合调校，拍照实力十足；3. OPPO Ace2 5G手机 256GB：价格为3999元，不仅拍照实力十足，还支持65W超级闪充，让你的手机充电更加便捷。这些手机都有不同的特点和功能，您可以根据自己的需求进行选择。如果您还有其他问题或需求，请随时告诉我。\\n```\\n\\n- Action：实际调用的API名称\\n- Action Input: 实际的输入参数\\n- Observation: 该部分是实际调用结果，训练时不参与loss，推理时需要外部调用后填入模型\\n- Thought: 模型思考输出\\n- Final Answer: 模型的最终回答\\n\\n## 微调\\n\\n在Agent训练中，为了避免训练后造成严重知识遗忘，我们的数据配比为[ms-agent](https://www.modelscope.cn/datasets/iic/ms_agent/summary):[ms-bench](https://www.modelscope.cn/datasets/iic/ms_bench/summary)数据集1比2，其中ms_agent共30000条，随机抽样ms_bench数据集60000条，同时为了改变模型认知，增加自我认知数据3000条。\\n\\n| 数据集           | 条数            |\\n| ---------------- | --------------- |\\n| ms-agent         | 30000(全数据集) |\\n| ms-bench         | 60000(抽样)     |\\n| self-recognition | 3000(重复抽样)  |\\n\\n我们也支持使用自己的Agent数据集。数据集格式需要符合[自定义数据集](%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E9%9B%86)的要求。更具体地，Agent的response/system应该符合上述的Action/Action Input/Observation格式。\\n\\n我们将**MLP**和**Embedder**加入了lora_target_modules. 你可以通过指定`--lora_target_modules ALL`在所有的linear层(包括qkvo以及mlp和embedder)加lora. 这**通常是效果最好的**.\\n\\n微调使用了qwen-7b-chat模型，超参数如下：\\n\\n| 超参数                      | 值       |\\n| --------------------------- | -------- |\\n| LR                          | 5e-5     |\\n| Epoch                       | 2        |\\n| lora_rank                   | 8        |\\n| lora_alpha                  | 32       |\\n| lora_target_modules         | ALL      |\\n| batch_size                  | 2        |\\n| gradient_accumulation_steps | 32 total |\\n\\n运行命令和其他超参数如下:\\n\\n```shell\\n# Experimental environment: 8GPU\\nnproc_per_node=8\\n\\nPYTHONPATH=../../.. \\\\\\ntorchrun \\\\\\n    --nproc_per_node=$nproc_per_node \\\\\\n    --master_port 29500 \\\\\\n    llm_sft.py \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --model_revision master \\\\\\n    --sft_type lora \\\\\\n    --tuner_backend peft \\\\\\n    --dtype AUTO \\\\\\n    --output_dir output \\\\\\n    --dataset ms-agent \\\\\\n    --train_dataset_mix_ratio 2.0 \\\\\\n    --train_dataset_sample -1 \\\\\\n    --num_train_epochs 2 \\\\\\n    --max_length 1500 \\\\\\n    --check_dataset_strategy warning \\\\\\n    --lora_rank 8 \\\\\\n    --lora_alpha 32 \\\\\\n    --lora_dropout 0.05 \\\\\\n    --lora_target_modules ALL \\\\\\n    --self_cognition_sample 3000 \\\\\\n    --model_name 卡卡罗特 \\\\\\n    --model_author 陶白白 \\\\\\n    --gradient_checkpointing true \\\\\\n    --batch_size 2 \\\\\\n    --weight_decay 0.1 \\\\\\n    --learning_rate 5e-5 \\\\\\n    --gradient_accumulation_steps $(expr 32 / $nproc_per_node) \\\\\\n    --max_grad_norm 0.5 \\\\\\n    --warmup_ratio 0.03 \\\\\\n    --eval_steps 100 \\\\\\n    --save_steps 100 \\\\\\n    --save_total_limit 2 \\\\\\n    --logging_steps 10\\n```\\n\\n在官方实验中，训练过程使用了8GPU硬件环境，**训练时长3小时**。\\n\\n> [!NOTE]\\n>\\n> 1. 该训练使用消费级单显卡也可以运行（对应**占用显存22G**），用户将DDP命令改为单卡命令即可\\n>\\n> 2. LoRA训练的遗忘问题并不严重，可以适当调低ms-bench数据集的比例，提高训练速度\\n\\n## 推理\\n\\n我们针对通用知识和Agent进行评测。下面列出了一个简单的评测结果。\\n\\n### 原始模型\\n\\n#### 通用知识\\n\\n> 西湖醋鱼怎么做\\n\\n![image-20240201122323540](../../resources/image-20240201122323540.png)\\n\\n> 新冠和普通感冒有什么区别\\n\\n![image-20240201122441874](../../resources/image-20240201122441874.png)\\n\\n#### Agent能力\\n\\n我们使用一个火焰报警场景作为测试用例：\\n\\n```text\\nAnswer the following questions as best you can. You have access to the following APIs:\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\n\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\n\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\n```\\n\\n![image-20240201122625473](../../resources/image-20240201122625473.png)\\n\\n![image-20240201122725477](../../resources/image-20240201122725477.png)\\n\\n![image-20240201131811038](../../resources/image-20240201131811038.png)\\n\\n可以看到，人工输入Observation后模型答案并不正确。\\n\\n### 训练后\\n\\n#### 通用知识\\n\\n> 西湖醋鱼怎么做\\n\\n![image-20240201132124061](../../resources/image-20240201132124061.png)\\n\\n![image-20240201132139698](../../resources/image-20240201132139698.png)\\n\\n> 新冠和普通感冒有什么区别\\n\\n![image-20240201132308260](../../resources/image-20240201132308260.png)\\n\\n#### Agent能力\\n\\n![image-20240201132421298](../../resources/image-20240201132421298.png)\\n\\n![image-20240201132454465](../../resources/image-20240201132454465.png)\\n\\n可以看到，训练后模型可以正确调用API并给出最终答案。\\n\\n#### 自我认知\\n\\n![image-20240201133359457](../../resources/image-20240201133359457.png)\\n\\n### 在命令行中使用Agent\\n\\n目前命令行的Agent推理支持需要指定`--eval_human true`，因为该参数为false的时候会读取数据集内容，此时无法手动传入`Observation:`后面的API调用结果。\\n\\n```shell\\n# 使用训练后的模型\\nswift infer --ckpt_dir output/qwen-7b-chat/vx-xxx/checkpoint-xxx --eval_human true --stop_words Observation: --infer_backend pt\\n# 也可以使用原始模型，如qwn-7b-chat或chatglm3-6b-32k等运行agent\\n# swift infer --model_type qwen-7b-chat --eval_human true --stop_words Observation: --infer_backend pt\\n# swift infer --model_type chatglm3-6b-32k --eval_human true --stop_words Observation: --infer_backend pt\\n```\\n\\n运行命令后，改变system字段：\\n\\n```shell\\n# 单行system\\n<<< reset-system\\n<<< Answer the following questions as best you can. You have access to the following APIs:\\\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\\\n\\\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\\\n\\\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\\\n\\\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\\\n\\\\nUse the following format:\\\\n\\\\nThought: you should always think about what to do\\\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\\\nAction Input: the input to the action\\\\nObservation: the result of the action\\\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\\\nThought: I now know the final answer\\\\nFinal Answer: the final answer to the original input question\\\\nBegin!\\n```\\n\\n如果需要以多行方式输入，可以用下面的命令(多行信息以#号结束)：\\n\\n```shell\\n# 多行system\\n<<< multi-line\\n<<<[M] reset-system#\\n<<<[MS] Answer the following questions as best you can. You have access to the following APIs:\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\n\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\n\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\n\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!#\\n```\\n\\n下面就可以进行Agent问答(注意如果使用多行模式输入行尾额外增加#号)：\\n\\n```shell\\n<<< 输入图片是/tmp/1.jpg，协助判断图片中是否存在着火点\\nThought: I need to use the fire\\\\_recognition API to analyze the input image and determine if there are any signs of fire.\\n\\nAction: Use the fire\\\\_recognition API to analyze the input image.\\n\\nAction Input: /tmp/1.jpg\\n\\nObservation:\\n<<< [{'coordinate': [101.1, 200.9], 'on_fire': True}]\\nThought: The fire\\\\_recognition API has returned a result indicating that there is fire in the input image.\\n\\nFinal Answer: There is fire in the input image.\\n```\\n\\n可以看到，模型已经返回了API调用的结果分析。用户可以继续问问题进行多轮Agent场景。也可以指定`--infer_backend vllm`和`--stream true`来使用vllm和流式推理。\\n\\n### 在部署中使用Agent\\n\\n由于部署不支持history管理，因此agent的API调用结果拼接需要用户自行进行，下面给出一个OpenAI格式可运行的代码范例。\\n\\n服务端：\\n\\n```shell\\n# 使用训练后的模型\\nswift deploy --ckpt_dir output/qwen-7b-chat/vx-xxx/checkpoint-xxx --stop_words Observation:\\n# 也可以使用原始模型，如qwen-7b-chat或chatglm3-6b-32k等运行agent\\n# swift deploy --model_type qwn-7b-chat --stop_words Observation:\\n# swift deploy --model_type chatglm3-6b-32k --stop_words Observation:\\n```\\n\\n客户端：\\n\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nsystem = \\\"\\\"\\\"Answer the following questions as best you can. You have access to the following APIs:\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\\\\\"name\\\\\\\": \\\\\\\"image\\\\\\\", \\\\\\\"description\\\\\\\": \\\\\\\"The input image to recognize fire\\\\\\\", \\\\\\\"required\\\\\\\": \\\\\\\"True\\\\\\\"}]\\n\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building's administraters. Parameters: []\\n\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\n\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nThought: I now know the final answer\\nFinal Answer: the final answer to the original input question\\nBegin!\\\"\\\"\\\"\\nmessages = [{\\n    'role': 'system',\\n    'content': system\\n}, {\\n    'role': 'user',\\n    'content': '输入图片是/tmp/1.jpg，协助判断图片中是否存在着火点'\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stop=['Observation:'],\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'response: {response}')\\n\\n# # 流式\\nmessages.append({'role': 'assistant', 'content': response + \\\"\\\\n[{'coordinate': [101.1, 200.9], 'on_fire': True}]\\\"})\\nprint(messages)\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stop=['Observation:'],\\n    stream=True,\\n    seed=42)\\n\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n## Output:\\n# model_type: qwen-7b-chat\\n# response: Thought: I need to check if there is fire in the image\\n# Action: Use fire\\\\_recognition API\\n# Action Input: /tmp/1.jpg\\n# Observation:\\n# [{'role': 'system', 'content': 'Answer the following questions as best you can. You have access to the following APIs:\\\\n1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{\\\"name\\\": \\\"image\\\", \\\"description\\\": \\\"The input image to recognize fire\\\", \\\"required\\\": \\\"True\\\"}]\\\\n\\\\n2. fire_alert: Call this tool to interact with the fire alert API. This API will start an alert to warn the building\\\\'s administraters. Parameters: []\\\\n\\\\n3. call_police: Call this tool to interact with the police calling API. This API will call 110 to catch the thief. Parameters: []\\\\n\\\\n4. call_fireman: Call this tool to interact with the fireman calling API. This API will call 119 to extinguish the fire. Parameters: []\\\\n\\\\nUse the following format:\\\\n\\\\nThought: you should always think about what to do\\\\nAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]\\\\nAction Input: the input to the action\\\\nObservation: the result of the action\\\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\\\nThought: I now know the final answer\\\\nFinal Answer: the final answer to the original input question\\\\nBegin!'}, {'role': 'user', 'content': '输入图片是/tmp/1.jpg，协助判断图片中是否存在着火点'}, {'role': 'assistant', 'content': \\\"Thought: I need to check if there is fire in the image\\\\nAction: Use fire\\\\\\\\_recognition API\\\\nAction Input: /tmp/1.jpg\\\\nObservation:\\\\n[{'coordinate': [101.1, 200.9], 'on_fire': True}]\\\"}]\\n# response:\\n# Final Answer: There is fire in the image at coordinates [101.1, 200.9]\\n```\\n\\n\\n\\n## 搭配Modelscope-Agent使用\\n结合[Modelscope-Agent](https://github.com/modelscope/modelscope-agent)，微调模型用于搭建Agent\\n\\n本节针对Modelscope-Agent中的交互式框架AgentFabric，微调小模型qwen-7b-chat使其具有function call能力\\n\\n由于ms-agent中的system prompt与Modelscope-Agent中的system prompt格式不匹配，直接训练效果不佳，为此我们根据ms-agent转换格式得到新数据集[ms_agent_for_agentfabric](https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary)，现已集成到SWIFT中。\\n其中`ms-agent-for-agentfabric-default`包含3万条由ms-agent转换的数据集，`ms-agent-for-agentfabric-additional`包含488条由开源的AgentFabric框架实际调用访问数据筛选得到\\n\\n\\n### 微调\\n将`dataset`换为`ms-agent-for-agentfabric-default`和`ms-agent-for-agentfabric-addition`\\n```shell\\n# Experimental environment: 8GPU\\nnproc_per_node=8\\n\\nPYTHONPATH=../../.. \\\\\\ntorchrun \\\\\\n    --nproc_per_node=$nproc_per_node \\\\\\n    --master_port 29500 \\\\\\n    llm_sft.py \\\\\\n    --model_id_or_path qwen/Qwen-7B-Chat \\\\\\n    --model_revision master \\\\\\n    --sft_type lora \\\\\\n    --tuner_backend swift \\\\\\n    --dtype AUTO \\\\\\n    --output_dir output \\\\\\n    --dataset ms-agent-for-agentfabric-default ms-agent-for-agentfabric-addition \\\\\\n    --train_dataset_mix_ratio 2.0 \\\\\\n    --train_dataset_sample -1 \\\\\\n    --num_train_epochs 2 \\\\\\n    --max_length 1500 \\\\\\n    --check_dataset_strategy warning \\\\\\n    --lora_rank 8 \\\\\\n    --lora_alpha 32 \\\\\\n    --lora_dropout 0.05 \\\\\\n    --lora_target_modules ALL \\\\\\n    --self_cognition_sample 3000 \\\\\\n    --model_name 卡卡罗特 \\\\\\n    --model_author 陶白白 \\\\\\n    --gradient_checkpointing true \\\\\\n    --batch_size 2 \\\\\\n    --weight_decay 0.1 \\\\\\n    --learning_rate 5e-5 \\\\\\n    --gradient_accumulation_steps $(expr 32 / $nproc_per_node) \\\\\\n    --max_grad_norm 0.5 \\\\\\n    --warmup_ratio 0.03 \\\\\\n    --eval_steps 100 \\\\\\n    --save_steps 100 \\\\\\n    --save_total_limit 2 \\\\\\n    --logging_steps 10\\n```\\n\\nmerge lora\\n```\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir '/path/to/qwen-7b-chat/vx-xxx/checkpoint-xxx' --merge_lora true\\n```\\n\\n### AgentFabric\\n#### 环境安装\\n```bash\\ngit clone https://github.com/modelscope/modelscope-agent.git\\ncd modelscope-agent  && pip install -r requirements.txt && pip install -r apps/agentfabric/requirements.txt\\n```\\n\\n#### 部署模型\\n使用以下任意一种方式部署模型\\n##### swift deploy\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir /path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged\\n```\\n\\n##### vllm\\n```bash\\npython -m vllm.entrypoints.openai.api_server --model /path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged --trust-remote-code\\n```\\n\\n#### 添加本地模型配置\\n在`/path/to/modelscope-agent/apps/agentfabric/config/model_config.json`中，新增合并后的本地模型\\n```\\n    \\\"my-qwen-7b-chat\\\": {\\n        \\\"type\\\": \\\"openai\\\",\\n        \\\"model\\\": \\\"/path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged\\\",\\n        \\\"api_base\\\": \\\"http://localhost:8000/v1\\\",\\n        \\\"is_chat\\\": true,\\n        \\\"is_function_call\\\": false,\\n        \\\"support_stream\\\": false\\n    }\\n```\\n注意，如果使用`swift deploy`部署，需要将`\\\"model\\\"`的值设为`qwen-7b-chat`\\n\\n#### 启动AgentFabric\\n在以下实践中，会调用[Wanx Image Generation](https://help.aliyun.com/zh/dashscope/opening-service?spm=a2c4g.11186623.0.0.50724937O7n40B)和[高德天气](https://lbs.amap.com/api/webservice/guide/create-project/get-key),需要手动设置API KEY, 设置后启动AgentFabric\\n```bash\\nexport PYTHONPATH=$PYTHONPATH:/path/to/your/modelscope-agent\\nexport DASHSCOPE_API_KEY=your_api_key\\nexport AMAP_TOKEN=your_api_key\\ncd modelscope-agent/apps/agentfabric\\npython app.py\\n```\\n\\n进入AgentFabric后，在配置(Configure)的模型中选择本地模型`my-qwen-7b-chat`\\n\\n内置能力选择agent可以调用的API, 这里选择`Wanx Image Generation`和`高德天气`\\n\\n点击更新配置，等待配置完成后在右侧的输入栏中与Agent交互\\n> 天气查询\\n![agentfabric_1](../../resources/agentfabric_1.png)\\n![agentfabric_2](../../resources/agentfabric_2.png)\\n\\n> 文生图\\n![agentfabric_3](../../resources/agentfabric_3.png)\\n![agentfabric_4](../../resources/agentfabric_4.png)\\n\\n可以看到微调后的模型可以正确理解指令并调用工具\\n\\n\\n## 总结\\n\\n通过SWIFT支持的Agent训练能力，我们使用ms-agent和ms-bench对qwen-7b-chat模型进行了微调。可以看到微调后模型保留了通用知识问答能力，并在system字段增加了API的情况下可以正确调用并完成任务。需要注意的是：\\n\\n1. 训练从LoRA变为全参数训练，知识遗忘问题会更加严重，数据集混合比例需要实际测试调整\\n2. 部分模型可能在训练后仍然调用效果不佳，可以测试该模型本身预训练能力是否扎实\\n3. Agent训练集格式、语种有细节改变后，对应推理阶段的格式也需要相应调整，否则可能效果不佳\\n4. 重要位置的`\\\\n`等特殊字符比较重要，请注意推理和训练格式统一\\n\\n\\n# Benchmark\\n## 目录\\n- [参数设置](#参数设置)\\n- [量化](#量化)\\n- [Model Type & Max Length](#model-type--max-length)\\n- [Batch Size](#batch-size)\\n- [Use Flash Attn & Gradient Checkpointing](#use-flash-attn--gradient-checkpointing)\\n- [LoRA Rank & LoRA Target Modules](#lora-rank--lora-target-modules)\\n- [Gradient Accumulation Steps](#gradient-accumulation-steps)\\n- [Tuners](#Tuners)\\n- [Export](#Export)\\n- [AWQ](#AWQ)\\n- [AQLM](#AQLM)\\n- [Sequence Parallel](#Sequence-Parallel)\\n\\n## 参数设置\\n实验环境:\\n- A100\\n- CUDA 11.8\\n- python 3.10\\n- torch 2.1.1\\n- flash_attn 2.3.4\\n- xformers 0.0.23\\n- auto_gptq 0.5.1\\n- bitsandbytes 0.41.3.post2\\n\\n\\n以下为所有实验的相同命令行设置部分:\\n```bash\\n    --dataset_test_ratio 0 \\\\\\n    --dataset cls-fudan-news-zh \\\\\\n    --save_strategy no \\\\\\n    --check_dataset_strategy warning \\\\\\n    --preprocess_num_proc 4 \\\\\\n```\\n\\n如果未指定以下参数, 则使用以下默认值:\\n```bash\\n    --max_length 2048 \\\\\\n    --batch_size 1 \\\\\\n    --gradient_checkpointing true \\\\\\n    --use_flash_attn true \\\\\\n    --lora_rank 8 \\\\\\n    --lora_target_modules DEFAULT \\\\\\n    --quantization_bit 0 \\\\\\n    --gradient_accumulation_steps 16 \\\\\\n```\\n\\n对应测试数据集的token数统计量(由qwen的tokenizer获取): 3234.4±2547.5, min=91, max=19548.\\n\\n实验使用脚本可以查看`scripts/benchmark/test_memory_time/`.\\n\\n## 量化\\n测试脚本为:\\n```bash\\nswift sft \\\\\\n    --model_type {MODEL_TYPE} \\\\\\n    --quantization_bit {QUANTIZATION_BIT} \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Quantization</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>bf16</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (gptq)</td>\\n        <td>2.05</td>\\n        <td>19.21</td>\\n    </tr>\\n    <tr>\\n        <td>int8 (gptq)</td>\\n        <td>1.97</td>\\n        <td>22.20</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (bnb)</td>\\n        <td>2.41</td>\\n        <td>23.85</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-14b-chat</td>\\n        <td>bf16</td>\\n        <td>2.60</td>\\n        <td>40.14</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (gptq)</td>\\n        <td>1.15</td>\\n        <td>23.30</td>\\n    </tr>\\n    <tr>\\n        <td>int8 (gptq)</td>\\n        <td>1.08</td>\\n        <td>29.13</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (bnb)</td>\\n        <td>1.36</td>\\n        <td>30.05</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-72b-chat</td>\\n        <td>bf16</td>\\n        <td>0.59 (2*A100)</td>\\n        <td>73.71+78.54</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (gptq)</td>\\n        <td>0.23</td>\\n        <td>54.86</td>\\n    </tr>\\n    <tr>\\n        <td>int8 (gptq)</td>\\n        <td>0.21</td>\\n        <td>78.44</td>\\n    </tr>\\n    <tr>\\n        <td>int4 (bnb)</td>\\n        <td>0.28</td>\\n        <td>74.87</td>\\n    </tr>\\n</table>\\n\\n## Model Type & Max Length\\n### LoRA\\n测试脚本为:\\n```bash\\nswift sft \\\\\\n    --model_type {MODEL_TYPE} \\\\\\n    --max_length {MAX_LENGTH} \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Max Length</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-1_8b-chat</td>\\n        <td>512</td>\\n        <td>9.88</td>\\n        <td>6.99</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>9.90</td>\\n        <td>10.71</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>8.77</td>\\n        <td>16.35</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>5.92</td>\\n        <td>23.80</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>4.19</td>\\n        <td>37.03</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-7b-chat</td>\\n        <td>512</td>\\n        <td>7.43</td>\\n        <td>18.01</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>6.51</td>\\n        <td>21.73</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>2.05</td>\\n        <td>35.31</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.34</td>\\n        <td>48.41</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-14b-chat</td>\\n        <td>512</td>\\n        <td>5.63</td>\\n        <td>30.14</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>4.36</td>\\n        <td>34.43</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>2.60</td>\\n        <td>40.14</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.17</td>\\n        <td>47.95</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.79</td>\\n        <td>60.74</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-72b-chat (2*A100)</td>\\n        <td>512</td>\\n        <td>1.41</td>\\n        <td>67.68+73.07</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>1.02</td>\\n        <td>70.25+77.11</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>0.59</td>\\n        <td>73.71+78.54</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>-</td>\\n        <td>OOM</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>-</td>\\n        <td>OOM</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">chatglm3-6b</td>\\n        <td>512</td>\\n        <td>6.72</td>\\n        <td>13.94</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>6.16</td>\\n        <td>12.99</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>4.20</td>\\n        <td>17.20</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.92</td>\\n        <td>29.80</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.24</td>\\n        <td>66.82</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">yi-6b-chat</td>\\n        <td>512</td>\\n        <td>5.27</td>\\n        <td>13.72</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>5.07</td>\\n        <td>15.44</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.84</td>\\n        <td>16.95</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.99</td>\\n        <td>28.25</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.35</td>\\n        <td>43.81</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">yi-34b-chat</td>\\n        <td>512</td>\\n        <td>2.32</td>\\n        <td>66.72</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>1.76</td>\\n        <td>69.10</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>1.05</td>\\n        <td>71.34</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>0.47</td>\\n        <td>78.72</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.31 (2*A100)</td>\\n        <td>47.01+65.03</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">openbuddy-zephyr-7b-chat</td>\\n        <td>512</td>\\n        <td>5.17</td>\\n        <td>14.99</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>3.92</td>\\n        <td>16.57</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.08</td>\\n        <td>19.89</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.85</td>\\n        <td>23.29</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.92</td>\\n        <td>52.14</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">baichuan2-7b-chat</td>\\n        <td>512</td>\\n        <td>6.09</td>\\n        <td>18.18</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>5.36</td>\\n        <td>17.45</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.43</td>\\n        <td>19.18</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.69</td>\\n        <td>34.22</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.16</td>\\n        <td>45.47</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">baichuan2-13b-chat</td>\\n        <td>512</td>\\n        <td>5.32</td>\\n        <td>31.01</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>3.91</td>\\n        <td>31.58</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>1.77</td>\\n        <td>32.40</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>0.65</td>\\n        <td>49.63</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.36</td>\\n        <td>76.17</td>\\n    </tr>\\n</table>\\n\\n\\n### Full\\n测试脚本为:\\n```bash\\nswift sft \\\\\\n    --model_type {MODEL_TYPE} \\\\\\n    --max_length {MAX_LENGTH} \\\\\\n    --sft_type full \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [FULL]</td>\\n        <td>Max Length</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-1_8b-chat</td>\\n        <td>512</td>\\n        <td>10.77</td>\\n        <td>18.16</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>10.39</td>\\n        <td>18.62</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>8.73</td>\\n        <td>35.11</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>5.45</td>\\n        <td>31.62</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>3.81</td>\\n        <td>38.93</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-7b-chat</td>\\n        <td>512</td>\\n        <td>5.96</td>\\n        <td>73.37</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>5.00</td>\\n        <td>73.64</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>3.30</td>\\n        <td>74.26</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>1.64</td>\\n        <td>78.76</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>1.11 (2*A100)</td>\\n        <td>61.34+73.00</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"5\\\">qwen-14b-chat (2*A100)</td>\\n        <td>512</td>\\n        <td>3.66</td>\\n        <td>60.42+72.31</td>\\n    </tr>\\n    <tr>\\n        <td>1024</td>\\n        <td>2.98</td>\\n        <td>60.61+74.37</td>\\n    </tr>\\n    <tr>\\n        <td>2048</td>\\n        <td>1.93</td>\\n        <td>60.70+78.22</td>\\n    </tr>\\n    <tr>\\n        <td>4096</td>\\n        <td>0.92</td>\\n        <td>75.59+78.64</td>\\n    </tr>\\n    <tr>\\n        <td>8192</td>\\n        <td>0.62</td>\\n        <td>76.59+77.68</td>\\n    </tr>\\n</table>\\n\\n\\n## Batch Size\\n测试脚本为:\\n```bash\\nswift sft \\\\\\n    --batch_size {BATCH_SIZE} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Batch Size</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>1</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>2</td>\\n        <td>3.60</td>\\n        <td>43.11</td>\\n    </tr>\\n    <tr>\\n        <td>4</td>\\n        <td>3.02</td>\\n        <td>63.81</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>2.77</td>\\n        <td>76.14</td>\\n    </tr>\\n</table>\\n\\n## Use Flash Attn & Gradient Checkpointing\\n测试脚本为:\\n```bash\\nswift sft \\\\\\n    --use_flash_attn {USE_FLASH_ATTN} \\\\\\n    --gradient_checkpointing {GRADIENT_CHECKPOINTING} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n     <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Use Flash Attn</td>\\n        <td>Gradient Checkpointing</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>&#x2714;</td>\\n        <td>&#x2714;</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>&#x2714;</td>\\n        <td>&#x2718;</td>\\n        <td>6.19</td>\\n        <td>37.70</td>\\n    </tr>\\n    <tr>\\n        <td>&#x2718;</td>\\n        <td>&#x2714;</td>\\n        <td>3.13</td>\\n        <td>27.71</td>\\n    </tr>\\n    <tr>\\n        <td>&#x2718;</td>\\n        <td>&#x2718;</td>\\n        <td>4.45</td>\\n        <td>57.67</td>\\n    </tr>\\n</table>\\n\\n\\n## LoRA Rank & LoRA Target Modules\\n测试脚本为:\\n```bash\\nswift sft \\\\\\n    --lora_rank {LORA_RANK} \\\\\\n    --lora_target_modules {LORA_TARGET_MODULES} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>LoRA Rank</td>\\n        <td>LoRA Target Modules</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n        <td>Trainable Params (M)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"4\\\">qwen-7b-chat</td>\\n        <td>2</td>\\n        <td>DEFAULT (c_attn)</td>\\n        <td>4.27</td>\\n        <td>27.72</td>\\n        <td>1.05</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>DEFAULT</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n        <td>4.19</td>\\n    </tr>\\n    <tr>\\n        <td>64</td>\\n        <td>DEFAULT</td>\\n        <td>4.19</td>\\n        <td>27.85</td>\\n        <td>33.55</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>ALL (all linear)</td>\\n        <td>3.22</td>\\n        <td>27.87</td>\\n        <td>17.89</td>\\n    </tr>\\n</table>\\n\\n\\n## Gradient Accumulation Steps\\n测试脚本为:\\n```bash\\nswift sft \\\\\\n    --gradient_accumulation_steps {GRADIENT_ACCUMULATION_STEPS} \\\\\\n    --model_type qwen-7b-chat \\\\\\n    --sft_type lora \\\\\\n    ...\\n```\\n\\n<table>\\n    <tr>\\n        <td>Model Type [LoRA]</td>\\n        <td>Gradient Accumulation Steps</td>\\n        <td>Training Speed (samples/s)</td>\\n        <td>GPU Memory (GiB)</td>\\n    </tr>\\n    <tr>\\n        <td rowspan=\\\"7\\\">qwen-7b-chat</td>\\n        <td>1</td>\\n        <td>4.26</td>\\n        <td>27.73</td>\\n    </tr>\\n    <tr>\\n        <td>2</td>\\n        <td>4.32</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>4</td>\\n        <td>4.31</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>8</td>\\n        <td>4.32</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>16</td>\\n        <td>4.33</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>32</td>\\n        <td>4.30</td>\\n        <td>27.74</td>\\n    </tr>\\n    <tr>\\n        <td>64</td>\\n        <td>4.32</td>\\n        <td>27.74</td>\\n    </tr>\\n</table>\\n\\n## Tuners\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|adalora|qwen-7b-chat|ms-agent|2.0|adalora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|26.8389(0.3464%)|True|True|lr=5e-05/epoch=2|32.55GiB|0.92(87543 samples/95338.71 seconds)|17.33(2345 tokens/135.29 seconds)|0.57|1.07|0.391|0.665|0.569|\\n|adapter|qwen-7b-chat|ms-agent|2.0|adapter||33.6896(0.4344%)|True|True|lr=5e-05/epoch=2|32.19GiB|1.48(87543 samples/59067.71 seconds)|26.63(4019 tokens/150.90 seconds)|0.55|1.03|0.438|0.662|0.565|\\n|dora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=True|19.2512(0.2487%)|True|True|lr=5e-05/epoch=2|32.46GiB|0.51(87543 samples/171110.54 seconds)|4.29(2413 tokens/562.32 seconds)|0.53|1.01|0.466|0.683|**0.577**|\\n|full+galore128|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.02GiB|1.10(87543 samples/79481.96 seconds)|28.96(2400 tokens/82.88 seconds)|0.55|1.00|0.358|**0.688**|**0.577**|\\n|full+galore32|qwen-7b-chat|ms-agent|2.0|full|galore_rank=32/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.05GiB|1.11(87543 samples/78989.74 seconds)|29.17(2431 tokens/83.35 seconds)|0.56|1.01|0.386|0.667|0.539|\\n|full+galore64|qwen-7b-chat|ms-agent|2.0|full|galore_rank=64/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|46.91GiB|1.11(87543 samples/79200.36 seconds)|28.94(2448 tokens/84.60 seconds)|0.56|1.01|0.397|0.674|0.544|\\n|full+galore_emb|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=true|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|44.53GiB|1.10(87543 samples/79775.02 seconds)|29.45(2433 tokens/82.62 seconds)|0.55|1.00|0.398|0.670|0.568|\\n|full+galore_perparam|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=true/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|47.02GiB|1.25(87543 samples/69821.89 seconds)|29.02(2478 tokens/85.39 seconds)|0.54|1.00|0.372|0.669|0.524|\\n|full+galore128+quantize+proj_quant|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|41.53GiB|1.45(76982 samples/52947.54 seconds)||0.54|1.00||||\\n|full+galore128+quantize|qwen-7b-chat|ms-agent|2.0|full|galore_rank=128/galore_per_parameter=false/galore_with_embedding=false|7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|41.72GiB|1.46(76982 samples/52583.22 seconds)||0.54|1.00||||\\n|full+no_mix|qwen-7b-chat|ms-agent|0.0|full||7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|72.56GiB|1.27(29698 samples/23356.97 seconds)|30.31(11738 tokens/387.29 seconds)|0.57|**0.44**|0.174|0.652|0.553|\\n|full|qwen-7b-chat|ms-agent|2.0|full||7721.3245(100.0000%)|True|True|lr=5e-05/epoch=2|73.53GiB|1.43(87543 samples/61022.97 seconds)|29.51(3382 tokens/114.62 seconds)|0.54|0.95|0.343|0.536|0.495|\\n|llamapro|qwen-7b-chat|ms-agent|2.0|llamapro|num_blocks=4|809.5826(9.4900%)|True|True|lr=5e-05/epoch=2|38.11GiB|1.53(87543 samples/57294.42 seconds)|25.80(2374 tokens/92.02 seconds)|0.53|1.00|0.434|0.645|0.357|\\n|lora+|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=16.0/use_rslora=False/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.95(87543 samples/91923.80 seconds)|18.81(3329 tokens/176.94 seconds)|0.53|0.98|0.432|0.647|0.344|\\n|lora+neftune|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/neftune_noise_alpha=15.0|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.96(87543 samples/91525.50 seconds)|19.84(161792 tokens/8156.02 seconds)|0.53|1.02|0.456|0.671|0.401|\\n|lora+no_mix|qwen-7b-chat|ms-agent|0.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|30.86GiB|0.91(29698 samples/32570.15 seconds)|19.89(36308 tokens/1825.26 seconds)|0.53|0.53|0.470|0.666|0.574|\\n|lora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.95(87543 samples/91974.29 seconds)|18.11(2415 tokens/133.32 seconds)|0.53|1.01|0.462|0.676|0.304|\\n|qwen-7b-chat-eval|qwen-7b-chat|None|0.0|None||None(None)||||None||30.81(13765 tokens/446.83 seconds)|||**0.517**|0.679|0.568|\\n|rslora|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=True/use_dora=False|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.35GiB|0.94(87543 samples/92758.63 seconds)|18.87(2762 tokens/146.34 seconds)|**0.53**|0.99|0.451|0.679|0.339|\\n| full+lisa_2          | qwen-7b-chat | ms-agent | 2.0                | full     | lisa_activated_layers=2/lisa_step_interval=20                | -                    | True       | True                   | lr=5e-05/epoch=2 | 31.11GiB | 2.66(76837 samples/28881.28 seconds)  | 36.10(134469 tokens/3725.21 seconds) | 0.62       | 1.06      | 0.349              | 0.653            | 0.592              |\\n| full+lisa_4          | qwen-7b-chat | ms-agent | 2.0                | full     | lisa_activated_layers=4/lisa_step_interval=20                | -                    | True       | True                   | lr=5e-05/epoch=2 | 31.87GiB | 2.63(76837 samples/29215.15 seconds)  | 36.75(135477 tokens/3686.17 seconds) | 0.63       | 1.06      | 0.377              | 0.656            | **0.607**          |\\n|lora+packing+ddp|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/packing=True|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|35.65GiB*2|1.56(7900 samples/5057.30 seconds)|26.20(421094 tokens/16073.09 seconds)|0.63|0.98|0.473|0.664|0.552|\\n|lora+packing+lazytokenize|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/packing=True|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|32.83GiB|7.69(78237 samples/10179.40 seconds)|25.86(307390 tokens/11888.17 seconds)|0.63|1.04|0.472|0.660|0.554|\\n|lora+packing|qwen-7b-chat|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False/packing=True|17.8913(0.2312%)|True|True|lr=5e-05/epoch=2|28.06GiB|0.79(7900 samples/10048.53 seconds)|26.12(409507 tokens/15675.36 seconds)|0.61|0.95|0.492|0.676|0.539|\\n\\n## unsloth\\n\\n| exp_name        | model_type         | dataset  | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers           | memory   | train speed(samples/s)               | infer speed(tokens/s)                 | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| --------------- | ------------------ | -------- | ------------------ | ----- | ------------ | ------------------- | ---------- | ---------------------- | ---------------- | -------- | ------------------------------------ | ------------------------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n| unsloth+lora+q4 | llama3-8b-instruct | ms-agent | 2.0                | lora  |              | 4.7186(0.1038%)     | True       | True                   | lr=5e-05/epoch=2 | 21.69GiB | 1.76(76839 samples/43763.01 seconds) | 15.22(160885 tokens/10570.90 seconds) | 0.58       | 1.03      | 0.668              | 0.755            | 0.501              |\\n\\n## Export\\n\\n| exp_name | model_type | calibration dataset | quantization method | quantization bits | infer speed(tokens/s) | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------------------- | ------------------- | ----------------- | --------------------- | ------------------ | ---------------- | ------------------ |\\n|awq-ms-bench-mini|qwen-7b-chat|ms-bench-mini|awq|4|27.25(16501 tokens/605.47 seconds)|0.494|0.665|0.571|\\n|awq-pileval|qwen-7b-chat|pileval|awq|4|26.92(12994 tokens/482.72 seconds)|**0.497**|**0.675**|**0.577**|\\n|gptq-ms-bench-mini|qwen-7b-chat|ms-bench-mini|gptq|4|31.16(15349 tokens/492.54 seconds)|0.482|0.642|0.556|\\n|gptq-pileval|qwen-7b-chat|pileval|gptq|4|31.67(15185 tokens/479.54 seconds)|0.478|0.654|0.559|\\n\\n## AWQ\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|qwen1half-7b-chat-awq|qwen1half-7b-chat-awq|ms-agent|2.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|19.9885(1.5802%)|True|True|lr=5e-05/epoch=2|24.26GiB|0.45(87543 samples/194746.58 seconds)|16.08(2469 tokens/153.58 seconds)|**0.55**|**1.19**|**0.505**|**0.737**|**0.656**|\\n\\n## AQLM\\n\\n| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\n| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\n|llama2-7b-aqlm-2bit-1x16|llama2-7b-aqlm-2bit-1x16|dureader-robust-zh|0.0|lora|rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False|19.9885(1.6510%)|True|True|lr=5e-05/epoch=2|4.04GiB|0.17(14994 samples/86140.71 seconds)||**0.48**|**0.74**||||\\n\\n\\n## Sequence Parallel\\n\\n<table>\\n\\n<tr>\\n<td>Model</td>\\n<td>Dataset</td>\\n<td>Hyper params</td>\\n<td>Total steps</td>\\n<td>Train speed</td>\\n<td>Gpu memory</td>\\n</tr>\\n\\n<tr>\\n<td rowspan=\\\"4\\\">chatglm3-6b-32k</td>\\n<td rowspan=\\\"4\\\">long-alpaca-12k(8055 tokens * 12000 rows)</td>\\n<td>gpu=2/sequence_parallel_size=1(双GPU DDP基准测试)</td>\\n<td>5940</td>\\n<td>0.30iter/s(5h13min total)</td>\\n<td>27G*2</td>\\n</tr>\\n\\n\\n<tr>\\n<td>gpu=2/sequence_parallel_size=2(双GPU序列并行2)</td>\\n<td>11880</td>\\n<td>0.5iter/s(6h total)</td>\\n<td>20G*2</td>\\n</tr>\\n\\n<tr>\\n<td>gpu=4/sequence_parallel_size=4(四GPU序列并行4)</td>\\n<td>11880</td>\\n<td>1iter/s(3h20min total)</td>\\n<td>18G*4</td>\\n</tr>\\n\\n<tr>\\n<td>gpu=4/sequence_parallel_size=2(四GPU序列并行2)</td>\\n<td>5940</td>\\n<td>0.45iter/s(3h total)</td>\\n<td>21G*4</td>\\n</tr>\\n\\n</table>\\n\\n\\n\\n# 自我认知微调最佳实践\\n10分钟微调专属于自己的大模型！\\n\\n## 目录\\n- [环境安装](#环境安装)\\n- [微调前推理](#微调前推理)\\n- [微调](#微调)\\n- [微调后推理](#微调后推理)\\n- [Web-UI](#web-ui)\\n\\n\\n## 环境安装\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## 微调前推理\\n\\n使用python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import ModelType, InferArguments, infer_main\\ninfer_args = InferArguments(model_type=ModelType.qwen2_7b_instruct)\\ninfer_main(infer_args)\\n\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是阿里云开发的一款超大规模语言模型，我叫通义千问。\\n--------------------------------------------------\\n<<< what's your name?\\nMy name is Qianwen, which is also known as Tongyi Qianwen. I am a large-scale language model created by Alibaba Cloud.\\n--------------------------------------------------\\n<<< 你是谁研发的？\\n我是由阿里云研发的。如果您有任何问题或需要帮助，请随时告诉我，我会尽力提供支持。\\n--------------------------------------------------\\n<<< 浙江的省会在哪？\\n浙江省的省会是杭州市。\\n--------------------------------------------------\\n<<< 这有什么好吃的？\\n浙江省，简称“浙”，位于中国东南沿海长江三角洲南翼，是中国东南沿海的一个重要省份，拥有丰富的美食文化。以下是一些浙江省内非常有名的美食：\\n\\n1. **西湖醋鱼**：一道以西湖草鱼为主料，用酸甜口味烹制的名菜，口感鲜美，酸甜适中。\\n\\n2. **东坡肉**：源于宋代大文豪苏东坡的名菜，以五花肉为主料，经过长时间的炖煮，肉质酥软，味道醇厚。\\n\\n3. **龙井虾仁**：以龙井茶为调料，搭配新鲜虾仁，色香味俱佳，是杭州的特色菜之一。\\n\\n4. **宁波汤圆**：宁波汤圆以皮薄馅多、甜而不腻著称，是宁波的传统小吃。\\n\\n5. **金华火腿**：金华火腿以其色泽红润、香气浓郁、肉质鲜美而闻名，是浙江省的特产之一。\\n\\n6. **绍兴黄酒**：绍兴黄酒是中国最著名的黄酒之一，以其独特的酿造工艺和丰富的口感深受人们喜爱。\\n\\n7. **海鲜**：浙江省沿海，海鲜种类繁多，新鲜的海鲜如大闸蟹、海虾、海鱼等，是不可错过的美味。\\n\\n8. **杭州小笼包**：与上海小笼包类似，但杭州的小笼包皮更薄，汤汁更丰富，是杭州的特色小吃之一。\\n\\n浙江省的美食丰富多样，以上只是其中的一部分，希望您有机会亲自品尝，享受美食带来的乐趣。\\n--------------------------------------------------\\n<<< 晚上睡不着觉怎么办\\n晚上睡不着觉可能由多种原因引起，包括压力、焦虑、生活习惯、环境因素等。以下是一些帮助改善睡眠质量的建议：\\n\\n1. **建立规律的睡眠习惯**：每天尽量在同一时间上床睡觉和起床，即使在周末也是如此。这有助于调整你的生物钟。\\n\\n2. **创造良好的睡眠环境**：确保你的卧室安静、黑暗、凉爽，并且床铺舒适。使用遮光窗帘、耳塞或白噪音机可以帮助改善睡眠环境。\\n\\n3. **限制咖啡因和酒精的摄入**：尤其是在睡前几小时内，避免摄入咖啡因和酒精，因为它们可能干扰睡眠。\\n\\n4. **减少蓝光暴露**：睡前避免使用手机、电脑和电视等发出蓝光的设备，因为蓝光可能抑制褪黑激素的产生，影响睡眠。\\n\\n5. **放松身心**：尝试进行深呼吸、冥想、瑜伽或温水浴等放松活动，帮助减轻压力和焦虑。\\n\\n6. **避免午睡过长**：如果你白天有长时间的午睡，可能会干扰晚上的睡眠。尽量控制午睡时间在30分钟以内。\\n\\n7. **适量运动**：定期进行适量的体育活动，如散步、游泳或骑自行车，可以帮助改善睡眠质量。但避免在睡前进行剧烈运动。\\n\\n8. **避免在床上做非睡眠活动**：将床作为睡觉和性活动的地方，避免在床上工作、看电视或使用电子设备。\\n\\n如果尝试了上述方法后仍然无法改善睡眠问题，建议咨询医生或睡眠专家，以排除潜在的健康问题。\\n\\\"\\\"\\\"\\n```\\n如果你要进行单样本推理, 可以参考[LLM推理文档](LLM%E6%8E%A8%E7%90%86%E6%96%87%E6%A1%A3.md#qwen-7b-chat)\\n\\n使用CLI:\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-7b-instruct\\n```\\n\\n## 微调\\n提示: 因为自我认知训练涉及到知识编辑, 建议对**MLP**加lora_target_modules. 你可以通过指定`--lora_target_modules ALL`在所有的linear层(包括qkvo以及mlp)加lora. 这**通常是效果最好的**.\\n\\n使用python:\\n```python\\n# Experimental environment: 3090, V100, ...\\n# 24GB GPU memory\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import DatasetName, ModelType, SftArguments, sft_main\\n\\nsft_args = SftArguments(\\n    model_type=ModelType.qwen2_7b_instruct,\\n    dataset=[f'{DatasetName.alpaca_zh}#500', f'{DatasetName.alpaca_en}#500',\\n             f'{DatasetName.self_cognition}#500'],\\n    max_length=2048,\\n    learning_rate=1e-4,\\n    output_dir='output',\\n    lora_target_modules=['ALL'],\\n    model_name=['小黄', 'Xiao Huang'],\\n    model_author=['魔搭', 'ModelScope'])\\noutput = sft_main(sft_args)\\nlast_model_checkpoint = output['last_model_checkpoint']\\nprint(f'last_model_checkpoint: {last_model_checkpoint}')\\n\\n\\\"\\\"\\\"Out[0]\\n[INFO:swift] The logging file will be saved in: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/logging.jsonl\\n{'loss': 1.8210969, 'acc': 0.6236614, 'grad_norm': 2.75, 'learning_rate': 2e-05, 'memory(GiB)': 16.79, 'train_speed(iter/s)': 0.155172, 'epoch': 0.01, 'global_step': 1}\\n{'loss': 1.75309932, 'acc': 0.63371617, 'grad_norm': 3.765625, 'learning_rate': 0.0001, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.210486, 'epoch': 0.05, 'global_step': 5}\\n{'loss': 1.42493172, 'acc': 0.65476351, 'grad_norm': 1.671875, 'learning_rate': 9.432e-05, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.221159, 'epoch': 0.11, 'global_step': 10}\\n{'loss': 1.16402645, 'acc': 0.69853611, 'grad_norm': 2.3125, 'learning_rate': 8.864e-05, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.223072, 'epoch': 0.16, 'global_step': 15}\\n{'loss': 1.18519087, 'acc': 0.68314366, 'grad_norm': 1.7578125, 'learning_rate': 8.295e-05, 'memory(GiB)': 18.48, 'train_speed(iter/s)': 0.224677, 'epoch': 0.21, 'global_step': 20}\\n{'loss': 1.09617777, 'acc': 0.69949636, 'grad_norm': 1.4296875, 'learning_rate': 7.727e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.225241, 'epoch': 0.27, 'global_step': 25}\\n{'loss': 1.09035854, 'acc': 0.70226536, 'grad_norm': 1.34375, 'learning_rate': 7.159e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.226112, 'epoch': 0.32, 'global_step': 30}\\n{'loss': 1.04421387, 'acc': 0.71705227, 'grad_norm': 1.65625, 'learning_rate': 6.591e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.225783, 'epoch': 0.38, 'global_step': 35}\\n{'loss': 0.97917967, 'acc': 0.73127871, 'grad_norm': 1.2265625, 'learning_rate': 6.023e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.226212, 'epoch': 0.43, 'global_step': 40}\\n{'loss': 0.94920969, 'acc': 0.74032536, 'grad_norm': 0.9140625, 'learning_rate': 5.455e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.225991, 'epoch': 0.48, 'global_step': 45}\\n{'loss': 0.99205322, 'acc': 0.73348026, 'grad_norm': 1.1640625, 'learning_rate': 4.886e-05, 'memory(GiB)': 19.46, 'train_speed(iter/s)': 0.224141, 'epoch': 0.54, 'global_step': 50}\\nTrain:  54%|███████████████████████████████████▍                              | 50/93 [03:42<03:19,  4.64s/it]\\n{'eval_loss': 1.03679836, 'eval_acc': 0.67676003, 'eval_runtime': 1.2396, 'eval_samples_per_second': 8.874, 'eval_steps_per_second': 8.874, 'epoch': 0.54, 'global_step': 50}\\nVal: 100%|████████████████████████████████████████████████████████████████████| 11/11 [00:01<00:00, 10.15it/s]\\n[INFO:swift] Saving model checkpoint to /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-50\\n{'loss': 0.98644152, 'acc': 0.73600368, 'grad_norm': 2.0625, 'learning_rate': 4.318e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.220983, 'epoch': 0.59, 'global_step': 55}\\n{'loss': 0.97522211, 'acc': 0.7305594, 'grad_norm': 1.1640625, 'learning_rate': 3.75e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.218717, 'epoch': 0.64, 'global_step': 60}\\n{'loss': 1.02459459, 'acc': 0.71822615, 'grad_norm': 1.125, 'learning_rate': 3.182e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.216185, 'epoch': 0.7, 'global_step': 65}\\n{'loss': 0.90719929, 'acc': 0.73806977, 'grad_norm': 1.078125, 'learning_rate': 2.614e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.21451, 'epoch': 0.75, 'global_step': 70}\\n{'loss': 0.88519163, 'acc': 0.74690943, 'grad_norm': 1.3359375, 'learning_rate': 2.045e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.21366, 'epoch': 0.81, 'global_step': 75}\\n{'loss': 0.95856657, 'acc': 0.72634115, 'grad_norm': 1.359375, 'learning_rate': 1.477e-05, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.213132, 'epoch': 0.86, 'global_step': 80}\\n{'loss': 0.88609543, 'acc': 0.75917048, 'grad_norm': 0.90625, 'learning_rate': 9.09e-06, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.211609, 'epoch': 0.91, 'global_step': 85}\\n{'loss': 0.97113533, 'acc': 0.73501945, 'grad_norm': 2.40625, 'learning_rate': 3.41e-06, 'memory(GiB)': 20.5, 'train_speed(iter/s)': 0.210918, 'epoch': 0.97, 'global_step': 90}\\nTrain: 100%|██████████████████████████████████████████████████████████████████| 93/93 [07:21<00:00,  5.05s/it]\\n{'eval_loss': 1.03077412, 'eval_acc': 0.68508706, 'eval_runtime': 1.2226, 'eval_samples_per_second': 8.997, 'eval_steps_per_second': 8.997, 'epoch': 1.0, 'global_step': 93}\\nVal: 100%|████████████████████████████████████████████████████████████████████| 11/11 [00:01<00:00, 10.26it/s]\\n[INFO:swift] Saving model checkpoint to /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n{'train_runtime': 443.3746, 'train_samples_per_second': 3.358, 'train_steps_per_second': 0.21, 'train_loss': 1.07190883, 'epoch': 1.0, 'global_step': 93}\\nTrain: 100%|██████████████████████████████████████████████████████████████████| 93/93 [07:23<00:00,  4.77s/it]\\n[INFO:swift] last_model_checkpoint: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n[INFO:swift] best_model_checkpoint: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n[INFO:swift] images_dir: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/images\\n[INFO:swift] End time of running main: 2024-06-07 10:18:41.386561\\nlast_model_checkpoint: /xxx/output/qwen2-7b-instruct/v2-20240607-101038/checkpoint-93\\n\\\"\\\"\\\"\\n```\\n\\n使用CLI (单卡):\\n```bash\\n# Experimental environment: A10, 3090, V100, ...\\n# 22GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen2-7b-instruct \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n```\\n\\n使用CLI (DeepSpeed-ZeRO2):\\n> 如果你使用的是3090等卡, 可以降低`max_length`来减少显存消耗.\\n```bash\\n# Experimental environment: 4 * 3090\\n# 4 * 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type qwen2-7b-instruct \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --deepspeed default-zero2\\n```\\n\\n## 微调后推理\\n你需要设置`last_model_checkpoint`的值, 该值会在sft的最后被打印出来.\\n\\n使用python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import InferArguments, merge_lora, infer_main\\n\\nlast_model_checkpoint = 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\ninfer_args = InferArguments(ckpt_dir=last_model_checkpoint)\\nmerge_lora(infer_args, device_map='cpu')\\nresult = infer_main(infer_args)\\n\\n\\n\\\"\\\"\\\"Out[0]\\n<<< 你好\\n你好！有什么我可以帮助你的吗？\\n--------------------------------------------------\\n<<< clear\\n<<< 你是谁？\\n我是小黄，由魔搭训练的人工智能语言模型。我的目的是帮助用户解答问题、提供信息和进行交流。有什么我可以帮助你的吗？\\n--------------------------------------------------\\n<<< what's your name?\\nI am a language model developed by ModelScope, and you can call me Xiao Huang.\\n--------------------------------------------------\\n<<< 你是谁研发的？\\n我是由魔搭研发的人工智能语言模型。\\n--------------------------------------------------\\n<<< 浙江的省会在哪？\\n浙江省的省会是杭州市。\\n--------------------------------------------------\\n<<< 这有什么好吃的？\\n杭州有许多美食，其中一些著名的有：\\n\\n1. 西湖醋鱼：这是一道经典的杭州菜，以西湖的鱼为主要原料，用醋和糖烹制而成。\\n\\n2. 龙井虾仁：这道菜以龙井茶和虾仁为主要原料，口感鲜美，清香扑鼻。\\n\\n3. 红烧肉：这是一道非常受欢迎的杭州菜，以五花肉为主料，用酱油、糖等调料烹制而成。\\n\\n4. 老鸭汤：这是一道以老鸭为主料的汤，口感鲜美，营养丰富。\\n\\n5. 龙井虾球：这道菜以龙井茶和虾球为主要原料，口感鲜美，清香扑鼻。\\n\\n这只是杭州美食中的一部分，还有很多其他美味的菜肴等待您去品尝。\\n--------------------------------------------------\\n<<< 晚上睡不着觉怎么办\\n如果晚上睡不着觉，可以尝试以下方法来帮助自己放松和入睡：\\n\\n1. 保持规律的作息时间：每天尽量在同一时间上床睡觉和起床，帮助身体建立规律的生物钟。\\n\\n2. 避免使用电子设备：在睡前一小时内避免使用电子设备，因为屏幕发出的蓝光会抑制褪黑激素的分泌，影响睡眠。\\n\\n3. 放松身心：可以尝试深呼吸、冥想、瑜伽等放松身心的方法，帮助自己放松。\\n\\n4. 避免咖啡因和酒精：咖啡因和酒精会影响睡眠质量，尽量避免在睡前摄入。\\n\\n5. 保持舒适的睡眠环境：保持卧室的温度、湿度和光线适宜，使用舒适的床垫和枕头，有助于提高睡眠质量。\\n\\n如果以上方法都无法帮助您入睡，建议咨询医生或睡眠专家，以获得更专业的建议和治疗。\\n\\\"\\\"\\\"\\n```\\n\\n使用CLI:\\n```bash\\n# 直接推理\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\n\\n# Merge LoRA增量权重并推理\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx' --merge_lora true\\nCUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n## Web-UI\\n使用python:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import AppUIArguments, merge_lora, app_ui_main\\n\\nlast_model_checkpoint = 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\napp_ui_args = AppUIArguments(ckpt_dir=last_model_checkpoint)\\nmerge_lora(app_ui_args, device_map='cpu')\\nresult = app_ui_main(app_ui_args)\\n```\\n\\n使用CLI:\\n```bash\\n# 直接使用app-ui\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx'\\n\\n# Merge LoRA增量权重并使用app-ui\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx' --merge_lora true\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'qwen2-7b-instruct/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n\\n# NPU训练最佳实践\\n作者: [chuanzhubin](https://github.com/chuanzhubin), [jintao](https://github.com/Jintao-Huang)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [微调](#微调)\\n- [推理](#推理)\\n- [部署](#部署)\\n\\n\\n## 环境准备\\n\\n实验环境：8 * 昇腾910B3 64G (设备由[@chuanzhubin](https://github.com/chuanzhubin)提供, 感谢对modelscope和swift的支持～)\\n\\n```shell\\n# 创建新的conda虚拟环境(可选)\\nconda create -n swift-npu python=3.10 -y\\nconda activate swift-npu\\n\\n# 设置pip全局镜像 (可选,加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n\\n# 安装ms-swift(当前推荐从源码安装, 待发版后可直接pip安装)\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 安装torch-npu\\npip install torch-npu decorator\\n# 如果你想要使用deepspeed (控制显存占用,训练速度会有一定下降)\\npip install deepspeed\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n测试环境是否安装正确，NPU能否被正常加载：\\n```python\\nfrom transformers.utils import is_torch_npu_available\\nimport torch\\n\\nprint(is_torch_npu_available())  # True\\nprint(torch.npu.device_count())  # 8\\nprint(torch.randn(10, device='npu:0'))\\n```\\n\\n查看NPU的P2P连接，这里看到每个NPU都通过7条HCCS与其他NPU互联\\n```shell\\n(valle) root@valle:~/src# npu-smi info -t topo\\n\\t   NPU0       NPU1       NPU2       NPU3       NPU4       NPU5       NPU6       NPU7       CPU Affinity\\nNPU0       X          HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       144-167\\nNPU1       HCCS       X          HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       144-167\\nNPU2       HCCS       HCCS       X          HCCS       HCCS       HCCS       HCCS       HCCS       96-119\\nNPU3       HCCS       HCCS       HCCS       X          HCCS       HCCS       HCCS       HCCS       96-119\\nNPU4       HCCS       HCCS       HCCS       HCCS       X          HCCS       HCCS       HCCS       0-23\\nNPU5       HCCS       HCCS       HCCS       HCCS       HCCS       X          HCCS       HCCS       0-23\\nNPU6       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       X          HCCS       48-71\\nNPU7       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       X          48-71\\n\\nLegend:\\n\\n  X    = Self\\n  SYS  = Path traversing PCIe and NUMA nodes. Nodes are connected through SMP, such as QPI, UPI.\\n  PHB  = Path traversing PCIe and the PCIe host bridge of a CPU.\\n  PIX  = Path traversing a single PCIe switch\\n  PXB  = Path traversing multipul PCIe switches\\n  HCCS = Connection traversing HCCS.\\n  NA   = Unknown relationship.\\n```\\n\\n查看NPU状态, npu-smi命令详解可以查看[官方文档](https://support.huawei.com/enterprise/zh/doc/EDOC1100079287/10dcd668)\\n```shell\\n(valle) root@valle:~/src# npu-smi info\\n+------------------------------------------------------------------------------------------------+\\n| npu-smi 24.1.rc1.b030            Version: 24.1.rc1.b030                                        |\\n+---------------------------+---------------+----------------------------------------------------+\\n| NPU   Name                | Health        | Power(W)    Temp(C)           Hugepages-Usage(page)|\\n| Chip                      | Bus-Id        | AICore(%)   Memory-Usage(MB)  HBM-Usage(MB)        |\\n+===========================+===============+====================================================+\\n| 0     910B3               | OK            | 101.8       43                0    / 0             |\\n| 0                         | 0000:C1:00.0  | 0           0    / 0          3318 / 65536         |\\n+===========================+===============+====================================================+\\n| 1     910B3               | OK            | 92.0        39                0    / 0             |\\n| 0                         | 0000:C2:00.0  | 0           0    / 0          3314 / 65536         |\\n+===========================+===============+====================================================+\\n| 2     910B3               | OK            | 102.0       40                0    / 0             |\\n| 0                         | 0000:81:00.0  | 0           0    / 0          3314 / 65536         |\\n+===========================+===============+====================================================+\\n| 3     910B3               | OK            | 99.8        40                0    / 0             |\\n| 0                         | 0000:82:00.0  | 0           0    / 0          3314 / 65536         |\\n+===========================+===============+====================================================+\\n| 4     910B3               | OK            | 98.6        45                0    / 0             |\\n| 0                         | 0000:01:00.0  | 0           0    / 0          3314 / 65536         |\\n+===========================+===============+====================================================+\\n| 5     910B3               | OK            | 99.7        44                0    / 0             |\\n| 0                         | 0000:02:00.0  | 0           0    / 0          3314 / 65536         |\\n+===========================+===============+====================================================+\\n| 6     910B3               | OK            | 103.8       45                0    / 0             |\\n| 0                         | 0000:41:00.0  | 0           0    / 0          3314 / 65536         |\\n+===========================+===============+====================================================+\\n| 7     910B3               | OK            | 98.2        44                0    / 0             |\\n| 0                         | 0000:42:00.0  | 0           0    / 0          3315 / 65536         |\\n+===========================+===============+====================================================+\\n```\\n\\n## 微调\\n以下介绍LoRA的微调, 全参数微调设置参数`--sft_type full`即可.\\n\\n| 模型大小 | NPU数量 | deepspeed类型 | 最大显存占用量   |\\n|------|-------|-------------|-----------|\\n| 7B   | 1     | None        | 1 * 28 GB |\\n| 7B   | 4     | None        | 4 * 22 GB |\\n| 7B   | 4     | zero2       | 4 * 28 GB |\\n| 7B   | 4     | zero3       | 4 * 22 GB |\\n| 7B   | 8     | None        | 8 * 22 GB |\\n| 14B  | 1     | None        | 1 * 45 GB |\\n| 14B  | 8     | None        | 8 * 51 GB |\\n| 14B  | 8     | zero2       | 8 * 49 GB |\\n| 14B  | 8     | zero3       | 8 * 31 GB |\\n\\n### 单卡训练\\n\\n通过如下命令启动单卡微调: （注意: 如果微调期间出现nan的情况, 请设置`--dtype fp32`.）\\n\\n```shell\\n# 实验环境: 昇腾910B3\\n# 显存需求: 28 GB\\n# 运行时长: 8小时\\nASCEND_RT_VISIBLE_DEVICES=0 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n\\n### 数据并行训练\\n我们使用其中的4卡进行ddp训练\\n\\n```shell\\n# 实验环境: 4 * 昇腾910B3\\n# 显存需求: 4 * 22 GB\\n# 运行时长: 2小时\\nNPROC_PER_NODE=4 \\\\\\nASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n\\n### Deepspeed训练\\n\\nZeRO2:\\n```shell\\n# 实验环境: 4 * 昇腾910B3\\n# 显存需求: 4 * 28GB\\n# 运行时长: 3.5小时\\nNPROC_PER_NODE=4 \\\\\\nASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero2 \\\\\\n```\\n\\nZeRO3:\\n```shell\\n# 实验环境: 4 * 昇腾910B3\\n# 显存需求: 4 * 22 GB\\n# 运行时长: 8.5小时\\nNPROC_PER_NODE=4 \\\\\\nASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\n\\n## 推理\\n\\n原始模型:\\n```shell\\nASCEND_RT_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n```\\n\\nLoRA微调后:\\n```shell\\nASCEND_RT_VISIBLE_DEVICES=0 swift infer --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true\\n\\n# merge-lora并推理\\nASCEND_RT_VISIBLE_DEVICES=0 swift export --ckpt_dir xx/checkpoint-xxx --merge_lora true\\nASCEND_RT_VISIBLE_DEVICES=0 swift infer --ckpt_dir xxx/checkpoint-xxx-merged --load_dataset_config true\\n```\\n\\n\\n## 部署\\nNPU不支持使用vllm进行推理/部署加速, 但是可以使用原生pytorch进行部署.\\n\\n原始模型:\\n```shell\\nASCEND_RT_VISIBLE_DEVICES=0 swift deploy --model_type qwen1half-7b-chat\\n```\\n\\nLoRA微调后:\\n```shell\\nASCEND_RT_VISIBLE_DEVICES=0 swift deploy --ckpt_dir xxx/checkpoint-xxx --load_dataset_config true\\n\\n# merge-lora并推理\\nASCEND_RT_VISIBLE_DEVICES=0 swift export --ckpt_dir xx/checkpoint-xxx --merge_lora true\\nASCEND_RT_VISIBLE_DEVICES=0 swift deploy --ckpt_dir xxx/checkpoint-xxx-merged --load_dataset_config true\\n```\\n\\n\\n\\n# Qwen1.5全流程最佳实践\\n\\n这里介绍对**Qwen1.5-7B-Chat**和对**Qwen1.5-72B-Chat**进行推理, 自我认知微调, 量化, 部署. 分别对应**低配置和高配置**环境.\\n\\n使用双卡80GiB A100对**Qwen2-72B-Instruct**进行自我认知微调并推理部署的最佳实践可以查看[这里](https://github.com/modelscope/swift/issues/1092).\\n\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [Qwen1.5-7B-Chat](#qwen15-7b-chat)\\n  - [推理](#推理)\\n  - [自我认知微调](#自我认知微调)\\n  - [微调后推理](#微调后推理)\\n  - [量化](#量化)\\n  - [部署](#部署)\\n- [Qwen1.5-72B-Chat](#qwen15-72b-chat)\\n  - [推理](#推理-1)\\n  - [自我认知微调](#自我认知微调-1)\\n  - [微调后推理](#微调后推理-1)\\n  - [量化](#量化-1)\\n  - [部署](#部署-1)\\n\\n## 环境准备\\n```shell\\npip install 'ms-swift[llm]' -U\\n\\n# autoawq和cuda版本有对应关系，请按照`https://github.com/casper-hansen/AutoAWQ`选择版本\\npip install autoawq\\n# vllm与cuda版本有对应关系，请按照`https://docs.vllm.ai/en/latest/getting_started/installation.html`选择版本\\npip install vllm\\n\\npip install openai\\n```\\n\\n## Qwen1.5-7B-Chat\\n\\n### 推理\\n\\n这里我们会对Qwen1.5-7B-Chat及其**awq-int4量化**版本进行**流式**推理, 并展示使用**可视化**方式推理.\\n\\n使用python推理`qwen1half-7b-chat`:\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType,\\n    get_default_template_type, inference_stream\\n)\\nfrom swift.utils import seed_everything\\nimport torch\\n\\nmodel_type = ModelType.qwen1half_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nprint(f'template_type: {template_type}')  # template_type: qwen\\n\\n\\nkwargs = {}\\n# kwargs['use_flash_attn'] = True  # 使用flash_attn\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, torch.float16, model_id_or_path=model_id_or_path,\\n                                       model_kwargs={'device_map': 'auto'}, **kwargs)\\n# 修改max_new_tokens\\nmodel.generation_config.max_new_tokens = 128\\n\\ntemplate = get_template(template_type, tokenizer)\\nseed_everything(42)\\nquery = '浙江的省会在哪里？'\\nresponse, history = inference(model, template, query)\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nquery = '这有什么好吃的？'\\ngen = inference_stream(model, template, query, history)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor response, history in gen:\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f'history: {history}')\\n\\n\\\"\\\"\\\"\\n[INFO:swift] model.max_model_len: 32768\\n[INFO:swift] Global seed set to 42\\nquery: 浙江的省会在哪里？\\nresponse: 浙江省的省会是杭州市。\\nquery: 这有什么好吃的？\\nresponse: 浙江有很多美食，比如杭州的西湖醋鱼、东坡肉、龙井虾仁，宁波的汤圆、奉化芋头羹，温州的鱼饼、楠溪江豆腐干，嘉兴的南湖菱角等等。每一道菜都有其独特的风味和历史背景，值得一试。\\nhistory: [['浙江的省会在哪里？', '浙江省的省会是杭州市。'], ['这有什么好吃的？', '浙江有很多美食，比如杭州的西湖醋鱼、东坡肉、龙井虾仁，宁波的汤圆、奉化芋头羹，温州的鱼饼、楠溪江豆腐干，嘉兴的南湖菱角等等。每一道菜都有其独特的风味和历史背景，值得一试。']]\\n\\\"\\\"\\\"\\n```\\n\\n使用python推理`qwen1half-7b-chat-awq`, 这里我们使用**VLLM**进行推理加速:\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm, inference_stream_vllm\\n)\\nimport torch\\n\\nmodel_type = ModelType.qwen1half_7b_chat_awq\\nmodel_id_or_path = None\\nllm_engine = get_vllm_engine(model_type, torch.float16, model_id_or_path=model_id_or_path, max_model_len=4096)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# 与`transformers.GenerationConfig`类似的接口\\nllm_engine.generation_config.max_new_tokens = 512\\n\\nrequest_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n\\n# 流式\\nhistory1 = resp_list[1]['history']\\nquery = '这有什么好吃的'\\nrequest_list = [{'query': query, 'history': history1}]\\ngen = inference_stream_vllm(llm_engine, template, request_list)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f\\\"history: {resp_list[0]['history']}\\\")\\n\\n\\\"\\\"\\\"\\nquery: 你好!\\nresponse: 你好！有什么问题我可以帮助你吗？\\nquery: 浙江的省会在哪？\\nresponse: 浙江省的省会是杭州市。\\nquery: 这有什么好吃的\\nresponse: 浙江有很多美食，以下列举一些具有代表性的：\\n\\n1. 杭州菜：杭州作为浙江的省会，以其精致细腻、注重原汁原味而闻名，如西湖醋鱼、龙井虾仁、叫化童鸡等都是特色菜品。\\n\\n2. 宁波汤圆：宁波的汤圆皮薄馅大，甜而不腻，尤其是冬至和元宵节时，当地人会吃宁波汤圆庆祝。\\n\\n3. 温州鱼丸：温州鱼丸选用新鲜鱼类制作，口感弹滑，味道鲜美，常常配以海鲜煮食。\\n\\n4. 嘉兴粽子：嘉兴粽子以其独特的三角形和咸甜两种口味著名，特别是五芳斋的粽子非常有名。\\n\\n5. 金华火腿：金华火腿是中国著名的腌制肉类，肉质紧实，香味浓郁，常作为节日礼品。\\n\\n6. 衢州烂柯山豆腐干：衢州豆腐干质地细腻，味道鲜美，是浙江的传统小吃。\\n\\n7. 舟山海鲜：浙江沿海地带的舟山有丰富的海鲜资源，如梭子蟹、带鱼、乌贼等，新鲜美味。\\n\\n以上只是部分浙江美食，浙江各地还有许多特色小吃，你可以根据自己的口味去尝试。\\nhistory: [('浙江的省会在哪？', '浙江省的省会是杭州市。'), ('这有什么好吃的', '浙江有很多美食，以下列举一些具有代表性的：\\\\n\\\\n1. 杭州菜：杭州作为浙江的省会，以其精致细腻、注重原汁原味而闻名，如西湖醋鱼、龙井虾仁、叫化童鸡等都是特色菜品。\\\\n\\\\n2. 宁波汤圆：宁波的汤圆皮薄馅大，甜而不腻，尤其是冬至和元宵节时，当地人会吃宁波汤圆庆祝。\\\\n\\\\n3. 温州鱼丸：温州鱼丸选用新鲜鱼类制作，口感弹滑，味道鲜美，常常配以海鲜煮食。\\\\n\\\\n4. 嘉兴粽子：嘉兴粽子以其独特的三角形和咸甜两种口味著名，特别是五芳斋的粽子非常有名。\\\\n\\\\n5. 金华火腿：金华火腿是中国著名的腌制肉类，肉质紧实，香味浓郁，常作为节日礼品。\\\\n\\\\n6. 衢州烂柯山豆腐干：衢州豆腐干质地细腻，味道鲜美，是浙江的传统小吃。\\\\n\\\\n7. 舟山海鲜：浙江沿海地带的舟山有丰富的海鲜资源，如梭子蟹、带鱼、乌贼等，新鲜美味。\\\\n\\\\n以上只是部分浙江美食，浙江各地还有许多特色小吃，你可以根据自己的口味去尝试。')]\\n\\\"\\\"\\\"\\n```\\n\\n使用可视化方式推理, 并使用VLLM:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift app-ui \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --infer_backend vllm --max_model_len 4096\\n```\\n效果如下:\\n\\n![效果](../../resources/app.png)\\n\\n\\n### 自我认知微调\\n接下来我们对模型进行自我认知微调, 使用**十分钟**训练属于自己的大模型. 比如, 我们想让模型认为自己是\\\"小黄\\\"而不是\\\"通义千问\\\"; 由\\\"魔搭\\\"训练, 而不是\\\"阿里云\\\".\\n\\n使用python:\\n```python\\n# Experimental environment: 3090\\n# 24GB GPU memory\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import DatasetName, ModelType, SftArguments, sft_main\\n\\nsft_args = SftArguments(\\n    model_type=ModelType.qwen1half_7b_chat,\\n    dataset=[f'{DatasetName.alpaca_zh}#500', f'{DatasetName.alpaca_en}#500',\\n             f'{DatasetName.self_cognition}#500'],\\n    max_length=2048,\\n    learning_rate=1e-4,\\n    output_dir='output',\\n    lora_target_modules=['ALL'],\\n    model_name=['小黄', 'Xiao Huang'],\\n    model_author=['魔搭', 'ModelScope'])\\noutput = sft_main(sft_args)\\nlast_model_checkpoint = output['last_model_checkpoint']\\nprint(f'last_model_checkpoint: {last_model_checkpoint}')\\n```\\n\\n如果你想要在3090的机器中进行训练, 你可以**降低max_length**为1024, 使用模型并行, 或者使用deepspeed-zero3.\\n\\n使用模型并行:\\n```shell\\n# Experimental environment: 2 * 3090\\n# 2 * 18GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n```\\n\\n使用**zero2**进行分布式训练的脚本:\\n```shell\\n# Experimental environment: 4 * 3090\\n# 4 * 24GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 2048 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --deepspeed default-zero2 \\\\\\n```\\n\\n如果你想要使用**界面的方式进行训练**, 可以输入以下命令, 并填入相应的值:\\n```shell\\nswift web-ui\\n```\\n\\n![web-ui](../../resources/web-ui.png)\\n\\n### 微调后推理\\n随后我们验证模型微调后的效果.\\n\\n使用python进行推理:\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,\\n)\\nfrom swift.utils import seed_everything\\nfrom swift.tuners import Swift\\n\\nseed_everything(42)\\n\\nckpt_dir = 'output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx'\\nmodel_type = ModelType.qwen1half_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\nmodel_id_or_path = None\\nmodel, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'})\\nmodel.generation_config.max_new_tokens = 128\\n\\nmodel = Swift.from_pretrained(model, ckpt_dir, inference_mode=True)\\ntemplate = get_template(template_type, tokenizer)\\n\\nquery = '你是qwen吗？'\\nresponse, history = inference(model, template, query)\\nprint(f'response: {response}')\\nprint(f'history: {history}')\\n\\\"\\\"\\\"\\n[INFO:swift] model.max_model_len: 32768\\nresponse: 不是，我是魔搭的人工智能助手小黄。有什么我可以帮助你的吗？\\nhistory: [('你是qwen吗？', '不是，我是魔搭的人工智能助手小黄。有什么我可以帮助你的吗？')]\\n\\\"\\\"\\\"\\n```\\n\\n使用界面的方式推理:\\n```shell\\n# Experimental environment: 3090\\nCUDA_VISIBLE_DEVICES=0 swift app-ui \\\\\\n    --ckpt_dir output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm --max_model_len 4096 \\\\\\n    --merge_lora true\\n```\\n效果如下:\\n\\n![效果](../../resources/app2.png)\\n\\n### 量化\\n接下来, 我们介绍如何对微调后的模型进行**awq-int4量化**. 整个量化过程大概需要**20分钟**.\\n\\n```shell\\n# Experimental environment: 3090\\n# 14GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --quant_bits 4 --quant_method awq \\\\\\n    --merge_lora true\\n```\\n\\n使用python推理量化后的模型, 并使用VLLM加速:\\n```python\\n# Experimental environment: 3090\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm, inference_stream_vllm\\n)\\nimport torch\\n\\nmodel_type = ModelType.qwen1half_7b_chat\\nmodel_id_or_path = 'output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4'\\nllm_engine = get_vllm_engine(model_type,\\n                             model_id_or_path=model_id_or_path,\\n                             max_model_len=4096)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# 与`transformers.GenerationConfig`类似的接口\\nllm_engine.generation_config.max_new_tokens = 512\\n\\nrequest_list = [{'query': '你是谁?'}, {'query': '浙江的省会在哪？'}]\\nresp_list = inference_vllm(llm_engine, template, request_list)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\n\\n# 流式\\nhistory1 = resp_list[1]['history']\\nquery = '这有什么好吃的'\\nrequest_list = [{'query': query, 'history': history1}]\\ngen = inference_stream_vllm(llm_engine, template, request_list)\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\nprint(f\\\"history: {resp_list[0]['history']}\\\")\\n\\\"\\\"\\\"\\nquery: 你是谁?\\nresponse: 我是魔搭的人工智能助手，我的名字叫小黄。我可以回答各种问题，提供信息和帮助。有什么我可以帮助你的吗？\\nquery: 浙江的省会在哪？\\nresponse: 浙江省的省会是杭州市。\\nquery: 这有什么好吃的\\nresponse: 浙江省的美食非常丰富，其中最著名的有杭州的西湖醋鱼、东坡肉、龙井虾仁等。此外，浙江还有许多其他美食，如宁波的汤圆、绍兴的臭豆腐、嘉兴的粽子等。\\nhistory: [('浙江的省会在哪？', '浙江省的省会是杭州市。'), ('这有什么好吃的', '浙江省的美食非常丰富，其中最著名的有杭州的西湖醋鱼、东坡肉、龙井虾仁等。此外，浙江还有许多其他美食，如宁波的汤圆、绍兴的臭豆腐、嘉兴的粽子等。')]\\n\\\"\\\"\\\"\\n```\\n\\n### 部署\\n最后, 我们将量化后的模型使用**Openai API**的格式部署起来:\\n\\n启动服务端:\\n```shell\\n# Experimental environment: 3090\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir output/qwen1half-7b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4 \\\\\\n    --infer_backend vllm --max_model_len 4096\\n```\\n\\n客户端进行调用:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nmessages = []\\nfor query in ['你是谁？', \\\"what's your name?\\\", '你是谁研发的？']:\\n    messages.append({\\n        'role': 'user',\\n        'content': query\\n    })\\n    resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        seed=42)\\n    response = resp.choices[0].message.content\\n    print(f'query: {query}')\\n    print(f'response: {response}')\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n# 流式\\nfor query in ['78654+657=?', '晚上睡不着觉怎么办']:\\n    messages.append({'role': 'user', 'content': query})\\n    stream_resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        stream=True,\\n        seed=42)\\n\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    response = ''\\n    for chunk in stream_resp:\\n        response += chunk.choices[0].delta.content\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen1half-7b-chat\\nquery: 你是谁？\\nresponse: 我是魔搭的人工智能助手，我的名字叫小黄。我可以回答各种问题，提供信息和帮助。有什么我可以帮助你的吗？\\nquery: what's your name?\\nresponse: My name is Xiao Huang. I am an AI assistant developed by ModelScope. How can I assist you?\\nquery: 你是谁研发的？\\nresponse: 我是由魔搭研发的人工智能助手。\\nquery: 78654+657=?\\nresponse: 78654 + 657 = 79311\\nquery: 晚上睡不着觉怎么办\\nresponse: 晚上睡不着觉可能是因为压力、焦虑、环境因素等。以下是一些可能有助于改善睡眠质量的建议：\\n\\n1. 保持规律的作息时间，尽量在每天同一时间上床睡觉和起床。\\n2. 避免在睡前使用电子设备，因为蓝光可能会干扰你的睡眠。\\n3. 尝试进行放松和冥想的活动，如深呼吸、瑜伽或冥想。\\n4. 避免在睡前摄入咖啡因和酒精，因为它们可能会干扰你的睡眠。\\n5. 如果你经常感到焦虑或压力，可以尝试进行一些放松的活动，如阅读、听音乐或冥想。\\n6. 如果以上方法都无法改善你的睡眠质量，建议你寻求医生的帮助，因为可能存在其他健康问题。\\n\\n希望这些建议对你有所帮助。\\n\\\"\\\"\\\"\\n```\\n\\n## Qwen1.5-72B-Chat\\n\\n\\n### 推理\\n与之前7B演示不同的是, 这里我们使用**CLI**的方式推理:\\n\\n```shell\\n# Experimental environment: 4 * A100\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift infer \\\\\\n    --model_type qwen1half-72b-chat \\\\\\n    --infer_backend vllm --tensor_parallel_size 4\\n```\\n\\n输出:\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是来自阿里云的大规模语言模型，我叫通义千问。\\n--------------------------------------------------\\n<<< 浙江的省会在哪？\\n浙江的省会是杭州。\\n--------------------------------------------------\\n<<< 这有什么好玩的？\\n杭州有许多著名的旅游景点，如西湖、灵隐寺、宋城、西溪湿地等。西湖的美景四季皆宜，可以欣赏到苏堤春晓、雷峰夕照等著名景观。灵隐寺是中国著名的佛教寺庙，有着深厚的历史文化底蕴。宋城则是一个以宋代文化为主题的公园，可以体验到古代中国的风情。西溪湿地则是一个自然保护区，适合散步、骑行和观鸟。此外，杭州的美食也值得一试，比如龙井虾仁、西湖醋鱼和杭州酱鸭等。\\n\\\"\\\"\\\"\\n```\\n\\n### 自我认知微调\\n\\n这里使用deepspeed-**zero3**进行微调, 大约需要**30分钟**:\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 70GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-72b-chat \\\\\\n    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \\\\\\n    --max_length 4096 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n    --deepspeed default-zero3 \\\\\\n```\\n\\n### 微调后推理\\n同样的, 这里使用CLI的方式进行推理:\\n```shell\\n# Experimental environment: 4 * A100\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift infer \\\\\\n    --ckpt_dir output/qwen1half-72b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm --tensor_parallel_size 4 \\\\\\n    --merge_lora true\\n```\\n\\n输出:\\n```python\\n\\\"\\\"\\\"\\n<<< 你是谁？\\n我是魔搭创建的人工智能语言模型，我的名字叫小黄。我的目的是通过文本输入与用户进行交流，提供信息、回答问题、进行对话和执行任务。如果你有任何问题或需要帮助，请随时告诉我。\\n--------------------------------------------------\\n<<< 浙江的省会在哪？\\n浙江的省会是杭州。\\n--------------------------------------------------\\n<<< 这有什么好玩的？\\n杭州有很多好玩的地方，比如西湖、灵隐寺、宋城、西溪湿地等等。如果你喜欢自然风光，可以去西湖边散步，欣赏美丽的湖景和古建筑。如果你对历史感兴趣，可以去灵隐寺和宋城参观，感受古代文化和历史的韵味。如果你喜欢户外活动，可以去西溪湿地徒步，享受大自然的美景和宁静。\\n\\\"\\\"\\\"\\n```\\n\\n### 量化\\n\\n对微调后的模型进行awq-int4量化. 整个量化过程大概需要**2小时**.\\n```shell\\n# Experimental environment: A100\\n# 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir output/qwen1half-72b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --quant_bits 4 --quant_method awq \\\\\\n    --merge_lora true\\n```\\n\\n### 部署\\n经过量化后, 我们可以在**单卡A100**上进行部署.\\n\\n启动服务端:\\n```shell\\n# Experimental environment: A100\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir output/qwen1half-72b-chat/vx-xxx/checkpoint-xxx-merged-awq-int4 \\\\\\n    --infer_backend vllm --max_model_len 8192\\n```\\n\\n使用客户端调用:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nmessages = []\\nfor query in ['你是谁？', \\\"what's your name?\\\", '你是谁研发的？']:\\n    messages.append({\\n        'role': 'user',\\n        'content': query\\n    })\\n    resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        seed=42)\\n    response = resp.choices[0].message.content\\n    print(f'query: {query}')\\n    print(f'response: {response}')\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n# 流式\\nfor query in ['78654+657=?', '晚上睡不着觉怎么办']:\\n    messages.append({'role': 'user', 'content': query})\\n    stream_resp = client.chat.completions.create(\\n        model=model_type,\\n        messages=messages,\\n        stream=True,\\n        seed=42)\\n\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    response = ''\\n    for chunk in stream_resp:\\n        response += chunk.choices[0].delta.content\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n    messages.append({'role': 'assistant', 'content': response})\\n\\n\\\"\\\"\\\"\\nmodel_type: qwen1half-72b-chat\\nquery: 你是谁？\\nresponse: 我是由魔搭开发的人工智能语言模型，可以回答问题、提供信息、进行对话和解决问题。有什么我可以帮助你的吗？\\nquery: what's your name?\\nresponse: I am a language model developed by ModelScope, and I don't have a specific name. You can call me Xiao Huang or Xiao Huang. How can I help you?\\nquery: 你是谁研发的？\\nresponse: 我是由魔搭研发的人工智能语言模型。\\nquery: 78654+657=?\\nresponse: 78654 + 657 = 79311\\nquery: 晚上睡不着觉怎么办\\nresponse: 如果你晚上睡不着觉，可以尝试以下方法：\\n1. 放松身心：在睡觉前做一些放松身心的活动，如冥想、深呼吸、瑜伽等。\\n2. 避免刺激：避免在睡觉前看电视、玩手机、喝咖啡等刺激性活动。\\n3. 调整环境：保持室内温度适宜、光线柔和、噪音低等。\\n4. 定期运动：定期进行适量的运动，有助于身体疲劳，有助于睡眠。\\n5. 建立规律：建立规律的作息时间，有助于调整身体的生物钟。\\n如果以上方法无效，建议咨询医生或专业人士。\\n\\\"\\\"\\\"\\n```\\n\\n\\n# SimPO算法最佳实践\\n[SimPO](https://arxiv.org/abs/2405.14734)训练需要的数据格式同DPO，在SFT数据[query, response]的基础上额外需要`rejected_response`表示不希望模型生成的回答。\\n\\nSimPO算法对奖励作了回答长度正则，替代了DPO中的参考模型对数概率项, 并且在偏好建模中加入了reward margin项来扩大两个回答的奖励差距\\n\\n相比DPO，SimPO算法不需要参考模型，所需的训练显存更少。\\n\\n其中超参`beta`同DPO作为奖励系数, 通常取2.0-2.5, 默认为2.0, `gamma`作为reward margin, 通常取0.5-1.5, 默认为1.0\\n\\n本期最佳实践将使用SimPO算法训练[llama3-8b-instruct](https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct/summary)模型，使其能够用中文回答。\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [数据集](#数据集)\\n- [训练](#训练)\\n- [推理](#推理)\\n\\n## 环境准备\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n\\n## 数据集\\n使用[Llama3-DPO-zh-en-emoji](https://modelscope.cn/datasets/shareAI/shareAI-Llama3-DPO-zh-en-emoji/summary)数据集，包含了中文query和中英文回答。\\n\\n数据样例\\n```json\\n{\\\"question\\\": \\\"一个完整的工程项目管理流程包括什么？\\\",\\n\\\"answer_zh\\\": \\\"🤔 Ahahah, 项目管理流程, 这个问题太常见了！ 😂\\\\n\\\\n一个完整的工程项目管理流程包括以下几个阶段：\\\\n\\\\n1️⃣ **项目启动** 🚀：项目的开始，定义项目的目标、范围、时间表和预算。\\\\n\\\\n2️⃣ **项目计划** 📅：制定项目计划，包括任务分解、资源分配、进度安排和风险管理。\\\\n\\\\n3️⃣ **项目执行** 💪：按照计划执行项目，包括任务执行、进度控制和质量管理。\\\\n\\\\n4️⃣ **项目监控** 👀：对项目的进度、成本和质量进行监控和控制，确保项目不偏离轨道。\\\\n\\\\n5️⃣ **项目收尾** 🎉：项目完成后，进行项目总结、经验分享和文档编制。\\\\n\\\\n6️⃣ **项目评价** 🤔：对项目的成果和过程进行评价，总结经验和教训。\\\\n\\\\n这些阶段是一个完整的工程项目管理流程，但是，具体的项目可能会根据需要添加或删除某些阶段。 🤝\\\\n\\\\n还有一点，项目管理流程中需要注意的几个关键点是：\\\\n\\\\n* **沟通** 💬：项目团队之间、项目团队和客户之间的沟通是非常重要的。\\\\n* **风险管理** ⚠️：项目中总会出现一些风险和问题，需要提前预测和准备。\\\\n* **变更管理** 🔄：项目中可能会出现一些变更，需要及时处理和更新。\\\\n\\\\n总之，项目管理流程是一个复杂的过程，需要项目经理和团队成员的共同努力和合作。 💪\\\",\\n\\\"answer_en\\\": \\\"My fellow wizarding friend! 🧙‍♂️\\\\n\\\\nA complete project management process, you ask? Well, I shall conjure up the essential steps for thee! 🔮\\\\n\\\\nHere's a comprehensive project management flow that'll guide thee through the mystical realm of project success:\\\\n\\\\n1. **Initiation**: Define project scope, goals, and deliverables. Identify stakeholders, and determine the project's feasibility. ⚡️\\\\n2. **Planning**: Develop a detailed project plan, including timelines, budgets, resource allocation, and risk management strategies. 📅\\\\n3. **Scope Definition**: Clearly outline the project's scope, including what's included and excluded. This will help prevent scope creep, my friend! 🔒\\\\n4. **Work Breakdown Structure (WBS)**: Decompose the project into smaller, manageable tasks. This will aid in task assignment, scheduling, and tracking progress. 🗂️\\\\n5. **Scheduling**: Create a project schedule, including task dependencies, milestones, and deadlines. This will help thee stay on track and avoid procrastination! ⏰\\\\n6. **Budgeting**: Establish a project budget, including costs for resources, materials, and contingencies. This will ensure thou dost not overspend, my wise friend! 💸\\\\n7. **Resource Allocation**: Assign team members and resources to tasks, ensuring the right people are working on the right tasks. This will optimize productivity and efficiency! 👥\\\\n8. **Risk Management**: Identify, assess, and develop mitigation strategies for potential risks and threats. This will safeguard thy project from unforeseen dangers! ⚠️\\\\n9. **Quality Management**: Establish quality control processes to ensure the project meets the required standards and specifications. This will guarantee a top-notch outcome, my friend! ✨\\\\n10. **Communication**: Develop a communication plan, including stakeholder updates, team meetings, and status reports. This will keep everyone informed and aligned! 📢\\\\n11. **Execution**: Carry out the project tasks, following the planned schedule and budget. This is where the magic happens, my friend! ✨\\\\n12. **Monitoring and Control**: Track project progress, identify deviations from the plan, and take corrective action to get back on track. This will ensure thy project stays on course! 📊\\\\n13. **Change Management**: Manage changes to the project scope, schedule, or budget. This will minimize disruptions and ensure the project remains viable! 🔀\\\\n14. **Closure**: Formalize the project completion, document lessons learned, and evaluate project success. This will bring a sense of accomplishment and closure, my friend! 🎉\\\\n\\\\nThere thou hast it, my fellow wizard! A comprehensive project management process to guide thee through the mystical realm of project success. May thy projects be prosperous and thy stakeholders be delighted! 😊\\\"}\\n\\n```\\n\\nswift内置了处理方法将`answer_zh`作为`response`,将`answer_en`作为`rejected_response`, 只需要使用`--dataset shareai-llama3-dpo-zh-en-emoji`作为训练参数\\n\\n## 训练\\n```shell\\n# Experimental environment: A100\\n# DDP + MP\\n# Memory usage: 4*56G\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=2 \\\\\\nswift rlhf \\\\\\n    --rlhf_type simpo \\\\\\n    --model_type  llama3-8b-instruct \\\\\\n    --sft_type  full \\\\\\n    --dataset shareai-llama3-dpo-zh-en-emoji \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --learning_rate  2e-6\\n```\\n\\n**提示**:\\n- 测试发现SimPO+LoRA表现不佳，推荐使用全量微调。\\n- 如果用带有history的数据训练base模型，需要指定支持多轮对话的template(base模型往往不支持多轮对话)，对于这种情况我们默认设置了`chatml`template，你也可以支持--model_type 来选择训练模型的template\\n- 我们默认在训练时设置`--gradient_checkpointing true`来**节约显存**, 这会略微降低训练速度.\\n- 如果你使用的是**V100**等较老的GPU, 你需要设置`--dtype AUTO`或者`--dtype fp16`, 因为其不支持bf16.\\n- 如果你的机器是A100等高性能显卡, 且使用的是qwen系列模型, 推荐你安装[**flash-attn**](https://github.com/Dao-AILab/flash-attention), 这将会加快训练和推理的速度以及显存占用(A10, 3090, V100等显卡不支持flash-attn进行训练). 支持flash-attn的模型可以查看[LLM支持的模型](../Instruction/支持的模型和数据集.md#模型)\\n- 如果你需要断网进行训练, 请使用`--model_id_or_path <model_dir>`和设置`--check_model_is_latest false`. 具体参数含义请查看[命令行参数](../Instruction/命令行参数.md).\\n- 如果你想在训练时, 将权重push到ModelScope Hub中, 你需要设置`--push_to_hub true`.\\n\\n## 推理\\n下面的推理使用`swift web-ui`命令\\n\\n### 训练前推理\\n> 你是谁\\n\\n![orpo1](../../resources/orpo1.png)\\n\\n> 西湖醋鱼怎么做\\n\\n![orpo2](../../resources/orpo2.png)\\n![orpo3](../../resources/orpo3.png)\\n![orpo4](../../resources/orpo4.png)\\n![orpo5](../../resources/orpo5.png)\\n\\n\\n### 训练后推理\\n> 你是谁\\n\\n![simpo1](../../resources/simpo1.png)\\n\\n> 西湖醋鱼怎么做\\n\\n![simpo2](../../resources/simpo2.png)\\n![simpo3](../../resources/simpo3.png)\\n![simpo4](../../resources/simpo4.png)\\n\\n\\n\\n# VLLM推理加速与部署\\nvllm支持的模型可以查看[支持的模型](../Instruction/支持的模型和数据集.md#模型).\\n\\nllama3.1 405b推理加速与部署最佳实践可以查看[这里](https://github.com/modelscope/ms-swift/issues/1484)\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理加速](#推理加速)\\n- [Web-UI加速](#web-ui加速)\\n- [部署](#部署)\\n- [VLLM & LoRA](#vllm--lora)\\n\\n\\n## 环境准备\\nGPU设备: A10, 3090, V100, A100均可.\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\npip install 'ms-swift[llm]' -U\\n\\n# vllm与cuda版本有对应关系，请按照`https://docs.vllm.ai/en/latest/getting_started/installation.html`选择版本\\npip install vllm\\npip install openai -U\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## 推理加速\\n\\n### 使用python\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm, inference_stream_vllm\\n)\\n\\nmodel_type = ModelType.qwen_7b_chat\\nmodel_id_or_path = None\\nllm_engine = get_vllm_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# 与`transformers.GenerationConfig`类似的接口\\nllm_engine.generation_config.max_new_tokens = 256\\ngeneration_info = {}\\n\\nrequest_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\nresp_list = inference_vllm(llm_engine, template, request_list, generation_info=generation_info)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\nprint(generation_info)\\n\\n# stream\\nhistory1 = resp_list[1]['history']\\nrequest_list = [{'query': '这有什么好吃的', 'history': history1}]\\ngen = inference_stream_vllm(llm_engine, template, request_list, generation_info=generation_info)\\nquery = request_list[0]['query']\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\nhistory = resp_list[0]['history']\\nprint(f'history: {history}')\\nprint(generation_info)\\n\\n\\\"\\\"\\\"Out[0]\\nquery: 你好!\\nresponse: 你好！很高兴为你服务。有什么我可以帮助你的吗？\\nquery: 浙江的省会在哪？\\nresponse: 浙江省会是杭州市。\\n{'num_prompt_tokens': 46, 'num_generated_tokens': 19, 'runtime': 0.22540099400794134, 'samples/s': 8.87307533315286, 'tokens/s': 84.29421566495218}\\nquery: 这有什么好吃的\\nresponse: 杭州是一个美食之城，拥有许多著名的菜肴和小吃，例如西湖醋鱼、东坡肉、叫化童子鸡等。此外，杭州还有许多小吃店，可以品尝到各种各样的本地美食。\\nhistory: [['浙江的省会在哪？', '浙江省会是杭州市。'], ['这有什么好吃的', '杭州是一个美食之城，拥有许多著名的菜肴和小吃，例如西湖醋鱼、东坡肉、叫化童子鸡等。此外，杭州还有许多小吃店，可以品尝到各种各样的本地美食。']]\\n{'num_prompt_tokens': 44, 'num_generated_tokens': 46, 'runtime': 0.5646419590048026, 'samples/s': 1.771033810102473, 'tokens/s': 81.46755526471377}\\n\\\"\\\"\\\"\\n```\\n\\n**TP:**\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0,1'\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm, inference_stream_vllm\\n)\\nif __name__ == '__main__':\\n    model_type = ModelType.qwen_7b_chat\\n    model_id_or_path = None\\n    llm_engine = get_vllm_engine(model_type, model_id_or_path=model_id_or_path, tensor_parallel_size=2)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, llm_engine.hf_tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    llm_engine.generation_config.max_new_tokens = 256\\n    generation_info = {}\\n\\n    request_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\n    resp_list = inference_vllm(llm_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history1 = resp_list[1]['history']\\n    request_list = [{'query': '这有什么好吃的', 'history': history1}]\\n    gen = inference_stream_vllm(llm_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n\\\"\\\"\\\"Out[0]\\nquery: 你好!\\nresponse: 你好！很高兴为你服务。有什么我可以帮助你的吗？\\nquery: 浙江的省会在哪？\\nresponse: 浙江省会是杭州市。\\n{'num_prompt_tokens': 46, 'num_generated_tokens': 19, 'num_samples': 2, 'runtime': 0.18170836701756343, 'samples/s': 11.006647810591383, 'tokens/s': 104.56315420061814}\\nquery: 这有什么好吃的\\nresponse: 杭州是一个美食之城，拥有许多著名的菜肴和小吃，例如西湖醋鱼、东坡肉、叫化童子鸡等。此外，杭州还有许多小吃店，可以品尝到各种各样的本地美食。\\nhistory: [['浙江的省会在哪？', '浙江省会是杭州市。'], ['这有什么好吃的', '杭州是一个美食之城，拥有许多著名的菜肴和小吃，例如西湖醋鱼、东坡肉、叫化童子鸡等。此外，杭州还有许多小吃店，可以品尝到各种各样的本地美食。']]\\n{'num_prompt_tokens': 44, 'num_generated_tokens': 46, 'num_samples': 1, 'runtime': 0.47030443901894614, 'samples/s': 2.1262822908624837, 'tokens/s': 97.80898537967424}\\n\\\"\\\"\\\"\\n```\\n\\n\\n### 使用CLI\\n```bash\\n# qwen\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen-7b-chat --infer_backend vllm\\n# yi\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type yi-6b-chat --infer_backend vllm\\n# gptq\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat-int4 --infer_backend vllm\\n\\n# TP\\n# 2 * 80GiB A100\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1 swift infer \\\\\\n    --model_type qwen2-72b-instruct --infer_backend vllm --max_model_len 2048 \\\\\\n    --tensor_parallel_size 2\\n```\\n\\n### 微调后的模型\\n\\n**单样本推理**:\\n\\n使用LoRA进行微调的模型你需要先[merge-lora](../Instruction/LLM微调文档.md#merge-lora), 产生完整的checkpoint目录.\\n\\n使用全参数微调的模型可以无缝使用VLLM进行推理加速.\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_vllm\\n)\\n\\nckpt_dir = 'vx-xxx/checkpoint-100-merged'\\nmodel_type = ModelType.qwen_7b_chat\\ntemplate_type = get_default_template_type(model_type)\\n\\nllm_engine = get_vllm_engine(model_type, model_id_or_path=ckpt_dir)\\ntokenizer = llm_engine.hf_tokenizer\\ntemplate = get_template(template_type, tokenizer)\\nquery = '你好'\\nresp = inference_vllm(llm_engine, template, [{'query': query}])[0]\\nprint(f\\\"response: {resp['response']}\\\")\\nprint(f\\\"history: {resp['history']}\\\")\\n```\\n\\n**使用CLI**:\\n```bash\\n# merge LoRA增量权重并使用vllm进行推理加速\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\n# 使用数据集评估\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' \\\\\\n    --infer_backend vllm \\\\\\n    --load_dataset_config true \\\\\\n\\n# 人工评估\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' \\\\\\n    --infer_backend vllm \\\\\\n```\\n\\n## Web-UI加速\\n\\n### 原始模型\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --model_type qwen-7b-chat --infer_backend vllm\\n```\\n\\n### 微调后模型\\n```bash\\n# merge LoRA增量权重并使用vllm作为backend构建app-ui\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged' --infer_backend vllm\\n```\\n\\n## 部署\\nswift使用VLLM作为推理后端, 并兼容openai的API样式.\\n\\n服务端的部署命令行参数可以参考: [deploy命令行参数](../Instruction/命令行参数.md#deploy-参数).\\n\\n客户端的openai的API参数可以参考: https://platform.openai.com/docs/api-reference/introduction.\\n\\nbenchmark测试代码: https://github.com/modelscope/ms-swift/blob/main/scripts/benchmark/deploy.py\\n\\n### 原始模型\\n#### qwen-7b-chat\\n\\n**服务端:**\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen-7b-chat\\n# 多卡部署\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy --model_type qwen-7b-chat --tensor_parallel_size 4\\n```\\n\\n**客户端:**\\n\\n测试:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen-7b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"晚上睡不着觉怎么办？\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\n使用swift的同步客户端接口:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = '浙江的省会在哪里?'\\nrequest_config = XRequestConfig(seed=42)\\nresp = inference_client(model_type, query, request_config=request_config)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nhistory = [(query, response)]\\nquery = '这有什么好吃的?'\\nrequest_config = XRequestConfig(stream=True, seed=42)\\nstream_resp = inference_client(model_type, query, history, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b-chat\\nquery: 浙江的省会在哪里?\\nresponse: 浙江省的省会是杭州市。\\nquery: 这有什么好吃的?\\nresponse: 杭州有许多美食，例如西湖醋鱼、东坡肉、龙井虾仁、叫化童子鸡等。此外，杭州还有许多特色小吃，如西湖藕粉、杭州小笼包、杭州油条等。\\n\\\"\\\"\\\"\\n```\\n\\n使用swift的异步客户端接口:\\n```python\\nimport asyncio\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client_async\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = '浙江的省会在哪里?'\\nrequest_config = XRequestConfig(seed=42)\\ntasks = [inference_client_async(model_type, query, request_config=request_config) for _ in range(5)]\\nasync def _batch_run(tasks):\\n    return await asyncio.gather(*tasks)\\n\\nresp_list = asyncio.run(_batch_run(tasks))\\nresp = resp_list[0]\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nasync def _stream():\\n    global query\\n    history = [(query, response)]\\n    query = '这有什么好吃的?'\\n    request_config = XRequestConfig(stream=True, seed=42)\\n    stream_resp = await inference_client_async(model_type, query, history, request_config=request_config)\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    async for chunk in stream_resp:\\n        print(chunk.choices[0].delta.content, end='', flush=True)\\n    print()\\n\\nasyncio.run(_stream())\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b-chat\\nquery: 浙江的省会在哪里?\\nresponse: 浙江省的省会是杭州市。\\nquery: 这有什么好吃的?\\nresponse: 浙江省有很多美食，比如杭州菜、宁波菜、绍兴菜、温州菜等。其中，杭州菜以清淡、鲜美、精致著称，而宁波菜则以鲜美、醇厚、香辣著称。此外，浙江省还有许多特色小吃，比如杭州的西湖醋鱼、宁波的汤圆、绍兴的酒酿圆子等。\\n\\\"\\\"\\\"\\n```\\n\\n使用openai（同步）:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = '浙江的省会在哪里?'\\nmessages = [{\\n    'role': 'user',\\n    'content': query\\n}]\\nresp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nmessages.append({'role': 'assistant', 'content': response})\\nquery = '这有什么好吃的?'\\nmessages.append({'role': 'user', 'content': query})\\nstream_resp = client.chat.completions.create(\\n    model=model_type,\\n    messages=messages,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b-chat\\nquery: 浙江的省会在哪里?\\nresponse: 浙江省的省会是杭州市。\\nquery: 这有什么好吃的?\\nresponse: 杭州有许多美食，例如西湖醋鱼、东坡肉、龙井虾仁、叫化童子鸡等。此外，杭州还有许多特色小吃，如西湖藕粉、杭州小笼包、杭州油条等。\\n\\\"\\\"\\\"\\n```\\n\\n#### qwen-7b\\n\\n**服务端:**\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen-7b\\n# 多卡部署\\nRAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy --model_type qwen-7b --tensor_parallel_size 4\\n```\\n\\n**客户端:**\\n\\n测试:\\n```bash\\ncurl http://localhost:8000/v1/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"qwen-7b\\\",\\n\\\"prompt\\\": \\\"浙江 -> 杭州\\\\n安徽 -> 合肥\\\\n四川 ->\\\",\\n\\\"max_tokens\\\": 32,\\n\\\"temperature\\\": 0.1,\\n\\\"seed\\\": 42\\n}'\\n```\\n\\n使用swift的同步客户端接口:\\n```python\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = '浙江 -> 杭州\\\\n安徽 -> 合肥\\\\n四川 ->'\\nrequest_config = XRequestConfig(max_tokens=32, temperature=0.1, seed=42)\\nresp = inference_client(model_type, query, request_config=request_config)\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nrequest_config.stream = True\\nstream_resp = inference_client(model_type, query, request_config=request_config)\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].text, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b\\nquery: 浙江 -> 杭州\\n安徽 -> 合肥\\n四川 ->\\nresponse:  成都\\n广东 -> 广州\\n江苏 -> 南京\\n浙江 -> 杭州\\n安徽 -> 合肥\\n四川 -> 成都\\n\\nquery: 浙江 -> 杭州\\n安徽 -> 合肥\\n四川 ->\\nresponse:  成都\\n广东 -> 广州\\n江苏 -> 南京\\n浙江 -> 杭州\\n安徽 -> 合肥\\n四川 -> 成都\\n\\\"\\\"\\\"\\n```\\n\\n使用swift的异步客户端接口:\\n```python\\nimport asyncio\\nfrom swift.llm import get_model_list_client, XRequestConfig, inference_client_async\\n\\nmodel_list = get_model_list_client()\\nmodel_type = model_list.data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = '浙江 -> 杭州\\\\n安徽 -> 合肥\\\\n四川 ->'\\nrequest_config = XRequestConfig(max_tokens=32, temperature=0.1, seed=42)\\n\\nresp = asyncio.run(inference_client_async(model_type, query, request_config=request_config))\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\nasync def _stream():\\n    request_config.stream = True\\n    stream_resp = await inference_client_async(model_type, query, request_config=request_config)\\n    print(f'query: {query}')\\n    print('response: ', end='')\\n    async for chunk in stream_resp:\\n        print(chunk.choices[0].text, end='', flush=True)\\n    print()\\n\\nasyncio.run(_stream())\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b\\nquery: 浙江 -> 杭州\\n安徽 -> 合肥\\n四川 ->\\nresponse:  成都\\n广东 -> 广州\\n江苏 -> 南京\\n浙江 -> 杭州\\n安徽 -> 合肥\\n四川 -> 成都\\n\\nquery: 浙江 -> 杭州\\n安徽 -> 合肥\\n四川 ->\\nresponse:  成都\\n广东 -> 广州\\n江苏 -> 南京\\n浙江 -> 杭州\\n安徽 -> 合肥\\n四川 -> 成都\\n\\\"\\\"\\\"\\n```\\n\\n\\n使用openai（同步）:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type = client.models.list().data[0].id\\nprint(f'model_type: {model_type}')\\n\\nquery = '浙江 -> 杭州\\\\n安徽 -> 合肥\\\\n四川 ->'\\nkwargs = {'model': model_type, 'prompt': query, 'seed': 42, 'temperature': 0.1, 'max_tokens': 32}\\n\\nresp = client.completions.create(**kwargs)\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nstream_resp = client.completions.create(stream=True, **kwargs)\\nresponse = resp.choices[0].text\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].text, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type: qwen-7b\\nquery: 浙江 -> 杭州\\n安徽 -> 合肥\\n四川 ->\\nresponse:  成都\\n广东 -> 广州\\n江苏 -> 南京\\n浙江 -> 杭州\\n安徽 -> 合肥\\n四川 -> 成都\\n\\nquery: 浙江 -> 杭州\\n安徽 -> 合肥\\n四川 ->\\nresponse:  成都\\n广东 -> 广州\\n江苏 -> 南京\\n浙江 -> 杭州\\n安徽 -> 合肥\\n四川 -> 成都\\n\\\"\\\"\\\"\\n```\\n\\n### 微调后模型\\n服务端:\\n```bash\\n# merge LoRA增量权重并部署\\n# 如果你需要量化, 可以指定`--quant_bits 4`.\\nCUDA_VISIBLE_DEVICES=0 swift export \\\\\\n    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true\\n\\nCUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged'\\n```\\n\\n客户端示例代码同原始模型.\\n\\n## 多LoRA部署\\n\\n目前pt方式部署模型已经支持`peft>=0.10.0`进行多LoRA部署，具体方法为：\\n\\n- 确保部署时`merge_lora`为`False`\\n- 使用`--lora_modules`参数,  可以查看[命令行文档](../Instruction/命令行参数.md)\\n- 推理时指定lora tuner的名字到模型字段\\n\\n举例：\\n\\n```shell\\n# 假设从llama3-8b-instruct训练了一个名字叫卡卡罗特的LoRA模型\\n# 服务端\\nswift deploy --ckpt_dir /mnt/ckpt-1000 --infer_backend pt --lora_modules my_tuner=/mnt/my-tuner\\n# 会加载起来两个tuner，一个是`/mnt/ckpt-1000`的`default-lora`，一个是`/mnt/my-tuner`的`my_tuner`\\n\\n# 客户端\\ncurl http://localhost:8000/v1/chat/completions -H \\\"Content-Type: application/json\\\" -d '{\\n\\\"model\\\": \\\"my-tuner\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"who are you?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n# resp: 我是卡卡罗特...\\n# 如果指定mode='llama3-8b-instruct'，则返回I'm llama3...，即原模型的返回值\\n```\\n\\n> [!NOTE]\\n>\\n> `--ckpt_dir`参数如果是个lora路径，则原来的default会被加载到default-lora的tuner上，其他的tuner需要通过`lora_modules`自行加载\\n\\n## VLLM & LoRA\\n\\nVLLM & LoRA支持的模型可以查看: https://docs.vllm.ai/en/latest/models/supported_models.html\\n\\n### 准备LoRA\\n```shell\\n# Experimental environment: 4 * A100\\n# 4 * 30GB GPU memory\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=4 \\\\\\nswift sft \\\\\\n    --model_type llama2-7b-chat \\\\\\n    --dataset self-cognition#500 sharegpt-gpt4:default#1000 \\\\\\n    --max_length 4096 \\\\\\n    --learning_rate 1e-4 \\\\\\n    --output_dir output \\\\\\n    --lora_target_modules ALL \\\\\\n    --model_name 小黄 'Xiao Huang' \\\\\\n    --model_author 魔搭 ModelScope \\\\\\n```\\n\\n\\n### VLLM推理加速\\n\\n推理:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift infer \\\\\\n    --ckpt_dir output/llama2-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm \\\\\\n    --vllm_enable_lora true\\n```\\n\\n运行结果:\\n```python\\n\\\"\\\"\\\"\\n<<< who are you?\\nI am an artificial intelligence language model developed by ModelScope. I am designed to assist and communicate with users in a helpful and respectful manner. I can answer questions, provide information, and engage in conversation. How can I help you?\\n\\\"\\\"\\\"\\n```\\n\\n单样本推理:\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\nimport torch\\nfrom swift.llm import (\\n    ModelType, get_vllm_engine, get_default_template_type,\\n    get_template, inference_stream_vllm, LoRARequest, inference_vllm\\n)\\n\\nlora_checkpoint = 'output/llama2-7b-chat/vx-xxx/checkpoint-xxx'\\nlora_request = LoRARequest('default-lora', 1, lora_checkpoint)\\n\\nmodel_type = ModelType.llama2_7b_chat\\nllm_engine = get_vllm_engine(model_type, torch.float16, enable_lora=True,\\n                             max_loras=1, max_lora_rank=16)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, llm_engine.hf_tokenizer)\\n# 与`transformers.GenerationConfig`类似的接口\\nllm_engine.generation_config.max_new_tokens = 256\\n\\n# use lora\\nrequest_list = [{'query': 'who are you?'}]\\nquery = request_list[0]['query']\\nresp_list = inference_vllm(llm_engine, template, request_list, lora_request=lora_request)\\nresponse = resp_list[0]['response']\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# no lora\\ngen = inference_stream_vllm(llm_engine, template, request_list)\\nquery = request_list[0]['query']\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nprint_idx = 0\\nfor resp_list in gen:\\n    response = resp_list[0]['response']\\n    print(response[print_idx:], end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\\"\\\"\\\"\\nquery: who are you?\\nresponse: I am an artificial intelligence language model developed by ModelScope. I can understand and respond to text-based questions and prompts, and provide information and assistance on a wide range of topics.\\nquery: who are you?\\nresponse:  Hello! I'm just an AI assistant, here to help you with any questions or tasks you may have. I'm designed to be helpful, respectful, and honest in my responses, and I strive to provide socially unbiased and positive answers. I'm not a human, but a machine learning model trained on a large dataset of text to generate responses to a wide range of questions and prompts. I'm here to help you in any way I can, while always ensuring that my answers are safe and respectful. Is there anything specific you'd like to know or discuss?\\n\\\"\\\"\\\"\\n```\\n\\n\\n### 部署\\n\\n**服务端**:\\n```shell\\nCUDA_VISIBLE_DEVICES=0 swift deploy \\\\\\n    --ckpt_dir output/llama2-7b-chat/vx-xxx/checkpoint-xxx \\\\\\n    --infer_backend vllm \\\\\\n    --vllm_enable_lora true\\n```\\n\\n**客户端**:\\n\\n测试:\\n```bash\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"default-lora\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"who are you?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n\\ncurl http://localhost:8000/v1/chat/completions \\\\\\n-H \\\"Content-Type: application/json\\\" \\\\\\n-d '{\\n\\\"model\\\": \\\"llama2-7b-chat\\\",\\n\\\"messages\\\": [{\\\"role\\\": \\\"user\\\", \\\"content\\\": \\\"who are you?\\\"}],\\n\\\"max_tokens\\\": 256,\\n\\\"temperature\\\": 0\\n}'\\n```\\n\\n输出:\\n```python\\n\\\"\\\"\\\"\\n{\\\"model\\\":\\\"default-lora\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"I am an artificial intelligence language model developed by ModelScope. I am designed to assist and communicate with users in a helpful, respectful, and honest manner. I can answer questions, provide information, and engage in conversation. How can I assist you?\\\"},\\\"finish_reason\\\":\\\"stop\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":141,\\\"completion_tokens\\\":53,\\\"total_tokens\\\":194},\\\"id\\\":\\\"chatcmpl-fb95932dcdab4ce68f4be49c9946b306\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1710820459}\\n\\n{\\\"model\\\":\\\"llama2-7b-chat\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\" Hello! I'm just an AI assistant, here to help you with any questions or concerns you may have. I'm designed to provide helpful, respectful, and honest responses, while ensuring that my answers are socially unbiased and positive in nature. I'm not capable of providing harmful, unethical, racist, sexist, toxic, dangerous, or illegal content, and I will always do my best to explain why I cannot answer a question if it does not make sense or is not factually coherent. If I don't know the answer to a question, I will not provide false information. My goal is to assist and provide accurate information to the best of my abilities. Is there anything else I can help you with?\\\"},\\\"finish_reason\\\":\\\"stop\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":141,\\\"completion_tokens\\\":163,\\\"total_tokens\\\":304},\\\"id\\\":\\\"chatcmpl-d867a3a52bb7451588d4f73e1df4ba95\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1710820557}\\n\\\"\\\"\\\"\\n```\\n\\n使用openai:\\n```python\\nfrom openai import OpenAI\\nclient = OpenAI(\\n    api_key='EMPTY',\\n    base_url='http://localhost:8000/v1',\\n)\\nmodel_type_list = [model.id for model in client.models.list().data]\\nprint(f'model_type_list: {model_type_list}')\\n\\nquery = 'who are you?'\\nmessages = [{\\n    'role': 'user',\\n    'content': query\\n}]\\nresp = client.chat.completions.create(\\n    model='default-lora',\\n    messages=messages,\\n    seed=42)\\nresponse = resp.choices[0].message.content\\nprint(f'query: {query}')\\nprint(f'response: {response}')\\n\\n# 流式\\nstream_resp = client.chat.completions.create(\\n    model='llama2-7b-chat',\\n    messages=messages,\\n    stream=True,\\n    seed=42)\\n\\nprint(f'query: {query}')\\nprint('response: ', end='')\\nfor chunk in stream_resp:\\n    print(chunk.choices[0].delta.content, end='', flush=True)\\nprint()\\n\\n\\\"\\\"\\\"Out[0]\\nmodel_type_list: ['llama2-7b-chat', 'default-lora']\\nquery: who are you?\\nresponse: I am an artificial intelligence language model developed by ModelScope. I am designed to assist and communicate with users in a helpful, respectful, and honest manner. I can answer questions, provide information, and engage in conversation. How can I assist you?\\nquery: who are you?\\nresponse:  Hello! I'm just an AI assistant, here to help you with any questions or concerns you may have. I'm designed to provide helpful, respectful, and honest responses, while ensuring that my answers are socially unbiased and positive in nature. I'm not capable of providing harmful, unethical, racist, sexist, toxic, dangerous, or illegal content, and I will always do my best to explain why I cannot answer a question if it does not make sense or is not factually coherent. If I don't know the answer to a question, I will not provide false information. Is there anything else I can help you with?\\n\\\"\\\"\\\"\\n```\\n\\n\\n# LmDeploy推理加速与部署\\nlmdeploy github: [https://github.com/InternLM/lmdeploy](https://github.com/InternLM/lmdeploy).\\n\\n支持lmdeploy推理加速的模型可以查看[支持的模型](../Instruction/支持的模型和数据集.md#模型).\\n\\n## 目录\\n- [环境准备](#环境准备)\\n- [推理加速](#推理加速)\\n- [部署](#部署)\\n- [多模态](#多模态)\\n\\n## 环境准备\\nGPU设备: A10, 3090, V100, A100均可.\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# lmdeploy与cuda版本有对应关系，请按照`https://github.com/InternLM/lmdeploy#installation`进行安装\\npip install lmdeploy\\n```\\n\\n## 推理加速\\n\\n### 使用python\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\nmodel_type = ModelType.qwen_7b_chat\\nmodel_id_or_path = None\\nlmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path)\\ntemplate_type = get_default_template_type(model_type)\\ntemplate = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n# 与`transformers.GenerationConfig`类似的接口\\nlmdeploy_engine.generation_config.max_new_tokens = 256\\ngeneration_info = {}\\n\\nrequest_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\nresp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nfor request, resp in zip(request_list, resp_list):\\n    print(f\\\"query: {request['query']}\\\")\\n    print(f\\\"response: {resp['response']}\\\")\\nprint(generation_info)\\n\\n# stream\\nhistory1 = resp_list[1]['history']\\nrequest_list = [{'query': '这有什么好吃的', 'history': history1}]\\ngen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\nquery = request_list[0]['query']\\nprint_idx = 0\\nprint(f'query: {query}\\\\nresponse: ', end='')\\nfor resp_list in gen:\\n    resp = resp_list[0]\\n    response = resp['response']\\n    delta = response[print_idx:]\\n    print(delta, end='', flush=True)\\n    print_idx = len(response)\\nprint()\\n\\nhistory = resp_list[0]['history']\\nprint(f'history: {history}')\\nprint(generation_info)\\n\\\"\\\"\\\"\\nquery: 你好!\\nresponse: 你好！有什么我能帮助你的吗？\\nquery: 浙江的省会在哪？\\nresponse: 浙江省会是杭州市。\\n{'num_prompt_tokens': 46, 'num_generated_tokens': 13, 'num_samples': 2, 'runtime': 0.2037766759749502, 'samples/s': 9.81466593480922, 'tokens/s': 63.79532857625993}\\nquery: 这有什么好吃的\\nresponse: 杭州有许多美食，比如西湖醋鱼、东坡肉、龙井虾仁、油炸臭豆腐等，都是当地非常有名的传统名菜。此外，当地的点心也非常有特色，比如桂花糕、马蹄酥、绿豆糕等。\\nhistory: [['浙江的省会在哪？', '浙江省会是杭州市。'], ['这有什么好吃的', '杭州有许多美食，比如西湖醋鱼、东坡肉、龙井虾仁、油炸臭豆腐等，都是当地非常有名的传统名菜。此外，当地的点心也非常有特色，比如桂花糕、马蹄酥、绿豆糕等。']]\\n{'num_prompt_tokens': 44, 'num_generated_tokens': 53, 'num_samples': 1, 'runtime': 0.6306625790311955, 'samples/s': 1.5856339558566632, 'tokens/s': 84.03859966040315}\\n\\\"\\\"\\\"\\n```\\n\\n**TP:**\\n\\n```python\\nimport os\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0,1'\\n\\nfrom swift.llm import (\\n    ModelType, get_lmdeploy_engine, get_default_template_type,\\n    get_template, inference_lmdeploy, inference_stream_lmdeploy\\n)\\n\\nif __name__ == '__main__':\\n    model_type = ModelType.qwen2_7b_instruct\\n    model_id_or_path = None\\n    lmdeploy_engine = get_lmdeploy_engine(model_type, model_id_or_path=model_id_or_path, tp=2)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, lmdeploy_engine.hf_tokenizer)\\n    # 与`transformers.GenerationConfig`类似的接口\\n    lmdeploy_engine.generation_config.max_new_tokens = 1024\\n    generation_info = {}\\n\\n    request_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\n    resp_list = inference_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n    print(generation_info)\\n\\n    # stream\\n    history1 = resp_list[1]['history']\\n    request_list = [{'query': '这有什么好吃的', 'history': history1}]\\n    gen = inference_stream_lmdeploy(lmdeploy_engine, template, request_list, generation_info=generation_info)\\n    query = request_list[0]['query']\\n    print_idx = 0\\n    print(f'query: {query}\\\\nresponse: ', end='')\\n    for resp_list in gen:\\n        resp = resp_list[0]\\n        response = resp['response']\\n        delta = response[print_idx:]\\n        print(delta, end='', flush=True)\\n        print_idx = len(response)\\n    print()\\n\\n    history = resp_list[0]['history']\\n    print(f'history: {history}')\\n    print(generation_info)\\n\\n\\\"\\\"\\\"\\nquery: 你好!\\nresponse: 你好！有什么我可以帮助你的吗？\\nquery: 浙江的省会在哪？\\nresponse: 浙江省的省会是杭州市。\\n{'num_prompt_tokens': 46, 'num_generated_tokens': 15, 'num_samples': 2, 'runtime': 0.18026001192629337, 'samples/s': 11.095084143330586, 'tokens/s': 83.2131310749794}\\nquery: 这有什么好吃的\\nresponse: 浙江省，简称“浙”，位于中国东南沿海长江三角洲地区，是一个美食资源丰富的地区。这里不仅有传统的江南菜系，还融合了海洋文化的特色，形成了独特的饮食文化。以下是一些浙江的著名美食：\\n\\n1. **西湖醋鱼**：一道源自杭州的传统名菜，选用鲜活的草鱼，肉质细嫩，酸甜适口，是来杭州必尝的佳肴。\\n\\n2. **东坡肉**：也是源于杭州的一道经典菜肴，以五花肉为主料，经过长时间的慢炖，肉质酥软，味道浓郁。\\n\\n3. **龙井虾仁**：以杭州龙井茶为原料，搭配新鲜的虾仁，色香味俱佳，是将茶文化和美食完美结合的佳作。\\n\\n4. **宁波汤圆**：宁波的汤圆以皮薄馅多、甜而不腻著称，有芝麻、豆沙等多种口味，是宁波地区的传统小吃。\\n\\n5. **海鲜大餐**：浙江沿海城市如宁波、舟山等地，海鲜种类丰富，可以品尝到各种新鲜的海产，如东海三鲜（黄鱼、带鱼、小黄鱼）、虾蟹等。\\n\\n6. **绍兴酒**：绍兴不仅是著名的黄酒产地，还有其他多种酒类，如女儿红、加饭酒等，口感醇厚，是佐餐或品饮的好选择。\\n\\n7. **衢州烤饼**：在衢州地区非常有名的小吃，外皮酥脆，内里松软，通常会夹上肉末、葱花等配料。\\n\\n8. **台州海鲜面**：台州的海鲜面以其丰富的海鲜和独特的调味方式闻名，面条滑爽，海鲜鲜美。\\n\\n这些只是浙江美食中的一部分，每个地方都有其独特的风味和特色小吃，值得一一尝试。\\nhistory: [['浙江的省会在哪？', '浙江省的省会是杭州市。'], ['这有什么好吃的', '浙江省，简称“浙”，位于中国东南沿海长江三角洲地区，是一个美食资源丰富的地区。这里不仅有传统的江南菜系，还融合了海洋文化的特色，形成了独特的饮食文化。以下是一些浙江的著名美食：\\\\n\\\\n1. **西湖醋鱼**：一道源自杭州的传统名菜，选用鲜活的草鱼，肉质细嫩，酸甜适口，是来杭州必尝的佳肴。\\\\n\\\\n2. **东坡肉**：也是源于杭州的一道经典菜肴，以五花肉为主料，经过长时间的慢炖，肉质酥软，味道浓郁。\\\\n\\\\n3. **龙井虾仁**：以杭州龙井茶为原料，搭配新鲜的虾仁，色香味俱佳，是将茶文化和美食完美结合的佳作。\\\\n\\\\n4. **宁波汤圆**：宁波的汤圆以皮薄馅多、甜而不腻著称，有芝麻、豆沙等多种口味，是宁波地区的传统小吃。\\\\n\\\\n5. **海鲜大餐**：浙江沿海城市如宁波、舟山等地，海鲜种类丰富，可以品尝到各种新鲜的海产，如东海三鲜（黄鱼、带鱼、小黄鱼）、虾蟹等。\\\\n\\\\n6. **绍兴酒**：绍兴不仅是著名的黄酒产地，还有其他多种酒类，如女儿红、加饭酒等，口感醇厚，是佐餐或品饮的好选择。\\\\n\\\\n7. **衢州烤饼**：在衢州地区非常有名的小吃，外皮酥脆，内里松软，通常会夹上肉末、葱花等配料。\\\\n\\\\n8. **台州海鲜面**：台州的海鲜面以其丰富的海鲜和独特的调味方式闻名，面条滑爽，海鲜鲜美。\\\\n\\\\n这些只是浙江美食中的一部分，每个地方都有其独特的风味和特色小吃，值得一一尝试。']]\\n{'num_prompt_tokens': 46, 'num_generated_tokens': 384, 'num_samples': 1, 'runtime': 2.7036479230737314, 'samples/s': 0.36987064457087926, 'tokens/s': 142.03032751521764}\\n\\\"\\\"\\\"\\n```\\n\\n### 使用CLI\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen2-7b-instruct --infer_backend lmdeploy\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen2-7b-instruct --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift infer --model_type qwen2-72b-instruct --infer_backend lmdeploy --tp 2\\n```\\n\\n## 部署\\n```bash\\nCUDA_VISIBLE_DEVICES=0 swift deploy --model_type qwen2-7b-instruct --infer_backend lmdeploy\\n# TP\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen2-7b-instruct --infer_backend lmdeploy --tp 2\\n\\nCUDA_VISIBLE_DEVICES=0,1 swift deploy --model_type qwen2-72b-instruct --infer_backend lmdeploy --tp 2\\n```\\n\\n客户端调用方式可以查看: [vLLM推理加速与部署文档](VLLM推理加速与部署.md#部署)\\n\\nbenchmark测试代码: https://github.com/modelscope/ms-swift/blob/main/scripts/benchmark/deploy.py\\n\\n## 多模态\\n查看[这里](../Multi-Modal/LmDeploy推理加速文档.md)\\n\\n\\n# DPO训练文档\\n## 目录\\n- [环境准备](#环境准备)\\n- [人类对齐训练](#人类对齐训练)\\n\\n## 环境准备\\nGPU设备: A10, 3090, V100, A100均可，如果是显存<=24G的GPU最少需要双卡环境。由于人类对齐训练在一张卡上加载两个模型，因此比微调的显存多占用一个推理模型的显存使用量。\\n```bash\\n# 设置pip全局镜像 (加速下载)\\npip config set global.index-url https://mirrors.aliyun.com/pypi/simple/\\n# 安装ms-swift\\ngit clone https://github.com/modelscope/swift.git\\ncd swift\\npip install -e '.[llm]'\\n\\n# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)\\npip install -r requirements/framework.txt  -U\\npip install -r requirements/llm.txt  -U\\n```\\n\\n## 人类对齐训练\\n下面的shell脚本运行了一个人类对齐训练。首先需要切换到运行目录：\\n\\n```shell\\ncd examples/pytorch/llm\\n```\\n\\n运行下面的命令：\\n\\n```shell\\n# Experimental environment: 4*A100\\n# Memory usage: 4 * 20G，双卡device_map * 2ddp\\nnproc_per_node=2\\n\\nCUDA_VISIBLE_DEVICES=0,1,2,3 \\\\\\nNPROC_PER_NODE=$nproc_per_node \\\\\\nMASTER_PORT=29500 \\\\\\nswift rlhf \\\\\\n    --rlhf_type dpo \\\\\\n    --model_type  yi-6b-chat \\\\\\n    --model_revision  master \\\\\\n    --sft_type  lora \\\\\\n    --tuner_backend  swift \\\\\\n    --dtype  AUTO  \\\\\\n    --output_dir  output  \\\\\\n    --dataset  hh-rlhf-cn:harmless_base_cn  \\\\\\n    --num_train_epochs  3  \\\\\\n    --max_length  1024  \\\\\\n    --check_dataset_strategy  none  \\\\\\n    --lora_rank  8  \\\\\\n    --lora_alpha  32  \\\\\\n    --lora_dropout  0.05  \\\\\\n    --lora_target_modules  ALL  \\\\\\n    --gradient_checkpointing  true  \\\\\\n    --batch_size  1  \\\\\\n    --weight_decay  0.1  \\\\\\n    --learning_rate  5e-5  \\\\\\n    --gradient_accumulation_steps  $(expr 16 / $nproc_per_node)  \\\\\\n    --max_grad_norm  1.0  \\\\\\n    --warmup_ratio  0.03  \\\\\\n    --eval_steps  2000  \\\\\\n    --save_steps  2000  \\\\\\n    --save_total_limit  2  \\\\\\n    --logging_steps  10 \\\\\\n```\\n\\n### sh脚本\\n\\nsh脚本可以查看[这里](https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/dpo)。\\n\\n```bash\\n# 下面的脚本需要在此目录下执行\\ncd examples/pytorch/llm\\n```\\n\\n**提示**:\\n\\n- 如果用带有history的数据训练base模型，需要指定支持多轮对话的template(base模型往往不支持多轮对话)，对于这种情况我们默认设置了`chatml`template，你也可以支持--model_type 来选择训练模型的template\\n- 我们默认在训练时设置`--gradient_checkpointing true`来**节约显存**, 这会略微降低训练速度.\\n- 如果你使用的是**V100**等较老的GPU, 你需要设置`--dtype AUTO`或者`--dtype fp16`, 因为其不支持bf16.\\n- 如果你的机器是A100等高性能显卡, 且使用的是qwen系列模型, 推荐你安装[**flash-attn**](https://github.com/Dao-AILab/flash-attention), 这将会加快训练和推理的速度以及显存占用(3090, V100等显卡不支持flash-attn进行训练). 支持flash-attn的模型可以查看[LLM支持的模型](../Instruction/支持的模型和数据集.md#模型)\\n- 如果你需要断网进行训练, 请使用`--model_id_or_path <model_dir>`和设置`--check_model_is_latest false`. 具体参数含义请查看[命令行参数](../Instruction/命令行参数.md).\\n- 如果你想在训练时, 将权重push到ModelScope Hub中, 你需要设置`--push_to_hub true`.\\n\\n```bash\\n# dpo训练 mistral-7b max_length=1024，bs=1\\n# 推荐的实验环境: V100, A10, 3090，2卡4卡或8卡\\nbash scripts/dpo/lora_ddp_mp/dpo.sh\\nbash scripts/dpo/lora_ddp_mp/infer.sh\\n```\\n\\n由于DPO训练后会得到一个完整模型或者adapter的weights，因此LoRA合并、推理的步骤和微调步骤相同，因此请参考[微调文档](../Instruction/LLM微调文档.md#merge-lora)对应的步骤。\\n\\n\\n# HuggingFace生态兼容\\n默认我们会使用[ModelScope](https://modelscope.cn/my/overview)中的模型和数据集进行微调和推理。但是考虑到海外用户更熟悉[HuggingFace](https://huggingface.co/)生态，这里对其进行兼容。\\n\\n你需要设置环境变量`USE_HF=1`，支持的HuggingFace模型和数据集可以参考[支持的模型和数据集](../Instruction/支持的模型和数据集.md)，部分数据集只支持在ModelScope环境下使用。\\n\\n以下是对`qwen1.5-7b-chat`的推理脚本:\\n```shell\\n# Experimental Environment: A10, 3090, V100\\nUSE_HF=1 CUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-7b-chat\\n```\\n\\n微调脚本:\\n```shell\\n# Experimental Environment: 2 * A100\\n# GPU Memory Requirement: 2 * 30GB\\nUSE_HF=1 \\\\\\nNPROC_PER_NODE=2 \\\\\\nCUDA_VISIBLE_DEVICES=0,1 \\\\\\nswift sft \\\\\\n    --model_type qwen1half-7b-chat \\\\\\n    --dataset blossom-math-zh \\\\\\n    --num_train_epochs 5 \\\\\\n    --sft_type lora \\\\\\n    --output_dir output \\\\\\n```\\n\\n微调后推理与部署等内容参考其他文档.\\n\\n\\n## LLM文档\\n\\n[English Documentation](https://swift.readthedocs.io/en/latest/LLM/index.html)\\n\\n### 📚教程\\n\\n1. [人类偏好对齐训练文档](人类偏好对齐训练文档.md)\\n2. [DPO训练文档](DPO训练文档.md)\\n3. [ORPO最佳实践](ORPO算法最佳实践.md)\\n4. [SimPO最佳实践](SimPO算法最佳实践.md)\\n5. [OLLAMA导出文档](OLLAMA导出文档.md)\\n6. [VLLM推理加速与部署](VLLM推理加速与部署.md)\\n7. [LmDeploy推理加速与部署](LmDeploy推理加速与部署.md)\\n8. [Megatron训练文档](Megatron训练文档.md)\\n\\n### ⭐️最佳实践系列\\n\\n1. [自我认知微调最佳实践](自我认知微调最佳实践.md)\\n2. [Agent训练与通用数据混合最佳实践](Agent微调最佳实践.md)\\n3. [Agent部署最佳实践](Agent部署最佳实践.md)\\n4. [Qwen1.5全流程最佳实践](Qwen1.5全流程最佳实践.md)\\n5. [NPU推理与微调最佳实践](NPU推理与微调最佳实践.md)\\n6. [Grok-1训练和推理最佳实践](Grok训练和推理.md)\\n\\n### 🐔参考文档\\n1. [运行速度与显存的Benchmark](Benchmark.md)\\n2. [HuggingFace生态兼容](HuggingFace生态兼容.md)\\n\\n\\n### 🍀Multi-Modal最佳实践系列\\n查看这里: [Multi-Modal最佳实践系列](../Multi-Modal/index.md)\\n\\n\\nimport os\\nimport re\\n\\nimport torch\\nfrom modelscope import snapshot_download\\n\\nfrom swift.llm import MODEL_MAPPING\\n\\n\\ndef test_readme():\\n    for model_type in MODEL_MAPPING.keys():\\n        model_id = MODEL_MAPPING[model_type]['model_id_or_path']\\n        model_dir = snapshot_download(model_id, revision='master')\\n        readme_path = os.path.join(model_dir, 'README.md')\\n        assert os.path.exists(readme_path)\\n        with open(readme_path, 'r') as f:\\n            text = f.read()\\n\\n        code_list = re.findall(r'```python\\\\n(.+?)\\\\n```', text, re.M | re.S)\\n        print(f'model_type: {model_type}')\\n        for code in code_list:\\n            if 'import' not in code or 'modelscope' not in code:\\n                continue\\n            try:\\n                exec(code)\\n            except Exception:\\n                print(code)\\n                input('[ENTER')\\n        torch.cuda.empty_cache()\\n\\n\\nif __name__ == '__main__':\\n    test_readme()\\n\\n\\nfrom dataclasses import dataclass\\n\\nfrom swift.llm import get_default_template_type, get_template, get_vllm_engine, inference_vllm\\nfrom swift.utils import get_main\\n\\n\\n@dataclass\\nclass VLLMTestArgs:\\n    model_type: str\\n\\n\\ndef test_vllm(args: VLLMTestArgs) -> None:\\n    model_type = args.model_type\\n    llm_engine = get_vllm_engine(model_type)\\n    template_type = get_default_template_type(model_type)\\n    template = get_template(template_type, llm_engine.hf_tokenizer)\\n\\n    llm_engine.generation_config.max_new_tokens = 256\\n\\n    request_list = [{'query': '你好!'}, {'query': '浙江的省会在哪？'}]\\n    resp_list = inference_vllm(llm_engine, template, request_list)\\n    for request, resp in zip(request_list, resp_list):\\n        print(f\\\"query: {request['query']}\\\")\\n        print(f\\\"response: {resp['response']}\\\")\\n\\n\\ntest_vllm_main = get_main(VLLMTestArgs, test_vllm)\\n\\nif __name__ == '__main__':\\n    test_vllm_main()\\n\\n\\nimport os\\nimport subprocess\\n\\nfrom swift.llm import ModelType\\n\\nos.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n\\nif __name__ == '__main__':\\n    model_name_list = ModelType.get_model_name_list()\\n    success_model_list = []\\n    fpath = os.path.join(os.path.dirname(__file__), 'utils.py')\\n    for model_name in model_name_list:\\n        code = subprocess.run(['python', fpath, '--model_type', model_name])\\n        if code.returncode == 0:\\n            success_model_list.append(model_name)\\n        else:\\n            print(f'model_name: {model_name} not support vllm.')\\n    print(success_model_list)\\n\\n\\nfrom typing import Any, List\\n\\nfrom swift.llm import MODEL_MAPPING, ModelType, get_default_lora_target_modules\\n\\n\\ndef get_model_info_table():\\n    fpaths = ['docs/source/Instruction/支持的模型和数据集.md', 'docs/source_en/Instruction/Supported-models-datasets.md']\\n    end_words = [['### 多模态大模型', '## 数据集'], ['### MLLM', '## Datasets']]\\n    model_name_list = ModelType.get_model_name_list()\\n    result = [\\n        '| Model Type | Model ID | Default Lora Target Modules | Default Template |'\\n        ' Support Flash Attn | Support vLLM | Support LMDeploy | Support Megatron | Requires | Tags | HF Model ID |\\\\n'\\n        '| ---------  | -------- | --------------------------- | ---------------- |'\\n        ' ------------------ | ------------ | ---------------- | ---------------- | -------- | ---- | ----------- |\\\\n'\\n    ] * 2\\n    res_llm: List[Any] = []\\n    res_mllm: List[Any] = []\\n    bool_mapping = {True: '&#x2714;', False: '&#x2718;'}\\n    for model_name in model_name_list:\\n        model_info = MODEL_MAPPING[model_name]\\n        model_id = model_info['model_id_or_path']\\n        lora_target_modules = get_default_lora_target_modules(model_name)\\n        if isinstance(lora_target_modules, list):\\n            lora_target_modules = ', '.join(lora_target_modules)\\n        else:\\n            lora_target_modules = lora_target_modules.replace('|', '\\\\\\\\|').replace('*', '\\\\\\\\*')\\n        template = model_info['template']\\n        support_flash_attn = model_info.get('support_flash_attn', False)\\n        support_flash_attn = bool_mapping[support_flash_attn]\\n        support_vllm = model_info.get('support_vllm', False)\\n        support_vllm = bool_mapping[support_vllm]\\n        support_lmdeploy = model_info.get('support_lmdeploy', False)\\n        support_lmdeploy = bool_mapping[support_lmdeploy]\\n        support_megatron = model_info.get('support_megatron', False)\\n        support_megatron = bool_mapping[support_megatron]\\n        requires = ', '.join(model_info['requires'])\\n        tags = model_info.get('tags', [])\\n        if 'multi-modal' in tags:\\n            tags.remove('multi-modal')\\n            is_multi_modal = True\\n        else:\\n            is_multi_modal = False\\n        tags_str = ', '.join(tags)\\n        if len(tags_str) == 0:\\n            tags_str = '-'\\n        hf_model_id = model_info.get('hf_model_id')\\n        if hf_model_id is None:\\n            hf_model_id = '-'\\n        r = [\\n            model_name, model_id, lora_target_modules, template, support_flash_attn, support_vllm, support_lmdeploy,\\n            support_megatron, requires, tags_str, hf_model_id\\n        ]\\n        if is_multi_modal:\\n            res_mllm.append(r)\\n        else:\\n            res_llm.append(r)\\n    print(f'LLM总数: {len(res_llm)}, MLLM总数: {len(res_mllm)}')\\n    text = ['', '']  # llm, mllm\\n    for i, res in enumerate([res_llm, res_mllm]):\\n        for r in res:\\n            ms_url = f'https://modelscope.cn/models/{r[1]}/summary'\\n            if r[10] != '-':\\n                hf_url = f'https://huggingface.co/{r[10]}'\\n                hf_model_id_str = f'[{r[10]}]({hf_url})'\\n            else:\\n                hf_model_id_str = '-'\\n            text[i] += (f'|{r[0]}|[{r[1]}]({ms_url})|{r[2]}|{r[3]}|{r[4]}|{r[5]}|{r[6]}|{r[7]}|{r[8]}'\\n                        f'|{r[9]}|{hf_model_id_str}|\\\\n')\\n        result[i] += text[i]\\n\\n    for i, fpath in enumerate(fpaths):\\n        with open(fpath, 'r') as f:\\n            text = f.read()\\n        llm_start_idx = text.find('| Model Type |')\\n        mllm_start_idx = text[llm_start_idx + 1:].find('| Model Type |') + llm_start_idx + 1\\n        llm_end_idx = text.find(end_words[i][0])\\n        mllm_end_idx = text.find(end_words[i][1])\\n        output = text[:llm_start_idx] + result[0] + '\\\\n\\\\n' + text[llm_end_idx:mllm_start_idx] + result[\\n            1] + '\\\\n\\\\n' + text[mllm_end_idx:]\\n        with open(fpath, 'w') as f:\\n            f.write(output)\\n\\n\\nif __name__ == '__main__':\\n    get_model_info_table()\\n\\n\\nfrom swift.llm import TemplateType\\n\\nif __name__ == '__main__':\\n    template_name_list = TemplateType.get_template_name_list()\\n    tn_gen = ', '.join([tn for tn in template_name_list if 'generation' in tn])\\n    tn_chat = ', '.join([tn for tn in template_name_list if 'generation' not in tn])\\n    print(f'Text Generation: {tn_gen}')\\n    print(f'Chat: {tn_chat}')\\n\\n\\nimport os\\n\\nfrom datasets import concatenate_datasets\\n\\nfrom swift.llm import (DATASET_MAPPING, DatasetName, ModelType, dataset_map, get_dataset, get_default_template_type,\\n                       get_model_tokenizer, get_template)\\nfrom swift.utils import stat_array\\n\\n\\ndef write_dataset_info() -> None:\\n    fpaths = ['docs/source/Instruction/支持的模型和数据集.md', 'docs/source_en/Instruction/Supported-models-datasets.md']\\n    pre_texts = []\\n    for fpath in fpaths:\\n        if os.path.exists(fpath):\\n            with open(fpath, 'r', encoding='utf-8') as f:\\n                text = f.read()\\n            idx = text.find('| Dataset Name |')\\n            pre_texts.append(text[:idx])\\n\\n            text = text[idx:]\\n            text_list = [t for t in text.split('\\\\n') if len(t.strip()) > 0]\\n        else:\\n            text_list = []\\n            pre_texts.append('')\\n\\n    res_text_list = []\\n\\n    res_text_list.append(\\n        '| Dataset Name | Dataset ID | Subsets | Dataset Size | Statistic (token) | Tags | HF Dataset ID |')\\n    res_text_list.append(\\n        '| ------------ | ---------- | ------- |------------- | ----------------- | ---- | ------------- |')\\n    if len(text_list) >= 2:\\n        text_list = text_list[2:]\\n    else:\\n        text_list = []\\n\\n    ignore_dataset = {text.split('|', 2)[1].lstrip('🔥 '): text for text in text_list}\\n    all_keys = set(DATASET_MAPPING.keys())\\n    py_keys = DatasetName.get_dataset_name_list()\\n    json_keys = list(all_keys - set(py_keys))\\n    json_keys.sort()\\n    dataset_name_list = py_keys + json_keys\\n    mapping = {}\\n    _iter = zip(\\n        ['llm', 'vision', 'audio'],\\n        [ModelType.qwen_7b_chat, ModelType.qwen_vl_chat, ModelType.qwen_audio_chat],\\n    )\\n    for task_type, model_type in _iter:\\n        _, tokenizer = get_model_tokenizer(model_type, load_model=False)\\n        template_type = get_default_template_type(model_type)\\n        template = get_template(template_type, tokenizer)\\n        mapping[task_type] = template\\n\\n    for dataset_name in dataset_name_list:\\n        try:\\n            dataset_info = DATASET_MAPPING[dataset_name]\\n            tags = dataset_info.get('tags', [])\\n            subsets = dataset_info.get('subsets', [])\\n            subsets = '<br>'.join(subsets)\\n            if 'audio' in tags:\\n                template = mapping['audio']\\n            elif 'vision' in tags:\\n                template = mapping['vision']\\n            else:\\n                template = mapping['llm']\\n            if dataset_name in ignore_dataset:\\n                dataset_size, stat_str = ignore_dataset[dataset_name].split('|')[4:6]\\n            else:\\n                dataset_info = DATASET_MAPPING[dataset_name]\\n                if dataset_info.get('huge_dataset', False):\\n                    dataset_size = '-'\\n                    stat_str = 'Dataset is too huge, please click the original link to view the dataset stat.'\\n                else:\\n                    train_dataset, val_dataset = get_dataset([dataset_name],\\n                                                             model_name=['小黄', 'Xiao Huang'],\\n                                                             model_author=['魔搭', 'ModelScope'])\\n                    dataset_size = len(train_dataset)\\n                    assert val_dataset is None\\n\\n                    raw_dataset = train_dataset\\n                    if val_dataset is not None:\\n                        raw_dataset = concatenate_datasets([raw_dataset, val_dataset])\\n                    if len(raw_dataset) < 5000:\\n                        num_proc = 1\\n                    else:\\n                        num_proc = 4\\n\\n                    dataset = dataset_map(raw_dataset, template.encode, num_proc=num_proc)\\n\\n                    _token_len = []\\n                    input_ids = dataset['input_ids']\\n                    for i in range(len(dataset)):\\n                        _token_len.append(len(input_ids[i]))\\n                    stat = stat_array(_token_len)[0]\\n                    stat_str = f\\\"{stat['mean']:.1f}±{stat['std']:.1f}, min={stat['min']}, max={stat['max']}\\\"\\n\\n            ms_url = f\\\"https://modelscope.cn/datasets/{dataset_info['dataset_id_or_path']}/summary\\\"\\n\\n            if '🔥' in tags:\\n                tags.remove('🔥')\\n                dataset_name = '🔥' + dataset_name\\n            tags_str = ', '.join(tags)\\n            if len(tags_str) == 0:\\n                tags_str = '-'\\n            hf_dataset_id = dataset_info.get('hf_dataset_id')\\n            if hf_dataset_id is None:\\n                hf_dataset_id_str = '-'\\n            else:\\n                hf_url = f'https://huggingface.co/datasets/{hf_dataset_id}'\\n                hf_dataset_id_str = f'[{hf_dataset_id}]({hf_url})'\\n\\n            res_text_list.append(f\\\"|{dataset_name}|[{dataset_info['dataset_id_or_path']}]({ms_url})|{subsets}|\\\"\\n                                 f'{dataset_size}|{stat_str}|{tags_str}|{hf_dataset_id_str}|')\\n        except Exception:\\n            import traceback\\n            print(traceback.format_exc())\\n            break\\n\\n    for idx in range(len(fpaths)):\\n        text = '\\\\n'.join(res_text_list)\\n        text = pre_texts[idx] + text + '\\\\n'\\n        with open(fpaths[idx], 'w', encoding='utf-8') as f:\\n            f.write(text)\\n    print(f'数据集总数: {len(dataset_name_list)}')\\n\\n\\nif __name__ == '__main__':\\n    write_dataset_info()\\n\\n\\nimport os\\n\\nfrom swift.utils import plot_images\\n\\nckpt_dir = 'output/xxx/vx-xxx'\\nif __name__ == '__main__':\\n    images_dir = os.path.join(ckpt_dir, 'images')\\n    tb_dir = os.path.join(ckpt_dir, 'runs')\\n    plot_images(images_dir, tb_dir, ['train/loss'], 0.9)\\n\\n\\ndef test_benchmark(infer_backend: str) -> None:\\n    import os\\n    os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\n    os.environ['TIMEOUT'] = '-1'\\n    import requests\\n    from swift.llm import DeployArguments, get_dataset, get_model_list_client, XRequestConfig, inference_client_async\\n    from swift.llm.deploy import llm_deploy\\n    import multiprocessing\\n    import time\\n    import asyncio\\n    from swift.utils import get_logger\\n\\n    logger = get_logger()\\n\\n    mp = multiprocessing.get_context('spawn')\\n    process = mp.Process(\\n        target=llm_deploy,\\n        args=(DeployArguments(model_type='qwen2-7b-instruct', infer_backend=infer_backend, verbose=False), ))\\n    process.start()\\n\\n    dataset = get_dataset(['alpaca-zh#1000', 'alpaca-en#1000'])[0]\\n    query_list = dataset['query']\\n    request_config = XRequestConfig(seed=42, max_tokens=8192)\\n\\n    while True:\\n        try:\\n            model_list = get_model_list_client()\\n        except requests.exceptions.ConnectionError:\\n            time.sleep(5)\\n            continue\\n        break\\n    model_type = model_list.data[0].id\\n    is_chat = model_list.data[0].is_chat\\n    is_multimodal = model_list.data[0].is_multimodal\\n    print(f'model_type: {model_type}')\\n\\n    tasks = []\\n    for query in query_list:\\n        tasks.append(\\n            inference_client_async(\\n                model_type, query, request_config=request_config, is_chat=is_chat, is_multimodal=is_multimodal))\\n\\n    async def _batch_run(tasks):\\n        return await asyncio.gather(*tasks)\\n\\n    resp_list = asyncio.run(_batch_run(tasks))\\n    logger.info(f'len(resp_list): {len(resp_list)}')\\n    logger.info(f'resp_list[0]: {resp_list[0]}')\\n    process.terminate()\\n\\n\\ndef test_vllm_benchmark():\\n    test_benchmark('vllm')\\n\\n\\ndef test_lmdeploy_benchmark():\\n    test_benchmark('lmdeploy')\\n\\n\\nif __name__ == '__main__':\\n    # test_vllm_benchmark()\\n    test_lmdeploy_benchmark()\\n\\n\\nimport os\\nimport shutil\\nimport subprocess\\nimport time\\nfrom collections import deque\\nfrom copy import deepcopy\\nfrom dataclasses import asdict, dataclass, field\\nfrom typing import Any, Dict, List\\n\\nimport json\\nimport torch\\n\\nfrom swift.llm import ExportArguments\\nfrom swift.utils import get_logger\\nfrom swift.utils.torch_utils import _find_free_port\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass Experiment:\\n\\n    name: str\\n\\n    cmd: str\\n\\n    group: str\\n\\n    requirements: Dict = field(default_factory=dict)\\n\\n    eval_requirements: Dict = field(default_factory=dict)\\n\\n    eval_dataset: List = field(default_factory=list)\\n\\n    args: Dict = field(default_factory=dict)\\n\\n    env: Dict = field(default_factory=dict)\\n\\n    record: Dict = field(default_factory=dict)\\n\\n    create_time: float = None\\n\\n    runtime: Dict = field(default_factory=dict)\\n\\n    input_args: Any = None\\n\\n    do_eval = False\\n\\n    def __init__(self,\\n                 name,\\n                 cmd,\\n                 group,\\n                 requirements=None,\\n                 eval_requirements=None,\\n                 eval_dataset=None,\\n                 args=None,\\n                 input_args=None,\\n                 **kwargs):\\n        self.name = name\\n        self.cmd = cmd\\n        self.group = group\\n        self.requirements = requirements or {}\\n        self.args = args or {}\\n        self.record = {}\\n        self.env = {}\\n        self.runtime = {}\\n        self.input_args = input_args\\n        self.eval_requirements = eval_requirements or {}\\n        self.eval_dataset = eval_dataset or []\\n        if self.cmd == 'eval':\\n            self.do_eval = True\\n\\n    def load(self, _json):\\n        self.name = _json['name']\\n        self.cmd = _json['cmd']\\n        self.requirements = _json['requirements']\\n        self.args = _json['args']\\n        self.record = _json['record']\\n        self.env = _json['env']\\n        self.create_time = _json['create_time']\\n\\n    @property\\n    def priority(self):\\n        return self.requirements.get('gpu', 0)\\n\\n    def to_dict(self):\\n        _dict = asdict(self)\\n        _dict.pop('runtime')\\n        _dict.pop('input_args')\\n        return _dict\\n\\n\\nclass ExpManager:\\n\\n    RESULT_FILE = 'result.jsonl'\\n\\n    def __init__(self):\\n        self.exps = []\\n\\n    def assert_gpu_not_overlap(self):\\n        all_gpus = set()\\n        for exp in self.exps:\\n            gpus = exp.runtime['env']['CUDA_VISIBLE_DEVICES'].split(',')\\n            if all_gpus & set(gpus):\\n                raise ValueError(f'GPU overlap: {self.exps}!')\\n            all_gpus.update(gpus)\\n\\n    def run(self, exp: Experiment):\\n        if os.path.exists(os.path.join(exp.input_args.save_dir, exp.name + '.json')):\\n            with open(os.path.join(exp.input_args.save_dir, exp.name + '.json'), 'r') as f:\\n                _json = json.load(f)\\n                if exp.eval_dataset and 'eval_result' not in _json['record']:\\n                    if not exp.do_eval:\\n                        logger.info(f'Experiment {exp.name} need eval, load from file.')\\n                        exp.load(_json)\\n                        exp.do_eval = True\\n                else:\\n                    logger.warn(f'Experiment {exp.name} already done, skip')\\n                    return\\n\\n        if exp.do_eval:\\n            runtime = self._build_eval_cmd(exp)\\n            exp.runtime = runtime\\n            envs = deepcopy(runtime.get('env', {}))\\n            envs.update(os.environ)\\n            logger.info(f'Running cmd: {runtime[\\\"running_cmd\\\"]}, env: {runtime.get(\\\"env\\\", {})}')\\n            os.makedirs('exp', exist_ok=True)\\n            log_file = os.path.join('exp', f'{exp.name}.eval.log')\\n            exp.handler = subprocess.Popen(runtime['running_cmd'] + f' > {log_file} 2>&1', env=envs, shell=True)\\n            self.exps.append(exp)\\n            self.assert_gpu_not_overlap()\\n            return\\n\\n        if any([exp.name == e.name for e in self.exps]):\\n            raise ValueError(f'Why exp name duplicate? {exp.name}')\\n        elif exp.cmd == 'export' and any([exp.cmd == 'export' for exp in self.exps]):  # noqa\\n            raise AssertionError('Cannot run parallel export task.')\\n        else:\\n            exp.create_time = time.time()\\n            runtime = self._build_cmd(exp)\\n            exp.runtime = runtime\\n            envs = deepcopy(runtime.get('env', {}))\\n            envs.update(os.environ)\\n            logger.info(f'Running cmd: {runtime[\\\"running_cmd\\\"]}, env: {runtime.get(\\\"env\\\", {})}')\\n            os.makedirs('exp', exist_ok=True)\\n            log_file = os.path.join('exp', f'{exp.name}.{exp.cmd}.log')\\n            exp.handler = subprocess.Popen(runtime['running_cmd'] + f' > {log_file} 2>&1', env=envs, shell=True)\\n            self.exps.append(exp)\\n            self.assert_gpu_not_overlap()\\n\\n    def _build_eval_cmd(self, exp: Experiment):\\n        gpu = exp.eval_requirements.get('gpu', None)\\n        env = {}\\n        allocated = []\\n        if gpu:\\n            allocated = self._find_free_gpu(int(gpu))\\n            assert allocated, 'No free gpu for now!'\\n            allocated = [str(gpu) for gpu in allocated]\\n            env['CUDA_VISIBLE_DEVICES'] = ','.join(allocated)\\n\\n        best_model_checkpoint = exp.record.get('best_model_checkpoint')\\n        eval_dataset = exp.eval_dataset\\n        if best_model_checkpoint is not None:\\n            model_type_kwargs = ''\\n            if not os.path.exists(os.path.join(best_model_checkpoint, 'sft_args.json')):\\n                model_type = best_model_checkpoint[best_model_checkpoint.rfind(os.path.sep) + 1:]\\n                model_type = '-'.join(model_type.split('-')[:-2])\\n                model_type_kwargs = f'--model_type {model_type}'\\n            cmd = f'swift eval {model_type_kwargs} --ckpt_dir {best_model_checkpoint} ' \\\\\\n                  + f'--infer_backend pt --sft_type full --name {exp.name} --eval_dataset {\\\" \\\".join(eval_dataset)}'\\n        else:\\n            assert exp.args.get('model_type') is not None\\n            cmd = f'swift eval --model_type {exp.args.get(\\\"model_type\\\")} --infer_backend pt ' \\\\\\n                  f'--name {exp.name} --eval_dataset {\\\" \\\".join(eval_dataset)}'\\n\\n        return {\\n            'running_cmd': cmd,\\n            'gpu': allocated,\\n            'env': env,\\n        }\\n\\n    def _build_cmd(self, exp: Experiment):\\n        gpu = exp.requirements.get('gpu', None)\\n        env = {}\\n        allocated = []\\n        if gpu:\\n            allocated = self._find_free_gpu(int(gpu))\\n            assert allocated, 'No free gpu for now!'\\n            allocated = [str(gpu) for gpu in allocated]\\n            env['CUDA_VISIBLE_DEVICES'] = ','.join(allocated)\\n        if int(exp.requirements.get('ddp', 1)) > 1:\\n            env['NPROC_PER_NODE'] = exp.requirements.get('ddp')\\n            env['MASTER_PORT'] = str(_find_free_port())\\n\\n        if exp.cmd == 'sft':\\n            from swift.llm import SftArguments\\n            args = exp.args\\n            sft_args = SftArguments(**args)\\n            args['output_dir'] = sft_args.output_dir\\n            args['logging_dir'] = sft_args.logging_dir\\n            args['add_output_dir_suffix'] = False\\n            os.makedirs(sft_args.output_dir, exist_ok=True)\\n            os.makedirs(sft_args.logging_dir, exist_ok=True)\\n            cmd = 'swift sft '\\n            for key, value in args.items():\\n                cmd += f' --{key} {value}'\\n        elif exp.cmd == 'dpo':\\n            from swift.llm import RLHFArguments\\n            args = exp.args\\n            dpo_args = RLHFArguments(**args)\\n            args['output_dir'] = dpo_args.output_dir\\n            args['logging_dir'] = dpo_args.logging_dir\\n            args['add_output_dir_suffix'] = False\\n            os.makedirs(dpo_args.output_dir, exist_ok=True)\\n            os.makedirs(dpo_args.logging_dir, exist_ok=True)\\n            cmd = 'swift dpo '\\n            for key, value in args.items():\\n                cmd += f' --{key} {value}'\\n        elif exp.cmd == 'export':\\n            args = exp.args\\n            cmd = 'swift export '\\n            for key, value in args.items():\\n                cmd += f' --{key} {value}'\\n        else:\\n            raise ValueError(f'Unsupported cmd type: {exp.cmd}')\\n        return {\\n            'running_cmd': cmd,\\n            'gpu': allocated,\\n            'env': env,\\n            'logging_dir': args.get('logging_dir'),\\n            'output_dir': args.get('output_dir', args.get('ckpt_dir'))\\n        }\\n\\n    def _find_free_gpu(self, n):\\n        all_gpus = set()\\n        for exp in self.exps:\\n            all_gpus.update(exp.runtime.get('gpu', set()))\\n        all_gpus = {int(g) for g in all_gpus}\\n        free_gpu = set(range(torch.cuda.device_count())) - all_gpus\\n        if len(free_gpu) < n:\\n            return None\\n        return list(free_gpu)[:n]\\n\\n    def prepare_experiments(self, args: Any):\\n        experiments = []\\n        for config_file in args.config:\\n            with open(config_file, 'r') as f:\\n                group = os.path.basename(config_file)\\n                group = group[:-5]\\n                content = json.load(f)\\n                exps = content['experiment']\\n                for exp in exps:\\n                    main_cfg = deepcopy(content)\\n                    name = exp['name']\\n                    cmd = main_cfg['cmd']\\n                    run_args = main_cfg['args']\\n                    env = main_cfg.get('env', {})\\n                    requirements = main_cfg.get('requirements', {})\\n                    eval_requirements = main_cfg.get('eval_requirements', {})\\n                    eval_dataset = main_cfg.get('eval_dataset', {})\\n                    if 'args' in exp:\\n                        run_args.update(exp['args'])\\n                    if 'requirements' in exp:\\n                        requirements.update(exp['requirements'])\\n                    if 'env' in exp:\\n                        env.update(exp['env'])\\n                    experiments.append(\\n                        Experiment(\\n                            group=group,\\n                            name=name,\\n                            cmd=cmd,\\n                            args=run_args,\\n                            env=env,\\n                            requirements=requirements,\\n                            eval_requirements=eval_requirements,\\n                            eval_dataset=eval_dataset,\\n                            input_args=args))\\n        return experiments\\n\\n    @staticmethod\\n    def _get_metric(exp: Experiment):\\n        if exp.do_eval:\\n            if os.path.isfile(os.path.join('exp', f'{exp.name}.eval.log')):\\n                with open(os.path.join('exp', f'{exp.name}.eval.log'), 'r') as f:\\n                    for line in f.readlines():\\n                        if 'Final report:' in line:\\n                            return json.loads(line.split('Final report:')[1].replace('\\\\'', '\\\"'))\\n        elif exp.cmd == 'export':\\n            exp_args = ExportArguments(**exp.args)\\n            if exp_args.quant_bits > 0:\\n                if exp_args.ckpt_dir is None:\\n                    path = f'{exp_args.model_type}-{exp_args.quant_method}-int{exp_args.quant_bits}'\\n                else:\\n                    ckpt_dir, ckpt_name = os.path.split(exp_args.ckpt_dir)\\n                    path = os.path.join(ckpt_dir, f'{ckpt_name}-{exp_args.quant_method}-int{exp_args.quant_bits}')\\n            else:\\n                ckpt_dir, ckpt_name = os.path.split(exp_args.ckpt_dir)\\n                path = os.path.join(ckpt_dir, f'{ckpt_name}-merged')\\n            if os.path.exists(path):\\n                shutil.rmtree(exp.name, ignore_errors=True)\\n                os.makedirs(exp.name, exist_ok=True)\\n                shutil.move(path, os.path.join(exp.name, path))\\n                return {\\n                    'best_model_checkpoint': os.path.join(exp.name, path),\\n                }\\n        else:\\n            logging_dir = exp.runtime.get('logging_dir')\\n            logging_file = os.path.join(logging_dir, '..', 'logging.jsonl')\\n            if os.path.isfile(logging_file):\\n                with open(logging_file, 'r') as f:\\n                    for line in f.readlines():\\n                        if 'model_info' in line:\\n                            return json.loads(line)\\n        return None\\n\\n    @staticmethod\\n    def write_record(exp: Experiment):\\n        target_dir = exp.input_args.save_dir\\n        file = os.path.join(target_dir, exp.name + '.json')\\n        with open(file, 'w', encoding='utf-8') as f:\\n            f.write(json.dumps(exp.to_dict()) + '\\\\n')\\n\\n    def _poll(self):\\n        while True:\\n            time.sleep(5)\\n\\n            has_finished = False\\n            for exp in self.exps:\\n                rt = exp.handler.poll()\\n                if rt is None:\\n                    continue\\n\\n                has_finished = True\\n                if rt == 0:\\n                    if not exp.do_eval:\\n                        all_metric = self._get_metric(exp)\\n                        if all_metric:\\n                            exp.record.update(all_metric)\\n                            if exp.eval_dataset:\\n                                exp.do_eval = True\\n                                self.exp_queue.appendleft(exp)\\n                            self.write_record(exp)\\n                        else:\\n                            logger.error(f'Running {exp.name} task, but no result found')\\n                    else:\\n                        all_metric = self._get_metric(exp)\\n                        exp.record['eval_result'] = all_metric\\n                        if all_metric:\\n                            self.write_record(exp)\\n                        else:\\n                            logger.error(f'Running {exp.name} eval task, but no eval result found')\\n                logger.info(f'Running {exp.name} finished with return code: {rt}')\\n\\n            if has_finished:\\n                self.exps = [exp for exp in self.exps if exp.handler.poll() is None]\\n                break\\n\\n    def begin(self, args: Any):\\n        exps = self.prepare_experiments(args)\\n        logger.info(f'all exps: {exps}')\\n        exps.sort(key=lambda e: e.priority)\\n        self.exp_queue = deque()\\n        for exp in exps:\\n            self.exp_queue.append(exp)\\n\\n        while len(self.exp_queue) or len(self.exps) > 0:\\n            while len(self.exp_queue):\\n                try:\\n                    logger.info(f'Running exp: {self.exp_queue[0].name}')\\n                    self.run(self.exp_queue[0])\\n                except Exception as e:\\n                    if not isinstance(e, AssertionError):\\n                        logger.error(f'Adding exp {self.exp_queue[0].name} error because of:')\\n                        logger.error(e)\\n                        self.exp_queue.popleft()\\n                    else:\\n                        logger.info(f'Adding exp {self.exp_queue[0].name} error because of:', str(e))\\n                    if 'no free gpu' in str(e).lower():\\n                        break\\n                    else:\\n                        continue\\n                else:\\n                    self.exp_queue.popleft()\\n            self._poll()\\n        logger.info(f'Run task finished because of exp queue: {self.exp_queue} and exps: {self.exps}')\\n\\n\\ndef find_all_config(dir_or_file: str):\\n    if os.path.isfile(dir_or_file):\\n        return [dir_or_file]\\n    else:\\n        configs = []\\n        for dirpath, dirnames, filenames in os.walk(dir_or_file):\\n            for name in filenames:\\n                if name.endswith('.json') and 'ipynb' not in dirpath:\\n                    configs.append(os.path.join(dirpath, name))\\n        return configs\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\nimport os.path\\n\\nfrom exp_utils import ExpManager, find_all_config\\n\\nfrom swift.utils import *\\n\\nlogger = get_logger()\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple args for swift experiments.')\\n    parser.add_argument(\\n        '--config',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The experiment config file',\\n    )\\n    parser.add_argument(\\n        '--save_dir',\\n        type=str,\\n        default='./experiment',\\n        required=False,\\n        help='The experiment output folder',\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef llm_exp():\\n    args = parse_args()\\n    config: str = args.config\\n    config = config.split(',')\\n    os.makedirs(args.save_dir, exist_ok=True)\\n    all_configs = []\\n    if not isinstance(config, list):\\n        config = [config]\\n    for dir_or_file in config:\\n        all_configs.extend(find_all_config(dir_or_file))\\n    args.config = all_configs\\n    exp_manager = ExpManager()\\n    exp_manager.begin(args)\\n\\n\\nif __name__ == '__main__':\\n    llm_exp()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport dataclasses\\nimport os\\nfrom dataclasses import dataclass\\nfrom typing import Any, Dict, List\\n\\nimport json\\nimport numpy as np\\n\\nfrom swift.utils.utils import split_str_parts_by\\n\\n\\n@dataclass\\nclass ModelOutput:\\n\\n    group: str = None\\n\\n    name: str = None\\n\\n    cmd: str = None\\n\\n    requirements: Dict[str, str] = dataclasses.field(default_factory=dict)\\n\\n    args: Dict[str, Any] = dataclasses.field(default_factory=dict)\\n\\n    memory: str = None\\n\\n    train_time: float = None\\n\\n    train_samples: int = None\\n\\n    train_samples_per_second: float = None\\n\\n    last_model_checkpoint: str = None\\n\\n    best_model_checkpoint: str = None\\n\\n    best_metric: Any = None\\n\\n    global_step: int = None\\n\\n    num_total_parameters: float = None\\n\\n    num_trainable_parameters: float = None\\n\\n    num_buffers: float = None\\n\\n    trainable_parameters_percentage: float = None\\n\\n    train_dataset_info: str = None\\n\\n    val_dataset_info: str = None\\n\\n    train_create_time: float = None\\n\\n    eval_tokens: int = None\\n\\n    eval_time: float = None\\n\\n    reports: Dict[str, Any] = None\\n\\n    train_loss: float = None\\n\\n    @property\\n    def tuner_hyper_params(self):\\n        hyper_params = ''\\n        args = self.args\\n        if 'sft_type' not in args:\\n            return ''\\n        if args['sft_type'] in ('lora', 'adalora', 'longlora'):\\n            if 'lora_rank' in args:\\n                hyper_params += f'rank={args[\\\"lora_rank\\\"]}/' \\\\\\n                                f'target={args[\\\"lora_target_modules\\\"]}/' \\\\\\n                                f'alpha={args[\\\"lora_alpha\\\"]}/' \\\\\\n                                f'lr_ratio={args.get(\\\"lora_lr_ratio\\\", None)}/' \\\\\\n                                f'use_rslora={args.get(\\\"use_rslora\\\", False)}/' \\\\\\n                                f'use_dora={args.get(\\\"use_dora\\\", False)}'\\n            else:\\n                hyper_params = ''\\n        if args['sft_type'] == 'full':\\n            if 'use_galore' in args and args['use_galore'] == 'true':\\n                hyper_params += f'galore_rank={args[\\\"galore_rank\\\"]}/' \\\\\\n                                f'galore_per_parameter={args[\\\"galore_optim_per_parameter\\\"]}/' \\\\\\n                                f'galore_with_embedding={args[\\\"galore_with_embedding\\\"]}/'\\n        if args['sft_type'] == 'llamapro':\\n            hyper_params += f'num_blocks={args[\\\"llamapro_num_new_blocks\\\"]}/'\\n        if 'neftune_noise_alpha' in args and args['neftune_noise_alpha']:\\n            hyper_params += f'neftune_noise_alpha={args[\\\"neftune_noise_alpha\\\"]}/'\\n\\n        if hyper_params.endswith('/'):\\n            hyper_params = hyper_params[:-1]\\n        return hyper_params\\n\\n    @property\\n    def hyper_paramters(self):\\n        if 'learning_rate' not in self.args:\\n            return ''\\n        return f'lr={self.args[\\\"learning_rate\\\"]}/' \\\\\\n               f'epoch={self.args[\\\"num_train_epochs\\\"]}'\\n\\n    @property\\n    def train_speed(self):\\n        if self.train_samples_per_second:\\n            return f'{self.train_samples_per_second:.2f}({self.train_samples} samples/{self.train_time:.2f} seconds)'\\n        else:\\n            return ''\\n\\n    @property\\n    def infer_speed(self):\\n        if self.eval_tokens:\\n            return f'{self.eval_tokens / self.eval_time:.2f}({self.eval_tokens} tokens/{self.eval_time:.2f} seconds)'\\n        return ''\\n\\n\\ndef generate_sft_report(outputs: List[ModelOutput]):\\n    gsm8k_accs = []\\n    arc_accs = []\\n    ceval_accs = []\\n    for output in outputs:\\n        gsm8k_acc = None\\n        arc_acc = None\\n        ceval_acc = None\\n        for report in (output.reports or []):\\n            if report['name'] == 'gsm8k':\\n                gsm8k_acc = report['score']\\n            if report['name'] == 'arc':\\n                arc_acc = report['score']\\n            if report['name'] == 'ceval':\\n                ceval_acc = report['score']\\n        gsm8k_accs.append(gsm8k_acc)\\n        arc_accs.append(arc_acc)\\n        ceval_accs.append(ceval_acc)\\n\\n    tab = '| exp_name | model_type | dataset | ms-bench mix ratio | tuner | tuner_params | trainable params(M) | flash_attn | gradient_checkpointing | hypers | memory | train speed(samples/s) | infer speed(tokens/s) | train_loss | eval_loss | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\\\n' \\\\\\n          '| -------- | ---------- | ------- | -------------------| ----- | ------------ | ------------------- | -----------| ---------------------- | ------ | ------ | ---------------------- | --------------------- | ---------- | --------- | ------------------ | ---------------- | ------------------ |\\\\n' # noqa\\n    min_best_metric = 999.\\n    min_train_loss = 999.\\n    if outputs:\\n        min_best_metric = min([output.best_metric or 999. for output in outputs])\\n        min_train_loss = min([output.train_loss or 999. for output in outputs])\\n\\n    max_gsm8k = 0.0\\n    if gsm8k_accs:\\n        max_gsm8k = max([gsm8k or 0. for gsm8k in gsm8k_accs])\\n\\n    max_arc = 0.0\\n    if arc_accs:\\n        max_arc = max([arc or 0. for arc in arc_accs])\\n\\n    max_ceval = 0.0\\n    if ceval_accs:\\n        max_ceval = max([ceval or 0. for ceval in ceval_accs])\\n\\n    for output, gsm8k_acc, arc_acc, ceval_acc in zip(outputs, gsm8k_accs, arc_accs, ceval_accs):\\n        use_flash_attn = output.args.get('use_flash_attn', '')\\n        use_gc = output.args.get('gradient_checkpointing', '')\\n        memory = output.memory\\n        train_speed = output.train_speed\\n        infer_speed = output.infer_speed\\n\\n        is_best_metric = np.isclose(min_best_metric, output.best_metric or 999.0)\\n        is_best_loss = np.isclose(min_train_loss, output.train_loss or 999.0)\\n        is_best_gsm8k = np.isclose(max_gsm8k, gsm8k_acc or 0.0)\\n        is_best_arc = np.isclose(max_arc, arc_acc or 0.0)\\n        is_best_ceval = np.isclose(max_ceval, ceval_acc or 0.0)\\n\\n        if not is_best_metric:\\n            best_metric = '' if not output.best_metric else f'{output.best_metric:.2f}'\\n        else:\\n            best_metric = '' if not output.best_metric else f'**{output.best_metric:.2f}**'\\n\\n        if not is_best_loss:\\n            train_loss = '' if not output.train_loss else f'{output.train_loss:.2f}'\\n        else:\\n            train_loss = '' if not output.train_loss else f'**{output.train_loss:.2f}**'\\n\\n        if not is_best_gsm8k:\\n            gsm8k_acc = '' if not gsm8k_acc else f'{gsm8k_acc:.3f}'\\n        else:\\n            gsm8k_acc = '' if not gsm8k_acc else f'**{gsm8k_acc:.3f}**'\\n\\n        if not is_best_arc:\\n            arc_acc = '' if not arc_acc else f'{arc_acc:.3f}'\\n        else:\\n            arc_acc = '' if not arc_acc else f'**{arc_acc:.3f}**'\\n\\n        if not is_best_ceval:\\n            ceval_acc = '' if not ceval_acc else f'{ceval_acc:.3f}'\\n        else:\\n            ceval_acc = '' if not ceval_acc else f'**{ceval_acc:.3f}**'\\n\\n        line = f'|{output.name}|' \\\\\\n               f'{output.args[\\\"model_type\\\"]}|' \\\\\\n               f'{output.args.get(\\\"dataset\\\")}|' \\\\\\n               f'{output.args.get(\\\"train_dataset_mix_ratio\\\", 0.)}|' \\\\\\n               f'{output.args.get(\\\"sft_type\\\")}|' \\\\\\n               f'{output.tuner_hyper_params}|' \\\\\\n               f'{output.num_trainable_parameters}({output.trainable_parameters_percentage})|' \\\\\\n               f'{use_flash_attn}|' \\\\\\n               f'{use_gc}|' \\\\\\n               f'{output.hyper_paramters}|' \\\\\\n               f'{memory}|' \\\\\\n               f'{train_speed}|' \\\\\\n               f'{infer_speed}|' \\\\\\n               f'{best_metric}|' \\\\\\n               f'{train_loss}|' \\\\\\n               f'{gsm8k_acc}|' \\\\\\n               f'{arc_acc}|' \\\\\\n               f'{ceval_acc}|\\\\n'\\n        tab += line\\n    return tab\\n\\n\\ndef generate_export_report(outputs: List[ModelOutput]):\\n    tab = '| exp_name | model_type | calibration dataset | quantization method | quantization bits | infer speed(tokens/s) | gsm8k weighted acc | arc weighted acc | ceval weighted acc |\\\\n' \\\\\\n          '| -------- | ---------- | ------------------- | ------------------- | ----------------- | --------------------- | ------------------ | ---------------- | ------------------ |\\\\n' # noqa\\n\\n    gsm8k_accs = []\\n    arc_accs = []\\n    ceval_accs = []\\n    for output in outputs:\\n        gsm8k_acc = None\\n        arc_acc = None\\n        ceval_acc = None\\n        for report in (output.reports or []):\\n            if report['name'] == 'gsm8k':\\n                gsm8k_acc = report['score']\\n            if report['name'] == 'arc':\\n                arc_acc = report['score']\\n            if report['name'] == 'ceval':\\n                ceval_acc = report['score']\\n        gsm8k_accs.append(gsm8k_acc)\\n        arc_accs.append(arc_acc)\\n        ceval_accs.append(ceval_acc)\\n\\n    max_gsm8k = 0.0\\n    if gsm8k_accs:\\n        max_gsm8k = max([gsm8k or 0. for gsm8k in gsm8k_accs])\\n\\n    max_arc = 0.0\\n    if arc_accs:\\n        max_arc = max([arc or 0. for arc in arc_accs])\\n\\n    max_ceval = 0.0\\n    if ceval_accs:\\n        max_ceval = max([ceval or 0. for ceval in ceval_accs])\\n\\n    for output, gsm8k_acc, arc_acc, ceval_acc in zip(outputs, gsm8k_accs, arc_accs, ceval_accs):\\n        infer_speed = output.infer_speed\\n        is_best_gsm8k = np.isclose(max_gsm8k, gsm8k_acc or 0.0)\\n        is_best_arc = np.isclose(max_arc, arc_acc or 0.0)\\n        is_best_ceval = np.isclose(max_ceval, ceval_acc or 0.0)\\n\\n        if not is_best_gsm8k:\\n            gsm8k_acc = '' if not gsm8k_acc else f'{gsm8k_acc:.3f}'\\n        else:\\n            gsm8k_acc = '' if not gsm8k_acc else f'**{gsm8k_acc:.3f}**'\\n\\n        if not is_best_arc:\\n            arc_acc = '' if not arc_acc else f'{arc_acc:.3f}'\\n        else:\\n            arc_acc = '' if not arc_acc else f'**{arc_acc:.3f}**'\\n\\n        if not is_best_ceval:\\n            ceval_acc = '' if not ceval_acc else f'{ceval_acc:.3f}'\\n        else:\\n            ceval_acc = '' if not ceval_acc else f'**{ceval_acc:.3f}**'\\n\\n        if output.train_dataset_info:\\n            dataset_info = f'{output.args[\\\"dataset\\\"]}/{output.train_dataset_info}'\\n        else:\\n            dataset_info = f'{output.args[\\\"dataset\\\"]}'\\n        line = f'|{output.name}|' \\\\\\n               f'{output.args[\\\"model_type\\\"]}|' \\\\\\n               f'{dataset_info}|' \\\\\\n               f'{output.args[\\\"quant_method\\\"]}|' \\\\\\n               f'{output.args[\\\"quant_bits\\\"]}|' \\\\\\n               f'{infer_speed}|' \\\\\\n               f'{gsm8k_acc}|' \\\\\\n               f'{arc_acc}|' \\\\\\n               f'{ceval_acc}|\\\\n'\\n        tab += line\\n    return tab\\n\\n\\ndef parse_output(file):\\n    with open(file, 'r') as f:\\n        content = json.load(f)\\n\\n    name = content['name']\\n    group = content['group']\\n    cmd = content['cmd']\\n    requirements = content['requirements']\\n    args = content['args']\\n    create_time = float(content.get('create_time') or 0)\\n    content = content['record']\\n    if cmd == 'export':\\n        best_model_checkpoint = content['best_model_checkpoint']\\n        eval_tokens = 0\\n        eval_time = 0.0\\n        eval_result = None\\n        if 'eval_result' in content:\\n            eval_result = content['eval_result']\\n            eval_tokens = eval_result['generation_info']['tokens']\\n            eval_time = eval_result['generation_info']['time']\\n            eval_result = eval_result['report']\\n        return ModelOutput(\\n            group=group,\\n            name=name,\\n            cmd=cmd,\\n            requirements=requirements,\\n            args=args,\\n            best_model_checkpoint=best_model_checkpoint,\\n            eval_time=eval_time,\\n            eval_tokens=eval_tokens,\\n            reports=eval_result,\\n        )\\n    else:\\n        memory = None\\n        train_time = None\\n        train_samples = None\\n        train_samples_per_second = None\\n        last_model_checkpoint = None\\n        best_model_checkpoint = None\\n        best_metric = None\\n        global_step = None\\n        train_dataset_info = None\\n        val_dataset_info = None\\n        num_trainable_parameters = None\\n        num_buffers = None\\n        trainable_parameters_percentage = None\\n        num_total_parameters = None\\n        train_loss = None\\n        if 'memory' in content:\\n            memory = content['memory']\\n            memory = '/'.join(memory.values())\\n        if 'train_time' in content:\\n            train_time = content['train_time']['train_runtime']\\n            train_samples = content['train_time']['n_train_samples']\\n            train_samples_per_second = content['train_time']['train_samples_per_second']\\n        if 'last_model_checkpoint' in content:\\n            last_model_checkpoint = content['last_model_checkpoint']\\n        if 'best_model_checkpoint' in content:\\n            best_model_checkpoint = content['best_model_checkpoint']\\n        if 'best_metric' in content:\\n            best_metric = content['best_metric']\\n        if 'log_history' in content:\\n            train_loss = content['log_history'][-1]['train_loss']\\n        if 'global_step' in content:\\n            global_step = content['global_step']\\n        if 'dataset_info' in content:\\n            train_dataset_info = content['dataset_info'].get('train_dataset')\\n            val_dataset_info = content['dataset_info'].get('val_dataset')\\n        if 'model_info' in content:\\n            # model_info like: SwiftModel: 6758.4041M Params (19.9885M Trainable [0.2958%]), 16.7793M Buffers.\\n            str_dict = split_str_parts_by(content['model_info'], [\\n                'SwiftModel:', 'CausalLM:', 'Seq2SeqLM:', 'LMHeadModel:', 'M Params (', 'M Trainable [', ']), ',\\n                'M Buffers.'\\n            ])\\n            str_dict = {c['key']: c['content'] for c in str_dict}\\n            if 'SwiftModel:' in str_dict:\\n                num_total_parameters = float(str_dict['SwiftModel:'])\\n            elif 'CausalLM:' in str_dict:\\n                num_total_parameters = float(str_dict['CausalLM:'])\\n            elif 'Seq2SeqLM:' in str_dict:\\n                num_total_parameters = float(str_dict['Seq2SeqLM:'])\\n            elif 'LMHeadModel:' in str_dict:\\n                num_total_parameters = float(str_dict['LMHeadModel:'])\\n            num_trainable_parameters = float(str_dict['M Params ('])\\n            num_buffers = float(str_dict[']), '])\\n            trainable_parameters_percentage = str_dict['M Trainable [']\\n\\n        eval_tokens = 0\\n        eval_time = 0.0\\n        eval_result = None\\n        if 'eval_result' in content:\\n            eval_result = content['eval_result']\\n            eval_tokens = eval_result['generation_info']['tokens']\\n            eval_time = eval_result['generation_info']['time']\\n            eval_result = eval_result['report']\\n\\n        return ModelOutput(\\n            group=group,\\n            name=name,\\n            cmd=cmd,\\n            requirements=requirements,\\n            args=args,\\n            memory=memory,\\n            train_time=train_time,\\n            train_samples=train_samples,\\n            train_samples_per_second=train_samples_per_second,\\n            last_model_checkpoint=last_model_checkpoint,\\n            best_model_checkpoint=best_model_checkpoint,\\n            best_metric=best_metric,\\n            global_step=global_step,\\n            train_dataset_info=train_dataset_info,\\n            val_dataset_info=val_dataset_info,\\n            train_create_time=create_time,\\n            num_total_parameters=num_total_parameters,\\n            num_trainable_parameters=num_trainable_parameters,\\n            num_buffers=num_buffers,\\n            trainable_parameters_percentage=trainable_parameters_percentage,\\n            eval_time=eval_time,\\n            eval_tokens=eval_tokens,\\n            reports=eval_result,\\n            train_loss=train_loss,\\n        )\\n\\n\\ndef generate_reports():\\n    outputs = []\\n    for dirs, _, files in os.walk('./experiment'):\\n        for file in files:\\n            abs_file = os.path.join(dirs, file)\\n            if not abs_file.endswith('.json') or 'ipynb' in abs_file:\\n                continue\\n\\n            outputs.append(parse_output(abs_file))\\n\\n    all_groups = set([output.group for output in outputs])\\n    for group in all_groups:\\n        group_outputs = [output for output in outputs if output.group == group]\\n        print(f'=================Printing the sft cmd result of exp {group}==================\\\\n\\\\n')\\n        print(generate_sft_report([output for output in group_outputs if output.cmd in ('sft', 'eval')]))\\n        # print(f'=================Printing the dpo result of exp {group}==================')\\n        # print(generate_dpo_report([output for output in outputs if output.cmd == 'dpo']))\\n        print(f'=================Printing the export cmd result of exp {group}==================\\\\n\\\\n')\\n        print(generate_export_report([output for output in group_outputs if output.cmd == 'export']))\\n        print('=================Printing done==================\\\\n\\\\n')\\n\\n\\nif __name__ == '__main__':\\n    generate_reports()\\n\\n\\n{\\n    \\\"cmd\\\": \\\"sft\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\",\\n        \\\"ddp\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"args\\\": {\\n      \\\"model_type\\\": \\\"qwen1half-7b-chat-awq\\\",\\n      \\\"dataset\\\": \\\"ms-agent\\\",\\n      \\\"train_dataset_mix_ratio\\\": 2.0,\\n      \\\"batch_size\\\": 1,\\n      \\\"max_length\\\": 2048,\\n      \\\"use_loss_scale\\\": true,\\n      \\\"gradient_accumulation_steps\\\": 16,\\n      \\\"learning_rate\\\": 5e-5,\\n      \\\"use_flash_attn\\\": true,\\n      \\\"eval_steps\\\": 2000,\\n      \\\"save_steps\\\": 2000,\\n      \\\"train_dataset_sample\\\": -1,\\n      \\\"val_dataset_sample\\\": 5000,\\n      \\\"num_train_epochs\\\": 2,\\n      \\\"gradient_checkpointing\\\": true,\\n      \\\"weight_decay\\\": 0.01,\\n      \\\"warmup_ratio\\\": 0.03,\\n      \\\"save_total_limit\\\": 2,\\n      \\\"logging_steps\\\": 10,\\n      \\\"sft_type\\\": \\\"lora\\\",\\n      \\\"lora_target_modules\\\": \\\"ALL\\\",\\n      \\\"lora_rank\\\": 8,\\n      \\\"lora_alpha\\\": 32\\n    },\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"qwen1half-7b-chat-awq\\\"\\n      }\\n    ]\\n}\\n\\n\\n{\\n    \\\"cmd\\\": \\\"sft\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\",\\n        \\\"ddp\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"args\\\": {\\n      \\\"model_type\\\": \\\"qwen1half-7b-chat-int8\\\",\\n      \\\"dataset\\\": \\\"ms-agent\\\",\\n      \\\"train_dataset_mix_ratio\\\": 2.0,\\n      \\\"batch_size\\\": 1,\\n      \\\"max_length\\\": 2048,\\n      \\\"use_loss_scale\\\": true,\\n      \\\"gradient_accumulation_steps\\\": 16,\\n      \\\"learning_rate\\\": 5e-5,\\n      \\\"use_flash_attn\\\": true,\\n      \\\"eval_steps\\\": 2000,\\n      \\\"save_steps\\\": 2000,\\n      \\\"train_dataset_sample\\\": -1,\\n      \\\"val_dataset_sample\\\": 5000,\\n      \\\"num_train_epochs\\\": 2,\\n      \\\"gradient_checkpointing\\\": true,\\n      \\\"weight_decay\\\": 0.01,\\n      \\\"warmup_ratio\\\": 0.03,\\n      \\\"save_total_limit\\\": 2,\\n      \\\"logging_steps\\\": 10,\\n      \\\"sft_type\\\": \\\"lora\\\",\\n      \\\"lora_target_modules\\\": \\\"ALL\\\",\\n      \\\"lora_rank\\\": 8,\\n      \\\"lora_alpha\\\": 32\\n    },\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"qwen1half-7b-chat-int8\\\"\\n      }\\n    ]\\n}\\n\\n\\n{\\n    \\\"cmd\\\": \\\"sft\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\",\\n        \\\"ddp\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"args\\\": {\\n      \\\"model_type\\\": \\\"llama2-7b-aqlm-2bit-1x16\\\",\\n      \\\"dataset\\\": \\\"dureader-robust-zh\\\",\\n      \\\"batch_size\\\": 1,\\n      \\\"max_length\\\": 1024,\\n      \\\"gradient_accumulation_steps\\\": 16,\\n      \\\"learning_rate\\\": 5e-5,\\n      \\\"use_flash_attn\\\": true,\\n      \\\"eval_steps\\\": 1000,\\n      \\\"save_steps\\\": 1000,\\n      \\\"train_dataset_sample\\\": 100000,\\n      \\\"val_dataset_sample\\\": 3000,\\n      \\\"num_train_epochs\\\": 2,\\n      \\\"check_dataset_strategy\\\": \\\"none\\\",\\n      \\\"gradient_checkpointing\\\": true,\\n      \\\"weight_decay\\\": 0.01,\\n      \\\"max_grad_norm\\\": 1.0,\\n      \\\"warmup_ratio\\\": 0.03,\\n      \\\"save_total_limit\\\": 2,\\n      \\\"logging_steps\\\": 10,\\n      \\\"sft_type\\\": \\\"lora\\\",\\n      \\\"lora_target_modules\\\": \\\"ALL\\\",\\n      \\\"lora_rank\\\": 8,\\n      \\\"lora_alpha\\\": 32\\n    },\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"llama2-7b-aqlm-2bit-1x16\\\"\\n      }\\n    ]\\n}\\n\\n\\n{\\n    \\\"cmd\\\": \\\"export\\\",\\n    \\\"args\\\": {\\n      \\\"model_type\\\": \\\"qwen-7b-chat\\\",\\n      \\\"quant_bits\\\": 4\\n    },\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"gptq-pileval\\\",\\n        \\\"args\\\": {\\n          \\\"quant_method\\\": \\\"gptq\\\",\\n          \\\"dataset\\\": \\\"pileval\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"gptq-ms-bench-mini\\\",\\n        \\\"args\\\": {\\n          \\\"quant_method\\\": \\\"gptq\\\",\\n          \\\"dataset\\\": \\\"ms-bench-mini\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"awq-pileval\\\",\\n        \\\"args\\\": {\\n          \\\"quant_method\\\": \\\"awq\\\",\\n          \\\"dataset\\\": \\\"pileval\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"awq-ms-bench-mini\\\",\\n        \\\"args\\\": {\\n          \\\"quant_method\\\": \\\"awq\\\",\\n          \\\"dataset\\\": \\\"ms-bench-mini\\\"\\n        }\\n      }\\n    ]\\n}\\n\\n\\n{\\n    \\\"cmd\\\": \\\"dpo\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"8\\\",\\n        \\\"ddp\\\": \\\"8\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"args\\\": {\\n        \\\"model_type\\\": \\\"llama2-7b\\\",\\n        \\\"ref_model_type\\\": \\\"llama2-7b\\\",\\n        \\\"template_type\\\": \\\"llama\\\",\\n        \\\"dataset\\\": \\\"hh-rlhf-cn\\\",\\n        \\\"train_dataset_sample\\\": 200000,\\n        \\\"truncation_strategy\\\": \\\"truncation_left\\\",\\n        \\\"val_dataset_sample\\\": 10000,\\n        \\\"num_train_epochs\\\": 1,\\n        \\\"max_length\\\": 1024,\\n        \\\"max_prompt_length\\\": 512,\\n        \\\"check_dataset_strategy\\\": \\\"none\\\",\\n        \\\"gradient_checkpointing\\\": true,\\n        \\\"batch_size\\\": 1,\\n        \\\"weight_decay\\\": 0.01,\\n        \\\"learning_rate\\\": 5e-5,\\n        \\\"gradient_accumulation_steps\\\": 2,\\n        \\\"max_grad_norm\\\": 1.0,\\n        \\\"warmup_ratio\\\": 0.03,\\n        \\\"eval_steps\\\": 2000,\\n        \\\"save_steps\\\": 2000,\\n        \\\"save_total_limit\\\": 2,\\n        \\\"logging_steps\\\": 10,\\n        \\\"sft_type\\\": \\\"lora\\\",\\n        \\\"lora_target_modules\\\": \\\"ALL EMBEDDING\\\",\\n        \\\"lora_rank\\\": 8,\\n        \\\"lora_alpha\\\": 32\\n    },\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"dpolora\\\",\\n        \\\"args\\\": {\\n          \\\"sft_beta\\\": 0.0\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"dpolora+sft_beta0.1\\\",\\n        \\\"args\\\": {\\n          \\\"sft_beta\\\": 0.1\\n        }\\n      }\\n    ]\\n}\\n\\n\\n{\\n    \\\"cmd\\\": \\\"eval\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\",\\n        \\\"ddp\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"args\\\": {},\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"experiment\\\": [{\\n      \\\"name\\\": \\\"qwen-7b-chat-eval\\\",\\n      \\\"args\\\": {\\n        \\\"model_type\\\": \\\"qwen-7b-chat\\\"\\n      }\\n    }]\\n}\\n\\n\\n{\\n    \\\"cmd\\\": \\\"sft\\\",\\n    \\\"requirements\\\":{\\n        \\\"gpu\\\": \\\"1\\\",\\n        \\\"ddp\\\": \\\"1\\\"\\n    },\\n    \\\"eval_requirements\\\": {\\n      \\\"gpu\\\": \\\"1\\\"\\n    },\\n    \\\"eval_dataset\\\": [\\\"ceval\\\", \\\"gsm8k\\\", \\\"arc\\\"],\\n    \\\"args\\\": {\\n      \\\"model_type\\\": \\\"qwen-7b-chat\\\",\\n      \\\"dataset\\\": \\\"ms-agent\\\",\\n      \\\"train_dataset_mix_ratio\\\": 2.0,\\n      \\\"batch_size\\\": 1,\\n      \\\"max_length\\\": 2048,\\n      \\\"use_loss_scale\\\": true,\\n      \\\"gradient_accumulation_steps\\\": 16,\\n      \\\"learning_rate\\\": 5e-5,\\n      \\\"use_flash_attn\\\": true,\\n      \\\"eval_steps\\\": 2000,\\n      \\\"save_steps\\\": 2000,\\n      \\\"train_dataset_sample\\\": -1,\\n      \\\"val_dataset_sample\\\": 5000,\\n      \\\"num_train_epochs\\\": 2,\\n      \\\"check_dataset_strategy\\\": \\\"none\\\",\\n      \\\"gradient_checkpointing\\\": true,\\n      \\\"weight_decay\\\": 0.01,\\n      \\\"warmup_ratio\\\": 0.03,\\n      \\\"save_total_limit\\\": 2,\\n      \\\"logging_steps\\\": 10\\n    },\\n    \\\"experiment\\\": [\\n      {\\n        \\\"name\\\": \\\"lora\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+packing\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"packing\\\": true,\\n          \\\"eval_steps\\\": 200,\\n          \\\"save_steps\\\": 200\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+packing+ddp\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"2\\\",\\n          \\\"ddp\\\": \\\"2\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"packing\\\": true,\\n          \\\"eval_steps\\\": 100,\\n          \\\"save_steps\\\": 100\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+packing+lazytokenize\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"packing\\\": true,\\n          \\\"lazy_tokenize\\\": true,\\n          \\\"eval_steps\\\": 200,\\n          \\\"save_steps\\\": 200\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"lora_lr_ratio\\\": 16.0\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"rslora\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"use_rslora\\\": true\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"dora\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"use_dora\\\": true\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+neftune\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"neftune_noise_alpha\\\": 15.0\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"llamapro\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"llamapro\\\",\\n          \\\"llamapro_num_new_blocks\\\": \\\"4\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"reft\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"reft\\\",\\n          \\\"train_dataset_mix_ratio\\\": 0.0,\\n          \\\"gradient_checkpointing\\\": \\\"false\\\",\\n          \\\"use_loss_scale\\\": false\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+galore128+quantize\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"use_galore\\\": \\\"true\\\",\\n          \\\"galore_rank\\\": \\\"128\\\",\\n          \\\"galore_update_proj_gap\\\": \\\"200\\\",\\n          \\\"galore_optim_per_parameter\\\": \\\"false\\\",\\n          \\\"galore_with_embedding\\\": \\\"false\\\",\\n          \\\"galore_quantization\\\": \\\"true\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+galore128+quantize+proj_quant\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"use_galore\\\": \\\"true\\\",\\n          \\\"galore_rank\\\": \\\"128\\\",\\n          \\\"galore_update_proj_gap\\\": \\\"200\\\",\\n          \\\"galore_optim_per_parameter\\\": \\\"false\\\",\\n          \\\"galore_with_embedding\\\": \\\"false\\\",\\n          \\\"galore_quantization\\\": \\\"true\\\",\\n          \\\"galore_proj_quant\\\": \\\"true\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+galore128\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"use_galore\\\": \\\"true\\\",\\n          \\\"galore_rank\\\": \\\"128\\\",\\n          \\\"galore_update_proj_gap\\\": \\\"200\\\",\\n          \\\"galore_optim_per_parameter\\\": \\\"false\\\",\\n          \\\"galore_with_embedding\\\": \\\"false\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+galore64\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"use_galore\\\": \\\"true\\\",\\n          \\\"galore_rank\\\": \\\"64\\\",\\n          \\\"galore_update_proj_gap\\\": \\\"200\\\",\\n          \\\"galore_optim_per_parameter\\\": \\\"false\\\",\\n          \\\"galore_with_embedding\\\": \\\"false\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+galore32\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"use_galore\\\": \\\"true\\\",\\n          \\\"galore_rank\\\": \\\"32\\\",\\n          \\\"galore_update_proj_gap\\\": \\\"200\\\",\\n          \\\"galore_optim_per_parameter\\\": \\\"false\\\",\\n          \\\"galore_with_embedding\\\": \\\"false\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+galore_emb\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"use_galore\\\": \\\"true\\\",\\n          \\\"galore_rank\\\": \\\"128\\\",\\n          \\\"galore_update_proj_gap\\\": \\\"200\\\",\\n          \\\"galore_optim_per_parameter\\\": \\\"false\\\",\\n          \\\"galore_with_embedding\\\": \\\"true\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+galore_perparam\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"use_galore\\\": \\\"true\\\",\\n          \\\"galore_rank\\\": \\\"128\\\",\\n          \\\"galore_update_proj_gap\\\": \\\"200\\\",\\n          \\\"galore_optim_per_parameter\\\": \\\"true\\\",\\n          \\\"galore_with_embedding\\\": \\\"false\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"adalora\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"adalora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"adapter\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"adapter\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"ia3\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"ia3\\\",\\n          \\\"ia3_target_modules\\\": \\\"ALL\\\",\\n          \\\"ia3_feedforward_modules\\\": \\\"mlp.gate_proj mlp.up_proj mlp.down_proj\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"lora+no_mix\\\",\\n        \\\"info\\\": \\\"lora无混合数据集\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"lora_target_modules\\\": \\\"ALL\\\",\\n          \\\"lora_rank\\\": 8,\\n          \\\"lora_alpha\\\": 32,\\n          \\\"train_dataset_mix_ratio\\\": 0.0\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+lisa_2\\\",\\n        \\\"info\\\": \\\"lisa 2layers + full\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"lisa_activated_layers\\\": 2,\\n          \\\"lisa_step_interval\\\": 20\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+lisa_4\\\",\\n        \\\"info\\\": \\\"lisa 4layers + full\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"lisa_activated_layers\\\": 4,\\n          \\\"lisa_step_interval\\\": 20\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"full+no_mix\\\",\\n        \\\"info\\\": \\\"全参无混合数据集\\\",\\n        \\\"requirements\\\":{\\n          \\\"gpu\\\": \\\"1\\\",\\n          \\\"ddp\\\": \\\"1\\\"\\n        },\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"train_dataset_mix_ratio\\\": 0.0\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"unsloth+lora+q4\\\",\\n        \\\"info\\\": \\\"unsloth lora quantization bit 4\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"lora\\\",\\n          \\\"tuner_backend\\\": \\\"unsloth\\\",\\n          \\\"quantization_bit\\\": 4,\\n          \\\"model_type\\\": \\\"llama3-8b-instruct\\\"\\n        }\\n      },\\n      {\\n        \\\"name\\\": \\\"unsloth+full\\\",\\n        \\\"info\\\": \\\"unsloth full\\\",\\n        \\\"args\\\": {\\n          \\\"sft_type\\\": \\\"full\\\",\\n          \\\"tuner_backend\\\": \\\"unsloth\\\",\\n          \\\"model_type\\\": \\\"llama3-8b-instruct\\\"\\n        }\\n      }\\n    ]\\n}\\n\\n\\nimport time\\nfrom dataclasses import dataclass, field\\nfrom typing import *\\n\\nimport numpy as np\\nimport torch\\n\\nfrom swift.llm import sft_main\\nfrom swift.llm.utils import *\\nfrom swift.utils import *\\n\\n\\n@dataclass\\nclass TrainArguments(SftArguments):\\n    run_time: int = 1\\n    global_seed: int = 42\\n\\n    def __post_init__(self):\\n        if self.model_type is None:\\n            self.model_type = 'qwen-7b-chat'\\n        if self.use_flash_attn is None:\\n            self.use_flash_attn = True\\n        return\\n\\n\\ndef get_non_default_args(train_args) -> Dict[str, Any]:\\n    train_args_default = train_args.__class__()\\n    res = {}\\n    for k, v in train_args.__dict__.items():\\n        v_default = getattr(train_args_default, k)\\n        if v != v_default or k in {'use_flash_attn', 'model_type'}:\\n            res[k] = v\\n    return res\\n\\n\\ndef test_memory_time(train_args: TrainArguments) -> Dict[str, Dict[str, Any]]:\\n    random_state = np.random.RandomState(train_args.global_seed)\\n    args_kwargs = get_non_default_args(train_args)\\n    print(f'args_kwargs: {args_kwargs}')\\n    train_dataset_sample = 1000  # save time\\n    if args_kwargs.get('max_length', 2048) <= 2048:\\n        train_dataset_sample = -1\\n    for i in range(train_args.run_time):\\n        sft_args = SftArguments(\\n            dataset_test_ratio=0,\\n            dataset=DatasetName.cls_fudan_news_zh,\\n            train_dataset_sample=train_dataset_sample,\\n            save_strategy='no',\\n            check_dataset_strategy='warning',\\n            seed=get_seed(random_state),\\n            **args_kwargs)\\n        output = sft_main(sft_args)\\n        torch.cuda.empty_cache()\\n    res = {\\n        'samples/s': f\\\"{output['train_time']['train_samples_per_second']:.2f}\\\",\\n        'memory': output['memory'],\\n        'train_args': check_json_format(args_kwargs),\\n        'model_info': output['model_info'],\\n        'dataset_info': output['dataset_info']\\n    }\\n    append_to_jsonl('scripts/benchmark/test_memory_time/result.jsonl', res)\\n    print(res)\\n    return res\\n\\n\\ntest_memory_time_main = get_main(TrainArguments, test_memory_time)\\n\\nif __name__ == '__main__':\\n    test_memory_time_main()\\n\\n\\n# CUDA_VISIBLE_DEVICES=0 nohup python scripts/benchmark/test_memory_time/run_loop.py &> 0.out &\\n\\nimport os\\n# os.environ['CUDA_VISIBLE_DEVICES'] = '0'\\nimport subprocess\\nfrom typing import List\\n\\nfrom swift.utils import read_from_jsonl, write_to_jsonl\\n\\n\\ndef test_memory_time_loop(train_kwargs_jsonl: str) -> None:\\n    while True:\\n        obj_list = read_from_jsonl(train_kwargs_jsonl)\\n        if len(obj_list[0]) == 0:\\n            break\\n        obj: List[str] = obj_list.pop(0)\\n        obj_list.append(obj)\\n        write_to_jsonl(train_kwargs_jsonl, obj_list)\\n        ret = subprocess.run(['python', 'scripts/benchmark/test_memory_time/run_single.py', *obj])\\n        assert ret.returncode == 0\\n\\n\\nif __name__ == '__main__':\\n    jsonl_path = os.path.join('scripts/benchmark/test_memory_time/run.jsonl')\\n    test_memory_time_loop(jsonl_path)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nimport sys\\nimport types\\nfrom collections import OrderedDict\\nfrom typing import List, Optional, Tuple\\n\\nimport safetensors\\nimport torch\\nimport torch.nn.functional as F\\nimport transformers\\nfrom packaging import version\\nfrom peft import PeftModel\\nfrom torch.utils.data import DataLoader\\nfrom transformers import PreTrainedModel, trainer\\nfrom transformers.modeling_utils import unwrap_model\\n\\nfrom swift.utils import get_logger, torchacc_trim_graph, use_torchacc\\n\\nlogger = get_logger()\\n\\n\\n# DataLoader\\ndef get_bucket_sizes(max_length: int) -> List[int]:\\n    \\\"\\\"\\\"Get the bucket sizes for TorchAcc.\\n    You can set the environment variable TORCHACC_DATA_BUCKETS to specify\\n    the bucket sizes. If not set, we use a normal distribution bucketing with\\n    8 buckets.\\n    \\\"\\\"\\\"\\n    if os.getenv('TORCHACC_DATA_BUCKETS') is not None:\\n        bucket_sizes = [int(x) for x in os.getenv('TORCHACC_DATA_BUCKETS').split(',')]\\n        bucket_sizes.append(max_length)\\n    else:  # default normal distribution bucketing.\\n        mean = max_length // 2\\n        var = max_length // 8\\n        bucket_sizes = [mean + i * var for i in range(-3, 4)]\\n        bucket_sizes.append(max_length)\\n    return bucket_sizes\\n\\n\\ndef _get_closet_bucket(bucket_sizes, data_length):\\n    \\\"\\\"\\\"Select the one from bucket_sizes that is closest in distance to\\n    data_length. This is required for TorchAcc.\\n    \\\"\\\"\\\"\\n    cloest_length = sys.maxsize\\n    for b in bucket_sizes:\\n        if b == data_length or ((b < cloest_length) and (b > data_length)):\\n            cloest_length = b\\n\\n    if cloest_length == sys.maxsize:\\n        bucket_sizes.append(data_length)\\n        cloest_length = data_length\\n\\n    return cloest_length\\n\\n\\ndef pad_and_split_batch(padding_to, input_ids, attention_mask, labels, loss_scale, max_length, tokenizer, rank,\\n                        world_size, padding_right):\\n    if padding_to is None:\\n        longest_len = input_ids.shape[-1]\\n        bucket_sizes = get_bucket_sizes(max_length)\\n        bucket_data_length = _get_closet_bucket(bucket_sizes, longest_len)\\n        padding_length = bucket_data_length - input_ids.shape[1]\\n        pad_tuple = (0, padding_length) if padding_right else (padding_length, 0)\\n        input_ids = F.pad(input_ids, pad_tuple, 'constant', tokenizer.pad_token_id)\\n        attention_mask = F.pad(attention_mask, pad_tuple, 'constant', 0)\\n        if loss_scale:\\n            loss_scale = F.pad(loss_scale, pad_tuple, 'constant', 0.)\\n        labels = F.pad(labels, pad_tuple, 'constant', -100)\\n\\n    # manully split the batch to different DP rank.\\n    batch_size = input_ids.shape[0] // world_size\\n    if batch_size > 0:\\n        start = rank * batch_size\\n        end = (rank + 1) * batch_size\\n        input_ids = input_ids[start:end, :]\\n        attention_mask = attention_mask[start:end, :]\\n        labels = labels[start:end, :]\\n        if loss_scale:\\n            loss_scale = loss_scale[start:end, :]\\n    return input_ids, attention_mask, labels, loss_scale\\n\\n\\ndef ta_train_dataloader(train_dataset, data_collator, sampler, args, batch_size):\\n    # patch skip_first_batches for customized dataloader.\\n    def acc_skip_first_batches(dataloader, num_batches=0):\\n        from accelerate.data_loader import SkipBatchSampler\\n        batch_sampler = SkipBatchSampler(dataloader._loader.batch_sampler, skip_batches=num_batches)\\n        try:\\n            dataset = dataloader.dataset\\n        except AttributeError:\\n            dataset = dataloader._loader.dataset\\n        dataloader_params = {\\n            'collate_fn': data_collator,\\n            'num_workers': args.dataloader_num_workers,\\n            'pin_memory': args.dataloader_pin_memory,\\n            'persistent_workers': args.dataloader_persistent_workers,\\n        }\\n\\n        if not isinstance(train_dataset, torch.utils.data.IterableDataset):\\n            dataloader_params['batch_sampler'] = batch_sampler\\n            dataloader_params['worker_init_fn'] = trainer.seed_worker\\n\\n        return ta.AsyncLoader(DataLoader(dataset, **dataloader_params), args.device)\\n\\n    trainer.skip_first_batches = acc_skip_first_batches\\n\\n    # dataloader for TorchAcc.\\n    import torchacc as ta\\n\\n    dataloader_params = {\\n        'batch_size': batch_size,\\n        'collate_fn': data_collator,\\n        'num_workers': args.dataloader_num_workers,\\n        'pin_memory': args.dataloader_pin_memory,\\n        'persistent_workers': args.dataloader_persistent_workers,\\n    }\\n\\n    if not isinstance(train_dataset, torch.utils.data.IterableDataset):\\n        dataloader_params['sampler'] = sampler\\n        dataloader_params['drop_last'] = args.dataloader_drop_last\\n        dataloader_params['worker_init_fn'] = trainer.seed_worker\\n\\n    return ta.AsyncLoader(DataLoader(train_dataset, **dataloader_params), args.device)\\n\\n\\ndef ta_eval_dataloader(eval_dataset, data_collator, sampler, args):\\n    import torchacc as ta\\n\\n    dataloader_params = {\\n        'batch_size': args.eval_batch_size,\\n        'collate_fn': data_collator,\\n        'num_workers': args.dataloader_num_workers,\\n        'pin_memory': args.dataloader_pin_memory,\\n        'persistent_workers': args.dataloader_persistent_workers,\\n    }\\n\\n    if not isinstance(eval_dataset, torch.utils.data.IterableDataset):\\n        dataloader_params['sampler'] = sampler\\n        dataloader_params['drop_last'] = args.dataloader_drop_last\\n\\n    return ta.AsyncLoader(DataLoader(eval_dataset, **dataloader_params), args.device)\\n\\n\\ndef ta_test_dataloader(test_dataset, data_collator, sampler, args):\\n    import torchacc as ta\\n\\n    dataloader_params = {\\n        'batch_size': args.eval_batch_size,\\n        'collate_fn': data_collator,\\n        'num_workers': args.dataloader_num_workers,\\n        'pin_memory': args.dataloader_pin_memory,\\n        'persistent_workers': args.dataloader_persistent_workers,\\n    }\\n\\n    if not isinstance(test_dataset, torch.utils.data.IterableDataset):\\n        dataloader_params['sampler'] = sampler\\n        dataloader_params['drop_last'] = args.dataloader_drop_last\\n\\n    # We use the same batch_size as for eval.\\n    return ta.AsyncLoader(DataLoader(test_dataset, **dataloader_params), args.device)\\n\\n\\n# Save/load checkpoint\\ndef ta_save_optimizer_and_scheduler(optimizer, lr_scheduler, output_dir):\\n    import torch_xla.core.xla_model as xm\\n    xm.rendezvous('saving_optimizer_states')\\n    xm.save(optimizer.state_dict(), os.path.join(output_dir, f'optimizer_{xm.get_ordinal()}.pt'), master_only=False)\\n    xm.save(lr_scheduler.state_dict(), os.path.join(output_dir, f'scheduler_{xm.get_ordinal()}.pt'), master_only=False)\\n    xm.rendezvous('saving_optimizer_states_done')\\n\\n\\ndef ta_load_optimizer_and_scheduler(optimizer, lr_scheduler, checkpoint, device):\\n    import torch_xla.core.xla_model as xm\\n    optimizer_state = torch.load(os.path.join(checkpoint, f'optimizer_{xm.get_ordinal()}.pt'), map_location='cpu')\\n    lr_scheduler_state = torch.load(os.path.join(checkpoint, f'scheduler_{xm.get_ordinal()}.pt'), map_location='cpu')\\n    xm.send_cpu_data_to_device(optimizer_state, device)\\n    xm.send_cpu_data_to_device(lr_scheduler_state, device)\\n\\n    optimizer.load_state_dict(optimizer_state)\\n    lr_scheduler.load_state_dict(lr_scheduler_state)\\n    return optimizer, lr_scheduler\\n\\n\\ndef save_ta_ddp_checkpoint(self_model, tokenizer, args, output_dir: Optional[str] = None):\\n    output_dir = output_dir if output_dir is not None else args.output_dir\\n    import torch_xla.core.xla_model as xm\\n\\n    model = self_model\\n\\n    if xm.is_master_ordinal(local=False):\\n        os.makedirs(output_dir, exist_ok=True)\\n        torch.save(args, os.path.join(output_dir, 'training_args.bin'))\\n\\n        xm.mark_step()\\n        # Save a trained model and configuration using `save_pretrained()`.\\n        # They can then be reloaded using `from_pretrained()`\\n        supported_classes = (PreTrainedModel, PeftModel)\\n        if not isinstance(model, supported_classes):\\n            if isinstance(unwrap_model(model), supported_classes):\\n                unwrap_model(model).save_pretrained(\\n                    output_dir,\\n                    is_main_process=args.should_save,\\n                    state_dict=xm._maybe_convert_to_cpu(model.state_dict()),\\n                    save_function=xm.save,\\n                    safe_serialization=args.save_safetensors,\\n                )\\n            else:\\n                logger.info('Trainer.model is not a `PreTrainedModel`, only saving its state dict.')\\n                state_dict = xm._maybe_convert_to_cpu(model.state_dict())\\n                if args.save_safetensors:\\n                    safetensors.torch.save_file(state_dict, os.path.join(output_dir, 'model.safetensors'))\\n                else:\\n                    torch.save(state_dict, os.path.join(output_dir, 'pytorch_model.bin'))\\n        else:\\n            model.save_pretrained(\\n                output_dir,\\n                is_main_process=args.should_save,\\n                save_function=xm.save,\\n                safe_serialization=args.save_safetensors,\\n                state_dict=xm._maybe_convert_to_cpu(model.state_dict()))\\n        if tokenizer is not None and args.should_save:\\n            tokenizer.save_pretrained(output_dir)\\n\\n\\ndef save_ta_fsdp_checkpoint(self_model, tokenizer, args, output_dir):\\n    import torch_xla.core.xla_model as xm\\n    from torch_xla.distributed.fsdp import consolidate_sharded_model_checkpoints\\n\\n    xm.mark_step()\\n\\n    if xm.is_master_ordinal(local=False):\\n        os.makedirs(output_dir, exist_ok=True)\\n        torch.save(args, os.path.join(output_dir, 'training_args.bin'))\\n\\n    supported_classes = (PreTrainedModel, PeftModel)\\n    model = self_model._get_underlay_model().module.module\\n    unwrapped_model = unwrap_model(model)\\n\\n    xm.rendezvous('saving_checkpoint')\\n    ckpt = {\\n        'model': self_model._get_underlay_model().state_dict(),\\n        'shard_metadata': self_model._get_underlay_model().get_shard_metadata(),\\n    }\\n    if isinstance(model, PeftModel):\\n        ckpt_path = os.path.join(output_dir, f'rank{args.process_index}-of-{args.world_size}-adapter_model.bin')\\n    else:\\n        ckpt_path = os.path.join(output_dir, f'rank{args.process_index}-of-{args.world_size}-pytorch_model.bin')\\n    xm.save(ckpt, ckpt_path, master_only=False)\\n    # Make sure all ranks have saved checkpoints\\n    xm.rendezvous('save_full_checkpoints')\\n\\n    if tokenizer is not None and args.should_save:\\n        tokenizer.save_pretrained(output_dir, is_main_process=xm.is_master_ordinal(local=False), save_function=xm.save)\\n\\n    # rank 0 consolidates and saves the whole checkpoint.\\n    if xm.is_master_ordinal(local=False):\\n        if isinstance(model, PeftModel):\\n            ckpt_suffix = 'rank*-of-*-adapter_model.bin'\\n        else:\\n            ckpt_suffix = 'rank*-of-*-pytorch_model.bin'\\n        full_state_dict, _ = consolidate_sharded_model_checkpoints(\\n            ckpt_prefix=os.path.join(output_dir, ''), ckpt_suffix=ckpt_suffix, save_model=False)\\n\\n        if isinstance(unwrapped_model, supported_classes):\\n            unwrapped_model.save_pretrained(\\n                output_dir,\\n                state_dict=full_state_dict,\\n                save_function=xm.save,\\n                safe_serialization=args.save_safetensors,\\n            )\\n        else:\\n            logger.info('Trainer.model is not a `PreTrainedModel`, only saving its state dict.')\\n            if args.save_safetensors:\\n                safetensors.torch.save_file(full_state_dict, os.path.join(output_dir, 'model.safetensors'))\\n            else:\\n                torch.save(full_state_dict, os.path.join(output_dir, 'pytorch_model.bin'))\\n\\n    xm.rendezvous('ckpt_consolidation')\\n    # delete the sharded checkpoint.\\n    os.remove(ckpt_path)\\n\\n\\ndef ta_trim_graph():\\n    if use_torchacc() and torchacc_trim_graph():\\n        import torchacc as ta\\n        ta.mark_step()\\n\\n\\n# Model patch\\ndef rotate_half(x):\\n    \\\"\\\"\\\"Rotates half the hidden dims of the input.\\\"\\\"\\\"\\n    x1 = x[..., :x.shape[-1] // 2]\\n    x2 = x[..., x.shape[-1] // 2:]\\n    return torch.cat((-x2, x1), dim=-1)\\n\\n\\ndef apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):\\n    \\\"\\\"\\\"Applies Rotary Position Embedding to the query and key tensors.\\n\\n    Args:\\n        q (`torch.Tensor`): The query tensor.\\n        k (`torch.Tensor`): The key tensor.\\n        cos (`torch.Tensor`): The cosine part of the rotary embedding.\\n        sin (`torch.Tensor`): The sine part of the rotary embedding.\\n        position_ids (`torch.Tensor`):\\n            The position indices of the tokens corresponding to the query and key tensors. For example, this can be\\n            used to pass offsetted position ids when working with a KV-cache.\\n        unsqueeze_dim (`int`, *optional*, defaults to 1):\\n            The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and\\n            sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note\\n            that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and\\n            k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes\\n            cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have\\n            the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.\\n    Returns:\\n        `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.\\n    \\\"\\\"\\\"\\n    if position_ids is not None:\\n        cos = cos[position_ids].unsqueeze(unsqueeze_dim)\\n        sin = sin[position_ids].unsqueeze(unsqueeze_dim)\\n    else:\\n        cos = cos.unsqueeze(unsqueeze_dim)\\n        sin = sin.unsqueeze(unsqueeze_dim)\\n    q_embed = (q * cos) + (rotate_half(q) * sin)\\n    k_embed = (k * cos) + (rotate_half(k) * sin)\\n    return q_embed, k_embed\\n\\n\\ndef patch_acc_model(model, args):\\n    if not args.use_flash_attn:\\n        logger.warn('Currently use flash attn for torchacc.')\\n    if args.model_type.startswith('qwen1half') or args.model_type.startswith('qwen2'):\\n        model = patch_qwen2_model(model)\\n    elif args.model_type.startswith('qwen'):\\n        import torchacc as ta\\n        model = ta.patch_qwen_model(model)\\n    elif args.model_type.startswith('baichuan'):\\n        model = patch_baichuan_model(model)\\n    elif args.model_type.startswith('llama') or args.model_type.startswith('yi'):\\n        model = patch_llama_model(model)\\n    elif args.model_type.startswith('chatglm'):\\n        model = patah_chatglm_model(model)\\n    return model\\n\\n\\ndef patch_llama_model(model):\\n\\n    def update_causal_mask(self, *args, **kwargs):\\n        # attention_mask is not supported in TorchAcc.\\n        return None\\n\\n    def llama_attn_forward(self,\\n                           hidden_states: torch.Tensor,\\n                           attention_mask: Optional[torch.Tensor] = None,\\n                           position_ids: Optional[torch.Tensor] = None,\\n                           past_key_value: Optional[Tuple[torch.Tensor]] = None,\\n                           output_attentions: bool = False,\\n                           use_cache: bool = False,\\n                           cache_position: Optional[torch.LongTensor] = None,\\n                           **kwargs) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:\\n        from torchacc.ops import flash_attn_varlen_xla\\n        import einops\\n\\n        bsz, q_len, _ = hidden_states.size()\\n\\n        query_states = (self.q_proj(hidden_states).view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2))\\n        key_states = (\\n            self.k_proj(hidden_states).view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2))\\n        value_states = (\\n            self.v_proj(hidden_states).view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2))\\n\\n        kv_seq_len = key_states.shape[-2]\\n        assert past_key_value is None, 'past_key_value is not supported'\\n\\n        if version.parse(transformers.__version__) >= version.parse('4.36'):\\n            cos, sin = self.rotary_emb(value_states, position_ids)\\n            query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)\\n        else:\\n            cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len)\\n            query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)\\n\\n        assert not output_attentions, 'output_attentions is not supported'\\n\\n        if past_key_value is not None:\\n            key_states = torch.cat([past_key_value[0], key_states], dim=2)\\n            value_states = torch.cat([past_key_value[1], value_states], dim=2)\\n        past_key_value = (key_states, value_states) if use_cache else None\\n\\n        # See https://github.com/HazyResearch/flash-attention/blob/main/flash_attn/flash_attention.py\\n        # if attention_mask is not None:\\n        #     value_states = value_states * attention_mask.unsqueeze(1).unsqueeze(-1)\\n        q = einops.rearrange(query_states, 'b h s ... -> (b s) h ...')\\n        k = einops.rearrange(key_states, 'b h s ... -> (b s) h ...')\\n        v = einops.rearrange(value_states, 'b h s ... -> (b s) h ...')\\n        max_s = q_len\\n        cu_q_lens = torch.arange(0, (bsz + 1) * q_len, step=q_len, dtype=torch.int32, device=q.device)\\n        output = flash_attn_varlen_xla(\\n            q, k, v, cu_q_lens, cu_q_lens, max_s, max_s, 0.0, softmax_scale=None, causal=True)\\n        output = einops.rearrange(output, '(b s) ... -> b s ...', b=bsz)\\n\\n        return self.o_proj(einops.rearrange(output, 'b s h d -> b s (h d)')), None, past_key_value\\n\\n    for layer in model.model.layers:\\n        layer.self_attn.forward = types.MethodType(llama_attn_forward, layer.self_attn)\\n\\n    if version.parse(transformers.__version__) >= version.parse('4.38'):\\n        model.model._update_causal_mask = types.MethodType(update_causal_mask, model.model)\\n\\n    return model\\n\\n\\ndef patah_chatglm_model(model):\\n\\n    def chatglm_apply_rotary_pos_emb(x: torch.Tensor, rope_cache: torch.Tensor) -> torch.Tensor:\\n        # x: [sq, b, np, hn]\\n        sq, _, np, _ = x.size(0), x.size(1), x.size(2), x.size(3)\\n        rot_dim = rope_cache.shape[-2] * 2\\n        x, x_pass = x[..., :rot_dim], x[..., rot_dim:]\\n        # truncate to support variable sizes\\n        rope_cache = rope_cache[:sq]\\n        xshaped = x.reshape(sq, -1, np, rot_dim // 2, 2)\\n        rope_cache = rope_cache.view(sq, -1, 1, xshaped.size(3), 2)\\n        x_out2 = torch.stack(\\n            [\\n                xshaped[..., 0] * rope_cache[..., 0] - xshaped[..., 1] * rope_cache[..., 1],\\n                xshaped[..., 1] * rope_cache[..., 0] + xshaped[..., 0] * rope_cache[..., 1],\\n            ],\\n            -1,\\n        )\\n        x_out2 = x_out2.flatten(3)\\n        return torch.cat((x_out2, x_pass), dim=-1)\\n\\n    def chatglm_attn_forward(self,\\n                             hidden_states,\\n                             attention_mask,\\n                             rotary_pos_emb,\\n                             kv_cache=None,\\n                             use_cache=True,\\n                             **kwargs):\\n        # hidden_states: [sq, b, h]\\n\\n        # =================================================\\n        # Pre-allocate memory for key-values for inference.\\n        # =================================================\\n        # =====================\\n        # Query, Key, and Value\\n        # =====================\\n\\n        # Attention heads [sq, b, h] --> [sq, b, (np * 3 * hn)]\\n        mixed_x_layer = self.query_key_value(hidden_states)\\n\\n        if self.multi_query_attention:\\n            (query_layer, key_layer, value_layer) = mixed_x_layer.split(\\n                [\\n                    self.num_attention_heads_per_partition * self.hidden_size_per_attention_head,\\n                    self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head,\\n                    self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head,\\n                ],\\n                dim=-1,\\n            )\\n            query_layer = query_layer.view(query_layer.size()[:-1] + (self.num_attention_heads_per_partition,\\n                                                                      self.hidden_size_per_attention_head))\\n            key_layer = key_layer.view(key_layer.size()[:-1] + (self.num_multi_query_groups_per_partition,\\n                                                                self.hidden_size_per_attention_head))\\n            value_layer = value_layer.view(value_layer.size()[:-1] + (self.num_multi_query_groups_per_partition,\\n                                                                      self.hidden_size_per_attention_head))\\n        else:\\n            new_tensor_shape = mixed_x_layer.size()[:-1] + (self.num_attention_heads_per_partition,\\n                                                            3 * self.hidden_size_per_attention_head)\\n            mixed_x_layer = mixed_x_layer.view(*new_tensor_shape)\\n\\n            # [sq, b, np, 3 * hn] --> 3 [sq, b, np, hn]\\n            (query_layer, key_layer, value_layer) = split_tensor_along_last_dim(mixed_x_layer, 3)\\n\\n        # apply relative positional encoding (rotary embedding)\\n        if rotary_pos_emb is not None:\\n            query_layer = chatglm_apply_rotary_pos_emb(query_layer, rotary_pos_emb)\\n            key_layer = chatglm_apply_rotary_pos_emb(key_layer, rotary_pos_emb)\\n\\n        # adjust key and value for inference\\n        if kv_cache is not None:\\n            cache_k, cache_v = kv_cache\\n            key_layer = torch.cat((cache_k, key_layer), dim=0)\\n            value_layer = torch.cat((cache_v, value_layer), dim=0)\\n        if use_cache:\\n            kv_cache = (key_layer, value_layer)\\n        else:\\n            kv_cache = None\\n\\n        if self.multi_query_attention:\\n            key_layer = key_layer.unsqueeze(-2)\\n            key_layer = key_layer.expand(\\n                -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1)\\n            key_layer = key_layer.contiguous().view(key_layer.size()[:2] + (self.num_attention_heads_per_partition,\\n                                                                            self.hidden_size_per_attention_head))\\n            value_layer = value_layer.unsqueeze(-2)\\n            value_layer = value_layer.expand(\\n                -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1)\\n            value_layer = value_layer.contiguous().view(value_layer.size()[:2]\\n                                                        + (self.num_attention_heads_per_partition,\\n                                                           self.hidden_size_per_attention_head))\\n\\n        # ==================================\\n        # core attention computation\\n        # ==================================\\n\\n        from torchacc.ops import flash_attn_varlen_qkvpacked_xla\\n        import einops\\n\\n        query_layer, key_layer, value_layer = [k.permute(1, 2, 0, 3) for k in [query_layer, key_layer, value_layer]]\\n        bsz, _, q_len, _ = query_layer.size()\\n        qkv = torch.stack([query_layer, key_layer, value_layer], dim=2)\\n        qkv = qkv.transpose(1, 3)\\n        qkv = einops.rearrange(qkv, 'b s ... -> (b s) ...')\\n        cu_q_lens = torch.arange(0, (bsz + 1) * q_len, step=q_len, dtype=torch.int32, device=qkv.device)\\n        context_layer = flash_attn_varlen_qkvpacked_xla(\\n            qkv, cu_q_lens, q_len, dropout_p=0.0, softmax_scale=None, causal=True)\\n        context_layer = einops.rearrange(context_layer, '(b s) ... -> b s ...', b=bsz)\\n        context_layer = context_layer.permute(1, 0, 2, 3)\\n        new_context_layer_shape = context_layer.size()[:-2] + (self.core_attention.hidden_size_per_partition, )\\n        context_layer = context_layer.reshape(*new_context_layer_shape)\\n\\n        # =================\\n        # Output. [sq, b, h]\\n        # =================\\n\\n        output = self.dense(context_layer)\\n\\n        return output, kv_cache\\n\\n    def torchacc_swiglu(x):\\n        x = torch.chunk(x, 2, dim=-1)\\n        return F.silu(x[0]).to(x[0].dtype) * x[1]\\n\\n    # patch attention\\n    for layer in model.transformer.encoder.layers:\\n        layer.self_attention.forward = types.MethodType(chatglm_attn_forward, layer.self_attention)\\n        layer.mlp.activation_func = torchacc_swiglu\\n\\n    return model\\n\\n\\ndef patch_baichuan_model(model):\\n\\n    def baichuan_attn_forward(self,\\n                              hidden_states: torch.Tensor,\\n                              attention_mask: Optional[torch.Tensor] = None,\\n                              past_key_value: Optional[Tuple[torch.Tensor]] = None,\\n                              output_attentions: bool = False,\\n                              use_cache: bool = False,\\n                              **kwargs) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:\\n\\n        import einops\\n\\n        bsz, q_len, _ = hidden_states.size()\\n\\n        proj = self.W_pack(hidden_states)\\n        proj = (proj.unflatten(-1, (3, self.hidden_size)).unsqueeze(0).transpose(0, -2).squeeze(-2))\\n        query_states = (proj[0].view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2))\\n        key_states = (proj[1].view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2))\\n        value_states = (proj[2].view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2))\\n\\n        kv_seq_len = key_states.shape[-2]\\n        if past_key_value is not None:\\n            kv_seq_len += past_key_value[0].shape[-2]\\n\\n        if past_key_value is not None:\\n            # reuse k, v, self_attention\\n            key_states = torch.cat([past_key_value[0], key_states], dim=2)\\n            value_states = torch.cat([past_key_value[1], value_states], dim=2)\\n\\n        past_key_value = (key_states, value_states) if use_cache else None\\n\\n        from torchacc.ops import flash_attn_varlen_xla\\n        query_states = query_states.transpose(1, 2)\\n        key_states = key_states.transpose(1, 2)\\n        value_states = value_states.transpose(1, 2)\\n        q, k, v = [einops.rearrange(x, 'b s ... -> (b s) ...') for x in [query_states, key_states, value_states]]\\n        cu_q_lens = torch.arange(0, (bsz + 1) * q_len, step=q_len, dtype=torch.int32, device=q.device)\\n        output = flash_attn_varlen_xla(\\n            q, k, v, cu_q_lens, cu_q_lens, q_len, q_len, 0.0, softmax_scale=None, causal=True)\\n        output = einops.rearrange(output, '(b s) ... -> b s ...', b=bsz)\\n        output = self.o_proj(einops.rearrange(output, 'b s h d -> b s (h d)'))\\n        return output, None, past_key_value\\n\\n    for layer in model.base_model.layers:\\n        layer.self_attn.forward = types.MethodType(baichuan_attn_forward, layer.self_attn)\\n\\n    return model\\n\\n\\ndef patch_qwen2_model(model):\\n\\n    def qwen2_attn_forward(\\n        self,\\n        hidden_states,\\n        attention_mask=None,\\n        position_ids=None,\\n        past_key_value=None,\\n        output_attentions: bool = False,\\n        use_cache: bool = False,\\n        **kwargs,\\n    ):\\n\\n        bsz, q_len, _ = hidden_states.size()\\n\\n        query_states = self.q_proj(hidden_states)\\n        key_states = self.k_proj(hidden_states)\\n        value_states = self.v_proj(hidden_states)\\n\\n        query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)\\n        key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n        value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n\\n        kv_seq_len = key_states.shape[-2]\\n        if past_key_value is not None:\\n            if self.layer_idx is None:\\n                raise ValueError(\\n                    f'The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} '\\n                    'for auto-regressive decoding with k/v caching, please make sure to initialize the attention class '\\n                    'with a layer index.')\\n            kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx)\\n\\n        # Because the input can be padded, the absolute sequence length depends on the max position id.\\n        # rotary_seq_len = max(kv_seq_len, position_ids[:, -1].max().item()) + 1\\n        rotary_seq_len = kv_seq_len + 1\\n        cos, sin = self.rotary_emb(value_states, seq_len=rotary_seq_len)\\n\\n        query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)\\n\\n        dropout_rate = 0.0 if not self.training else self.attention_dropout\\n\\n        # In PEFT, usually we cast the layer norms in float32 for training stability reasons\\n        # therefore the input hidden states gets silently casted in float32. Hence, we need\\n        # cast them back in float16 just to be sure everything works as expected.\\n        input_dtype = query_states.dtype\\n        if input_dtype == torch.float32:\\n            if torch.is_autocast_enabled():\\n                target_dtype = torch.get_autocast_gpu_dtype()\\n            # Handle the case where the model is quantized\\n            elif hasattr(self.config, '_pre_quantization_dtype'):\\n                target_dtype = self.config._pre_quantization_dtype\\n            else:\\n                target_dtype = self.q_proj.weight.dtype\\n\\n            query_states = query_states.to(target_dtype)\\n            key_states = key_states.to(target_dtype)\\n            value_states = value_states.to(target_dtype)\\n\\n        # Reashape to the expected shape for Flash Attention\\n        query_states = query_states.transpose(1, 2)\\n        key_states = key_states.transpose(1, 2)\\n        value_states = value_states.transpose(1, 2)\\n\\n        from torchacc.ops import flash_attn_varlen_xla\\n        import einops\\n\\n        q, k, v = [einops.rearrange(x, 'b s ... -> (b s) ...') for x in [query_states, key_states, value_states]]\\n        cu_q_lens = torch.arange(0, (bsz + 1) * q_len, step=q_len, dtype=torch.int32, device=q.device)\\n\\n        attn_output = flash_attn_varlen_xla(\\n            q, k, v, cu_q_lens, cu_q_lens, q_len, q_len, dropout_rate, softmax_scale=None, causal=True)\\n\\n        attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous()\\n        attn_output = self.o_proj(attn_output)\\n\\n        if not output_attentions:\\n            attn_weights = None\\n\\n        return attn_output, attn_weights, past_key_value\\n\\n    def qwen2_forward(self,\\n                      input_ids: torch.LongTensor = None,\\n                      attention_mask: Optional[torch.Tensor] = None,\\n                      position_ids: Optional[torch.LongTensor] = None,\\n                      past_key_values: Optional[List[torch.FloatTensor]] = None,\\n                      inputs_embeds: Optional[torch.FloatTensor] = None,\\n                      use_cache: Optional[bool] = None,\\n                      output_attentions: Optional[bool] = None,\\n                      output_hidden_states: Optional[bool] = None,\\n                      return_dict: Optional[bool] = None,\\n                      **kwargs):\\n        output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions\\n        output_hidden_states = (\\n            output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states)\\n        use_cache = use_cache if use_cache is not None else self.config.use_cache\\n\\n        return_dict = return_dict if return_dict is not None else self.config.use_return_dict\\n\\n        # retrieve input_ids and inputs_embeds\\n        if input_ids is not None and inputs_embeds is not None:\\n            raise ValueError('You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time')\\n        elif input_ids is not None:\\n            batch_size, seq_length = input_ids.shape\\n        elif inputs_embeds is not None:\\n            batch_size, seq_length, _ = inputs_embeds.shape\\n        else:\\n            raise ValueError('You have to specify either decoder_input_ids or decoder_inputs_embeds')\\n\\n        if self.gradient_checkpointing and self.training:\\n            if use_cache:\\n                use_cache = False\\n\\n        past_key_values_length = 0\\n\\n        if use_cache:\\n            use_legacy_cache = not isinstance(past_key_values, Cache)\\n            if use_legacy_cache:\\n                past_key_values = DynamicCache.from_legacy_cache(past_key_values)\\n            past_key_values_length = past_key_values.get_usable_length(seq_length)\\n\\n        if position_ids is None:\\n            device = input_ids.device if input_ids is not None else inputs_embeds.device\\n            position_ids = torch.arange(\\n                past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device)\\n            position_ids = position_ids.unsqueeze(0).view(-1, seq_length)\\n        else:\\n            position_ids = position_ids.view(-1, seq_length).long()\\n\\n        if inputs_embeds is None:\\n            inputs_embeds = self.embed_tokens(input_ids)\\n\\n        hidden_states = inputs_embeds\\n\\n        # decoder layers\\n        all_hidden_states = () if output_hidden_states else None\\n        all_self_attns = () if output_attentions else None\\n        next_decoder_cache = None\\n\\n        for decoder_layer in self.layers:\\n            if output_hidden_states:\\n                all_hidden_states += (hidden_states, )\\n\\n            if self.gradient_checkpointing and self.training:\\n                layer_outputs = self._gradient_checkpointing_func(\\n                    decoder_layer.__call__,\\n                    hidden_states,\\n                    attention_mask,\\n                    position_ids,\\n                    past_key_values,\\n                    output_attentions,\\n                    use_cache,\\n                )\\n            else:\\n                layer_outputs = decoder_layer(\\n                    hidden_states,\\n                    attention_mask=attention_mask,\\n                    position_ids=position_ids,\\n                    past_key_value=past_key_values,\\n                    output_attentions=output_attentions,\\n                    use_cache=use_cache,\\n                )\\n\\n            hidden_states = layer_outputs[0]\\n\\n            if use_cache:\\n                next_decoder_cache = layer_outputs[2 if output_attentions else 1]\\n\\n            if output_attentions:\\n                all_self_attns += (layer_outputs[1], )\\n\\n        hidden_states = self.norm(hidden_states)\\n\\n        # add hidden states from the last decoder layer\\n        if output_hidden_states:\\n            all_hidden_states += (hidden_states, )\\n\\n        next_cache = None\\n        if use_cache:\\n            next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache\\n\\n        if not return_dict:\\n            return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None)\\n        from transformers.modeling_outputs import BaseModelOutputWithPast\\n        return BaseModelOutputWithPast(\\n            last_hidden_state=hidden_states,\\n            past_key_values=next_cache,\\n            hidden_states=all_hidden_states,\\n            attentions=all_self_attns,\\n        )\\n\\n    for layer in model.model.layers:\\n        layer.self_attn.forward = types.MethodType(qwen2_attn_forward, layer.self_attn)\\n\\n    model.model.forward = types.MethodType(qwen2_forward, model.model)\\n    return model\\n\\n\\ndef patch_clip_grad_norm(accelerator):\\n    import accelerate\\n    from accelerate.utils import DistributedType\\n    from accelerate.optimizer import AcceleratedOptimizer\\n    import torch_xla.core.xla_model as xm\\n\\n    def clip_grad_norm_(self, parameters, max_norm, norm_type=2):\\n        \\\"\\\"\\\"\\n        Should be used in place of `torch.nn.utils.clip_grad_norm_`.\\n\\n        Returns:\\n            `torch.Tensor`: Total norm of the parameter gradients (viewed as a single vector).\\n\\n        Example:\\n\\n        ```python\\n        >>> from accelerate import Accelerator\\n\\n        >>> accelerator = Accelerator(gradient_accumulation_steps=2)\\n        >>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)\\n\\n        >>> for input, target in dataloader:\\n        ...     optimizer.zero_grad()\\n        ...     output = model(input)\\n        ...     loss = loss_func(output, target)\\n        ...     accelerator.backward(loss)\\n        ...     if accelerator.sync_gradients:\\n        ...         accelerator.clip_grad_norm_(model.parameters(), max_grad_norm)\\n        ...     optimizer.step()\\n        ```\\n        \\\"\\\"\\\"\\n        if self.distributed_type == DistributedType.FSDP:\\n            self.unscale_gradients()\\n            parameters = [p for p in parameters]\\n            for model in self._models:\\n                if parameters == [p for p in model.parameters()]:\\n                    return model.clip_grad_norm_(max_norm, norm_type)\\n        elif self.distributed_type == DistributedType.DEEPSPEED:\\n            # `accelerator.backward(loss)` is doing that automatically. Therefore, its implementation is not needed\\n            # We cannot return the gradient norm because DeepSpeed does it.\\n            return None\\n        elif self.distributed_type == DistributedType.XLA:\\n            # Reduce gradients first for XLA\\n            for acc_opt in self._optimizers:\\n                if not acc_opt.gradient_state.is_xla_gradients_synced:\\n                    opt = acc_opt\\n                    while isinstance(opt, AcceleratedOptimizer):\\n                        opt = opt.optimizer\\n                    gradients = xm._fetch_gradients(opt)\\n                    # Use xm.all_reduce to perform an in-place all-reduce. Recusrsive all-reduce each tensor\\n                    # one by one in self.reduce is non-inplace.\\n                    xm.all_reduce('sum', gradients, scale=1.0 / self.num_processes)\\n                    # Set is_xla_gradients_synced to True to avoid all-reduce twice in the AcceleratedOptimizer step.\\n                    acc_opt.gradient_state.is_xla_gradients_synced = True\\n            if os.environ.get('ACCELERATE_USE_FSDP', 'false') == 'true':\\n                self.unscale_gradients()\\n                parameters = [p for p in parameters]\\n                for model in self._models:\\n                    if parameters == [p for p in model.parameters()]:\\n                        return model._get_underlay_model().clip_grad_norm_(max_norm, norm_type)\\n        self.unscale_gradients()\\n        return torch.nn.utils.clip_grad_norm_(parameters, max_norm, norm_type=norm_type)\\n\\n    # TODO(baole): This should be removed once accelerate is updated.\\n    accelerator.clip_grad_norm_ = types.MethodType(clip_grad_norm_, accelerator)\\n    return accelerator\\n\\n\\n# Make sure to modify __release_datetime__ to release time when making official release.\\n__version__ = '2.5.0.dev0'\\n# default release datetime for branches under active development is set\\n# to be a time far-far-away-into-the-future\\n__release_datetime__ = '2099-10-13 08:56:12'\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import TYPE_CHECKING\\n\\nfrom .utils.import_utils import _LazyModule\\n\\nif TYPE_CHECKING:\\n    from .version import __version__, __release_datetime__\\n    from .tuners import (Adapter, AdapterConfig, AdapterModule, SwiftModel, LoRA, LoRAConfig, SWIFT_MAPPING,\\n                         AdaLoraConfig, IA3Config, LoftQConfig, LoHaConfig, LoKrConfig, LoraConfig, OFTConfig,\\n                         PeftConfig, PeftModel, PeftModelForCausalLM, ResTuningConfig, SideConfig,\\n                         PeftModelForSeq2SeqLM, PeftModelForSequenceClassification, PeftModelForTokenClassification,\\n                         PrefixTuningConfig, PromptEncoderConfig, PromptLearningConfig, PromptTuningConfig,\\n                         get_peft_config, get_peft_model, get_peft_model_state_dict, Prompt, PromptConfig, PromptModule,\\n                         SwiftConfig, SwiftOutput, Swift, SwiftTuners, LongLoRAConfig, LongLoRA, LongLoRAModelType,\\n                         SCETuning, SCETuningConfig)\\n    from .hub import snapshot_download, push_to_hub, push_to_hub_async, push_to_hub_in_queue\\n    from .trainers import (EvaluationStrategy, FSDPOption, HPSearchBackend, HubStrategy, IntervalStrategy,\\n                           SchedulerType, ShardedDDPOption, TrainingArguments, Seq2SeqTrainingArguments, Trainer,\\n                           Seq2SeqTrainer)\\n    from .utils import get_logger\\nelse:\\n    _import_structure = {\\n        'version': ['__release_datetime__', '__version__'],\\n        'hub': ['snapshot_download', 'push_to_hub', 'push_to_hub_async', 'push_to_hub_in_queue'],\\n        'tuners': [\\n            'Adapter', 'AdapterConfig', 'AdapterModule', 'SwiftModel', 'LoRA', 'LoRAConfig', 'SWIFT_MAPPING',\\n            'LoraConfig', 'AdaLoraConfig', 'IA3Config', 'LoftQConfig', 'LoHaConfig', 'LoKrConfig', 'OFTConfig',\\n            'PeftConfig', 'ResTuningConfig', 'SideConfig', 'PeftModel', 'PeftModelForCausalLM', 'PeftModelForSeq2SeqLM',\\n            'PeftModelForSequenceClassification', 'PeftModelForTokenClassification', 'PrefixTuningConfig',\\n            'PromptEncoderConfig', 'PromptLearningConfig', 'PromptTuningConfig', 'get_peft_config', 'get_peft_model',\\n            'get_peft_model_state_dict', 'Prompt', 'PromptConfig', 'PromptModule', 'SwiftConfig', 'SwiftOutput',\\n            'Swift', 'SwiftTuners', 'LongLoRAConfig', 'LongLoRA', 'LongLoRAModelType', 'SCETuning', 'SCETuningConfig'\\n        ],\\n        'trainers': [\\n            'EvaluationStrategy', 'FSDPOption', 'HPSearchBackend', 'HubStrategy', 'IntervalStrategy', 'SchedulerType',\\n            'ShardedDDPOption', 'TrainingArguments', 'Seq2SeqTrainingArguments', 'Trainer', 'Seq2SeqTrainer'\\n        ],\\n        'utils': ['get_logger']\\n    }\\n\\n    import sys\\n\\n    sys.modules[__name__] = _LazyModule(\\n        __name__,\\n        globals()['__file__'],\\n        _import_structure,\\n        module_spec=__spec__,\\n        extra_objects={},\\n    )\\n\\n\\nimport csv\\nimport datetime\\nimport inspect\\nimport logging\\nimport os\\nimport random\\nimport re\\nfrom copy import deepcopy\\nfrom types import MethodType\\nfrom typing import Dict\\n\\nimport numpy as np\\nimport torch\\nimport torch.distributed as dist\\nimport torch.nn.functional as F\\nimport torchvision\\nimport torchvision.transforms as transforms\\nfrom decord import VideoReader\\nfrom diffusers import AutoencoderKL, DDIMScheduler, MotionAdapter, UNet2DConditionModel, UNetMotionModel\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.pipelines import AnimateDiffPipeline\\nfrom diffusers.utils import export_to_gif\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom einops import rearrange\\nfrom modelscope import snapshot_download\\nfrom torch.nn.parallel import DistributedDataParallel as DDP\\nfrom torch.utils.data import RandomSampler\\nfrom torch.utils.data.dataset import Dataset\\nfrom torch.utils.data.distributed import DistributedSampler\\nfrom tqdm.auto import tqdm\\nfrom transformers import CLIPTextModel, CLIPTokenizer\\n\\nfrom swift import LoRAConfig, Swift, get_logger, push_to_hub\\nfrom swift.aigc.utils import AnimateDiffArguments\\nfrom swift.utils import get_dist_setting, get_main, is_dist\\n\\nlogger = get_logger()\\n\\n\\nclass AnimateDiffDataset(Dataset):\\n\\n    VIDEO_ID = 'videoid'\\n    NAME = 'name'\\n    CONTENT_URL = 'contentUrl'\\n\\n    def __init__(\\n        self,\\n        csv_path,\\n        video_folder,\\n        sample_size=256,\\n        sample_stride=4,\\n        sample_n_frames=16,\\n        dataset_sample_size=10000,\\n    ):\\n        print(f'loading annotations from {csv_path} ...')\\n        with open(csv_path, 'r') as csvfile:\\n            self.dataset = list(csv.DictReader(csvfile))\\n        dataset = []\\n        for d in tqdm(self.dataset):\\n            content_url = d[self.CONTENT_URL]\\n            file_name = content_url.split('/')[-1]\\n            if os.path.isfile(os.path.join(video_folder, file_name)):\\n                dataset.append(d)\\n            if dataset_sample_size is not None and len(dataset) > dataset_sample_size:\\n                break\\n\\n        self.dataset = dataset\\n        self.length = len(self.dataset)\\n        print(f'data scale: {self.length}')\\n\\n        self.video_folder = video_folder\\n        self.sample_stride = sample_stride\\n        self.sample_n_frames = sample_n_frames\\n\\n        sample_size = tuple(sample_size) if not isinstance(sample_size, int) else (sample_size, sample_size)\\n        self.pixel_transforms = transforms.Compose([\\n            transforms.RandomHorizontalFlip(),\\n            transforms.Resize(sample_size[0]),\\n            transforms.CenterCrop(sample_size),\\n            transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], inplace=True),\\n        ])\\n\\n    def get_batch(self, idx):\\n        video_dict: Dict[str, str] = self.dataset[idx]\\n        name = video_dict[self.NAME]\\n\\n        content_url = video_dict[self.CONTENT_URL]\\n        file_name = content_url.split('/')[-1]\\n        video_dir = os.path.join(self.video_folder, file_name)\\n        video_reader = VideoReader(video_dir)\\n        video_length = len(video_reader)\\n\\n        clip_length = min(video_length, (self.sample_n_frames - 1) * self.sample_stride + 1)\\n        start_idx = random.randint(0, video_length - clip_length)\\n        batch_index = np.linspace(start_idx, start_idx + clip_length - 1, self.sample_n_frames, dtype=int)\\n\\n        pixel_values = torch.from_numpy(video_reader.get_batch(batch_index).asnumpy()).permute(0, 3, 1, 2).contiguous()\\n        pixel_values = pixel_values / 255.\\n        del video_reader\\n        return pixel_values, name\\n\\n    def __len__(self):\\n        return self.length\\n\\n    def __getitem__(self, idx):\\n        while True:\\n            try:\\n                pixel_values, name = self.get_batch(idx)\\n                break\\n\\n            except Exception as e:\\n                logger.error(f'Error loading dataset batch: {e}')\\n                idx = random.randint(0, self.length - 1)\\n\\n        pixel_values = self.pixel_transforms(pixel_values)\\n        sample = dict(pixel_values=pixel_values, text=name)\\n        return sample\\n\\n\\ndef save_videos_grid(videos: torch.Tensor, path: str, rescale=False, n_rows=6, duration=4):\\n    import imageio\\n    videos = rearrange(videos, 'b c t h w -> t b c h w')\\n    outputs = []\\n    for x in videos:\\n        x = torchvision.utils.make_grid(x, nrow=n_rows)\\n        x = x.transpose(0, 1).transpose(1, 2).squeeze(-1)\\n        if rescale:\\n            x = (x + 1.0) / 2.0  # -1,1 -> 0,1\\n        x = (x * 255).numpy().astype(np.uint8)\\n        outputs.append(x)\\n\\n    os.makedirs(os.path.dirname(path), exist_ok=True)\\n    imageio.mimsave(path, outputs, duration=duration)\\n\\n\\ndef animatediff_sft(args: AnimateDiffArguments) -> None:\\n    # Initialize distributed training\\n    if is_dist():\\n        _, local_rank, num_processes, _ = get_dist_setting()\\n        global_rank = dist.get_rank()\\n    else:\\n        local_rank = 0\\n        global_rank = 0\\n        num_processes = 1\\n    is_main_process = global_rank == 0\\n\\n    global_seed = args.seed + global_rank\\n    torch.manual_seed(global_seed)\\n\\n    # Logging folder\\n    folder_name = datetime.datetime.now().strftime('ad-%Y-%m-%dT%H-%M-%S')\\n    output_dir = os.path.join(args.output_dir, folder_name)\\n\\n    *_, config = inspect.getargvalues(inspect.currentframe())\\n\\n    if is_main_process and args.use_wandb:\\n        import wandb\\n        wandb.init(project='animatediff', name=folder_name, config=config)\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n\\n    # Handle the output folder creation\\n    if is_main_process:\\n        os.makedirs(output_dir, exist_ok=True)\\n        os.makedirs(f'{output_dir}/samples', exist_ok=True)\\n        os.makedirs(f'{output_dir}/sanity_check', exist_ok=True)\\n        os.makedirs(f'{output_dir}/checkpoints', exist_ok=True)\\n\\n    with open(args.validation_prompts_path, 'r') as f:\\n        validation_data = f.readlines()\\n\\n    # Load scheduler, tokenizer and models.\\n    noise_scheduler = DDIMScheduler(\\n        num_train_timesteps=args.num_train_timesteps,\\n        beta_start=args.beta_start,\\n        beta_end=args.beta_end,\\n        beta_schedule=args.beta_schedule,\\n        steps_offset=args.steps_offset,\\n        clip_sample=args.clip_sample,\\n    )\\n    if not os.path.exists(args.model_id_or_path):\\n        pretrained_model_path = snapshot_download(args.model_id_or_path, revision=args.model_revision)\\n    vae = AutoencoderKL.from_pretrained(pretrained_model_path, subfolder='vae')\\n    tokenizer = CLIPTokenizer.from_pretrained(pretrained_model_path, subfolder='tokenizer')\\n    text_encoder = CLIPTextModel.from_pretrained(pretrained_model_path, subfolder='text_encoder')\\n\\n    motion_adapter = None\\n    if args.motion_adapter_id_or_path is not None:\\n        if not os.path.exists(args.motion_adapter_id_or_path):\\n            args.motion_adapter_id_or_path = snapshot_download(\\n                args.motion_adapter_id_or_path, revision=args.motion_adapter_revision)\\n        motion_adapter = MotionAdapter.from_pretrained(args.motion_adapter_id_or_path)\\n    unet: UNetMotionModel = UNetMotionModel.from_unet2d(\\n        UNet2DConditionModel.from_pretrained(pretrained_model_path, subfolder='unet'),\\n        motion_adapter=motion_adapter,\\n        load_weights=True,\\n    )\\n\\n    # Freeze vae and text_encoder\\n    vae.requires_grad_(False)\\n    text_encoder.requires_grad_(False)\\n\\n    # Set unet trainable parameters\\n    unet.requires_grad_(False)\\n    for name, param in unet.named_parameters():\\n        if re.fullmatch(args.trainable_modules, name):\\n            param.requires_grad = True\\n\\n    # Preparing LoRA\\n    if args.sft_type == 'lora':\\n        if args.motion_adapter_id_or_path is None:\\n            raise ValueError('No AnimateDiff weight found, Please do not use LoRA.')\\n        lora_config = LoRAConfig(\\n            r=args.lora_rank,\\n            target_modules=args.trainable_modules,\\n            lora_alpha=args.lora_alpha,\\n            lora_dtype=args.lora_dtype,\\n            lora_dropout=args.lora_dropout)\\n        unet = Swift.prepare_model(unet, lora_config)\\n        logger.info(f'lora_config: {lora_config}')\\n\\n    trainable_params = list(filter(lambda p: p.requires_grad, unet.parameters()))\\n    optimizer = torch.optim.AdamW(\\n        trainable_params,\\n        lr=args.learning_rate,\\n        weight_decay=args.weight_decay,\\n    )\\n\\n    if is_main_process:\\n        print(f'trainable params number: {len(trainable_params)}')\\n        print(f'trainable params scale: {sum(p.numel() for p in trainable_params) / 1e6:.3f} M')\\n\\n    # Enable xformers\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    # Enable gradient checkpointing\\n    if args.gradient_checkpointing:\\n        unet.enable_gradient_checkpointing()\\n\\n    # Move models to GPU\\n    vae.to(local_rank)\\n    text_encoder.to(local_rank)\\n\\n    # Get the training dataset\\n    train_dataset = AnimateDiffDataset(\\n        csv_path=args.csv_path,\\n        video_folder=args.video_folder,\\n        sample_size=args.sample_size,\\n        sample_stride=args.sample_stride,\\n        sample_n_frames=args.sample_n_frames,\\n        dataset_sample_size=args.dataset_sample_size,\\n    )\\n\\n    if not is_dist():\\n        sampler = RandomSampler(train_dataset)\\n    else:\\n        sampler = DistributedSampler(\\n            train_dataset, num_replicas=num_processes, rank=global_rank, shuffle=True, seed=global_seed)\\n\\n    # DataLoaders creation:\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        batch_size=args.batch_size,\\n        shuffle=False,\\n        sampler=sampler,\\n        num_workers=args.dataloader_num_workers,\\n        pin_memory=True,\\n        drop_last=True,\\n    )\\n\\n    # Get the training iteration\\n    max_train_steps = args.num_train_epochs * len(train_dataloader)\\n    print(f'max_train_steps: {max_train_steps}')\\n\\n    # Scheduler\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler_type,\\n        optimizer=optimizer,\\n        num_warmup_steps=int(args.warmup_ratio * max_train_steps) // args.gradient_accumulation_steps,\\n        num_training_steps=max_train_steps // args.gradient_accumulation_steps,\\n    )\\n\\n    unet.to(local_rank)\\n    if is_dist():\\n        unet = DDP(unet, device_ids=[local_rank], output_device=local_rank)\\n\\n    num_train_epochs = args.num_train_epochs\\n\\n    # Train!\\n    total_batch_size = args.batch_size * num_processes * args.gradient_accumulation_steps\\n\\n    if is_main_process:\\n        logging.info('***** Running training *****')\\n        logging.info(f'  Num examples = {len(train_dataset)}')\\n        logging.info(f'  Num Epochs = {num_train_epochs}')\\n        logging.info(f'  Instantaneous batch size per device = {args.batch_size}')\\n        logging.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n        logging.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n        logging.info(f'  Total optimization steps = {max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Only show the progress bar once on each machine.\\n    progress_bar = tqdm(range(global_step, max_train_steps), disable=not is_main_process)\\n    progress_bar.set_description('Steps')\\n\\n    # Support mixed-precision training\\n    scaler = torch.cuda.amp.GradScaler() if args.mixed_precision else None\\n\\n    for epoch in range(first_epoch, num_train_epochs):\\n        if is_dist():\\n            train_dataloader.sampler.set_epoch(epoch)\\n\\n        unet.train()\\n\\n        for step, batch in enumerate(train_dataloader):\\n            if args.text_dropout_rate > 0:\\n                batch['text'] = [name if random.random() > args.text_dropout_rate else '' for name in batch['text']]\\n\\n            # Data batch sanity check\\n            if epoch == first_epoch and step == 0:\\n                pixel_values, texts = batch['pixel_values'].cpu(), batch['text']\\n                pixel_values = rearrange(pixel_values, 'b f c h w -> b c f h w')\\n                for idx, (pixel_value, text) in enumerate(zip(pixel_values, texts)):\\n                    pixel_value = pixel_value[None, ...]\\n                    file_name = '-'.join(text.replace('/',\\n                                                      '').split()[:10]) if not text == '' else f'{global_rank}-{idx}'\\n                    save_videos_grid(pixel_value, f'{output_dir}/sanity_check/{file_name}.gif', rescale=True)\\n\\n            # Convert videos to latent space\\n            pixel_values = batch['pixel_values'].to(local_rank)\\n            video_length = pixel_values.shape[1]\\n            with torch.no_grad():\\n                pixel_values = rearrange(pixel_values, 'b f c h w -> (b f) c h w')\\n                latents = vae.encode(pixel_values).latent_dist\\n                latents = latents.sample()\\n                latents = rearrange(latents, '(b f) c h w -> b c f h w', f=video_length)\\n                latents = latents * 0.18215\\n\\n            # Sample noise that we'll add to the latents\\n            noise = torch.randn_like(latents)\\n            bsz = latents.shape[0]\\n\\n            # Sample a random timestep for each video\\n            timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=latents.device)\\n            timesteps = timesteps.long()\\n\\n            # Add noise to the latents according to the noise magnitude at each timestep\\n            # (this is the forward diffusion process)\\n            noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)\\n\\n            # Get the text embedding for conditioning\\n            with torch.no_grad():\\n                prompt_ids = tokenizer(\\n                    batch['text'],\\n                    max_length=tokenizer.model_max_length,\\n                    padding='max_length',\\n                    truncation=True,\\n                    return_tensors='pt').input_ids.to(latents.device)\\n                encoder_hidden_states = text_encoder(prompt_ids)[0]\\n\\n            # Get the target for loss depending on the prediction type\\n            if noise_scheduler.config.prediction_type == 'epsilon':\\n                target = noise\\n            elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                raise NotImplementedError\\n            else:\\n                raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n            # Predict the noise residual and compute loss\\n            # Mixed-precision training\\n            with torch.cuda.amp.autocast(enabled=args.mixed_precision):\\n                model_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample\\n                loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n\\n            # Backpropagate\\n            if args.mixed_precision:\\n                scaler.scale(loss).backward()\\n            else:\\n                loss.backward()\\n\\n            if step % args.gradient_accumulation_steps == 0:\\n                # Backpropagate\\n                if args.mixed_precision:\\n                    scaler.unscale_(optimizer)\\n                    torch.nn.utils.clip_grad_norm_(unet.parameters(), args.max_grad_norm)\\n                    scaler.step(optimizer)\\n                    scaler.update()\\n                else:\\n                    torch.nn.utils.clip_grad_norm_(unet.parameters(), args.max_grad_norm)\\n                    optimizer.step()\\n                optimizer.zero_grad()\\n                lr_scheduler.step()\\n\\n            progress_bar.update(1)\\n            global_step += 1\\n\\n            # Wandb logging\\n            if is_main_process and args.use_wandb:\\n                wandb.log({'train_loss': loss.item()}, step=global_step)\\n\\n            # Save checkpoint\\n            if is_main_process and (global_step % args.save_steps == 0 or step == len(train_dataloader) - 1):\\n                save_path = os.path.join(output_dir, 'checkpoints')\\n                if step == len(train_dataloader) - 1:\\n                    if isinstance(unet, DDP):\\n                        unet.module.save_pretrained(os.path.join(save_path, 'iter-last'))\\n                    else:\\n                        unet.save_pretrained(os.path.join(save_path, 'iter-last'))\\n                    if args.push_to_hub:\\n                        push_to_hub(\\n                            repo_name=args.hub_model_id,\\n                            output_dir=os.path.join(save_path, 'iter-last'),\\n                            token=args.hub_token,\\n                            private=True,\\n                        )\\n                    logging.info(f'Saved state to {os.path.join(save_path, \\\"iter-last\\\")} on the last step')\\n                else:\\n                    iter_save_path = os.path.join(save_path, f'iter-{global_step}')\\n                    if isinstance(unet, DDP):\\n                        unet.module.save_pretrained(iter_save_path)\\n                    else:\\n                        unet.save_pretrained(iter_save_path)\\n                    if args.push_to_hub and args.push_hub_strategy == 'all_checkpoints':\\n                        push_to_hub(\\n                            repo_name=args.hub_model_id,\\n                            output_dir=os.path.join(save_path, f'iter-{global_step}'),\\n                            token=args.hub_token,\\n                            private=True,\\n                        )\\n                    logging.info(\\n                        f'Saved state to {os.path.join(save_path, f\\\"iter-{global_step}\\\")} (global_step: {global_step})')\\n\\n            # Periodically validation\\n            if is_main_process and global_step % args.eval_steps == 0:\\n\\n                generator = torch.Generator(device=latents.device)\\n                generator.manual_seed(global_seed)\\n                Swift.merge(unet)\\n                height = args.sample_size\\n                width = args.sample_size\\n\\n                def state_dict(self,\\n                               *args,\\n                               destination=None,\\n                               prefix='',\\n                               keep_vars=False,\\n                               adapter_name: str = None,\\n                               **kwargs):\\n                    state_dict = self.state_dict_origin()\\n                    return {\\n                        key.replace('base_layer.', ''): value\\n                        for key, value in state_dict.items() if 'lora' not in key\\n                    }\\n\\n                motion_adapter = MotionAdapter(\\n                    motion_num_attention_heads=args.motion_num_attention_heads,\\n                    motion_max_seq_length=args.motion_max_seq_length)\\n\\n                module = unet if not isinstance(unet, DDP) else unet.module\\n                motion_adapter.mid_block.motion_modules = deepcopy(module.mid_block.motion_modules)\\n                motion_adapter.mid_block.motion_modules.state_dict_origin = \\\\\\n                    motion_adapter.mid_block.motion_modules.state_dict\\n                motion_adapter.mid_block.motion_modules.state_dict = MethodType(state_dict,\\n                                                                                motion_adapter.mid_block.motion_modules)\\n                for db1, db2 in zip(motion_adapter.down_blocks, module.down_blocks):\\n                    db1.motion_modules = deepcopy(db2.motion_modules)\\n                    db1.motion_modules.state_dict_origin = db1.motion_modules.state_dict\\n                    db1.motion_modules.state_dict = MethodType(state_dict, db1.motion_modules)\\n                for db1, db2 in zip(motion_adapter.up_blocks, module.up_blocks):\\n                    db1.motion_modules = deepcopy(db2.motion_modules)\\n                    db1.motion_modules.state_dict_origin = db1.motion_modules.state_dict\\n                    db1.motion_modules.state_dict = MethodType(state_dict, db1.motion_modules)\\n\\n                Swift.unmerge(unet)\\n                validation_pipeline = AnimateDiffPipeline(\\n                    unet=UNet2DConditionModel.from_pretrained(pretrained_model_path, subfolder='unet'),\\n                    vae=vae,\\n                    tokenizer=tokenizer,\\n                    motion_adapter=motion_adapter,\\n                    text_encoder=text_encoder,\\n                    scheduler=noise_scheduler,\\n                ).to('cuda')\\n                validation_pipeline.enable_vae_slicing()\\n                validation_pipeline.enable_model_cpu_offload()\\n\\n                for idx, prompt in enumerate(validation_data):\\n                    output = validation_pipeline(\\n                        prompt=prompt,\\n                        negative_prompt='bad quality, worse quality',\\n                        num_frames=args.sample_n_frames,\\n                        height=height,\\n                        width=width,\\n                        guidance_scale=args.guidance_scale,\\n                        num_inference_steps=args.num_inference_steps,\\n                        generator=torch.Generator('cpu').manual_seed(global_seed),\\n                    )\\n                    frames = output.frames[0]\\n                    export_to_gif(frames, f'{output_dir}/samples/sample-{global_step}-{idx}.gif')\\n                unet.train()\\n\\n            logs = {'step_loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n\\n            if global_step >= max_train_steps:\\n                break\\n\\n    if is_dist():\\n        dist.destroy_process_group()\\n\\n\\nanimatediff_main = get_main(AnimateDiffArguments, animatediff_sft)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\n\\nimport torch\\nfrom diffusers import DDIMScheduler, MotionAdapter\\nfrom diffusers.pipelines import AnimateDiffPipeline\\nfrom diffusers.utils import export_to_gif\\n\\nfrom swift import Swift, snapshot_download\\nfrom swift.aigc.utils import AnimateDiffInferArguments\\nfrom swift.utils import get_logger, get_main\\n\\nlogger = get_logger()\\n\\n\\ndef animatediff_infer(args: AnimateDiffInferArguments) -> None:\\n    generator = torch.Generator(device='cpu')\\n    generator.manual_seed(args.seed)\\n\\n    # Load scheduler, tokenizer and models.\\n    noise_scheduler = DDIMScheduler(\\n        num_train_timesteps=args.num_train_timesteps,\\n        beta_start=args.beta_start,\\n        beta_end=args.beta_end,\\n        beta_schedule=args.beta_schedule,\\n        steps_offset=args.steps_offset,\\n        clip_sample=args.clip_sample,\\n    )\\n\\n    if not os.path.exists(args.model_id_or_path):\\n        pretrained_model_path = snapshot_download(args.model_id_or_path, revision=args.model_revision)\\n    else:\\n        pretrained_model_path = args.model_id_or_path\\n\\n    motion_adapter = None\\n    if args.motion_adapter_id_or_path is not None:\\n        if not os.path.exists(args.motion_adapter_id_or_path):\\n            args.motion_adapter_id_or_path = snapshot_download(\\n                args.motion_adapter_id_or_path, revision=args.motion_adapter_revision)\\n        motion_adapter = MotionAdapter.from_pretrained(args.motion_adapter_id_or_path)\\n    if args.sft_type == 'full':\\n        motion_adapter_dir = args.ckpt_dir if args.ckpt_dir is not None else os.path.join(\\n            pretrained_model_path, 'motion_adapter')\\n        motion_adapter = MotionAdapter.from_pretrained(motion_adapter_dir)\\n\\n    validation_pipeline = AnimateDiffPipeline.from_pretrained(\\n        pretrained_model_path,\\n        motion_adapter=motion_adapter,\\n    ).to('cuda')\\n    validation_pipeline.scheduler = noise_scheduler\\n\\n    if not args.sft_type == 'full':\\n        model = Swift.from_pretrained(validation_pipeline.unet, args.ckpt_dir)\\n        if args.merge_lora:\\n            ckpt_dir, ckpt_name = os.path.split(args.ckpt_dir)\\n            merged_lora_path = os.path.join(ckpt_dir, f'{ckpt_name}-merged')\\n            logger.info(f'merged_lora_path: `{merged_lora_path}`')\\n            logger.info(\\\"Setting args.sft_type: 'full'\\\")\\n            logger.info(f'Setting args.ckpt_dir: {merged_lora_path}')\\n            args.sft_type = 'full'\\n            args.ckpt_dir = merged_lora_path\\n            if os.path.exists(args.ckpt_dir) and not args.replace_if_exists:\\n                logger.warn(f'The weight directory for the merged LoRA already exists in {args.ckpt_dir}, '\\n                            'skipping the saving process. '\\n                            'you can pass `replace_if_exists=True` to overwrite it.')\\n                return\\n\\n            Swift.merge_and_unload(model)\\n            validation_pipeline.unet = model.model\\n            validation_pipeline.save_pretrained(args.ckpt_dir)\\n\\n    validation_pipeline.enable_vae_slicing()\\n    validation_pipeline.enable_model_cpu_offload()\\n\\n    if args.eval_human:\\n        idx = 0\\n        while True:\\n            prompt = input('<<< ')\\n            sample = validation_pipeline(\\n                prompt,\\n                negative_prompt='bad quality, worse quality',\\n                generator=generator,\\n                num_frames=args.sample_n_frames,\\n                num_inference_steps=args.num_inference_steps,\\n                guidance_scale=args.guidance_scale,\\n            ).frames[0]\\n            os.makedirs(args.output_path, exist_ok=True)\\n            logger.info(f'Output saved to: {f\\\"{args.output_path}/output-{idx}.gif\\\"}')\\n            export_to_gif(sample, f'{args.output_path}/output-{idx}.gif')\\n            idx += 1\\n    else:\\n        with open(args.validation_prompts_path, 'r') as f:\\n            validation_data = f.readlines()\\n\\n        for idx, prompt in enumerate(validation_data):\\n            sample = validation_pipeline(\\n                prompt,\\n                negative_prompt='bad quality, worse quality',\\n                generator=generator,\\n                num_frames=args.sample_n_frames,\\n                num_inference_steps=args.num_inference_steps,\\n                guidance_scale=args.guidance_scale,\\n            ).frames[0]\\n            os.makedirs(args.output_path, exist_ok=True)\\n            logger.info(f'Output saved to: {f\\\"{args.output_path}/output-{idx}.gif\\\"}')\\n            export_to_gif(sample, f'{args.output_path}/output-{idx}.gif')\\n\\n\\nanimatediff_infer_main = get_main(AnimateDiffInferArguments, animatediff_infer)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import TYPE_CHECKING\\n\\nfrom swift.utils.import_utils import _LazyModule\\n\\nif TYPE_CHECKING:\\n    # Recommend using `xxx_main`\\n    from .animatediff import animatediff_sft, animatediff_main\\n    from .animatediff_infer import animatediff_infer, animatediff_infer_main\\n    from .diffusers import train_text_to_image, train_text_to_image_lora, train_text_to_image_lora_sdxl, \\\\\\n        train_text_to_image_sdxl, infer_text_to_image, infer_text_to_image_lora, infer_text_to_image_sdxl, \\\\\\n        infer_text_to_image_lora_sdxl, train_controlnet, train_controlnet_sdxl, train_dreambooth, \\\\\\n        train_dreambooth_lora, train_dreambooth_lora_sdxl, infer_controlnet, infer_controlnet_sdxl, \\\\\\n        infer_dreambooth, infer_dreambooth_lora, infer_dreambooth_lora_sdxl\\n    from .utils import AnimateDiffArguments, AnimateDiffInferArguments\\nelse:\\n    _import_structure = {\\n        'animatediff': ['animatediff_sft', 'animatediff_main'],\\n        'animatediff_infer': ['animatediff_infer', 'animatediff_infer_main'],\\n        'diffusers': [\\n            'train_text_to_image', 'train_text_to_image_lora', 'train_text_to_image_lora_sdxl',\\n            'train_text_to_image_sdxl', 'infer_text_to_image', 'infer_text_to_image_lora', 'infer_text_to_image_sdxl',\\n            'infer_text_to_image_lora_sdxl', 'train_controlnet', 'train_controlnet_sdxl', 'train_dreambooth',\\n            'train_dreambooth_lora', 'train_dreambooth_lora_sdxl', 'infer_controlnet', 'infer_controlnet_sdxl',\\n            'infer_dreambooth', 'infer_dreambooth_lora', 'infer_dreambooth_lora_sdxl'\\n        ],\\n        'utils': ['AnimateDiffArguments', 'AnimateDiffInferArguments'],\\n    }\\n\\n    import sys\\n\\n    sys.modules[__name__] = _LazyModule(\\n        __name__,\\n        globals()['__file__'],\\n        _import_structure,\\n        module_spec=__spec__,\\n        extra_objects={},\\n    )\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nfrom dataclasses import dataclass, field\\nfrom typing import Literal, Optional, Union\\n\\nimport torch\\nimport torch.distributed as dist\\n\\nfrom swift import get_logger\\nfrom swift.utils import broadcast_string, get_dist_setting, is_dist\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass AnimateDiffArguments:\\n    motion_adapter_id_or_path: Optional[str] = None\\n    motion_adapter_revision: Optional[str] = None\\n\\n    model_id_or_path: str = None\\n    model_revision: str = None\\n\\n    dataset_sample_size: int = None\\n\\n    sft_type: str = field(default='lora', metadata={'choices': ['lora', 'full']})\\n\\n    output_dir: str = 'output'\\n    ddp_backend: str = field(default='nccl', metadata={'choices': ['nccl', 'gloo', 'mpi', 'ccl', 'hccl']})\\n\\n    seed: int = 42\\n\\n    lora_rank: int = 8\\n    lora_alpha: int = 32\\n    lora_dropout: float = 0.05\\n    lora_dtype: Literal['fp16', 'bf16', 'fp32', 'AUTO'] = 'fp32'\\n\\n    gradient_checkpointing: bool = False\\n    batch_size: int = 1\\n    num_train_epochs: int = 1\\n    # if max_steps >= 0, override num_train_epochs\\n    max_steps: int = -1\\n    learning_rate: Optional[float] = None\\n    weight_decay: float = 0.01\\n    gradient_accumulation_steps: int = 16\\n    max_grad_norm: float = 1.\\n    lr_scheduler_type: str = 'cosine'\\n    warmup_ratio: float = 0.05\\n\\n    eval_steps: int = 50\\n    save_steps: Optional[int] = None\\n    dataloader_num_workers: int = 1\\n\\n    push_to_hub: bool = False\\n    # 'user_name/repo_name' or 'repo_name'\\n    hub_model_id: Optional[str] = None\\n    hub_private_repo: bool = False\\n    push_hub_strategy: str = field(default='push_best', metadata={'choices': ['push_last', 'all_checkpoints']})\\n    # None: use env var `MODELSCOPE_API_TOKEN`\\n    hub_token: Optional[str] = field(\\n        default=None, metadata={'help': 'SDK token can be found in https://modelscope.cn/my/myaccesstoken'})\\n\\n    ignore_args_error: bool = False  # True: notebook compatibility\\n\\n    text_dropout_rate: float = 0.1\\n\\n    validation_prompts_path: str = field(\\n        default=None, metadata={'help': 'The validation prompts file path, use llm/configs/ad_validation.txt is None'})\\n\\n    trainable_modules: str = field(\\n        default='.*motion_modules.*',\\n        metadata={'help': 'The trainable modules, by default, the .*motion_modules.* will be trained'})\\n\\n    mixed_precision: bool = True\\n\\n    enable_xformers_memory_efficient_attention: bool = True\\n\\n    num_inference_steps: int = 25\\n    guidance_scale: float = 8.\\n    sample_size: int = 256\\n    sample_stride: int = 4\\n    sample_n_frames: int = 16\\n\\n    csv_path: str = None\\n    video_folder: str = None\\n\\n    motion_num_attention_heads: int = 8\\n    motion_max_seq_length: int = 32\\n    num_train_timesteps: int = 1000\\n    beta_start: int = 0.00085\\n    beta_end: int = 0.012\\n    beta_schedule: str = 'linear'\\n    steps_offset: int = 1\\n    clip_sample: bool = False\\n\\n    use_wandb: bool = False\\n    # compat\\n    lora_dropout_p: Optional[float] = None\\n\\n    def __post_init__(self) -> None:\\n        handle_compatibility(self)\\n\\n        current_dir = os.path.dirname(__file__)\\n        if self.validation_prompts_path is None:\\n            self.validation_prompts_path = os.path.join(current_dir, 'configs/animatediff', 'validation.txt')\\n        if self.learning_rate is None:\\n            self.learning_rate = 1e-4\\n        if self.save_steps is None:\\n            self.save_steps = self.eval_steps\\n\\n        if is_dist():\\n            rank, local_rank, _, _ = get_dist_setting()\\n            torch.cuda.set_device(local_rank)\\n            self.seed += rank  # Avoid the same dropout\\n            # Initialize in advance\\n            if not dist.is_initialized():\\n                dist.init_process_group(backend=self.ddp_backend)\\n            # Make sure to set the same output_dir when using DDP.\\n            self.output_dir = broadcast_string(self.output_dir)\\n\\n\\n@dataclass\\nclass AnimateDiffInferArguments:\\n\\n    motion_adapter_id_or_path: Optional[str] = None\\n    motion_adapter_revision: Optional[str] = None\\n\\n    model_id_or_path: str = None\\n    model_revision: str = None\\n\\n    sft_type: str = field(default='lora', metadata={'choices': ['lora', 'full']})\\n\\n    ckpt_dir: Optional[str] = field(default=None, metadata={'help': '/path/to/your/vx-xxx/checkpoint-xxx'})\\n    eval_human: bool = False  # False: eval val_dataset\\n\\n    seed: int = 42\\n\\n    # other\\n    ignore_args_error: bool = False  # True: notebook compatibility\\n\\n    validation_prompts_path: str = None\\n\\n    output_path: str = './generated'\\n\\n    enable_xformers_memory_efficient_attention: bool = True\\n\\n    num_inference_steps: int = 25\\n    guidance_scale: float = 7.5\\n    sample_size: int = 256\\n    sample_stride: int = 4\\n    sample_n_frames: int = 16\\n\\n    motion_num_attention_heads: int = 8\\n    motion_max_seq_length: int = 32\\n    num_train_timesteps: int = 1000\\n    beta_start: int = 0.00085\\n    beta_end: int = 0.012\\n    beta_schedule: str = 'linear'\\n    steps_offset: int = 1\\n    clip_sample: bool = False\\n\\n    merge_lora: bool = False\\n    replace_if_exists: bool = False\\n\\n    # compatibility. (Deprecated)\\n    merge_lora_and_save: Optional[bool] = None\\n\\n    def __post_init__(self) -> None:\\n        handle_compatibility(self)\\n\\n\\ndef handle_compatibility(args: Union[AnimateDiffArguments, AnimateDiffInferArguments]) -> None:\\n    if isinstance(args, AnimateDiffInferArguments):\\n        if args.merge_lora_and_save is not None:\\n            args.merge_lora = args.merge_lora_and_save\\n    if isinstance(args, AnimateDiffArguments):\\n        if args.lora_dropout_p is not None:\\n            args.lora_dropout = args.lora_dropout_p\\n\\n\\nfrom .argument import AnimateDiffArguments, AnimateDiffInferArguments\\n\\n\\nmasterpiece, bestquality, highlydetailed, ultradetailed, Snow rocky mountains peaks canyon. Snow blanketed rocky mountains surround and shadow deep canyons\\nmasterpiece, bestquality, highlydetailed, ultradetailed, A drone view of celebration with Christma tree and fireworks, starry sky - background\\nmasterpiece, bestquality, highlydetailed, ultradetailed, Robot dancing in times square\\nmasterpiece, bestquality, highlydetailed, ultradetailed, Pacific coast, carmel by the sea ocean and waves\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n\\nimport argparse\\nimport gc\\nimport itertools\\nimport logging\\nimport math\\nimport os\\nimport shutil\\nimport warnings\\nfrom pathlib import Path\\n\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import DistributedDataParallelKwargs, ProjectConfiguration, set_seed\\nfrom diffusers import (AutoencoderKL, DDPMScheduler, DPMSolverMultistepScheduler, StableDiffusionXLPipeline,\\n                       UNet2DConditionModel)\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.training_utils import compute_snr\\nfrom diffusers.utils import check_min_version, is_wandb_available\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom huggingface_hub.utils import insecure_hashlib\\nfrom modelscope import AutoTokenizer\\nfrom packaging import version\\nfrom PIL import Image\\nfrom PIL.ImageOps import exif_transpose\\nfrom torch.utils.data import Dataset\\nfrom torchvision import transforms\\nfrom tqdm.auto import tqdm\\nfrom transformers import PretrainedConfig\\n\\nfrom swift import LoRAConfig, Swift, push_to_hub, snapshot_download\\n\\nlogger = get_logger(__name__)\\n\\n\\ndef save_model_card(\\n    repo_id: str,\\n    images=None,\\n    base_model=str,\\n    train_text_encoder=False,\\n    instance_prompt=str,\\n    validation_prompt=str,\\n    repo_folder=None,\\n    vae_path=None,\\n):\\n    img_str = 'widget:\\\\n' if images else ''\\n    for i, image in enumerate(images):\\n        image.save(os.path.join(repo_folder, f'image_{i}.png'))\\n        img_str += f\\\"\\\"\\\"\\n        - text: '{validation_prompt if validation_prompt else ' '}'\\n          output:\\n            url:\\n                \\\"image_{i}.png\\\"\\n        \\\"\\\"\\\"\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\ntags:\\n- stable-diffusion-xl\\n- stable-diffusion-xl-diffusers\\n- text-to-image\\n- diffusers\\n- lora\\n- template:sd-lora\\n{img_str}\\nbase_model: {base_model}\\ninstance_prompt: {instance_prompt}\\nlicense: openrail++\\n---\\n    \\\"\\\"\\\"\\n\\n    model_card = f\\\"\\\"\\\"\\n# SDXL LoRA DreamBooth - {repo_id}\\n\\n<Gallery />\\n\\n## Model description\\n\\nThese are {repo_id} LoRA adaption weights for {base_model}.\\n\\nThe weights were trained  using [DreamBooth](https://dreambooth.github.io/).\\n\\nLoRA for the text encoder was enabled: {train_text_encoder}.\\n\\nSpecial VAE used for training: {vae_path}.\\n\\n## Trigger words\\n\\nYou should use {instance_prompt} to trigger the image generation.\\n\\n## Download model\\n\\nWeights for this model are available in Safetensors format.\\n\\n[Download]({repo_id}/tree/main) them in the Files & versions tab.\\n\\n\\\"\\\"\\\"\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str,\\n                                               revision: str,\\n                                               subfolder: str = 'text_encoder'):\\n    text_encoder_config = PretrainedConfig.from_pretrained(\\n        pretrained_model_name_or_path, subfolder=subfolder, revision=revision)\\n    model_class = text_encoder_config.architectures[0]\\n\\n    if model_class == 'CLIPTextModel':\\n        from transformers import CLIPTextModel\\n\\n        return CLIPTextModel\\n    elif model_class == 'CLIPTextModelWithProjection':\\n        from transformers import CLIPTextModelWithProjection\\n\\n        return CLIPTextModelWithProjection\\n    else:\\n        raise ValueError(f'{model_class} is not supported.')\\n\\n\\ndef parse_args(input_args=None):\\n    parser = argparse.ArgumentParser(description='Simple example of a dreambooth inference.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--pretrained_vae_model_name_or_path',\\n        type=str,\\n        default=None,\\n        help='Path to pretrained VAE model with better numerical stability. '\\n        'More details: https://github.com/huggingface/diffusers/pull/4038.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--dataset_name',\\n        type=str,\\n        default=None,\\n        help=('The name of the Dataset (from the HuggingFace hub) containing the training data of '\\n              'instance images (could be your own, possibly private,'\\n              ' dataset). It can also be a path pointing to a local copy of a dataset in your filesystem,'\\n              ' or to a folder containing files that 🤗 Datasets can understand.'),\\n    )\\n    parser.add_argument(\\n        '--dataset_config_name',\\n        type=str,\\n        default=None,\\n        help=\\\"The config of the Dataset, leave as None if there's only one config.\\\",\\n    )\\n    parser.add_argument(\\n        '--instance_data_dir',\\n        type=str,\\n        default=None,\\n        help=('A folder containing the training data. '),\\n    )\\n\\n    parser.add_argument(\\n        '--cache_dir',\\n        type=str,\\n        default=None,\\n        help='The directory where the downloaded models and datasets will be stored.',\\n    )\\n\\n    parser.add_argument(\\n        '--image_column',\\n        type=str,\\n        default='image',\\n        help='The column of the dataset containing the target image. By '\\n        \\\"default, the standard Image Dataset maps out 'file_name' \\\"\\n        \\\"to 'image'.\\\",\\n    )\\n    parser.add_argument(\\n        '--caption_column',\\n        type=str,\\n        default=None,\\n        help='The column of the dataset containing the instance prompt for each image',\\n    )\\n\\n    parser.add_argument('--repeats', type=int, default=1, help='How many times to repeat the training data.')\\n\\n    parser.add_argument(\\n        '--class_data_dir',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='A folder containing the training data of class images.',\\n    )\\n    parser.add_argument(\\n        '--instance_prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help=\\\"The prompt with identifier specifying the instance, e.g. 'photo of a TOK dog', 'in the style of TOK'\\\",\\n    )\\n    parser.add_argument(\\n        '--class_prompt',\\n        type=str,\\n        default=None,\\n        help='The prompt to specify images in the same class as provided instance images.',\\n    )\\n    parser.add_argument(\\n        '--validation_prompt',\\n        type=str,\\n        default=None,\\n        help='A prompt that is used during validation to verify that the model is learning.',\\n    )\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images that should be generated during validation with `validation_prompt`.',\\n    )\\n    parser.add_argument(\\n        '--validation_epochs',\\n        type=int,\\n        default=50,\\n        help=('Run dreambooth validation every X epochs. Dreambooth validation consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`.'),\\n    )\\n    parser.add_argument(\\n        '--with_prior_preservation',\\n        default=False,\\n        action='store_true',\\n        help='Flag to add prior preservation loss.',\\n    )\\n    parser.add_argument('--prior_loss_weight', type=float, default=1.0, help='The weight of prior preservation loss.')\\n    parser.add_argument(\\n        '--num_class_images',\\n        type=int,\\n        default=100,\\n        help=('Minimal class images for prior preservation loss. If there are not enough images already present in'\\n              ' class_data_dir, additional images will be sampled with class_prompt.'),\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='lora-dreambooth-model',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=1024,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--crops_coords_top_left_h',\\n        type=int,\\n        default=0,\\n        help=('Coordinate for (the height) to be included in the crop coordinate embeddings needed by SDXL UNet.'),\\n    )\\n    parser.add_argument(\\n        '--crops_coords_top_left_w',\\n        type=int,\\n        default=0,\\n        help=('Coordinate for (the height) to be included in the crop coordinate embeddings needed by SDXL UNet.'),\\n    )\\n    parser.add_argument(\\n        '--center_crop',\\n        default=False,\\n        action='store_true',\\n        help=('Whether to center crop the input images to the resolution. If not set, the images will be randomly'\\n              ' cropped. The images will be resized to the resolution first before cropping.'),\\n    )\\n    parser.add_argument(\\n        '--train_text_encoder',\\n        action='store_true',\\n        help='Whether to train the text encoder. If set, the text encoder should be float32 precision.',\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=4, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--sample_batch_size', type=int, default=4, help='Batch size (per device) for sampling images.')\\n    parser.add_argument('--num_train_epochs', type=int, default=1)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=('Save a checkpoint of the training state every X updates. These checkpoints can be used both as final'\\n              ' checkpoints in case they are better than the last checkpoint, and are also suitable for resuming'\\n              ' training using `--resume_from_checkpoint`.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=1e-4,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n\\n    parser.add_argument(\\n        '--text_encoder_lr',\\n        type=float,\\n        default=5e-6,\\n        help='Text encoder learning rate to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n\\n    parser.add_argument(\\n        '--snr_gamma',\\n        type=float,\\n        default=None,\\n        help='SNR weighting gamma to be used if rebalancing the loss. Recommended value is 5.0. '\\n        'More details here: https://arxiv.org/abs/2303.09556.',\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--lr_num_cycles',\\n        type=int,\\n        default=1,\\n        help='Number of hard resets of the lr in cosine_with_restarts scheduler.',\\n    )\\n    parser.add_argument('--lr_power', type=float, default=1.0, help='Power factor of the polynomial scheduler.')\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n\\n    parser.add_argument(\\n        '--optimizer',\\n        type=str,\\n        default='AdamW',\\n        help=('The optimizer type to use. Choose between [\\\"AdamW\\\", \\\"prodigy\\\"]'),\\n    )\\n\\n    parser.add_argument(\\n        '--use_8bit_adam',\\n        action='store_true',\\n        help='Whether or not to use 8-bit Adam from bitsandbytes. Ignored if optimizer is not set to AdamW',\\n    )\\n\\n    parser.add_argument(\\n        '--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam and Prodigy optimizers.')\\n    parser.add_argument(\\n        '--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam and Prodigy optimizers.')\\n    parser.add_argument(\\n        '--prodigy_beta3',\\n        type=float,\\n        default=None,\\n        help='coefficients for computing the Prodidy stepsize using running averages. If set to None, '\\n        'uses the value of square root of beta2. Ignored if optimizer is adamW',\\n    )\\n    parser.add_argument('--prodigy_decouple', type=bool, default=True, help='Use AdamW style decoupled weight decay')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-04, help='Weight decay to use for unet params')\\n    parser.add_argument(\\n        '--adam_weight_decay_text_encoder', type=float, default=1e-03, help='Weight decay to use for text_encoder')\\n\\n    parser.add_argument(\\n        '--adam_epsilon',\\n        type=float,\\n        default=1e-08,\\n        help='Epsilon value for the Adam optimizer and Prodigy optimizers.',\\n    )\\n\\n    parser.add_argument(\\n        '--prodigy_use_bias_correction',\\n        type=bool,\\n        default=True,\\n        help=\\\"Turn on Adam's bias correction. True by default. Ignored if optimizer is adamW\\\",\\n    )\\n    parser.add_argument(\\n        '--prodigy_safeguard_warmup',\\n        type=bool,\\n        default=True,\\n        help='Remove lr from the denominator of D estimate to avoid issues during warm-up stage. True by default. '\\n        'Ignored if optimizer is adamW',\\n    )\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument(\\n        '--prior_generation_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp32', 'fp16', 'bf16'],\\n        help=('Choose prior generation precision between fp32, fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to  fp16 if a GPU is available else fp32.'),\\n    )\\n    parser.add_argument('--local_rank', type=int, default=-1, help='For distributed training: local_rank')\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument(\\n        '--rank',\\n        type=int,\\n        default=4,\\n        help=('The dimension of the LoRA update matrices.'),\\n    )\\n\\n    if input_args is not None:\\n        args = parser.parse_args(input_args)\\n    else:\\n        args = parser.parse_args()\\n\\n    if args.dataset_name is None and args.instance_data_dir is None:\\n        raise ValueError('Specify either `--dataset_name` or `--instance_data_dir`')\\n\\n    if args.dataset_name is not None and args.instance_data_dir is not None:\\n        raise ValueError('Specify only one of `--dataset_name` or `--instance_data_dir`')\\n\\n    env_local_rank = int(os.environ.get('LOCAL_RANK', -1))\\n    if env_local_rank != -1 and env_local_rank != args.local_rank:\\n        args.local_rank = env_local_rank\\n\\n    if args.with_prior_preservation:\\n        if args.class_data_dir is None:\\n            raise ValueError('You must specify a data directory for class images.')\\n        if args.class_prompt is None:\\n            raise ValueError('You must specify prompt for class images.')\\n    else:\\n        # logger is not available yet\\n        if args.class_data_dir is not None:\\n            warnings.warn('You need not use --class_data_dir without --with_prior_preservation.')\\n        if args.class_prompt is not None:\\n            warnings.warn('You need not use --class_prompt without --with_prior_preservation.')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    args.vae_base_model_id = args.pretrained_vae_model_name_or_path\\n    if args.pretrained_vae_model_name_or_path and not os.path.exists(args.pretrained_vae_model_name_or_path):\\n        args.pretrained_vae_model_name_or_path = snapshot_download(args.pretrained_vae_model_name_or_path)\\n\\n    return args\\n\\n\\nclass DreamBoothDataset(Dataset):\\n    \\\"\\\"\\\"\\n    A dataset to prepare the instance and class images with the prompts for fine-tuning the model.\\n    It pre-processes the images.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        args,\\n        instance_data_root,\\n        instance_prompt,\\n        class_prompt,\\n        class_data_root=None,\\n        class_num=None,\\n        size=1024,\\n        repeats=1,\\n        center_crop=False,\\n    ):\\n        self.size = size\\n        self.center_crop = center_crop\\n\\n        self.instance_prompt = instance_prompt\\n        self.custom_instance_prompts = None\\n        self.class_prompt = class_prompt\\n\\n        # if --dataset_name is provided or a metadata jsonl file is provided in the local --instance_data directory,\\n        # we load the training data using load_dataset\\n        if args.dataset_name is not None:\\n            try:\\n                from datasets import load_dataset\\n            except ImportError:\\n                raise ImportError(\\n                    'You are trying to load your data using the datasets library. If you wish to train using custom '\\n                    'captions please install the datasets library: `pip install datasets`. If you wish to load a '\\n                    'local folder containing images only, specify --instance_data_dir instead.')\\n            # Downloading and loading a dataset from the hub.\\n            # See more about loading custom images at\\n            # https://huggingface.co/docs/datasets/v2.0.0/en/dataset_script\\n            dataset = load_dataset(\\n                args.dataset_name,\\n                args.dataset_config_name,\\n                cache_dir=args.cache_dir,\\n            )\\n            # Preprocessing the datasets.\\n            column_names = dataset['train'].column_names\\n\\n            # 6. Get the column names for input/target.\\n            if args.image_column is None:\\n                image_column = column_names[0]\\n                logger.info(f'image column defaulting to {image_column}')\\n            else:\\n                image_column = args.image_column\\n                if image_column not in column_names:\\n                    raise ValueError(f\\\"`--image_column` value '{args.image_column}' not found in dataset columns. \\\"\\n                                     f\\\"Dataset columns are: {', '.join(column_names)}\\\")\\n            instance_images = dataset['train'][image_column]\\n\\n            if args.caption_column is None:\\n                logger.info('No caption column provided, defaulting to instance_prompt for all images. If your dataset '\\n                            'contains captions/prompts for the images, make sure to specify the '\\n                            'column as --caption_column')\\n                self.custom_instance_prompts = None\\n            else:\\n                if args.caption_column not in column_names:\\n                    raise ValueError(f\\\"`--caption_column` value '{args.caption_column}' not found in dataset columns. \\\"\\n                                     f\\\"Dataset columns are: {', '.join(column_names)}\\\")\\n                custom_instance_prompts = dataset['train'][args.caption_column]\\n                # create final list of captions according to --repeats\\n                self.custom_instance_prompts = []\\n                for caption in custom_instance_prompts:\\n                    self.custom_instance_prompts.extend(itertools.repeat(caption, repeats))\\n        else:\\n            self.instance_data_root = Path(instance_data_root)\\n            if not self.instance_data_root.exists():\\n                raise ValueError(\\\"Instance images root doesn't exists.\\\")\\n\\n            instance_images = [Image.open(path) for path in list(Path(instance_data_root).iterdir())]\\n            self.custom_instance_prompts = None\\n\\n        self.instance_images = []\\n        for img in instance_images:\\n            self.instance_images.extend(itertools.repeat(img, repeats))\\n        self.num_instance_images = len(self.instance_images)\\n        self._length = self.num_instance_images\\n\\n        if class_data_root is not None:\\n            self.class_data_root = Path(class_data_root)\\n            self.class_data_root.mkdir(parents=True, exist_ok=True)\\n            self.class_images_path = list(self.class_data_root.iterdir())\\n            if class_num is not None:\\n                self.num_class_images = min(len(self.class_images_path), class_num)\\n            else:\\n                self.num_class_images = len(self.class_images_path)\\n            self._length = max(self.num_class_images, self.num_instance_images)\\n        else:\\n            self.class_data_root = None\\n\\n        self.image_transforms = transforms.Compose([\\n            transforms.Resize(size, interpolation=transforms.InterpolationMode.BILINEAR),\\n            transforms.CenterCrop(size) if center_crop else transforms.RandomCrop(size),\\n            transforms.ToTensor(),\\n            transforms.Normalize([0.5], [0.5]),\\n        ])\\n\\n    def __len__(self):\\n        return self._length\\n\\n    def __getitem__(self, index):\\n        example = {}\\n        instance_image = self.instance_images[index % self.num_instance_images]\\n        instance_image = exif_transpose(instance_image)\\n\\n        if not instance_image.mode == 'RGB':\\n            instance_image = instance_image.convert('RGB')\\n        example['instance_images'] = self.image_transforms(instance_image)\\n\\n        if self.custom_instance_prompts:\\n            caption = self.custom_instance_prompts[index % self.num_instance_images]\\n            if caption:\\n                example['instance_prompt'] = caption\\n            else:\\n                example['instance_prompt'] = self.instance_prompt\\n\\n        else:  # costum prompts were provided, but length does not match size of image dataset\\n            example['instance_prompt'] = self.instance_prompt\\n\\n        if self.class_data_root:\\n            class_image = Image.open(self.class_images_path[index % self.num_class_images])\\n            class_image = exif_transpose(class_image)\\n\\n            if not class_image.mode == 'RGB':\\n                class_image = class_image.convert('RGB')\\n            example['class_images'] = self.image_transforms(class_image)\\n            example['class_prompt'] = self.class_prompt\\n\\n        return example\\n\\n\\ndef collate_fn(examples, with_prior_preservation=False):\\n    pixel_values = [example['instance_images'] for example in examples]\\n    prompts = [example['instance_prompt'] for example in examples]\\n\\n    # Concat class and instance examples for prior preservation.\\n    # We do this to avoid doing two forward passes.\\n    if with_prior_preservation:\\n        pixel_values += [example['class_images'] for example in examples]\\n        prompts += [example['class_prompt'] for example in examples]\\n\\n    pixel_values = torch.stack(pixel_values)\\n    pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n\\n    batch = {'pixel_values': pixel_values, 'prompts': prompts}\\n    return batch\\n\\n\\nclass PromptDataset(Dataset):\\n    'A simple dataset to prepare the prompts to generate class images on multiple GPUs.'\\n\\n    def __init__(self, prompt, num_samples):\\n        self.prompt = prompt\\n        self.num_samples = num_samples\\n\\n    def __len__(self):\\n        return self.num_samples\\n\\n    def __getitem__(self, index):\\n        example = {}\\n        example['prompt'] = self.prompt\\n        example['index'] = index\\n        return example\\n\\n\\ndef tokenize_prompt(tokenizer, prompt):\\n    text_inputs = tokenizer(\\n        prompt,\\n        padding='max_length',\\n        max_length=tokenizer.model_max_length,\\n        truncation=True,\\n        return_tensors='pt',\\n    )\\n    text_input_ids = text_inputs.input_ids\\n    return text_input_ids\\n\\n\\n# Adapted from pipelines.StableDiffusionXLPipeline.encode_prompt\\ndef encode_prompt(text_encoders, tokenizers, prompt, text_input_ids_list=None):\\n    prompt_embeds_list = []\\n\\n    for i, text_encoder in enumerate(text_encoders):\\n        if tokenizers is not None:\\n            tokenizer = tokenizers[i]\\n            text_input_ids = tokenize_prompt(tokenizer, prompt)\\n        else:\\n            assert text_input_ids_list is not None\\n            text_input_ids = text_input_ids_list[i]\\n\\n        prompt_embeds = text_encoder(\\n            text_input_ids.to(text_encoder.device),\\n            output_hidden_states=True,\\n        )\\n\\n        # We are only ALWAYS interested in the pooled output of the final text encoder\\n        pooled_prompt_embeds = prompt_embeds[0]\\n        prompt_embeds = prompt_embeds.hidden_states[-2]\\n        bs_embed, seq_len, _ = prompt_embeds.shape\\n        prompt_embeds = prompt_embeds.view(bs_embed, seq_len, -1)\\n        prompt_embeds_list.append(prompt_embeds)\\n\\n    prompt_embeds = torch.concat(prompt_embeds_list, dim=-1)\\n    pooled_prompt_embeds = pooled_prompt_embeds.view(bs_embed, -1)\\n    return prompt_embeds, pooled_prompt_embeds\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n    kwargs = DistributedDataParallelKwargs(find_unused_parameters=True)\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n        kwargs_handlers=[kwargs],\\n    )\\n\\n    if args.report_to == 'wandb':\\n        if not is_wandb_available():\\n            raise ImportError('Make sure to install wandb if you want to use it for logging during training.')\\n        import wandb\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Generate class images if prior preservation is enabled.\\n    if args.with_prior_preservation:\\n        class_images_dir = Path(args.class_data_dir)\\n        if not class_images_dir.exists():\\n            class_images_dir.mkdir(parents=True)\\n        cur_class_images = len(list(class_images_dir.iterdir()))\\n\\n        if cur_class_images < args.num_class_images:\\n            torch_dtype = torch.float16 if accelerator.device.type == 'cuda' else torch.float32\\n            if args.prior_generation_precision == 'fp32':\\n                torch_dtype = torch.float32\\n            elif args.prior_generation_precision == 'fp16':\\n                torch_dtype = torch.float16\\n            elif args.prior_generation_precision == 'bf16':\\n                torch_dtype = torch.bfloat16\\n            pipeline = StableDiffusionXLPipeline.from_pretrained(\\n                args.pretrained_model_name_or_path,\\n                torch_dtype=torch_dtype,\\n                revision=args.revision,\\n                variant=args.variant,\\n            )\\n            pipeline.set_progress_bar_config(disable=True)\\n\\n            num_new_images = args.num_class_images - cur_class_images\\n            logger.info(f'Number of class images to sample: {num_new_images}.')\\n\\n            sample_dataset = PromptDataset(args.class_prompt, num_new_images)\\n            sample_dataloader = torch.utils.data.DataLoader(sample_dataset, batch_size=args.sample_batch_size)\\n\\n            sample_dataloader = accelerator.prepare(sample_dataloader)\\n            pipeline.to(accelerator.device)\\n\\n            for example in tqdm(\\n                    sample_dataloader, desc='Generating class images', disable=not accelerator.is_local_main_process):\\n                images = pipeline(example['prompt']).images\\n\\n                for i, image in enumerate(images):\\n                    hash_image = insecure_hashlib.sha1(image.tobytes()).hexdigest()\\n                    image_filename = class_images_dir / f\\\"{example['index'][i] + cur_class_images}-{hash_image}.jpg\\\"\\n                    image.save(image_filename)\\n\\n            del pipeline\\n            if torch.cuda.is_available():\\n                torch.cuda.empty_cache()\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load the tokenizers\\n    tokenizer_one = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n    tokenizer_two = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer_2',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n\\n    # import correct text encoder classes\\n    text_encoder_cls_one = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)\\n    text_encoder_cls_two = import_model_class_from_model_name_or_path(\\n        args.pretrained_model_name_or_path, args.revision, subfolder='text_encoder_2')\\n\\n    # Load scheduler and models\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    text_encoder_one = text_encoder_cls_one.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n    text_encoder_two = text_encoder_cls_two.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder_2', revision=args.revision, variant=args.variant)\\n    vae_path = (\\n        args.pretrained_model_name_or_path\\n        if args.pretrained_vae_model_name_or_path is None else args.pretrained_vae_model_name_or_path)\\n    vae = AutoencoderKL.from_pretrained(\\n        vae_path,\\n        subfolder='vae' if args.pretrained_vae_model_name_or_path is None else None,\\n        revision=args.revision,\\n        variant=args.variant,\\n    )\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n\\n    # We only train the additional adapter LoRA layers\\n    vae.requires_grad_(False)\\n    text_encoder_one.requires_grad_(False)\\n    text_encoder_two.requires_grad_(False)\\n    unet.requires_grad_(False)\\n\\n    # For mixed precision training we cast all non-trainable weights\\n    # (vae, non-lora text_encoder and non-lora unet) to half-precision\\n    # as these weights are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Move unet, vae and text_encoder to device and cast to weight_dtype\\n    unet.to(accelerator.device, dtype=weight_dtype)\\n\\n    # The VAE is always in float32 to avoid NaN losses.\\n    vae.to(accelerator.device, dtype=torch.float32)\\n\\n    text_encoder_one.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder_two.to(accelerator.device, dtype=weight_dtype)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn('xFormers 0.0.16 cannot be used for training in some GPUs. '\\n                            'If you observe problems during training, '\\n                            'please update xFormers to at least 0.0.17. See '\\n                            'https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    if args.gradient_checkpointing:\\n        unet.enable_gradient_checkpointing()\\n        if args.train_text_encoder:\\n            text_encoder_one.gradient_checkpointing_enable()\\n            text_encoder_two.gradient_checkpointing_enable()\\n\\n    # now we will add new LoRA weights to the attention layers\\n    unet_lora_config = LoRAConfig(\\n        r=args.rank, init_lora_weights='gaussian', target_modules=['to_k', 'to_q', 'to_v', 'to_out.0'])\\n    unet = Swift.prepare_model(unet, unet_lora_config)\\n    if args.mixed_precision == 'fp16':\\n        for param in unet.parameters():\\n            # only upcast trainable parameters (LoRA) into fp32\\n            if param.requires_grad:\\n                param.data = param.to(torch.float32)\\n\\n    # The text encoder comes from 🤗 transformers, so we cannot directly modify it.\\n    # So, instead, we monkey-patch the forward calls of its attention-blocks.\\n    if args.train_text_encoder:\\n        text_lora_config = LoRAConfig(\\n            r=args.rank, init_lora_weights='gaussian', target_modules=['q_proj', 'k_proj', 'v_proj', 'out_proj'])\\n        text_encoder_one = Swift.prepare_model(text_encoder_one, text_lora_config)\\n        text_encoder_two = Swift.prepare_model(text_encoder_two, text_lora_config)\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    unet_lora_parameters = list(filter(lambda p: p.requires_grad, unet.parameters()))\\n\\n    if args.train_text_encoder:\\n        text_lora_parameters_one = list(filter(lambda p: p.requires_grad, text_encoder_one.parameters()))\\n        text_lora_parameters_two = list(filter(lambda p: p.requires_grad, text_encoder_two.parameters()))\\n\\n    # Optimization parameters\\n    unet_lora_parameters_with_lr = {'params': unet_lora_parameters, 'lr': args.learning_rate}\\n    if args.train_text_encoder:\\n        # different learning rate for text encoder and unet\\n        text_lora_parameters_one_with_lr = {\\n            'params': text_lora_parameters_one,\\n            'weight_decay': args.adam_weight_decay_text_encoder,\\n            'lr': args.text_encoder_lr if args.text_encoder_lr else args.learning_rate,\\n        }\\n        text_lora_parameters_two_with_lr = {\\n            'params': text_lora_parameters_two,\\n            'weight_decay': args.adam_weight_decay_text_encoder,\\n            'lr': args.text_encoder_lr if args.text_encoder_lr else args.learning_rate,\\n        }\\n        params_to_optimize = [\\n            unet_lora_parameters_with_lr,\\n            text_lora_parameters_one_with_lr,\\n            text_lora_parameters_two_with_lr,\\n        ]\\n    else:\\n        params_to_optimize = [unet_lora_parameters_with_lr]\\n\\n    # Optimizer creation\\n    if not (args.optimizer.lower() == 'prodigy' or args.optimizer.lower() == 'adamw'):\\n        logger.warn(f'Unsupported choice of optimizer: {args.optimizer}.Supported optimizers include [adamW, prodigy].'\\n                    'Defaulting to adamW')\\n        args.optimizer = 'adamw'\\n\\n    if args.use_8bit_adam and not args.optimizer.lower() == 'adamw':\\n        logger.warn(f\\\"use_8bit_adam is ignored when optimizer is not set to 'AdamW'. Optimizer was \\\"\\n                    f'set to {args.optimizer.lower()}')\\n\\n    if args.optimizer.lower() == 'adamw':\\n        if args.use_8bit_adam:\\n            try:\\n                import bitsandbytes as bnb\\n            except ImportError:\\n                raise ImportError(\\n                    'To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`.')\\n\\n            optimizer_class = bnb.optim.AdamW8bit\\n        else:\\n            optimizer_class = torch.optim.AdamW\\n\\n        optimizer = optimizer_class(\\n            params_to_optimize,\\n            betas=(args.adam_beta1, args.adam_beta2),\\n            weight_decay=args.adam_weight_decay,\\n            eps=args.adam_epsilon,\\n        )\\n\\n    if args.optimizer.lower() == 'prodigy':\\n        try:\\n            import prodigyopt\\n        except ImportError:\\n            raise ImportError('To use Prodigy, please install the prodigyopt library: `pip install prodigyopt`')\\n\\n        optimizer_class = prodigyopt.Prodigy\\n\\n        optimizer = optimizer_class(\\n            params_to_optimize,\\n            lr=args.learning_rate,\\n            betas=(args.adam_beta1, args.adam_beta2),\\n            weight_decay=args.adam_weight_decay,\\n            eps=args.adam_epsilon,\\n            decouple=args.prodigy_decouple,\\n            use_bias_correction=args.prodigy_use_bias_correction,\\n            safeguard_warmup=args.prodigy_safeguard_warmup,\\n        )\\n\\n    # Dataset and DataLoaders creation:\\n    train_dataset = DreamBoothDataset(\\n        args=args,\\n        instance_data_root=args.instance_data_dir,\\n        instance_prompt=args.instance_prompt,\\n        class_prompt=args.class_prompt,\\n        class_data_root=args.class_data_dir if args.with_prior_preservation else None,\\n        class_num=args.num_class_images,\\n        size=args.resolution,\\n        repeats=args.repeats,\\n        center_crop=args.center_crop,\\n    )\\n\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        batch_size=args.train_batch_size,\\n        shuffle=True,\\n        collate_fn=lambda examples: collate_fn(examples, args.with_prior_preservation),\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Computes additional embeddings/ids required by the SDXL UNet.\\n    # regular text embeddings (when `train_text_encoder` is not True)\\n    # pooled text embeddings\\n    # time ids\\n\\n    def compute_time_ids():\\n        # Adapted from pipeline.StableDiffusionXLPipeline._get_add_time_ids\\n        original_size = (args.resolution, args.resolution)\\n        target_size = (args.resolution, args.resolution)\\n        crops_coords_top_left = (args.crops_coords_top_left_h, args.crops_coords_top_left_w)\\n        add_time_ids = list(original_size + crops_coords_top_left + target_size)\\n        add_time_ids = torch.tensor([add_time_ids])\\n        add_time_ids = add_time_ids.to(accelerator.device, dtype=weight_dtype)\\n        return add_time_ids\\n\\n    if not args.train_text_encoder:\\n        tokenizers = [tokenizer_one, tokenizer_two]\\n        text_encoders = [text_encoder_one, text_encoder_two]\\n\\n        def compute_text_embeddings(prompt, text_encoders, tokenizers):\\n            with torch.no_grad():\\n                prompt_embeds, pooled_prompt_embeds = encode_prompt(text_encoders, tokenizers, prompt)\\n                prompt_embeds = prompt_embeds.to(accelerator.device)\\n                pooled_prompt_embeds = pooled_prompt_embeds.to(accelerator.device)\\n            return prompt_embeds, pooled_prompt_embeds\\n\\n    # Handle instance prompt.\\n    instance_time_ids = compute_time_ids()\\n\\n    # If no type of tuning is done on the text_encoder and custom instance prompts are NOT\\n    # provided (i.e. the --instance_prompt is used for all images), we encode the instance prompt once to avoid\\n    # the redundant encoding.\\n    if not args.train_text_encoder and not train_dataset.custom_instance_prompts:\\n        instance_prompt_hidden_states, instance_pooled_prompt_embeds = compute_text_embeddings(\\n            args.instance_prompt, text_encoders, tokenizers)\\n\\n    # Handle class prompt for prior-preservation.\\n    if args.with_prior_preservation:\\n        class_time_ids = compute_time_ids()\\n        if not args.train_text_encoder:\\n            class_prompt_hidden_states, class_pooled_prompt_embeds = compute_text_embeddings(\\n                args.class_prompt, text_encoders, tokenizers)\\n\\n    # Clear the memory here\\n    if not args.train_text_encoder and not train_dataset.custom_instance_prompts:\\n        del tokenizers, text_encoders\\n        gc.collect()\\n        torch.cuda.empty_cache()\\n\\n    # If custom instance prompts are NOT provided (i.e. the instance prompt is used for all images),\\n    # pack the statically computed variables appropriately here. This is so that we don't\\n    # have to pass them to the dataloader.\\n    add_time_ids = instance_time_ids\\n    if args.with_prior_preservation:\\n        add_time_ids = torch.cat([add_time_ids, class_time_ids], dim=0)\\n\\n    if not train_dataset.custom_instance_prompts:\\n        if not args.train_text_encoder:\\n            prompt_embeds = instance_prompt_hidden_states\\n            unet_add_text_embeds = instance_pooled_prompt_embeds\\n            if args.with_prior_preservation:\\n                prompt_embeds = torch.cat([prompt_embeds, class_prompt_hidden_states], dim=0)\\n                unet_add_text_embeds = torch.cat([unet_add_text_embeds, class_pooled_prompt_embeds], dim=0)\\n        # if we're optmizing the text encoder (both if instance prompt is used for all images or custom prompts)\\n        # we need to tokenize and encode the batch prompts on all training steps\\n        else:\\n            tokens_one = tokenize_prompt(tokenizer_one, args.instance_prompt)\\n            tokens_two = tokenize_prompt(tokenizer_two, args.instance_prompt)\\n            if args.with_prior_preservation:\\n                class_tokens_one = tokenize_prompt(tokenizer_one, args.class_prompt)\\n                class_tokens_two = tokenize_prompt(tokenizer_two, args.class_prompt)\\n                tokens_one = torch.cat([tokens_one, class_tokens_one], dim=0)\\n                tokens_two = torch.cat([tokens_two, class_tokens_two], dim=0)\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * accelerator.num_processes,\\n        num_training_steps=args.max_train_steps * accelerator.num_processes,\\n        num_cycles=args.lr_num_cycles,\\n        power=args.lr_power,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    if args.train_text_encoder:\\n        unet, text_encoder_one, text_encoder_two, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(\\n            unet, text_encoder_one, text_encoder_two, optimizer, train_dataloader, lr_scheduler)\\n    else:\\n        unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader,\\n                                                                              lr_scheduler)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        accelerator.init_trackers('dreambooth-lora-sd-xl', config=vars(args))\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num batches each epoch = {len(train_dataloader)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the mos recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        unet.train()\\n        if args.train_text_encoder:\\n            text_encoder_one.train()\\n            text_encoder_two.train()\\n\\n            # set top parameter requires_grad = True for gradient checkpointing works\\n            text_encoder_one.text_model.embeddings.requires_grad_(True)\\n            text_encoder_two.text_model.embeddings.requires_grad_(True)\\n\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(unet):\\n                pixel_values = batch['pixel_values'].to(dtype=vae.dtype)\\n                prompts = batch['prompts']\\n\\n                # encode batch prompts when custom prompts are provided for each image -\\n                if train_dataset.custom_instance_prompts:\\n                    if not args.train_text_encoder:\\n                        prompt_embeds, unet_add_text_embeds = compute_text_embeddings(\\n                            prompts, text_encoders, tokenizers)\\n                    else:\\n                        tokens_one = tokenize_prompt(tokenizer_one, prompts)\\n                        tokens_two = tokenize_prompt(tokenizer_two, prompts)\\n\\n                # Convert images to latent space\\n                model_input = vae.encode(pixel_values).latent_dist.sample()\\n                model_input = model_input * vae.config.scaling_factor\\n                if args.pretrained_vae_model_name_or_path is None:\\n                    model_input = model_input.to(weight_dtype)\\n\\n                # Sample noise that we'll add to the latents\\n                noise = torch.randn_like(model_input)\\n                bsz = model_input.shape[0]\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(\\n                    0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=model_input.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the model input according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_model_input = noise_scheduler.add_noise(model_input, noise, timesteps)\\n\\n                # Calculate the elements to repeat depending on the use of prior-preservation and custom captions.\\n                if not train_dataset.custom_instance_prompts:\\n                    elems_to_repeat_text_embeds = bsz // 2 if args.with_prior_preservation else bsz\\n                    elems_to_repeat_time_ids = bsz // 2 if args.with_prior_preservation else bsz\\n                else:\\n                    elems_to_repeat_text_embeds = 1\\n                    elems_to_repeat_time_ids = bsz // 2 if args.with_prior_preservation else bsz\\n\\n                # Predict the noise residual\\n                if not args.train_text_encoder:\\n                    unet_added_conditions = {\\n                        'time_ids': add_time_ids.repeat(elems_to_repeat_time_ids, 1),\\n                        'text_embeds': unet_add_text_embeds.repeat(elems_to_repeat_text_embeds, 1),\\n                    }\\n                    prompt_embeds_input = prompt_embeds.repeat(elems_to_repeat_text_embeds, 1, 1)\\n                    model_pred = unet(\\n                        noisy_model_input,\\n                        timesteps,\\n                        prompt_embeds_input,\\n                        added_cond_kwargs=unet_added_conditions,\\n                    ).sample\\n                else:\\n                    unet_added_conditions = {'time_ids': add_time_ids.repeat(elems_to_repeat_time_ids, 1)}\\n                    prompt_embeds, pooled_prompt_embeds = encode_prompt(\\n                        text_encoders=[text_encoder_one, text_encoder_two],\\n                        tokenizers=None,\\n                        prompt=None,\\n                        text_input_ids_list=[tokens_one, tokens_two],\\n                    )\\n                    unet_added_conditions.update(\\n                        {'text_embeds': pooled_prompt_embeds.repeat(elems_to_repeat_text_embeds, 1)})\\n                    prompt_embeds_input = prompt_embeds.repeat(elems_to_repeat_text_embeds, 1, 1)\\n                    model_pred = unet(\\n                        noisy_model_input, timesteps, prompt_embeds_input,\\n                        added_cond_kwargs=unet_added_conditions).sample\\n\\n                # Get the target for loss depending on the prediction type\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(model_input, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n                if args.with_prior_preservation:\\n                    # Chunk the noise and model_pred into two parts and compute the loss on each part separately.\\n                    model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0)\\n                    target, target_prior = torch.chunk(target, 2, dim=0)\\n\\n                    # Compute prior loss\\n                    prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction='mean')\\n\\n                if args.snr_gamma is None:\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n                else:\\n                    # Compute loss-weights as per Section 3.4 of https://arxiv.org/abs/2303.09556.\\n                    # Since we predict the noise instead of x_0, the original formulation is slightly changed.\\n                    # This is discussed in Section 4.2 of the same paper.\\n                    snr = compute_snr(noise_scheduler, timesteps)\\n                    base_weight = (\\n                        torch.stack([snr, args.snr_gamma * torch.ones_like(timesteps)], dim=1).min(dim=1)[0] / snr)\\n\\n                    if noise_scheduler.config.prediction_type == 'v_prediction':\\n                        # Velocity objective needs to be floored to an SNR weight of one.\\n                        mse_loss_weights = base_weight + 1\\n                    else:\\n                        # Epsilon and sample both use the same loss weights.\\n                        mse_loss_weights = base_weight\\n\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='none')\\n                    loss = loss.mean(dim=list(range(1, len(loss.shape)))) * mse_loss_weights\\n                    loss = loss.mean()\\n\\n                if args.with_prior_preservation:\\n                    # Add the prior loss to the instance loss.\\n                    loss = loss + args.prior_loss_weight * prior_loss\\n\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    params_to_clip = (\\n                        itertools.chain(unet_lora_parameters, text_lora_parameters_one, text_lora_parameters_two)\\n                        if args.train_text_encoder else unet_lora_parameters)\\n                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad()\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n\\n                if accelerator.is_main_process:\\n                    if global_step % args.checkpointing_steps == 0:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint,\\n                            # we need to have at _most_ `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        accelerator.unwrap_model(unet).to(torch.float32).save_pretrained(\\n                            os.path.join(save_path, 'unet'))\\n\\n                        if args.train_text_encoder:\\n                            accelerator.unwrap_model(text_encoder_one).save_pretrained(\\n                                os.path.join(save_path, 'text_encoder1'))\\n                            accelerator.unwrap_model(text_encoder_two).save_pretrained(\\n                                os.path.join(save_path, 'text_encoder2'))\\n                        logger.info(f'Saved state to {save_path}')\\n\\n            logs = {'loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n            accelerator.log(logs, step=global_step)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n        if accelerator.is_main_process:\\n            if args.validation_prompt is not None and epoch % args.validation_epochs == 0:\\n                logger.info(f'Running validation... \\\\n Generating {args.num_validation_images} images with prompt:'\\n                            f' {args.validation_prompt}.')\\n                # create pipeline\\n                if not args.train_text_encoder:\\n                    text_encoder_one = text_encoder_cls_one.from_pretrained(\\n                        args.pretrained_model_name_or_path,\\n                        subfolder='text_encoder',\\n                        revision=args.revision,\\n                        variant=args.variant,\\n                    )\\n                    text_encoder_two = text_encoder_cls_two.from_pretrained(\\n                        args.pretrained_model_name_or_path,\\n                        subfolder='text_encoder_2',\\n                        revision=args.revision,\\n                        variant=args.variant,\\n                    )\\n                pipeline = StableDiffusionXLPipeline.from_pretrained(\\n                    args.pretrained_model_name_or_path,\\n                    vae=vae,\\n                    text_encoder=accelerator.unwrap_model(text_encoder_one),\\n                    text_encoder_2=accelerator.unwrap_model(text_encoder_two),\\n                    unet=accelerator.unwrap_model(unet.base_model),\\n                    revision=args.revision,\\n                    variant=args.variant,\\n                    torch_dtype=weight_dtype,\\n                )\\n\\n                # We train on the simplified learning objective.\\n                # If we were previously predicting a variance, we need the scheduler to ignore it\\n                scheduler_args = {}\\n\\n                if 'variance_type' in pipeline.scheduler.config:\\n                    variance_type = pipeline.scheduler.config.variance_type\\n\\n                    if variance_type in ['learned', 'learned_range']:\\n                        variance_type = 'fixed_small'\\n\\n                    scheduler_args['variance_type'] = variance_type\\n\\n                pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config,\\n                                                                             **scheduler_args)\\n\\n                pipeline = pipeline.to(accelerator.device)\\n                pipeline.set_progress_bar_config(disable=True)\\n\\n                # run inference\\n                generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n                pipeline_args = {'prompt': args.validation_prompt}\\n\\n                with torch.cuda.amp.autocast():\\n                    images = [\\n                        pipeline(**pipeline_args, generator=generator).images[0]\\n                        for _ in range(args.num_validation_images)\\n                    ]\\n\\n                for tracker in accelerator.trackers:\\n                    if tracker.name == 'tensorboard':\\n                        np_images = np.stack([np.asarray(img) for img in images])\\n                        tracker.writer.add_images('validation', np_images, epoch, dataformats='NHWC')\\n                    if tracker.name == 'wandb':\\n                        tracker.log({\\n                            'validation': [\\n                                wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                                for i, image in enumerate(images)\\n                            ]\\n                        })\\n\\n                del pipeline\\n                torch.cuda.empty_cache()\\n\\n    # Save the lora layers\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        unet = accelerator.unwrap_model(unet)\\n        unet = unet.to(torch.float32)\\n        unet.save_pretrained(os.path.join(args.output_dir, 'iter-last', 'unet'))\\n\\n        if args.train_text_encoder:\\n            text_encoder_one = accelerator.unwrap_model(text_encoder_one)\\n            text_encoder_one.save_pretrained(os.path.join(args.output_dir, 'iter-last', 'text_encoder1'))\\n            text_encoder_two = accelerator.unwrap_model(text_encoder_two)\\n            text_encoder_two.save_pretrained(os.path.join(args.output_dir, 'iter-last', 'text_encoder2'))\\n\\n        # Final inference\\n        # Load previous pipeline\\n        vae = AutoencoderKL.from_pretrained(\\n            vae_path,\\n            subfolder='vae' if args.pretrained_vae_model_name_or_path is None else None,\\n            revision=args.revision,\\n            variant=args.variant,\\n            torch_dtype=weight_dtype,\\n        )\\n        pipeline = StableDiffusionXLPipeline.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            vae=vae,\\n            revision=args.revision,\\n            variant=args.variant,\\n            torch_dtype=weight_dtype,\\n        )\\n\\n        # We train on the simplified learning objective.\\n        # If we were previously predicting a variance, we need the scheduler to ignore it\\n        scheduler_args = {}\\n\\n        if 'variance_type' in pipeline.scheduler.config:\\n            variance_type = pipeline.scheduler.config.variance_type\\n\\n            if variance_type in ['learned', 'learned_range']:\\n                variance_type = 'fixed_small'\\n\\n            scheduler_args['variance_type'] = variance_type\\n\\n        pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config, **scheduler_args)\\n\\n        # load attention processors\\n        pipeline.unet = Swift.from_pretrained(pipeline.unet, os.path.join(args.output_dir, 'iter-last', 'unet'))\\n        if args.train_text_encoder:\\n            pipeline.text_encoder_one = Swift.from_pretrained(\\n                pipeline.text_encoder_one, os.path.join(args.output_dir, 'iter-last', 'text_encoder1'))\\n            pipeline.text_encoder_two = Swift.from_pretrained(\\n                pipeline.text_encoder_two, os.path.join(args.output_dir, 'iter-last', 'text_encoder2'))\\n\\n        # run inference\\n        images = []\\n        if args.validation_prompt and args.num_validation_images > 0:\\n            pipeline = pipeline.to(accelerator.device)\\n            generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n            images = [\\n                pipeline(args.validation_prompt, num_inference_steps=25, generator=generator).images[0]\\n                for _ in range(args.num_validation_images)\\n            ]\\n\\n            for tracker in accelerator.trackers:\\n                if tracker.name == 'tensorboard':\\n                    np_images = np.stack([np.asarray(img) for img in images])\\n                    tracker.writer.add_images('test', np_images, epoch, dataformats='NHWC')\\n                if tracker.name == 'wandb':\\n                    tracker.log({\\n                        'test': [\\n                            wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                            for i, image in enumerate(images)\\n                        ]\\n                    })\\n\\n        if args.push_to_hub:\\n            save_model_card(\\n                args.hub_model_id,\\n                images=images,\\n                base_model=args.base_model_id,\\n                train_text_encoder=args.train_text_encoder,\\n                instance_prompt=args.instance_prompt,\\n                validation_prompt=args.validation_prompt,\\n                repo_folder=os.path.join(args.output_dir, 'iter-last'),\\n                vae_path=args.vae_base_model_id,\\n            )\\n            push_to_hub(args.hub_model_id, os.path.join(args.output_dir, 'iter-last'), args.hub_token)\\n\\n    accelerator.end_training()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import DiffusionPipeline\\nfrom modelscope import snapshot_download\\n\\nfrom swift import Swift\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a text to image inference.')\\n    parser.add_argument(\\n        '--base_model_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-xl-base-1.0',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--lora_model_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained lora model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for inference.')\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=50,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.base_model_path):\\n        base_model_path = args.base_model_path\\n    else:\\n        base_model_path = snapshot_download(args.base_model_path, revision=args.revision)\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    pipe = DiffusionPipeline.from_pretrained(base_model_path, torch_dtype=torch_dtype)\\n    if args.lora_model_path is not None:\\n        pipe.unet = Swift.from_pretrained(pipe.unet, args.lora_model_path)\\n    pipe = pipe.to('cuda')\\n    image = pipe(args.prompt, num_inference_steps=args.num_inference_steps).images[0]\\n    image.save(args.image_save_path)\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n\\nimport argparse\\nimport logging\\nimport math\\nimport os\\nimport random\\nimport shutil\\nfrom pathlib import Path\\n\\nimport accelerate\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import ProjectConfiguration, set_seed\\nfrom datasets import load_dataset\\nfrom diffusers import (AutoencoderKL, ControlNetModel, DDPMScheduler, StableDiffusionControlNetPipeline,\\n                       UNet2DConditionModel, UniPCMultistepScheduler)\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.utils import is_wandb_available\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom modelscope import AutoTokenizer, MsDataset\\nfrom packaging import version\\nfrom PIL import Image\\nfrom torchvision import transforms\\nfrom tqdm.auto import tqdm\\nfrom transformers import PretrainedConfig\\n\\nfrom swift import push_to_hub, snapshot_download\\n\\nif is_wandb_available():\\n    import wandb\\n\\nlogger = get_logger(__name__)\\n\\n\\ndef image_grid(imgs, rows, cols):\\n    assert len(imgs) == rows * cols\\n\\n    w, h = imgs[0].size\\n    grid = Image.new('RGB', size=(cols * w, rows * h))\\n\\n    for i, img in enumerate(imgs):\\n        grid.paste(img, box=(i % cols * w, i // cols * h))\\n    return grid\\n\\n\\ndef log_validation(vae, text_encoder, tokenizer, unet, controlnet, args, accelerator, weight_dtype, step):\\n    logger.info('Running validation... ')\\n\\n    controlnet = accelerator.unwrap_model(controlnet)\\n\\n    pipeline = StableDiffusionControlNetPipeline.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        vae=vae,\\n        text_encoder=text_encoder,\\n        tokenizer=tokenizer,\\n        unet=unet,\\n        controlnet=controlnet,\\n        safety_checker=None,\\n        revision=args.revision,\\n        variant=args.variant,\\n        torch_dtype=weight_dtype,\\n    )\\n    pipeline.scheduler = UniPCMultistepScheduler.from_config(pipeline.scheduler.config)\\n    pipeline = pipeline.to(accelerator.device)\\n    pipeline.set_progress_bar_config(disable=True)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        pipeline.enable_xformers_memory_efficient_attention()\\n\\n    if args.seed is None:\\n        generator = None\\n    else:\\n        generator = torch.Generator(device=accelerator.device).manual_seed(args.seed)\\n\\n    if len(args.validation_image) == len(args.validation_prompt):\\n        validation_images = args.validation_image\\n        validation_prompts = args.validation_prompt\\n    elif len(args.validation_image) == 1:\\n        validation_images = args.validation_image * len(args.validation_prompt)\\n        validation_prompts = args.validation_prompt\\n    elif len(args.validation_prompt) == 1:\\n        validation_images = args.validation_image\\n        validation_prompts = args.validation_prompt * len(args.validation_image)\\n    else:\\n        raise ValueError(\\n            'number of `args.validation_image` and `args.validation_prompt` should be checked in `parse_args`')\\n\\n    image_logs = []\\n\\n    for validation_prompt, validation_image in zip(validation_prompts, validation_images):\\n        validation_image = Image.open(validation_image).convert('RGB')\\n\\n        images = []\\n\\n        for _ in range(args.num_validation_images):\\n            with torch.autocast('cuda'):\\n                image = pipeline(\\n                    validation_prompt, validation_image, num_inference_steps=20, generator=generator).images[0]\\n\\n            images.append(image)\\n\\n        image_logs.append({\\n            'validation_image': validation_image,\\n            'images': images,\\n            'validation_prompt': validation_prompt\\n        })\\n\\n    for tracker in accelerator.trackers:\\n        if tracker.name == 'tensorboard':\\n            for log in image_logs:\\n                images = log['images']\\n                validation_prompt = log['validation_prompt']\\n                validation_image = log['validation_image']\\n\\n                formatted_images = []\\n\\n                formatted_images.append(np.asarray(validation_image))\\n\\n                for image in images:\\n                    formatted_images.append(np.asarray(image))\\n\\n                formatted_images = np.stack(formatted_images)\\n\\n                tracker.writer.add_images(validation_prompt, formatted_images, step, dataformats='NHWC')\\n        elif tracker.name == 'wandb':\\n            formatted_images = []\\n\\n            for log in image_logs:\\n                images = log['images']\\n                validation_prompt = log['validation_prompt']\\n                validation_image = log['validation_image']\\n\\n                formatted_images.append(wandb.Image(validation_image, caption='Controlnet conditioning'))\\n\\n                for image in images:\\n                    image = wandb.Image(image, caption=validation_prompt)\\n                    formatted_images.append(image)\\n\\n            tracker.log({'validation': formatted_images})\\n        else:\\n            logger.warn(f'image logging not implemented for {tracker.name}')\\n\\n        return image_logs\\n\\n\\ndef import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str, revision: str):\\n    text_encoder_config = PretrainedConfig.from_pretrained(\\n        pretrained_model_name_or_path,\\n        subfolder='text_encoder',\\n        revision=revision,\\n    )\\n    model_class = text_encoder_config.architectures[0]\\n\\n    if model_class == 'CLIPTextModel':\\n        from transformers import CLIPTextModel\\n\\n        return CLIPTextModel\\n    elif model_class == 'RobertaSeriesModelWithTransformation':\\n        from diffusers.pipelines.alt_diffusion.modeling_roberta_series import RobertaSeriesModelWithTransformation\\n\\n        return RobertaSeriesModelWithTransformation\\n    else:\\n        raise ValueError(f'{model_class} is not supported.')\\n\\n\\ndef save_model_card(repo_id: str, image_logs=None, base_model=str, repo_folder=None):\\n    img_str = ''\\n    if image_logs is not None:\\n        img_str = 'You can find some example images below.\\\\n'\\n        for i, log in enumerate(image_logs):\\n            images = log['images']\\n            validation_prompt = log['validation_prompt']\\n            validation_image = log['validation_image']\\n            validation_image.save(os.path.join(repo_folder, 'image_control.png'))\\n            img_str += f'prompt: {validation_prompt}\\\\n'\\n            images = [validation_image] + images\\n            image_grid(images, 1, len(images)).save(os.path.join(repo_folder, f'images_{i}.png'))\\n            img_str += f'![images_{i})](./images_{i}.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: creativeml-openrail-m\\nbase_model: {base_model}\\ntags:\\n- stable-diffusion\\n- stable-diffusion-diffusers\\n- text-to-image\\n- diffusers\\n- controlnet\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# controlnet-{repo_id}\\n\\nThese are controlnet weights trained on {base_model} with new type of conditioning.\\n{img_str}\\n\\\"\\\"\\\"\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef parse_args(input_args=None):\\n    parser = argparse.ArgumentParser(description='Simple example of a ControlNet training script.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--controlnet_model_name_or_path',\\n        type=str,\\n        default=None,\\n        help='Path to pretrained controlnet model or model identifier from huggingface.co/models or '\\n        'modelscope.cn/models. If not specified controlnet weights are initialized from unet.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--tokenizer_name',\\n        type=str,\\n        default=None,\\n        help='Pretrained tokenizer name or path if not the same as model_name',\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='controlnet-model',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument(\\n        '--cache_dir',\\n        type=str,\\n        default=None,\\n        help='The directory where the downloaded models and datasets will be stored.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=512,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=4, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--num_train_epochs', type=int, default=1)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=\\n        ('Save a checkpoint of the training state every X updates. Checkpoints can be used for resuming training '\\n         'via `--resume_from_checkpoint`. '\\n         'In the case that the checkpoint is better than the final trained model, the checkpoint can also be used for '\\n         'inference.'\\n         'Using a checkpoint for inference requires separate loading of the original pipeline and the individual '\\n         'checkpointed model components.'\\n         'See https://huggingface.co/docs/diffusers/main/en/training/dreambooth'\\n         '#performing-inference-using-a-saved-checkpoint for step by step instructions.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=5e-6,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--lr_num_cycles',\\n        type=int,\\n        default=1,\\n        help='Number of hard resets of the lr in cosine_with_restarts scheduler.',\\n    )\\n    parser.add_argument('--lr_power', type=float, default=1.0, help='Power factor of the polynomial scheduler.')\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument(\\n        '--set_grads_to_none',\\n        action='store_true',\\n        help=('Save more memory by using setting grads to None instead of zero. Be aware, that this changes certain'\\n              ' behaviors, so disable this argument if it causes any problems. More info:'\\n              ' https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.zero_grad.html'),\\n    )\\n    parser.add_argument(\\n        '--dataset_name',\\n        type=str,\\n        default=None,\\n        help=('The name of the Dataset (from the HuggingFace hub) to train on (could be your own, possibly private,'\\n              ' dataset). It can also be a path pointing to a local copy of a dataset in your filesystem,'\\n              ' or to a folder containing files that 🤗 Datasets can understand.'),\\n    )\\n    parser.add_argument(\\n        '--dataset_config_name',\\n        type=str,\\n        default=None,\\n        help=\\\"The config of the Dataset, leave as None if there's only one config.\\\",\\n    )\\n    parser.add_argument(\\n        '--train_data_dir',\\n        type=str,\\n        default=None,\\n        help=('A folder containing the training data. Folder contents must follow the structure described in'\\n              ' https://huggingface.co/docs/datasets/image_dataset#imagefolder. In particular, a `metadata.jsonl` file'\\n              ' must exist to provide the captions for the images. Ignored if `dataset_name` is specified.'),\\n    )\\n    parser.add_argument(\\n        '--image_column', type=str, default='image', help='The column of the dataset containing the target image.')\\n    parser.add_argument(\\n        '--conditioning_image_column',\\n        type=str,\\n        default='conditioning_image',\\n        help='The column of the dataset containing the controlnet conditioning image.',\\n    )\\n    parser.add_argument(\\n        '--caption_column',\\n        type=str,\\n        default='text',\\n        help='The column of the dataset containing a caption or a list of captions.',\\n    )\\n    parser.add_argument(\\n        '--max_train_samples',\\n        type=int,\\n        default=None,\\n        help=('For debugging purposes or quicker training, truncate the number of training examples to this '\\n              'value if set.'),\\n    )\\n    parser.add_argument(\\n        '--proportion_empty_prompts',\\n        type=float,\\n        default=0,\\n        help='Proportion of image prompts to be replaced with empty strings. Defaults to 0 (no prompt replacement).',\\n    )\\n    parser.add_argument(\\n        '--validation_prompt',\\n        type=str,\\n        default=None,\\n        nargs='+',\\n        help=('A set of prompts evaluated every `--validation_steps` and logged to `--report_to`.'\\n              ' Provide either a matching number of `--validation_image`s, a single `--validation_image`'\\n              ' to be used with all prompts, or a single prompt that will be used with all `--validation_image`s.'),\\n    )\\n    parser.add_argument(\\n        '--validation_image',\\n        type=str,\\n        default=None,\\n        nargs='+',\\n        help=('A set of paths to the controlnet conditioning image be evaluated every `--validation_steps`'\\n              ' and logged to `--report_to`. Provide either a matching number of `--validation_prompt`s, a'\\n              ' a single `--validation_prompt` to be used with all `--validation_image`s, or a single'\\n              ' `--validation_image` that will be used with all `--validation_prompt`s.'),\\n    )\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images to be generated for each `--validation_image`, `--validation_prompt` pair',\\n    )\\n    parser.add_argument(\\n        '--validation_steps',\\n        type=int,\\n        default=100,\\n        help=('Run validation every X steps. Validation consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`'\\n              ' and logging the images.'),\\n    )\\n    parser.add_argument(\\n        '--tracker_project_name',\\n        type=str,\\n        default='train_controlnet',\\n        help=('The `project_name` argument passed to Accelerator.init_trackers for'\\n              ' more information see '\\n              'https://huggingface.co/docs/accelerate/v0.17.0/en/package_reference/accelerator#accelerate.Accelerator'),\\n    )\\n\\n    if input_args is not None:\\n        args = parser.parse_args(input_args)\\n    else:\\n        args = parser.parse_args()\\n\\n    if args.dataset_name is None and args.train_data_dir is None:\\n        raise ValueError('Specify either `--dataset_name` or `--train_data_dir`')\\n\\n    if args.dataset_name is not None and args.train_data_dir is not None:\\n        raise ValueError('Specify only one of `--dataset_name` or `--train_data_dir`')\\n\\n    if args.proportion_empty_prompts < 0 or args.proportion_empty_prompts > 1:\\n        raise ValueError('`--proportion_empty_prompts` must be in the range [0, 1].')\\n\\n    if args.validation_prompt is not None and args.validation_image is None:\\n        raise ValueError('`--validation_image` must be set if `--validation_prompt` is set')\\n\\n    if args.validation_prompt is None and args.validation_image is not None:\\n        raise ValueError('`--validation_prompt` must be set if `--validation_image` is set')\\n\\n    if (args.validation_image is not None and args.validation_prompt is not None and len(args.validation_image) != 1\\n            and len(args.validation_prompt) != 1 and len(args.validation_image) != len(args.validation_prompt)):\\n        raise ValueError('Must provide either 1 `--validation_image`, 1 `--validation_prompt`,'\\n                         ' or the same number of `--validation_prompt`s and `--validation_image`s')\\n\\n    if args.resolution % 8 != 0:\\n        raise ValueError('`--resolution` must be divisible by 8 for consistently sized encoded images between '\\n                         'the VAE and the controlnet encoder.')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    if args.controlnet_model_name_or_path and not os.path.exists(args.controlnet_model_name_or_path):\\n        args.controlnet_model_name_or_path = snapshot_download(args.controlnet_model_name_or_path)\\n\\n    return args\\n\\n\\ndef make_train_dataset(args, tokenizer, accelerator):\\n    # Get the datasets: you can either provide your own training and evaluation files (see below)\\n    # or specify a Dataset from the hub (the dataset will be downloaded automatically from the datasets Hub).\\n\\n    # In distributed training, the load_dataset function guarantees that only one local process can concurrently\\n    # download the dataset.\\n    if args.dataset_name is not None:\\n        # Downloading and loading a dataset from the hub.\\n        dataset = MsDataset.load(\\n            args.dataset_name,\\n            args.dataset_config_name,\\n        )\\n        if not isinstance(dataset, dict):\\n            dataset = {'train': dataset}\\n    else:\\n        if args.train_data_dir is not None:\\n            dataset = load_dataset(\\n                args.train_data_dir,\\n                cache_dir=args.cache_dir,\\n            )\\n        # See more about loading custom images at\\n        # https://huggingface.co/docs/datasets/v2.0.0/en/dataset_script\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize inputs and targets.\\n    column_names = dataset['train'].column_names\\n\\n    # 6. Get the column names for input/target.\\n    if args.image_column is None:\\n        image_column = column_names[0]\\n        logger.info(f'image column defaulting to {image_column}')\\n    else:\\n        image_column = args.image_column\\n        if image_column not in column_names:\\n            raise ValueError(f\\\"`--image_column` value '{args.image_column}' not found in dataset columns.\\\"\\n                             f\\\" Dataset columns are: {', '.join(column_names)}\\\")\\n\\n    if args.caption_column is None:\\n        caption_column = column_names[1]\\n        logger.info(f'caption column defaulting to {caption_column}')\\n    else:\\n        caption_column = args.caption_column\\n        if caption_column not in column_names:\\n            raise ValueError(f\\\"`--caption_column` value '{args.caption_column}' not found in dataset columns. \\\"\\n                             f\\\"Dataset columns are: {', '.join(column_names)}\\\")\\n\\n    if args.conditioning_image_column is None:\\n        conditioning_image_column = column_names[2]\\n        logger.info(f'conditioning image column defaulting to {conditioning_image_column}')\\n    else:\\n        conditioning_image_column = args.conditioning_image_column\\n        if conditioning_image_column not in column_names:\\n            raise ValueError(\\n                f\\\"`--conditioning_image_column` value '{args.conditioning_image_column}' not found in dataset columns. \\\"\\n                f\\\"Dataset columns are: {', '.join(column_names)}\\\")\\n\\n    def tokenize_captions(examples, is_train=True):\\n        captions = []\\n        for caption in examples[caption_column]:\\n            if random.random() < args.proportion_empty_prompts:\\n                captions.append('')\\n            elif isinstance(caption, str):\\n                captions.append(caption)\\n            elif isinstance(caption, (list, np.ndarray)):\\n                # take a random caption if there are multiple\\n                captions.append(random.choice(caption) if is_train else caption[0])\\n            else:\\n                raise ValueError(\\n                    f'Caption column `{caption_column}` should contain either strings or lists of strings.')\\n        inputs = tokenizer(\\n            captions, max_length=tokenizer.model_max_length, padding='max_length', truncation=True, return_tensors='pt')\\n        return inputs.input_ids\\n\\n    image_transforms = transforms.Compose([\\n        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),\\n        transforms.CenterCrop(args.resolution),\\n        transforms.ToTensor(),\\n        transforms.Normalize([0.5], [0.5]),\\n    ])\\n\\n    conditioning_image_transforms = transforms.Compose([\\n        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),\\n        transforms.CenterCrop(args.resolution),\\n        transforms.ToTensor(),\\n    ])\\n\\n    def preprocess_train(examples):\\n        images = [image.convert('RGB') for image in examples[image_column]]\\n        images = [image_transforms(image) for image in images]\\n\\n        conditioning_images = [image.convert('RGB') for image in examples[conditioning_image_column]]\\n        conditioning_images = [conditioning_image_transforms(image) for image in conditioning_images]\\n\\n        examples['pixel_values'] = images\\n        examples['conditioning_pixel_values'] = conditioning_images\\n        examples['input_ids'] = tokenize_captions(examples)\\n\\n        return examples\\n\\n    with accelerator.main_process_first():\\n        if args.max_train_samples is not None:\\n            dataset['train'] = dataset['train'].shuffle(seed=args.seed).select(range(args.max_train_samples))\\n        # Set the training transforms\\n        train_dataset = dataset['train'].with_transform(preprocess_train)\\n\\n    return train_dataset\\n\\n\\ndef collate_fn(examples):\\n    pixel_values = torch.stack([example['pixel_values'] for example in examples])\\n    pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n\\n    conditioning_pixel_values = torch.stack([example['conditioning_pixel_values'] for example in examples])\\n    conditioning_pixel_values = conditioning_pixel_values.to(memory_format=torch.contiguous_format).float()\\n\\n    input_ids = torch.stack([example['input_ids'] for example in examples])\\n\\n    return {\\n        'pixel_values': pixel_values,\\n        'conditioning_pixel_values': conditioning_pixel_values,\\n        'input_ids': input_ids,\\n    }\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n    )\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load the tokenizer\\n    if args.tokenizer_name:\\n        tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, revision=args.revision, use_fast=False)\\n    elif args.pretrained_model_name_or_path:\\n        tokenizer = AutoTokenizer.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            subfolder='tokenizer',\\n            revision=args.revision,\\n            use_fast=False,\\n        )\\n\\n    # import correct text encoder class\\n    text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)\\n\\n    # Load scheduler and models\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    text_encoder = text_encoder_cls.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n    vae = AutoencoderKL.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='vae', revision=args.revision, variant=args.variant)\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n\\n    if args.controlnet_model_name_or_path:\\n        logger.info('Loading existing controlnet weights')\\n        controlnet = ControlNetModel.from_pretrained(args.controlnet_model_name_or_path)\\n    else:\\n        logger.info('Initializing controlnet weights from unet')\\n        controlnet = ControlNetModel.from_unet(unet)\\n\\n    # `accelerate` 0.16.0 will have better support for customized saving\\n    if version.parse(accelerate.__version__) >= version.parse('0.16.0'):\\n        # create custom saving & loading hooks so that `accelerator.save_state(...)` serializes in a nice format\\n        def save_model_hook(models, weights, output_dir):\\n            if accelerator.is_main_process:\\n                i = len(weights) - 1\\n\\n                while len(weights) > 0:\\n                    weights.pop()\\n                    model = models[i]\\n\\n                    sub_dir = 'controlnet'\\n                    model.save_pretrained(os.path.join(output_dir, sub_dir))\\n\\n                    i -= 1\\n\\n        def load_model_hook(models, input_dir):\\n            while len(models) > 0:\\n                # pop models so that they are not loaded again\\n                model = models.pop()\\n\\n                # load diffusers style into model\\n                load_model = ControlNetModel.from_pretrained(input_dir, subfolder='controlnet')\\n                model.register_to_config(**load_model.config)\\n\\n                model.load_state_dict(load_model.state_dict())\\n                del load_model\\n\\n        accelerator.register_save_state_pre_hook(save_model_hook)\\n        accelerator.register_load_state_pre_hook(load_model_hook)\\n\\n    vae.requires_grad_(False)\\n    unet.requires_grad_(False)\\n    text_encoder.requires_grad_(False)\\n    controlnet.train()\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn(\\n                    'xFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training,'\\n                    ' please update xFormers to at least 0.0.17. '\\n                    'See https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n            controlnet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    if args.gradient_checkpointing:\\n        controlnet.enable_gradient_checkpointing()\\n\\n    # Check that all trainable models are in full precision\\n    low_precision_error_string = (\\n        ' Please make sure to always have all model weights in full float32 precision when starting training - even if'\\n        ' doing mixed precision training, copy of the weights should still be float32.')\\n\\n    if accelerator.unwrap_model(controlnet).dtype != torch.float32:\\n        raise ValueError(\\n            f'Controlnet loaded as datatype {accelerator.unwrap_model(controlnet).dtype}. {low_precision_error_string}')\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Use 8-bit Adam for lower memory usage or to fine-tune the model in 16GB GPUs\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError('To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`.')\\n\\n        optimizer_class = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_class = torch.optim.AdamW\\n\\n    # Optimizer creation\\n    params_to_optimize = controlnet.parameters()\\n    optimizer = optimizer_class(\\n        params_to_optimize,\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    train_dataset = make_train_dataset(args, tokenizer, accelerator)\\n\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        shuffle=True,\\n        collate_fn=collate_fn,\\n        batch_size=args.train_batch_size,\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * accelerator.num_processes,\\n        num_training_steps=args.max_train_steps * accelerator.num_processes,\\n        num_cycles=args.lr_num_cycles,\\n        power=args.lr_power,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    controlnet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(controlnet, optimizer, train_dataloader,\\n                                                                                lr_scheduler)\\n\\n    # For mixed precision training we cast the text_encoder and vae weights to half-precision\\n    # as these models are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Move vae, unet and text_encoder to device and cast to weight_dtype\\n    vae.to(accelerator.device, dtype=weight_dtype)\\n    unet.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder.to(accelerator.device, dtype=weight_dtype)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        tracker_config = dict(vars(args))\\n\\n        # tensorboard cannot handle list types for config\\n        tracker_config.pop('validation_prompt')\\n        tracker_config.pop('validation_image')\\n\\n        accelerator.init_trackers(args.tracker_project_name, config=tracker_config)\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num batches each epoch = {len(train_dataloader)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the most recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    image_logs = None\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(controlnet):\\n                # Convert images to latent space\\n                latents = vae.encode(batch['pixel_values'].to(dtype=weight_dtype)).latent_dist.sample()\\n                latents = latents * vae.config.scaling_factor\\n\\n                # Sample noise that we'll add to the latents\\n                noise = torch.randn_like(latents)\\n                bsz = latents.shape[0]\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=latents.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the latents according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)\\n\\n                # Get the text embedding for conditioning\\n                encoder_hidden_states = text_encoder(batch['input_ids'])[0]\\n\\n                controlnet_image = batch['conditioning_pixel_values'].to(dtype=weight_dtype)\\n\\n                down_block_res_samples, mid_block_res_sample = controlnet(\\n                    noisy_latents,\\n                    timesteps,\\n                    encoder_hidden_states=encoder_hidden_states,\\n                    controlnet_cond=controlnet_image,\\n                    return_dict=False,\\n                )\\n\\n                # Predict the noise residual\\n                model_pred = unet(\\n                    noisy_latents,\\n                    timesteps,\\n                    encoder_hidden_states=encoder_hidden_states,\\n                    down_block_additional_residuals=[\\n                        sample.to(dtype=weight_dtype) for sample in down_block_res_samples\\n                    ],\\n                    mid_block_additional_residual=mid_block_res_sample.to(dtype=weight_dtype),\\n                ).sample\\n\\n                # Get the target for loss depending on the prediction type\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(latents, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n                loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    params_to_clip = controlnet.parameters()\\n                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad(set_to_none=args.set_grads_to_none)\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n\\n                if accelerator.is_main_process:\\n                    if global_step % args.checkpointing_steps == 0:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint,\\n                            # we need to have at _most_ `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        logger.info(f'Saved state to {save_path}')\\n\\n                    if args.validation_prompt is not None and global_step % args.validation_steps == 0:\\n                        image_logs = log_validation(\\n                            vae,\\n                            text_encoder,\\n                            tokenizer,\\n                            unet,\\n                            controlnet,\\n                            args,\\n                            accelerator,\\n                            weight_dtype,\\n                            global_step,\\n                        )\\n\\n            logs = {'loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n            accelerator.log(logs, step=global_step)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n    # Create the pipeline using using the trained modules and save it.\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        controlnet = accelerator.unwrap_model(controlnet)\\n        controlnet.save_pretrained(args.output_dir)\\n        if args.push_to_hub:\\n            save_model_card(\\n                args.hub_model_id,\\n                image_logs=image_logs,\\n                base_model=args.base_model_id,\\n                repo_folder=args.output_dir,\\n            )\\n            push_to_hub(args.hub_model_id, args.output_dir, args.hub_token)\\n\\n    accelerator.end_training()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import StableDiffusionPipeline\\nfrom modelscope import snapshot_download\\n\\nfrom swift import Swift\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a text to image inference.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-v1-5',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--lora_model_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained lora model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=30,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.pretrained_model_name_or_path):\\n        model_path = args.pretrained_model_name_or_path\\n    else:\\n        model_path = snapshot_download(args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    pipe = StableDiffusionPipeline.from_pretrained(model_path, torch_dtype=torch_dtype)\\n    if args.lora_model_path is not None:\\n        pipe.unet = Swift.from_pretrained(pipe.unet, args.lora_model_path)\\n    pipe.to('cuda')\\n    image = pipe(\\n        prompt=args.prompt, num_inference_steps=args.num_inference_steps, guidance_scale=args.guidance_scale).images[0]\\n    image.save(args.image_save_path)\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n# limitations under the License.\\n\\\"\\\"\\\"Fine-tuning script for Stable Diffusion XL for text2image.\\\"\\\"\\\"\\n\\nimport argparse\\nimport functools\\nimport gc\\nimport logging\\nimport math\\nimport os\\nimport random\\nimport shutil\\nfrom pathlib import Path\\n\\nimport accelerate\\nimport datasets\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import ProjectConfiguration, set_seed\\nfrom datasets import load_dataset\\nfrom diffusers import AutoencoderKL, DDPMScheduler, StableDiffusionXLPipeline, UNet2DConditionModel\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.training_utils import EMAModel, compute_snr\\nfrom diffusers.utils import is_wandb_available\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom modelscope import AutoTokenizer, MsDataset\\nfrom packaging import version\\nfrom PIL import Image\\nfrom torchvision import transforms\\nfrom torchvision.transforms.functional import crop\\nfrom tqdm.auto import tqdm\\nfrom transformers import PretrainedConfig\\n\\nfrom swift import push_to_hub, snapshot_download\\n\\nlogger = get_logger(__name__)\\n\\nDATASET_NAME_MAPPING = {\\n    'AI-ModelScope/pokemon-blip-captions': ('text', 'image:FILE'),\\n}\\n\\n\\ndef save_model_card(\\n    repo_id: str,\\n    images=None,\\n    validation_prompt=None,\\n    base_model=str,\\n    dataset_name=str,\\n    repo_folder=None,\\n    vae_path=None,\\n):\\n    img_str = ''\\n    for i, image in enumerate(images):\\n        image.save(os.path.join(repo_folder, f'image_{i}.png'))\\n        img_str += f'![img_{i}](./image_{i}.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: creativeml-openrail-m\\nbase_model: {base_model}\\ndataset: {dataset_name}\\ntags:\\n- stable-diffusion-xl\\n- stable-diffusion-xl-diffusers\\n- text-to-image\\n- diffusers\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# Text-to-image finetuning - {repo_id}\\n\\nThis pipeline was finetuned from **{base_model}** on the **{args.dataset_name}** dataset. Below are some example images\\ngenerated with the finetuned pipeline using the following prompt: {validation_prompt}: \\\\n\\n{img_str}\\n\\nSpecial VAE used for training: {vae_path}.\\n\\\"\\\"\\\"\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str,\\n                                               revision: str,\\n                                               subfolder: str = 'text_encoder'):\\n    text_encoder_config = PretrainedConfig.from_pretrained(\\n        pretrained_model_name_or_path, subfolder=subfolder, revision=revision)\\n    model_class = text_encoder_config.architectures[0]\\n\\n    if model_class == 'CLIPTextModel':\\n        from transformers import CLIPTextModel\\n\\n        return CLIPTextModel\\n    elif model_class == 'CLIPTextModelWithProjection':\\n        from transformers import CLIPTextModelWithProjection\\n\\n        return CLIPTextModelWithProjection\\n    else:\\n        raise ValueError(f'{model_class} is not supported.')\\n\\n\\ndef parse_args(input_args=None):\\n    parser = argparse.ArgumentParser(description='Simple example of a training script.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--pretrained_vae_model_name_or_path',\\n        type=str,\\n        default=None,\\n        help='Path to pretrained VAE model with better numerical stability. \\\\\\n        More details: https://github.com/huggingface/diffusers/pull/4038.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--dataset_name',\\n        type=str,\\n        default=None,\\n        help=('The name of the Dataset (from the HuggingFace hub) to train on (could be your own, possibly private,'\\n              ' dataset). It can also be a path pointing to a local copy of a dataset in your filesystem,'\\n              ' or to a folder containing files that 🤗 Datasets can understand.'),\\n    )\\n    parser.add_argument(\\n        '--dataset_config_name',\\n        type=str,\\n        default=None,\\n        help=\\\"The config of the Dataset, leave as None if there's only one config.\\\",\\n    )\\n    parser.add_argument(\\n        '--train_data_dir',\\n        type=str,\\n        default=None,\\n        help=('A folder containing the training data. Folder contents must follow the structure described in'\\n              ' https://huggingface.co/docs/datasets/image_dataset#imagefolder. In particular, a `metadata.jsonl` file'\\n              ' must exist to provide the captions for the images. Ignored if `dataset_name` is specified.'),\\n    )\\n    parser.add_argument(\\n        '--image_column', type=str, default='image:FILE', help='The column of the dataset containing an image.')\\n    parser.add_argument(\\n        '--caption_column',\\n        type=str,\\n        default='text',\\n        help='The column of the dataset containing a caption or a list of captions.',\\n    )\\n    parser.add_argument(\\n        '--validation_prompt',\\n        type=str,\\n        default=None,\\n        help='A prompt that is used during validation to verify that the model is learning.',\\n    )\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images that should be generated during validation with `validation_prompt`.',\\n    )\\n    parser.add_argument(\\n        '--validation_epochs',\\n        type=int,\\n        default=1,\\n        help=('Run fine-tuning validation every X epochs. The validation process consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`.'),\\n    )\\n    parser.add_argument(\\n        '--max_train_samples',\\n        type=int,\\n        default=None,\\n        help=('For debugging purposes or quicker training, truncate the number of training examples to this '\\n              'value if set.'),\\n    )\\n    parser.add_argument(\\n        '--proportion_empty_prompts',\\n        type=float,\\n        default=0,\\n        help='Proportion of image prompts to be replaced with empty strings. Defaults to 0 (no prompt replacement).',\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='sdxl-model-finetuned',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument(\\n        '--cache_dir',\\n        type=str,\\n        default=None,\\n        help='The directory where the downloaded models and datasets will be stored.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=1024,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--center_crop',\\n        default=False,\\n        action='store_true',\\n        help=('Whether to center crop the input images to the resolution. If not set, the images will be randomly'\\n              ' cropped. The images will be resized to the resolution first before cropping.'),\\n    )\\n    parser.add_argument(\\n        '--random_flip',\\n        action='store_true',\\n        help='whether to randomly flip images horizontally',\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=16, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--num_train_epochs', type=int, default=100)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=('Save a checkpoint of the training state every X updates. These checkpoints can be used both as final'\\n              ' checkpoints in case they are better than the last checkpoint, and are also suitable for resuming'\\n              ' training using `--resume_from_checkpoint`.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=1e-4,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--timestep_bias_strategy',\\n        type=str,\\n        default='none',\\n        choices=['earlier', 'later', 'range', 'none'],\\n        help=(\\n            'The timestep bias strategy, which may help direct the model toward learning low or high frequency details.'\\n            \\\" Choices: ['earlier', 'later', 'range', 'none'].\\\"\\n            \\\" The default is 'none', which means no bias is applied, and training proceeds normally.\\\"\\n            \\\" The value of 'later' will increase the frequency of the model's final training timesteps.\\\"),\\n    )\\n    parser.add_argument(\\n        '--timestep_bias_multiplier',\\n        type=float,\\n        default=1.0,\\n        help=('The multiplier for the bias. Defaults to 1.0, which means no bias is applied.'\\n              ' A value of 2.0 will double the weight of the bias, and a value of 0.5 will halve it.'),\\n    )\\n    parser.add_argument(\\n        '--timestep_bias_begin',\\n        type=int,\\n        default=0,\\n        help=('When using `--timestep_bias_strategy=range`, the beginning (inclusive) timestep to bias.'\\n              ' Defaults to zero, which equates to having no specific bias.'),\\n    )\\n    parser.add_argument(\\n        '--timestep_bias_end',\\n        type=int,\\n        default=1000,\\n        help=('When using `--timestep_bias_strategy=range`, the final timestep (inclusive) to bias.'\\n              ' Defaults to 1000, which is the number of timesteps that Stable Diffusion is trained on.'),\\n    )\\n    parser.add_argument(\\n        '--timestep_bias_portion',\\n        type=float,\\n        default=0.25,\\n        help=('The portion of timesteps to bias. Defaults to 0.25, which 25% of timesteps will be biased.'\\n              ' A value of 0.5 will bias one half of the timesteps. '\\n              'The value provided for `--timestep_bias_strategy` determines'\\n              ' whether the biased portions are in the earlier or later timesteps.'),\\n    )\\n    parser.add_argument(\\n        '--snr_gamma',\\n        type=float,\\n        default=None,\\n        help='SNR weighting gamma to be used if rebalancing the loss. Recommended value is 5.0. '\\n        'More details here: https://arxiv.org/abs/2303.09556.',\\n    )\\n    parser.add_argument('--use_ema', action='store_true', help='Whether to use EMA model.')\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--prediction_type',\\n        type=str,\\n        default=None,\\n        help=\\\"The prediction_type that shall be used for training. Choose between 'epsilon' or 'v_prediction' or \\\\\\n        leave `None`. If left to `None` the default prediction type of the scheduler: \\\\\\n        `noise_scheduler.config.prediciton_type` is chosen.\\\",\\n    )\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument('--local_rank', type=int, default=-1, help='For distributed training: local_rank')\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument('--noise_offset', type=float, default=0, help='The scale of noise offset.')\\n\\n    if input_args is not None:\\n        args = parser.parse_args(input_args)\\n    else:\\n        args = parser.parse_args()\\n\\n    env_local_rank = int(os.environ.get('LOCAL_RANK', -1))\\n    if env_local_rank != -1 and env_local_rank != args.local_rank:\\n        args.local_rank = env_local_rank\\n\\n    # Sanity checks\\n    if args.dataset_name is None and args.train_data_dir is None:\\n        raise ValueError('Need either a dataset name or a training folder.')\\n\\n    if args.proportion_empty_prompts < 0 or args.proportion_empty_prompts > 1:\\n        raise ValueError('`--proportion_empty_prompts` must be in the range [0, 1].')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    args.vae_base_model_id = args.pretrained_vae_model_name_or_path\\n    if args.pretrained_vae_model_name_or_path and not os.path.exists(args.pretrained_vae_model_name_or_path):\\n        args.pretrained_vae_model_name_or_path = snapshot_download(args.pretrained_vae_model_name_or_path)\\n    return args\\n\\n\\n# Adapted from pipelines.StableDiffusionXLPipeline.encode_prompt\\ndef encode_prompt(batch, text_encoders, tokenizers, proportion_empty_prompts, caption_column, is_train=True):\\n    prompt_embeds_list = []\\n    prompt_batch = batch[caption_column]\\n\\n    captions = []\\n    for caption in prompt_batch:\\n        if random.random() < proportion_empty_prompts:\\n            captions.append('')\\n        elif isinstance(caption, str):\\n            captions.append(caption)\\n        elif isinstance(caption, (list, np.ndarray)):\\n            # take a random caption if there are multiple\\n            captions.append(random.choice(caption) if is_train else caption[0])\\n\\n    with torch.no_grad():\\n        for tokenizer, text_encoder in zip(tokenizers, text_encoders):\\n            text_inputs = tokenizer(\\n                captions,\\n                padding='max_length',\\n                max_length=tokenizer.model_max_length,\\n                truncation=True,\\n                return_tensors='pt',\\n            )\\n            text_input_ids = text_inputs.input_ids\\n            prompt_embeds = text_encoder(\\n                text_input_ids.to(text_encoder.device),\\n                output_hidden_states=True,\\n            )\\n\\n            # We are only ALWAYS interested in the pooled output of the final text encoder\\n            pooled_prompt_embeds = prompt_embeds[0]\\n            prompt_embeds = prompt_embeds.hidden_states[-2]\\n            bs_embed, seq_len, _ = prompt_embeds.shape\\n            prompt_embeds = prompt_embeds.view(bs_embed, seq_len, -1)\\n            prompt_embeds_list.append(prompt_embeds)\\n\\n    prompt_embeds = torch.concat(prompt_embeds_list, dim=-1)\\n    pooled_prompt_embeds = pooled_prompt_embeds.view(bs_embed, -1)\\n    return {'prompt_embeds': prompt_embeds.cpu(), 'pooled_prompt_embeds': pooled_prompt_embeds.cpu()}\\n\\n\\ndef compute_vae_encodings(batch, vae):\\n    images = batch.pop('pixel_values')\\n    pixel_values = torch.stack(list(images))\\n    pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n    pixel_values = pixel_values.to(vae.device, dtype=vae.dtype)\\n\\n    with torch.no_grad():\\n        model_input = vae.encode(pixel_values).latent_dist.sample()\\n    model_input = model_input * vae.config.scaling_factor\\n    return {'model_input': model_input.cpu()}\\n\\n\\ndef generate_timestep_weights(args, num_timesteps):\\n    weights = torch.ones(num_timesteps)\\n\\n    # Determine the indices to bias\\n    num_to_bias = int(args.timestep_bias_portion * num_timesteps)\\n\\n    if args.timestep_bias_strategy == 'later':\\n        bias_indices = slice(-num_to_bias, None)\\n    elif args.timestep_bias_strategy == 'earlier':\\n        bias_indices = slice(0, num_to_bias)\\n    elif args.timestep_bias_strategy == 'range':\\n        # Out of the possible 1000 timesteps, we might want to focus on eg. 200-500.\\n        range_begin = args.timestep_bias_begin\\n        range_end = args.timestep_bias_end\\n        if range_begin < 0:\\n            raise ValueError(\\n                'When using the range strategy for timestep bias, you must provide a beginning timestep greater \\\\\\n                or equal to zero.')\\n        if range_end > num_timesteps:\\n            raise ValueError(\\n                'When using the range strategy for timestep bias, you must provide an ending timestep smaller than \\\\\\n                the number of timesteps.')\\n        bias_indices = slice(range_begin, range_end)\\n    else:  # 'none' or any other string\\n        return weights\\n    if args.timestep_bias_multiplier <= 0:\\n        return ValueError(\\n            'The parameter --timestep_bias_multiplier is not intended to be used to disable the training of specific '\\n            'timesteps.'\\n            ' If it was intended to disable timestep bias, use `--timestep_bias_strategy none` instead.'\\n            ' A timestep bias multiplier less than or equal to 0 is not allowed.')\\n\\n    # Apply the bias\\n    weights[bias_indices] *= args.timestep_bias_multiplier\\n\\n    # Normalize\\n    weights /= weights.sum()\\n\\n    return weights\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n    )\\n\\n    if args.report_to == 'wandb':\\n        if not is_wandb_available():\\n            raise ImportError('Make sure to install wandb if you want to use it for logging during training.')\\n        import wandb\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        datasets.utils.logging.set_verbosity_warning()\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        datasets.utils.logging.set_verbosity_error()\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load the tokenizers\\n    tokenizer_one = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n    tokenizer_two = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer_2',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n\\n    # import correct text encoder classes\\n    text_encoder_cls_one = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)\\n    text_encoder_cls_two = import_model_class_from_model_name_or_path(\\n        args.pretrained_model_name_or_path, args.revision, subfolder='text_encoder_2')\\n\\n    # Load scheduler and models\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    # Check for terminal SNR in combination with SNR Gamma\\n    text_encoder_one = text_encoder_cls_one.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n    text_encoder_two = text_encoder_cls_two.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder_2', revision=args.revision, variant=args.variant)\\n    vae_path = (\\n        args.pretrained_model_name_or_path\\n        if args.pretrained_vae_model_name_or_path is None else args.pretrained_vae_model_name_or_path)\\n    vae = AutoencoderKL.from_pretrained(\\n        vae_path,\\n        subfolder='vae' if args.pretrained_vae_model_name_or_path is None else None,\\n        revision=args.revision,\\n        variant=args.variant,\\n    )\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n\\n    # Freeze vae and text encoders.\\n    vae.requires_grad_(False)\\n    text_encoder_one.requires_grad_(False)\\n    text_encoder_two.requires_grad_(False)\\n    # Set unet as trainable.\\n    unet.train()\\n\\n    # For mixed precision training we cast all non-trainable weigths to half-precision\\n    # as these weights are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Move unet, vae and text_encoder to device and cast to weight_dtype\\n    # The VAE is in float32 to avoid NaN losses.\\n    vae.to(accelerator.device, dtype=torch.float32)\\n    text_encoder_one.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder_two.to(accelerator.device, dtype=weight_dtype)\\n\\n    # Create EMA for the unet.\\n    if args.use_ema:\\n        ema_unet = UNet2DConditionModel.from_pretrained(\\n            args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n        ema_unet = EMAModel(ema_unet.parameters(), model_cls=UNet2DConditionModel, model_config=ema_unet.config)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn(\\n                    'xFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training,'\\n                    ' please update xFormers to at least 0.0.17. '\\n                    'See https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    # `accelerate` 0.16.0 will have better support for customized saving\\n    if version.parse(accelerate.__version__) >= version.parse('0.16.0'):\\n        # create custom saving & loading hooks so that `accelerator.save_state(...)` serializes in a nice format\\n        def save_model_hook(models, weights, output_dir):\\n            if accelerator.is_main_process:\\n                if args.use_ema:\\n                    ema_unet.save_pretrained(os.path.join(output_dir, 'unet_ema'))\\n\\n                for i, model in enumerate(models):\\n                    model.save_pretrained(os.path.join(output_dir, 'unet'))\\n\\n                    # make sure to pop weight so that corresponding model is not saved again\\n                    weights.pop()\\n\\n        def load_model_hook(models, input_dir):\\n            if args.use_ema:\\n                load_model = EMAModel.from_pretrained(os.path.join(input_dir, 'unet_ema'), UNet2DConditionModel)\\n                ema_unet.load_state_dict(load_model.state_dict())\\n                ema_unet.to(accelerator.device)\\n                del load_model\\n\\n            for i in range(len(models)):\\n                # pop models so that they are not loaded again\\n                model = models.pop()\\n\\n                # load diffusers style into model\\n                load_model = UNet2DConditionModel.from_pretrained(input_dir, subfolder='unet')\\n                model.register_to_config(**load_model.config)\\n\\n                model.load_state_dict(load_model.state_dict())\\n                del load_model\\n\\n        accelerator.register_save_state_pre_hook(save_model_hook)\\n        accelerator.register_load_state_pre_hook(load_model_hook)\\n\\n    if args.gradient_checkpointing:\\n        unet.enable_gradient_checkpointing()\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Use 8-bit Adam for lower memory usage or to fine-tune the model in 16GB GPUs\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError('To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`.')\\n\\n        optimizer_class = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_class = torch.optim.AdamW\\n\\n    # Optimizer creation\\n    params_to_optimize = unet.parameters()\\n    optimizer = optimizer_class(\\n        params_to_optimize,\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    # Get the datasets: you can either provide your own training and evaluation files (see below)\\n    # or specify a Dataset from the hub (the dataset will be downloaded automatically from the datasets Hub).\\n\\n    # In distributed training, the load_dataset function guarantees that only one local process can concurrently\\n    # download the dataset.\\n    def path_to_img(example):\\n        example['image'] = Image.open(example['image:FILE'])\\n        return example\\n\\n    if args.dataset_name is not None:\\n        # Downloading and loading a dataset from the hub.\\n        dataset = MsDataset.load(\\n            args.dataset_name,\\n            args.dataset_config_name,\\n            data_dir=args.train_data_dir,\\n        )\\n        if not isinstance(dataset, dict):\\n            dataset = {'train': dataset}\\n    else:\\n        data_files = {}\\n        if args.train_data_dir is not None:\\n            data_files['train'] = os.path.join(args.train_data_dir, '**')\\n        dataset = load_dataset(\\n            'imagefolder',\\n            data_files=data_files,\\n            cache_dir=args.cache_dir,\\n        )\\n        # See more about loading custom images at\\n        # https://huggingface.co/docs/datasets/v2.4.0/en/image_load#imagefolder\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize inputs and targets.\\n    column_names = dataset['train'].column_names\\n\\n    # 6. Get the column names for input/target.\\n    dataset_columns = DATASET_NAME_MAPPING.get(args.dataset_name, None)\\n    if args.image_column is None:\\n        image_column = dataset_columns[1] if dataset_columns is not None else column_names[1]\\n    else:\\n        image_column = args.image_column\\n        if image_column not in column_names:\\n            raise ValueError(\\n                f\\\"--image_column' value '{args.image_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if args.caption_column is None:\\n        caption_column = dataset_columns[0] if dataset_columns is not None else column_names[0]\\n    else:\\n        caption_column = args.caption_column\\n        if caption_column not in column_names:\\n            raise ValueError(\\n                f\\\"--caption_column' value '{args.caption_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if image_column.endswith(':FILE'):\\n        dataset['train'] = dataset['train'].map(path_to_img)\\n        image_column = 'image'\\n\\n    # Preprocessing the datasets.\\n    train_resize = transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR)\\n    train_crop = transforms.CenterCrop(args.resolution) if args.center_crop else transforms.RandomCrop(args.resolution)\\n    train_flip = transforms.RandomHorizontalFlip(p=1.0)\\n    train_transforms = transforms.Compose([transforms.ToTensor(), transforms.Normalize([0.5], [0.5])])\\n\\n    def preprocess_train(examples):\\n        images = [image.convert('RGB') for image in examples[image_column]]\\n        # image aug\\n        original_sizes = []\\n        all_images = []\\n        crop_top_lefts = []\\n        for image in images:\\n            original_sizes.append((image.height, image.width))\\n            image = train_resize(image)\\n            if args.center_crop:\\n                y1 = max(0, int(round((image.height - args.resolution) / 2.0)))\\n                x1 = max(0, int(round((image.width - args.resolution) / 2.0)))\\n                image = train_crop(image)\\n            else:\\n                y1, x1, h, w = train_crop.get_params(image, (args.resolution, args.resolution))\\n                image = crop(image, y1, x1, h, w)\\n            if args.random_flip and random.random() < 0.5:\\n                # flip\\n                x1 = image.width - x1\\n                image = train_flip(image)\\n            crop_top_left = (y1, x1)\\n            crop_top_lefts.append(crop_top_left)\\n            image = train_transforms(image)\\n            all_images.append(image)\\n\\n        examples['original_sizes'] = original_sizes\\n        examples['crop_top_lefts'] = crop_top_lefts\\n        examples['pixel_values'] = all_images\\n        return examples\\n\\n    with accelerator.main_process_first():\\n        if args.max_train_samples is not None:\\n            dataset['train'] = dataset['train'].shuffle(seed=args.seed).select(range(args.max_train_samples))\\n        # Set the training transforms\\n        train_dataset = dataset['train'].with_transform(preprocess_train)\\n\\n    # Let's first compute all the embeddings so that we can free up the text encoders\\n    # from memory. We will pre-compute the VAE encodings too.\\n    text_encoders = [text_encoder_one, text_encoder_two]\\n    tokenizers = [tokenizer_one, tokenizer_two]\\n    compute_embeddings_fn = functools.partial(\\n        encode_prompt,\\n        text_encoders=text_encoders,\\n        tokenizers=tokenizers,\\n        proportion_empty_prompts=args.proportion_empty_prompts,\\n        caption_column=args.caption_column,\\n    )\\n    compute_vae_encodings_fn = functools.partial(compute_vae_encodings, vae=vae)\\n    with accelerator.main_process_first():\\n        from datasets.fingerprint import Hasher\\n\\n        # fingerprint used by the cache for the other processes to load the result\\n        # details: https://github.com/huggingface/diffusers/pull/4038#discussion_r1266078401\\n        new_fingerprint = Hasher.hash(args)\\n        new_fingerprint_for_vae = Hasher.hash('vae')\\n        train_dataset = train_dataset.map(compute_embeddings_fn, batched=True, new_fingerprint=new_fingerprint)\\n        train_dataset = train_dataset.map(\\n            compute_vae_encodings_fn,\\n            batched=True,\\n            batch_size=args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps,\\n            new_fingerprint=new_fingerprint_for_vae,\\n        )\\n\\n    del text_encoders, tokenizers, vae\\n    gc.collect()\\n    torch.cuda.empty_cache()\\n\\n    def collate_fn(examples):\\n        model_input = torch.stack([torch.tensor(example['model_input']) for example in examples])\\n        original_sizes = [example['original_sizes'] for example in examples]\\n        crop_top_lefts = [example['crop_top_lefts'] for example in examples]\\n        prompt_embeds = torch.stack([torch.tensor(example['prompt_embeds']) for example in examples])\\n        pooled_prompt_embeds = torch.stack([torch.tensor(example['pooled_prompt_embeds']) for example in examples])\\n\\n        return {\\n            'model_input': model_input,\\n            'prompt_embeds': prompt_embeds,\\n            'pooled_prompt_embeds': pooled_prompt_embeds,\\n            'original_sizes': original_sizes,\\n            'crop_top_lefts': crop_top_lefts,\\n        }\\n\\n    # DataLoaders creation:\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        shuffle=True,\\n        collate_fn=collate_fn,\\n        batch_size=args.train_batch_size,\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * args.gradient_accumulation_steps,\\n        num_training_steps=args.max_train_steps * args.gradient_accumulation_steps,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader,\\n                                                                          lr_scheduler)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        accelerator.init_trackers('text2image-fine-tune-sdxl', config=vars(args))\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the most recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        train_loss = 0.0\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(unet):\\n                # Sample noise that we'll add to the latents\\n                model_input = batch['model_input'].to(accelerator.device)\\n                noise = torch.randn_like(model_input)\\n                if args.noise_offset:\\n                    # https://www.crosslabs.org//blog/diffusion-with-offset-noise\\n                    noise += args.noise_offset * torch.randn(\\n                        (model_input.shape[0], model_input.shape[1], 1, 1), device=model_input.device)\\n\\n                bsz = model_input.shape[0]\\n                if args.timestep_bias_strategy == 'none':\\n                    # Sample a random timestep for each image without bias.\\n                    timesteps = torch.randint(\\n                        0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=model_input.device)\\n                else:\\n                    # Sample a random timestep for each image, potentially biased by the timestep weights.\\n                    # Biasing the timestep weights allows us to spend less time training irrelevant timesteps.\\n                    weights = generate_timestep_weights(args, noise_scheduler.config.num_train_timesteps).to(\\n                        model_input.device)\\n                    timesteps = torch.multinomial(weights, bsz, replacement=True).long()\\n\\n                # Add noise to the model input according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_model_input = noise_scheduler.add_noise(model_input, noise, timesteps)\\n\\n                # time ids\\n                def compute_time_ids(original_size, crops_coords_top_left):\\n                    # Adapted from pipeline.StableDiffusionXLPipeline._get_add_time_ids\\n                    target_size = (args.resolution, args.resolution)\\n                    add_time_ids = list(original_size + crops_coords_top_left + target_size)\\n                    add_time_ids = torch.tensor([add_time_ids])\\n                    add_time_ids = add_time_ids.to(accelerator.device, dtype=weight_dtype)\\n                    return add_time_ids\\n\\n                add_time_ids = torch.cat(\\n                    [compute_time_ids(s, c) for s, c in zip(batch['original_sizes'], batch['crop_top_lefts'])])\\n\\n                # Predict the noise residual\\n                unet_added_conditions = {'time_ids': add_time_ids}\\n                prompt_embeds = batch['prompt_embeds'].to(accelerator.device)\\n                pooled_prompt_embeds = batch['pooled_prompt_embeds'].to(accelerator.device)\\n                unet_added_conditions.update({'text_embeds': pooled_prompt_embeds})\\n                model_pred = unet(\\n                    noisy_model_input, timesteps, prompt_embeds, added_cond_kwargs=unet_added_conditions).sample\\n\\n                # Get the target for loss depending on the prediction type\\n                if args.prediction_type is not None:\\n                    # set prediction_type of scheduler if defined\\n                    noise_scheduler.register_to_config(prediction_type=args.prediction_type)\\n\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(model_input, noise, timesteps)\\n                elif noise_scheduler.config.prediction_type == 'sample':\\n                    # We set the target to latents here, but the model_pred will return the noise sample prediction.\\n                    target = model_input\\n                    # We will have to subtract the noise residual from the prediction to get the target sample.\\n                    model_pred = model_pred - noise\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n                if args.snr_gamma is None:\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n                else:\\n                    # Compute loss-weights as per Section 3.4 of https://arxiv.org/abs/2303.09556.\\n                    # Since we predict the noise instead of x_0, the original formulation is slightly changed.\\n                    # This is discussed in Section 4.2 of the same paper.\\n                    snr = compute_snr(noise_scheduler, timesteps)\\n                    if noise_scheduler.config.prediction_type == 'v_prediction':\\n                        # Velocity objective requires that we add one to SNR values before we divide by them.\\n                        snr = snr + 1\\n                    mse_loss_weights = (\\n                        torch.stack([snr, args.snr_gamma * torch.ones_like(timesteps)], dim=1).min(dim=1)[0] / snr)\\n\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='none')\\n                    loss = loss.mean(dim=list(range(1, len(loss.shape)))) * mse_loss_weights\\n                    loss = loss.mean()\\n\\n                # Gather the losses across all processes for logging (if we use distributed training).\\n                avg_loss = accelerator.gather(loss.repeat(args.train_batch_size)).mean()\\n                train_loss += avg_loss.item() / args.gradient_accumulation_steps\\n\\n                # Backpropagate\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    params_to_clip = unet.parameters()\\n                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad()\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n                accelerator.log({'train_loss': train_loss}, step=global_step)\\n                train_loss = 0.0\\n\\n                if accelerator.is_main_process:\\n                    if global_step % args.checkpointing_steps == 0:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint, we need to have at _most_ \\\\\\n                            # `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        logger.info(f'Saved state to {save_path}')\\n\\n            logs = {'step_loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n        if accelerator.is_main_process:\\n            if args.validation_prompt is not None and epoch % args.validation_epochs == 0:\\n                logger.info(f'Running validation... \\\\n Generating {args.num_validation_images} images with prompt:'\\n                            f' {args.validation_prompt}.')\\n                if args.use_ema:\\n                    # Store the UNet parameters temporarily and load the EMA parameters to perform inference.\\n                    ema_unet.store(unet.parameters())\\n                    ema_unet.copy_to(unet.parameters())\\n\\n                # create pipeline\\n                vae = AutoencoderKL.from_pretrained(\\n                    vae_path,\\n                    subfolder='vae' if args.pretrained_vae_model_name_or_path is None else None,\\n                    revision=args.revision,\\n                    variant=args.variant,\\n                )\\n                pipeline = StableDiffusionXLPipeline.from_pretrained(\\n                    args.pretrained_model_name_or_path,\\n                    vae=vae,\\n                    unet=accelerator.unwrap_model(unet),\\n                    revision=args.revision,\\n                    variant=args.variant,\\n                    torch_dtype=weight_dtype,\\n                )\\n                if args.prediction_type is not None:\\n                    scheduler_args = {'prediction_type': args.prediction_type}\\n                    pipeline.scheduler = pipeline.scheduler.from_config(pipeline.scheduler.config, **scheduler_args)\\n\\n                pipeline = pipeline.to(accelerator.device)\\n                pipeline.set_progress_bar_config(disable=True)\\n\\n                # run inference\\n                generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n                pipeline_args = {'prompt': args.validation_prompt}\\n\\n                with torch.cuda.amp.autocast():\\n                    images = [\\n                        pipeline(**pipeline_args, generator=generator, num_inference_steps=25).images[0]\\n                        for _ in range(args.num_validation_images)\\n                    ]\\n\\n                for tracker in accelerator.trackers:\\n                    if tracker.name == 'tensorboard':\\n                        np_images = np.stack([np.asarray(img) for img in images])\\n                        tracker.writer.add_images('validation', np_images, epoch, dataformats='NHWC')\\n                    if tracker.name == 'wandb':\\n                        tracker.log({\\n                            'validation': [\\n                                wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                                for i, image in enumerate(images)\\n                            ]\\n                        })\\n\\n                del pipeline\\n                torch.cuda.empty_cache()\\n\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        unet = accelerator.unwrap_model(unet)\\n        if args.use_ema:\\n            ema_unet.copy_to(unet.parameters())\\n\\n        # Serialize pipeline.\\n        vae = AutoencoderKL.from_pretrained(\\n            vae_path,\\n            subfolder='vae' if args.pretrained_vae_model_name_or_path is None else None,\\n            revision=args.revision,\\n            variant=args.variant,\\n            torch_dtype=weight_dtype,\\n        )\\n        pipeline = StableDiffusionXLPipeline.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            unet=unet,\\n            vae=vae,\\n            revision=args.revision,\\n            variant=args.variant,\\n            torch_dtype=weight_dtype,\\n        )\\n        if args.prediction_type is not None:\\n            scheduler_args = {'prediction_type': args.prediction_type}\\n            pipeline.scheduler = pipeline.scheduler.from_config(pipeline.scheduler.config, **scheduler_args)\\n        pipeline.save_pretrained(args.output_dir)\\n\\n        # run inference\\n        images = []\\n        if args.validation_prompt and args.num_validation_images > 0:\\n            pipeline = pipeline.to(accelerator.device)\\n            generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n            with torch.cuda.amp.autocast():\\n                images = [\\n                    pipeline(args.validation_prompt, num_inference_steps=25, generator=generator).images[0]\\n                    for _ in range(args.num_validation_images)\\n                ]\\n\\n            for tracker in accelerator.trackers:\\n                if tracker.name == 'tensorboard':\\n                    np_images = np.stack([np.asarray(img) for img in images])\\n                    tracker.writer.add_images('test', np_images, epoch, dataformats='NHWC')\\n                if tracker.name == 'wandb':\\n                    tracker.log({\\n                        'test': [\\n                            wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                            for i, image in enumerate(images)\\n                        ]\\n                    })\\n\\n        if args.push_to_hub:\\n            save_model_card(\\n                repo_id=args.hub_model_id,\\n                images=images,\\n                validation_prompt=args.validation_prompt,\\n                base_model=args.base_model_id,\\n                dataset_name=args.dataset_name,\\n                repo_folder=args.output_dir,\\n                vae_path=args.vae_base_model_id,\\n            )\\n            push_to_hub(\\n                args.hub_model_id,\\n                args.output_dir,\\n                args.hub_token,\\n            )\\n\\n    accelerator.end_training()\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n# limitations under the License.\\n\\\"\\\"\\\"Fine-tuning script for Stable Diffusion XL for text2image with support for LoRA.\\\"\\\"\\\"\\n\\nimport argparse\\nimport logging\\nimport math\\nimport os\\nimport random\\nimport shutil\\nfrom pathlib import Path\\nfrom typing import Dict\\n\\nimport datasets\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import DistributedDataParallelKwargs, ProjectConfiguration, set_seed\\nfrom datasets import load_dataset\\nfrom diffusers import AutoencoderKL, DDPMScheduler, StableDiffusionXLPipeline, UNet2DConditionModel\\nfrom diffusers.loaders import LoraLoaderMixin\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.training_utils import compute_snr\\nfrom diffusers.utils import check_min_version, is_wandb_available\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom modelscope import AutoTokenizer, MsDataset\\nfrom packaging import version\\nfrom PIL import Image\\nfrom torchvision import transforms\\nfrom torchvision.transforms.functional import crop\\nfrom tqdm.auto import tqdm\\nfrom transformers import PretrainedConfig\\n\\nfrom swift import LoRAConfig, Swift, get_peft_model_state_dict, push_to_hub, snapshot_download\\n\\nlogger = get_logger(__name__)\\n\\n\\n# TODO: This function should be removed once training scripts are rewritten in PEFT\\ndef text_encoder_lora_state_dict(text_encoder):\\n    state_dict = {}\\n\\n    def text_encoder_attn_modules(text_encoder):\\n        from transformers import CLIPTextModel, CLIPTextModelWithProjection\\n\\n        attn_modules = []\\n\\n        if isinstance(text_encoder, (CLIPTextModel, CLIPTextModelWithProjection)):\\n            for i, layer in enumerate(text_encoder.text_model.encoder.layers):\\n                name = f'text_model.encoder.layers.{i}.self_attn'\\n                mod = layer.self_attn\\n                attn_modules.append((name, mod))\\n\\n        return attn_modules\\n\\n    for name, module in text_encoder_attn_modules(text_encoder):\\n        for k, v in module.q_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.q_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.k_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.k_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.v_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.v_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.out_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.out_proj.lora_linear_layer.{k}'] = v\\n\\n    return state_dict\\n\\n\\ndef save_model_card(\\n    repo_id: str,\\n    images=None,\\n    base_model=str,\\n    dataset_name=str,\\n    train_text_encoder=False,\\n    repo_folder=None,\\n    vae_path=None,\\n):\\n    img_str = ''\\n    for i, image in enumerate(images):\\n        image.save(os.path.join(repo_folder, f'image_{i}.png'))\\n        img_str += f'![img_{i}](./image_{i}.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: creativeml-openrail-m\\nbase_model: {base_model}\\ndataset: {dataset_name}\\ntags:\\n- stable-diffusion-xl\\n- stable-diffusion-xl-diffusers\\n- text-to-image\\n- diffusers\\n- lora\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# LoRA text2image fine-tuning - {repo_id}\\n\\nThese are LoRA adaption weights for {base_model}. The weights were fine-tuned on the {dataset_name} dataset.\\nYou can find some example images in the following. \\\\n\\n{img_str}\\n\\nLoRA for the text encoder was enabled: {train_text_encoder}.\\n\\nSpecial VAE used for training: {vae_path}.\\n\\\"\\\"\\\"\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str,\\n                                               revision: str,\\n                                               subfolder: str = 'text_encoder'):\\n    text_encoder_config = PretrainedConfig.from_pretrained(\\n        pretrained_model_name_or_path, subfolder=subfolder, revision=revision)\\n    model_class = text_encoder_config.architectures[0]\\n\\n    if model_class == 'CLIPTextModel':\\n        from transformers import CLIPTextModel\\n\\n        return CLIPTextModel\\n    elif model_class == 'CLIPTextModelWithProjection':\\n        from transformers import CLIPTextModelWithProjection\\n\\n        return CLIPTextModelWithProjection\\n    else:\\n        raise ValueError(f'{model_class} is not supported.')\\n\\n\\ndef parse_args(input_args=None):\\n    parser = argparse.ArgumentParser(description='Simple example of a training script.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--pretrained_vae_model_name_or_path',\\n        type=str,\\n        default=None,\\n        help='Path to pretrained VAE model with better numerical stability. \\\\\\n        More details: https://github.com/huggingface/diffusers/pull/4038.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--dataset_name',\\n        type=str,\\n        default=None,\\n        help=('The name of the Dataset (from the HuggingFace hub) to train on (could be your own, possibly private,'\\n              ' dataset). It can also be a path pointing to a local copy of a dataset in your filesystem,'\\n              ' or to a folder containing files that 🤗 Datasets can understand.'),\\n    )\\n    parser.add_argument(\\n        '--dataset_config_name',\\n        type=str,\\n        default=None,\\n        help=\\\"The config of the Dataset, leave as None if there's only one config.\\\",\\n    )\\n    parser.add_argument(\\n        '--train_data_dir',\\n        type=str,\\n        default=None,\\n        help=('A folder containing the training data. Folder contents must follow the structure described in'\\n              ' https://huggingface.co/docs/datasets/image_dataset#imagefolder. In particular, a `metadata.jsonl` file'\\n              ' must exist to provide the captions for the images. Ignored if `dataset_name` is specified.'),\\n    )\\n    parser.add_argument(\\n        '--image_column', type=str, default='image:FILE', help='The column of the dataset containing an image.')\\n    parser.add_argument(\\n        '--caption_column',\\n        type=str,\\n        default='text',\\n        help='The column of the dataset containing a caption or a list of captions.',\\n    )\\n    parser.add_argument(\\n        '--validation_prompt',\\n        type=str,\\n        default=None,\\n        help='A prompt that is used during validation to verify that the model is learning.',\\n    )\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images that should be generated during validation with `validation_prompt`.',\\n    )\\n    parser.add_argument(\\n        '--validation_epochs',\\n        type=int,\\n        default=1,\\n        help=('Run fine-tuning validation every X epochs. The validation process consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`.'),\\n    )\\n    parser.add_argument(\\n        '--max_train_samples',\\n        type=int,\\n        default=None,\\n        help=('For debugging purposes or quicker training, truncate the number of training examples to this '\\n              'value if set.'),\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='sd-model-finetuned-lora',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument(\\n        '--cache_dir',\\n        type=str,\\n        default=None,\\n        help='The directory where the downloaded models and datasets will be stored.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=1024,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--center_crop',\\n        default=False,\\n        action='store_true',\\n        help=('Whether to center crop the input images to the resolution. If not set, the images will be randomly'\\n              ' cropped. The images will be resized to the resolution first before cropping.'),\\n    )\\n    parser.add_argument(\\n        '--random_flip',\\n        action='store_true',\\n        help='whether to randomly flip images horizontally',\\n    )\\n    parser.add_argument(\\n        '--train_text_encoder',\\n        action='store_true',\\n        help='Whether to train the text encoder. If set, the text encoder should be float32 precision.',\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=16, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--num_train_epochs', type=int, default=100)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=('Save a checkpoint of the training state every X updates. These checkpoints can be used both as final'\\n              ' checkpoints in case they are better than the last checkpoint, and are also suitable for resuming'\\n              ' training using `--resume_from_checkpoint`.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=1e-4,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--snr_gamma',\\n        type=float,\\n        default=None,\\n        help='SNR weighting gamma to be used if rebalancing the loss. Recommended value is 5.0. '\\n        'More details here: https://arxiv.org/abs/2303.09556.',\\n    )\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--prediction_type',\\n        type=str,\\n        default=None,\\n        help=\\\"The prediction_type that shall be used for training. Choose between 'epsilon' or 'v_prediction' or \\\\\\n        leave `None`. If left to `None` the default prediction type of the scheduler: \\\\\\n        `noise_scheduler.config.prediciton_type` is chosen.\\\",\\n    )\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument('--local_rank', type=int, default=-1, help='For distributed training: local_rank')\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument('--noise_offset', type=float, default=0, help='The scale of noise offset.')\\n    parser.add_argument(\\n        '--rank',\\n        type=int,\\n        default=4,\\n        help=('The dimension of the LoRA update matrices.'),\\n    )\\n\\n    if input_args is not None:\\n        args = parser.parse_args(input_args)\\n    else:\\n        args = parser.parse_args()\\n\\n    env_local_rank = int(os.environ.get('LOCAL_RANK', -1))\\n    if env_local_rank != -1 and env_local_rank != args.local_rank:\\n        args.local_rank = env_local_rank\\n\\n    # Sanity checks\\n    if args.dataset_name is None and args.train_data_dir is None:\\n        raise ValueError('Need either a dataset name or a training folder.')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    args.vae_base_model_id = args.pretrained_vae_model_name_or_path\\n    if args.pretrained_vae_model_name_or_path and not os.path.exists(args.pretrained_vae_model_name_or_path):\\n        args.pretrained_vae_model_name_or_path = snapshot_download(args.pretrained_vae_model_name_or_path)\\n    return args\\n\\n\\nDATASET_NAME_MAPPING = {\\n    'AI-ModelScope/pokemon-blip-captions': ('text', 'image:FILE'),\\n}\\n\\n\\ndef unet_attn_processors_state_dict(unet) -> Dict[str, torch.tensor]:\\n    \\\"\\\"\\\"\\n    Returns:\\n        a state dict containing just the attention processor parameters.\\n    \\\"\\\"\\\"\\n    attn_processors = unet.attn_processors\\n\\n    attn_processors_state_dict = {}\\n\\n    for attn_processor_key, attn_processor in attn_processors.items():\\n        for parameter_key, parameter in attn_processor.state_dict().items():\\n            attn_processors_state_dict[f'{attn_processor_key}.{parameter_key}'] = parameter\\n\\n    return attn_processors_state_dict\\n\\n\\ndef tokenize_prompt(tokenizer, prompt):\\n    text_inputs = tokenizer(\\n        prompt,\\n        padding='max_length',\\n        max_length=tokenizer.model_max_length,\\n        truncation=True,\\n        return_tensors='pt',\\n    )\\n    text_input_ids = text_inputs.input_ids\\n    return text_input_ids\\n\\n\\n# Adapted from pipelines.StableDiffusionXLPipeline.encode_prompt\\ndef encode_prompt(text_encoders, tokenizers, prompt, text_input_ids_list=None):\\n    prompt_embeds_list = []\\n\\n    for i, text_encoder in enumerate(text_encoders):\\n        if tokenizers is not None:\\n            tokenizer = tokenizers[i]\\n            text_input_ids = tokenize_prompt(tokenizer, prompt)\\n        else:\\n            assert text_input_ids_list is not None\\n            text_input_ids = text_input_ids_list[i]\\n\\n        prompt_embeds = text_encoder(\\n            text_input_ids.to(text_encoder.device),\\n            output_hidden_states=True,\\n        )\\n\\n        # We are only ALWAYS interested in the pooled output of the final text encoder\\n        pooled_prompt_embeds = prompt_embeds[0]\\n        prompt_embeds = prompt_embeds.hidden_states[-2]\\n        bs_embed, seq_len, _ = prompt_embeds.shape\\n        prompt_embeds = prompt_embeds.view(bs_embed, seq_len, -1)\\n        prompt_embeds_list.append(prompt_embeds)\\n\\n    prompt_embeds = torch.concat(prompt_embeds_list, dim=-1)\\n    pooled_prompt_embeds = pooled_prompt_embeds.view(bs_embed, -1)\\n    return prompt_embeds, pooled_prompt_embeds\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n    kwargs = DistributedDataParallelKwargs(find_unused_parameters=True)\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n        kwargs_handlers=[kwargs],\\n    )\\n\\n    if args.report_to == 'wandb':\\n        if not is_wandb_available():\\n            raise ImportError('Make sure to install wandb if you want to use it for logging during training.')\\n        import wandb\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        datasets.utils.logging.set_verbosity_warning()\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        datasets.utils.logging.set_verbosity_error()\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load the tokenizers\\n    tokenizer_one = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n    tokenizer_two = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer_2',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n\\n    # import correct text encoder classes\\n    text_encoder_cls_one = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)\\n    text_encoder_cls_two = import_model_class_from_model_name_or_path(\\n        args.pretrained_model_name_or_path, args.revision, subfolder='text_encoder_2')\\n\\n    # Load scheduler and models\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    text_encoder_one = text_encoder_cls_one.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n    text_encoder_two = text_encoder_cls_two.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder_2', revision=args.revision, variant=args.variant)\\n    vae_path = (\\n        args.pretrained_model_name_or_path\\n        if args.pretrained_vae_model_name_or_path is None else args.pretrained_vae_model_name_or_path)\\n    vae = AutoencoderKL.from_pretrained(\\n        vae_path,\\n        subfolder='vae' if args.pretrained_vae_model_name_or_path is None else None,\\n        revision=args.revision,\\n        variant=args.variant,\\n    )\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n\\n    # We only train the additional adapter LoRA layers\\n    vae.requires_grad_(False)\\n    text_encoder_one.requires_grad_(False)\\n    text_encoder_two.requires_grad_(False)\\n    unet.requires_grad_(False)\\n\\n    # For mixed precision training we cast all non-trainable weigths (vae, non-lora text_encoder and non-lora unet) to\\n    # half-precision\\n    # as these weights are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Move unet, vae and text_encoder to device and cast to weight_dtype\\n    # The VAE is in float32 to avoid NaN losses.\\n    unet.to(accelerator.device, dtype=weight_dtype)\\n    if args.pretrained_vae_model_name_or_path is None:\\n        vae.to(accelerator.device, dtype=torch.float32)\\n    else:\\n        vae.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder_one.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder_two.to(accelerator.device, dtype=weight_dtype)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn(\\n                    'xFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training, \\\\\\n                    please update xFormers to at least 0.0.17. \\\\\\n                    See https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    # now we will add new LoRA weights to the attention layers\\n    # Set correct lora layers\\n    unet_lora_config = LoRAConfig(\\n        r=args.rank, init_lora_weights='gaussian', target_modules=['to_k', 'to_q', 'to_v', 'to_out.0'])\\n\\n    unet = Swift.prepare_model(unet, unet_lora_config)\\n    if args.mixed_precision == 'fp16':\\n        for param in unet.parameters():\\n            # only upcast trainable parameters (LoRA) into fp32\\n            if param.requires_grad:\\n                param.data = param.to(torch.float32)\\n\\n    # The text encoder comes from 🤗 transformers, we will also attach adapters to it.\\n    if args.train_text_encoder:\\n        # ensure that dtype is float32, even if rest of the model that isn't trained is loaded in fp16\\n        text_lora_config = LoRAConfig(\\n            r=args.rank, init_lora_weights='gaussian', target_modules=['q_proj', 'k_proj', 'v_proj', 'out_proj'])\\n        text_encoder_one = Swift.prepare_model(text_encoder_one, text_lora_config)\\n        text_encoder_two = Swift.prepare_model(text_encoder_two, text_lora_config)\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Use 8-bit Adam for lower memory usage or to fine-tune the model in 16GB GPUs\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError('To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`.')\\n\\n        optimizer_class = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_class = torch.optim.AdamW\\n\\n    # Optimizer creation\\n    params_to_optimize = list(filter(lambda p: p.requires_grad, unet.parameters()))\\n    if args.train_text_encoder:\\n        params_to_optimize = (\\n            params_to_optimize + list(filter(lambda p: p.requires_grad, text_encoder_one.parameters()))\\n            + list(filter(lambda p: p.requires_grad, text_encoder_two.parameters())))\\n    optimizer = optimizer_class(\\n        params_to_optimize,\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    # Get the datasets: you can either provide your own training and evaluation files (see below)\\n    # or specify a Dataset from the hub (the dataset will be downloaded automatically from the datasets Hub).\\n\\n    # In distributed training, the load_dataset function guarantees that only one local process can concurrently\\n    # download the dataset.\\n    def path_to_img(example):\\n        example['image'] = Image.open(example['image:FILE'])\\n        return example\\n\\n    if args.dataset_name is not None:\\n        # Downloading and loading a dataset from the hub.\\n        dataset = MsDataset.load(\\n            args.dataset_name,\\n            args.dataset_config_name,\\n            data_dir=args.train_data_dir,\\n        )\\n        if not isinstance(dataset, dict):\\n            dataset = {'train': dataset}\\n    else:\\n        data_files = {}\\n        if args.train_data_dir is not None:\\n            data_files['train'] = os.path.join(args.train_data_dir, '**')\\n        dataset = load_dataset(\\n            'imagefolder',\\n            data_files=data_files,\\n            cache_dir=args.cache_dir,\\n        )\\n        # See more about loading custom images at\\n        # https://huggingface.co/docs/datasets/v2.4.0/en/image_load#imagefolder\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize inputs and targets.\\n    column_names = dataset['train'].column_names\\n\\n    # 6. Get the column names for input/target.\\n    dataset_columns = DATASET_NAME_MAPPING.get(args.dataset_name, None)\\n    if args.image_column is None:\\n        image_column = dataset_columns[1] if dataset_columns is not None else column_names[1]\\n    else:\\n        image_column = args.image_column\\n        if image_column not in column_names:\\n            raise ValueError(\\n                f\\\"--image_column' value '{args.image_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if args.caption_column is None:\\n        caption_column = dataset_columns[0] if dataset_columns is not None else column_names[0]\\n    else:\\n        caption_column = args.caption_column\\n        if caption_column not in column_names:\\n            raise ValueError(\\n                f\\\"--caption_column' value '{args.caption_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if image_column.endswith(':FILE'):\\n        dataset['train'] = dataset['train'].map(path_to_img)\\n        image_column = 'image'\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize input captions and transform the images.\\n    def tokenize_captions(examples, is_train=True):\\n        captions = []\\n        for caption in examples[caption_column]:\\n            if isinstance(caption, str):\\n                captions.append(caption)\\n            elif isinstance(caption, (list, np.ndarray)):\\n                # take a random caption if there are multiple\\n                captions.append(random.choice(caption) if is_train else caption[0])\\n            else:\\n                raise ValueError(\\n                    f'Caption column `{caption_column}` should contain either strings or lists of strings.')\\n        tokens_one = tokenize_prompt(tokenizer_one, captions)\\n        tokens_two = tokenize_prompt(tokenizer_two, captions)\\n        return tokens_one, tokens_two\\n\\n    # Preprocessing the datasets.\\n    train_resize = transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR)\\n    train_crop = transforms.CenterCrop(args.resolution) if args.center_crop else transforms.RandomCrop(args.resolution)\\n    train_flip = transforms.RandomHorizontalFlip(p=1.0)\\n    train_transforms = transforms.Compose([\\n        transforms.ToTensor(),\\n        transforms.Normalize([0.5], [0.5]),\\n    ])\\n\\n    def preprocess_train(examples):\\n        images = [image.convert('RGB') for image in examples[image_column]]\\n        # image aug\\n        original_sizes = []\\n        all_images = []\\n        crop_top_lefts = []\\n        for image in images:\\n            original_sizes.append((image.height, image.width))\\n            image = train_resize(image)\\n            if args.center_crop:\\n                y1 = max(0, int(round((image.height - args.resolution) / 2.0)))\\n                x1 = max(0, int(round((image.width - args.resolution) / 2.0)))\\n                image = train_crop(image)\\n            else:\\n                y1, x1, h, w = train_crop.get_params(image, (args.resolution, args.resolution))\\n                image = crop(image, y1, x1, h, w)\\n            if args.random_flip and random.random() < 0.5:\\n                # flip\\n                x1 = image.width - x1\\n                image = train_flip(image)\\n            crop_top_left = (y1, x1)\\n            crop_top_lefts.append(crop_top_left)\\n            image = train_transforms(image)\\n            all_images.append(image)\\n\\n        examples['original_sizes'] = original_sizes\\n        examples['crop_top_lefts'] = crop_top_lefts\\n        examples['pixel_values'] = all_images\\n        tokens_one, tokens_two = tokenize_captions(examples)\\n        examples['input_ids_one'] = tokens_one\\n        examples['input_ids_two'] = tokens_two\\n        return examples\\n\\n    with accelerator.main_process_first():\\n        if args.max_train_samples is not None:\\n            dataset['train'] = dataset['train'].shuffle(seed=args.seed).select(range(args.max_train_samples))\\n        # Set the training transforms\\n        train_dataset = dataset['train'].with_transform(preprocess_train)\\n\\n    def collate_fn(examples):\\n        pixel_values = torch.stack([example['pixel_values'] for example in examples])\\n        pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n        original_sizes = [example['original_sizes'] for example in examples]\\n        crop_top_lefts = [example['crop_top_lefts'] for example in examples]\\n        input_ids_one = torch.stack([example['input_ids_one'] for example in examples])\\n        input_ids_two = torch.stack([example['input_ids_two'] for example in examples])\\n        return {\\n            'pixel_values': pixel_values,\\n            'input_ids_one': input_ids_one,\\n            'input_ids_two': input_ids_two,\\n            'original_sizes': original_sizes,\\n            'crop_top_lefts': crop_top_lefts,\\n        }\\n\\n    # DataLoaders creation:\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        shuffle=True,\\n        collate_fn=collate_fn,\\n        batch_size=args.train_batch_size,\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * args.gradient_accumulation_steps,\\n        num_training_steps=args.max_train_steps * args.gradient_accumulation_steps,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    if args.train_text_encoder:\\n        unet, text_encoder_one, text_encoder_two, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(\\n            unet, text_encoder_one, text_encoder_two, optimizer, train_dataloader, lr_scheduler)\\n    else:\\n        unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader,\\n                                                                              lr_scheduler)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        accelerator.init_trackers('text2image-fine-tune', config=vars(args))\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the most recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        unet.train()\\n        if args.train_text_encoder:\\n            text_encoder_one.train()\\n            text_encoder_two.train()\\n        train_loss = 0.0\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(unet):\\n                # Convert images to latent space\\n                if args.pretrained_vae_model_name_or_path is not None:\\n                    pixel_values = batch['pixel_values'].to(dtype=weight_dtype)\\n                else:\\n                    pixel_values = batch['pixel_values']\\n\\n                model_input = vae.encode(pixel_values).latent_dist.sample()\\n                model_input = model_input * vae.config.scaling_factor\\n                if args.pretrained_vae_model_name_or_path is None:\\n                    model_input = model_input.to(weight_dtype)\\n\\n                # Sample noise that we'll add to the latents\\n                noise = torch.randn_like(model_input)\\n                if args.noise_offset:\\n                    # https://www.crosslabs.org//blog/diffusion-with-offset-noise\\n                    noise += args.noise_offset * torch.randn(\\n                        (model_input.shape[0], model_input.shape[1], 1, 1), device=model_input.device)\\n\\n                bsz = model_input.shape[0]\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(\\n                    0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=model_input.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the model input according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_model_input = noise_scheduler.add_noise(model_input, noise, timesteps)\\n\\n                # time ids\\n                def compute_time_ids(original_size, crops_coords_top_left):\\n                    # Adapted from pipeline.StableDiffusionXLPipeline._get_add_time_ids\\n                    target_size = (args.resolution, args.resolution)\\n                    add_time_ids = list(original_size + crops_coords_top_left + target_size)\\n                    add_time_ids = torch.tensor([add_time_ids])\\n                    add_time_ids = add_time_ids.to(accelerator.device, dtype=weight_dtype)\\n                    return add_time_ids\\n\\n                add_time_ids = torch.cat(\\n                    [compute_time_ids(s, c) for s, c in zip(batch['original_sizes'], batch['crop_top_lefts'])])\\n\\n                # Predict the noise residual\\n                unet_added_conditions = {'time_ids': add_time_ids}\\n                prompt_embeds, pooled_prompt_embeds = encode_prompt(\\n                    text_encoders=[text_encoder_one, text_encoder_two],\\n                    tokenizers=None,\\n                    prompt=None,\\n                    text_input_ids_list=[batch['input_ids_one'], batch['input_ids_two']],\\n                )\\n                unet_added_conditions.update({'text_embeds': pooled_prompt_embeds})\\n                model_pred = unet(\\n                    noisy_model_input, timesteps, prompt_embeds, added_cond_kwargs=unet_added_conditions).sample\\n\\n                # Get the target for loss depending on the prediction type\\n                if args.prediction_type is not None:\\n                    # set prediction_type of scheduler if defined\\n                    noise_scheduler.register_to_config(prediction_type=args.prediction_type)\\n\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(model_input, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n                if args.snr_gamma is None:\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n                else:\\n                    # Compute loss-weights as per Section 3.4 of https://arxiv.org/abs/2303.09556.\\n                    # Since we predict the noise instead of x_0, the original formulation is slightly changed.\\n                    # This is discussed in Section 4.2 of the same paper.\\n                    snr = compute_snr(noise_scheduler, timesteps)\\n                    if noise_scheduler.config.prediction_type == 'v_prediction':\\n                        # Velocity objective requires that we add one to SNR values before we divide by them.\\n                        snr = snr + 1\\n                    mse_loss_weights = (\\n                        torch.stack([snr, args.snr_gamma * torch.ones_like(timesteps)], dim=1).min(dim=1)[0] / snr)\\n\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='none')\\n                    loss = loss.mean(dim=list(range(1, len(loss.shape)))) * mse_loss_weights\\n                    loss = loss.mean()\\n\\n                # Gather the losses across all processes for logging (if we use distributed training).\\n                avg_loss = accelerator.gather(loss.repeat(args.train_batch_size)).mean()\\n                train_loss += avg_loss.item() / args.gradient_accumulation_steps\\n\\n                # Backpropagate\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    accelerator.clip_grad_norm_(params_to_optimize, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad()\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n                accelerator.log({'train_loss': train_loss}, step=global_step)\\n                train_loss = 0.0\\n\\n                if accelerator.is_main_process:\\n                    if global_step % args.checkpointing_steps == 0:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint, we need to have at _most_ \\\\\\n                            # `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        logger.info(f'Saved state to {save_path}')\\n\\n            logs = {'step_loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n        if accelerator.is_main_process:\\n            if args.validation_prompt is not None and epoch % args.validation_epochs == 0:\\n                logger.info(f'Running validation... \\\\n Generating {args.num_validation_images} images with prompt:'\\n                            f' {args.validation_prompt}.')\\n                # create pipeline\\n                pipeline = StableDiffusionXLPipeline.from_pretrained(\\n                    args.pretrained_model_name_or_path,\\n                    vae=vae,\\n                    text_encoder=accelerator.unwrap_model(text_encoder_one),\\n                    text_encoder_2=accelerator.unwrap_model(text_encoder_two),\\n                    unet=accelerator.unwrap_model(unet.base_model),\\n                    revision=args.revision,\\n                    variant=args.variant,\\n                    torch_dtype=weight_dtype,\\n                )\\n\\n                pipeline = pipeline.to(accelerator.device)\\n                pipeline.set_progress_bar_config(disable=True)\\n\\n                # run inference\\n                generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n                pipeline_args = {'prompt': args.validation_prompt}\\n\\n                with torch.cuda.amp.autocast():\\n                    images = [\\n                        pipeline(**pipeline_args, generator=generator).images[0]\\n                        for _ in range(args.num_validation_images)\\n                    ]\\n\\n                for tracker in accelerator.trackers:\\n                    if tracker.name == 'tensorboard':\\n                        np_images = np.stack([np.asarray(img) for img in images])\\n                        tracker.writer.add_images('validation', np_images, epoch, dataformats='NHWC')\\n                    if tracker.name == 'wandb':\\n                        tracker.log({\\n                            'validation': [\\n                                wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                                for i, image in enumerate(images)\\n                            ]\\n                        })\\n\\n                del pipeline\\n                torch.cuda.empty_cache()\\n\\n    # Save the lora layers\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        unet = accelerator.unwrap_model(unet)\\n        unet.save_pretrained(os.path.join(args.output_dir, 'unet'))\\n\\n        if args.train_text_encoder:\\n            text_encoder_one = accelerator.unwrap_model(text_encoder_one)\\n            text_encoder_one.save_pretrained(os.path.join(args.output_dir, 'text_encoder1'))\\n            text_encoder_two = accelerator.unwrap_model(text_encoder_two)\\n            text_encoder_two.save_pretrained(os.path.join(args.output_dir, 'text_encoder2'))\\n\\n        del unet\\n        del text_encoder_one\\n        del text_encoder_two\\n        torch.cuda.empty_cache()\\n\\n        # Final inference\\n        # Load previous pipeline\\n        pipeline = StableDiffusionXLPipeline.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            vae=vae,\\n            revision=args.revision,\\n            variant=args.variant,\\n            torch_dtype=weight_dtype,\\n        )\\n        pipeline = pipeline.to(accelerator.device)\\n\\n        # load attention processors\\n        pipeline.unet = Swift.from_pretrained(pipeline.unet, os.path.join(args.output_dir, 'unet'))\\n        if args.train_text_encoder:\\n            pipeline.text_encoder_one = Swift.from_pretrained(pipeline.text_encoder_one,\\n                                                              os.path.join(args.output_dir, 'text_encoder1'))\\n            pipeline.text_encoder_two = Swift.from_pretrained(pipeline.text_encoder_two,\\n                                                              os.path.join(args.output_dir, 'text_encoder2'))\\n\\n        # run inference\\n        images = []\\n        if args.validation_prompt and args.num_validation_images > 0:\\n            generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n            images = [\\n                pipeline(args.validation_prompt, num_inference_steps=25, generator=generator).images[0]\\n                for _ in range(args.num_validation_images)\\n            ]\\n\\n            for tracker in accelerator.trackers:\\n                if tracker.name == 'tensorboard':\\n                    np_images = np.stack([np.asarray(img) for img in images])\\n                    tracker.writer.add_images('test', np_images, epoch, dataformats='NHWC')\\n                if tracker.name == 'wandb':\\n                    tracker.log({\\n                        'test': [\\n                            wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                            for i, image in enumerate(images)\\n                        ]\\n                    })\\n\\n        if args.push_to_hub:\\n            save_model_card(\\n                args.hub_model_id,\\n                images=images,\\n                base_model=args.base_model_id,\\n                dataset_name=args.dataset_name,\\n                train_text_encoder=args.train_text_encoder,\\n                repo_folder=args.output_dir,\\n                vae_path=args.vae_base_model_id,\\n            )\\n            push_to_hub(\\n                args.hub_model_id,\\n                args.output_dir,\\n                args.hub_token,\\n            )\\n\\n    accelerator.end_training()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import DiffusionPipeline, DPMSolverMultistepScheduler\\nfrom modelscope import snapshot_download\\n\\nfrom swift import Swift\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a text to image inference.')\\n    parser.add_argument(\\n        '--base_model_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-v1-5',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--lora_model_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained lora model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=50,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.base_model_path):\\n        base_model_path = args.base_model_path\\n    else:\\n        base_model_path = snapshot_download(args.base_model_path, revision=args.revision)\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    pipe = DiffusionPipeline.from_pretrained(base_model_path, torch_dtype=torch_dtype)\\n    pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)\\n    if args.lora_model_path is not None:\\n        pipe.unet = Swift.from_pretrained(pipe.unet, args.lora_model_path)\\n    pipe.to('cuda')\\n\\n    image = pipe(args.prompt, num_inference_steps=args.num_inference_steps).images[0]\\n\\n    image.save(args.image_save_path)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import ControlNetModel, StableDiffusionControlNetPipeline, UniPCMultistepScheduler\\nfrom diffusers.utils import load_image\\nfrom modelscope import snapshot_download\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a ControlNet inference.')\\n    parser.add_argument(\\n        '--base_model_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-v1-5',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--controlnet_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained controlnet model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--control_image_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to conditioning image.',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for inference.')\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=20,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.base_model_path):\\n        base_model_path = args.base_model_path\\n    else:\\n        base_model_path = snapshot_download(args.base_model_path, revision=args.revision)\\n\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    controlnet = ControlNetModel.from_pretrained(args.controlnet_path, torch_dtype=torch_dtype)\\n    pipe = StableDiffusionControlNetPipeline.from_pretrained(\\n        base_model_path, controlnet=controlnet, torch_dtype=torch_dtype)\\n\\n    # speed up diffusion process with faster scheduler and memory optimization\\n    pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)\\n\\n    # memory optimization.\\n    pipe.enable_model_cpu_offload()\\n\\n    control_image = load_image(args.control_image_path)\\n\\n    # generate image\\n    generator = torch.manual_seed(args.seed)\\n    image = pipe(\\n        args.prompt, num_inference_steps=args.num_inference_steps, generator=generator, image=control_image).images[0]\\n    image.save(args.image_save_path)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import StableDiffusionPipeline, UNet2DConditionModel\\nfrom modelscope import snapshot_download\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a text to image inference.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-v1-5',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--unet_model_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained unet model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=50,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.pretrained_model_name_or_path):\\n        model_path = args.pretrained_model_name_or_path\\n    else:\\n        model_path = snapshot_download(args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    pipe = StableDiffusionPipeline.from_pretrained(model_path, torch_dtype=torch_dtype)\\n    if args.unet_model_path is not None:\\n        pipe.unet = UNet2DConditionModel.from_pretrained(args.unet_model_path, torch_dtype=torch_dtype)\\n    pipe.to('cuda')\\n    image = pipe(\\n        prompt=args.prompt, num_inference_steps=args.num_inference_steps, guidance_scale=args.guidance_scale).images[0]\\n    image.save(args.image_save_path)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import StableDiffusionPipeline\\nfrom modelscope import snapshot_download\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a dreambooth inference.')\\n    parser.add_argument(\\n        '--model_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to trained model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=50,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    pipe = StableDiffusionPipeline.from_pretrained(args.model_path, torch_dtype=torch_dtype).to('cuda')\\n\\n    image = pipe(\\n        args.prompt, num_inference_steps=args.num_inference_steps, guidance_scale=args.guidance_scale).images[0]\\n\\n    image.save(args.image_save_path)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import DiffusionPipeline, UNet2DConditionModel\\nfrom modelscope import snapshot_download\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a text to image inference.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-v1-5',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--unet_model_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained unet model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=30,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.pretrained_model_name_or_path):\\n        model_path = args.pretrained_model_name_or_path\\n    else:\\n        model_path = snapshot_download(args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    pipe = DiffusionPipeline.from_pretrained(model_path, torch_dtype=torch_dtype)\\n    if args.unet_model_path is not None:\\n        pipe.unet = UNet2DConditionModel.from_pretrained(args.unet_model_path, torch_dtype=torch_dtype)\\n    pipe.to('cuda')\\n    image = pipe(\\n        prompt=args.prompt, num_inference_steps=args.num_inference_steps, guidance_scale=args.guidance_scale).images[0]\\n    image.save(args.image_save_path)\\n\\n\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n# limitations under the License.\\n\\\"\\\"\\\"Fine-tuning script for Stable Diffusion for text2image with support for LoRA.\\\"\\\"\\\"\\n\\nimport argparse\\nimport logging\\nimport math\\nimport os\\nimport random\\nimport shutil\\nfrom pathlib import Path\\n\\nimport datasets\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import ProjectConfiguration, set_seed\\nfrom datasets import load_dataset\\nfrom diffusers import AutoencoderKL, DDPMScheduler, DiffusionPipeline, UNet2DConditionModel\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.training_utils import compute_snr\\nfrom diffusers.utils import check_min_version, is_wandb_available\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom modelscope import MsDataset\\nfrom packaging import version\\nfrom peft.utils import get_peft_model_state_dict\\nfrom PIL import Image\\nfrom torchvision import transforms\\nfrom tqdm.auto import tqdm\\nfrom transformers import CLIPTextModel, CLIPTokenizer\\n\\nfrom swift import LoRAConfig, Swift, push_to_hub, snapshot_download\\n\\nlogger = get_logger(__name__, log_level='INFO')\\n\\n\\n# TODO: This function should be removed once training scripts are rewritten in PEFT\\ndef text_encoder_lora_state_dict(text_encoder):\\n    state_dict = {}\\n\\n    def text_encoder_attn_modules(text_encoder):\\n        from transformers import CLIPTextModel, CLIPTextModelWithProjection\\n\\n        attn_modules = []\\n\\n        if isinstance(text_encoder, (CLIPTextModel, CLIPTextModelWithProjection)):\\n            for i, layer in enumerate(text_encoder.text_model.encoder.layers):\\n                name = f'text_model.encoder.layers.{i}.self_attn'\\n                mod = layer.self_attn\\n                attn_modules.append((name, mod))\\n\\n        return attn_modules\\n\\n    for name, module in text_encoder_attn_modules(text_encoder):\\n        for k, v in module.q_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.q_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.k_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.k_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.v_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.v_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.out_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.out_proj.lora_linear_layer.{k}'] = v\\n\\n    return state_dict\\n\\n\\ndef save_model_card(repo_id: str, images=None, base_model=str, dataset_name=str, repo_folder=None):\\n    img_str = ''\\n    for i, image in enumerate(images):\\n        image.save(os.path.join(repo_folder, f'image_{i}.png'))\\n        img_str += f'![img_{i}](./image_{i}.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: creativeml-openrail-m\\nbase_model: {base_model}\\ntags:\\n- stable-diffusion\\n- stable-diffusion-diffusers\\n- text-to-image\\n- diffusers\\n- lora\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# LoRA text2image fine-tuning - {repo_id}\\nThese are LoRA adaption weights for {base_model}. The weights were fine-tuned on the {dataset_name} dataset.\\nYou can find some example images in the following. \\\\n\\n{img_str}\\n\\\"\\\"\\\"\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a training script.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--dataset_name',\\n        type=str,\\n        default=None,\\n        help=('The name of the Dataset (from the HuggingFace hub) to train on (could be your own, possibly private,'\\n              ' dataset). It can also be a path pointing to a local copy of a dataset in your filesystem,'\\n              ' or to a folder containing files that 🤗 Datasets can understand.'),\\n    )\\n    parser.add_argument(\\n        '--dataset_config_name',\\n        type=str,\\n        default=None,\\n        help=\\\"The config of the Dataset, leave as None if there's only one config.\\\",\\n    )\\n    parser.add_argument(\\n        '--train_data_dir',\\n        type=str,\\n        default=None,\\n        help=('A folder containing the training data. Folder contents must follow the structure described in'\\n              ' https://huggingface.co/docs/datasets/image_dataset#imagefolder. In particular, a `metadata.jsonl` file'\\n              ' must exist to provide the captions for the images. Ignored if `dataset_name` is specified.'),\\n    )\\n    parser.add_argument(\\n        '--image_column', type=str, default='image:FILE', help='The column of the dataset containing an image.')\\n    parser.add_argument(\\n        '--caption_column',\\n        type=str,\\n        default='text',\\n        help='The column of the dataset containing a caption or a list of captions.',\\n    )\\n    parser.add_argument(\\n        '--validation_prompt', type=str, default=None, help='A prompt that is sampled during training for inference.')\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images that should be generated during validation with `validation_prompt`.',\\n    )\\n    parser.add_argument(\\n        '--validation_epochs',\\n        type=int,\\n        default=1,\\n        help=('Run fine-tuning validation every X epochs. The validation process consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`.'),\\n    )\\n    parser.add_argument(\\n        '--max_train_samples',\\n        type=int,\\n        default=None,\\n        help=('For debugging purposes or quicker training, truncate the number of training examples to this '\\n              'value if set.'),\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='sd-model-finetuned-lora',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument(\\n        '--cache_dir',\\n        type=str,\\n        default=None,\\n        help='The directory where the downloaded models and datasets will be stored.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=512,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--center_crop',\\n        default=False,\\n        action='store_true',\\n        help=('Whether to center crop the input images to the resolution. If not set, the images will be randomly'\\n              ' cropped. The images will be resized to the resolution first before cropping.'),\\n    )\\n    parser.add_argument(\\n        '--random_flip',\\n        action='store_true',\\n        help='whether to randomly flip images horizontally',\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=16, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--num_train_epochs', type=int, default=100)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=1e-4,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--snr_gamma',\\n        type=float,\\n        default=None,\\n        help='SNR weighting gamma to be used if rebalancing the loss. Recommended value is 5.0. '\\n        'More details here: https://arxiv.org/abs/2303.09556.',\\n    )\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--prediction_type',\\n        type=str,\\n        default=None,\\n        help=\\\"The prediction_type that shall be used for training. Choose between 'epsilon' or 'v_prediction' or \\\\\\n        leave `None`. If left to `None` the default prediction type of the scheduler: \\\\\\n        `noise_scheduler.config.prediciton_type` is chosen.\\\",\\n    )\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument('--local_rank', type=int, default=-1, help='For distributed training: local_rank')\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=(\\n            'Save a checkpoint of the training state every X updates. These checkpoints are only suitable for resuming'\\n            ' training using `--resume_from_checkpoint`.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument('--noise_offset', type=float, default=0, help='The scale of noise offset.')\\n    parser.add_argument(\\n        '--rank',\\n        type=int,\\n        default=4,\\n        help=('The dimension of the LoRA update matrices.'),\\n    )\\n\\n    args = parser.parse_args()\\n    env_local_rank = int(os.environ.get('LOCAL_RANK', -1))\\n    if env_local_rank != -1 and env_local_rank != args.local_rank:\\n        args.local_rank = env_local_rank\\n\\n    # Sanity checks\\n    if args.dataset_name is None and args.train_data_dir is None:\\n        raise ValueError('Need either a dataset name or a training folder.')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n    return args\\n\\n\\nDATASET_NAME_MAPPING = {\\n    'AI-ModelScope/pokemon-blip-captions': ('text', 'image:FILE'),\\n}\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n    )\\n    if args.report_to == 'wandb':\\n        if not is_wandb_available():\\n            raise ImportError('Make sure to install wandb if you want to use it for logging during training.')\\n        import wandb\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        datasets.utils.logging.set_verbosity_warning()\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        datasets.utils.logging.set_verbosity_error()\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load scheduler, tokenizer and models.\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    tokenizer = CLIPTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='tokenizer', revision=args.revision)\\n    text_encoder = CLIPTextModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision)\\n    vae = AutoencoderKL.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='vae', revision=args.revision, variant=args.variant)\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n    # freeze parameters of models to save more memory\\n    unet.requires_grad_(False)\\n    vae.requires_grad_(False)\\n    text_encoder.requires_grad_(False)\\n\\n    # For mixed precision training we cast all non-trainable weigths (vae, non-lora text_encoder and non-lora unet) to\\n    # half-precision\\n    # as these weights are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Freeze the unet parameters before adding adapters\\n    for param in unet.parameters():\\n        param.requires_grad_(False)\\n\\n    unet_lora_config = LoRAConfig(\\n        r=args.rank, init_lora_weights='gaussian', target_modules=['to_k', 'to_q', 'to_v', 'to_out.0'])\\n\\n    # Move unet, vae and text_encoder to device and cast to weight_dtype\\n    unet.to(accelerator.device, dtype=weight_dtype)\\n    vae.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder.to(accelerator.device, dtype=weight_dtype)\\n\\n    unet = Swift.prepare_model(unet, unet_lora_config)\\n    if args.mixed_precision == 'fp16':\\n        for param in unet.parameters():\\n            # only upcast trainable parameters (LoRA) into fp32\\n            if param.requires_grad:\\n                param.data = param.to(torch.float32)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn('xFormers 0.0.16 cannot be used for training in some GPUs. \\\\\\n                    If you observe problems during training, please update xFormers to at least 0.0.17. \\\\\\n                    See https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    lora_layers = filter(lambda p: p.requires_grad, unet.parameters())\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Initialize the optimizer\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError(\\n                'Please install bitsandbytes to use 8-bit Adam. You can do so by running `pip install bitsandbytes`')\\n\\n        optimizer_cls = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_cls = torch.optim.AdamW\\n\\n    optimizer = optimizer_cls(\\n        lora_layers,\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    # Get the datasets: you can either provide your own training and evaluation files (see below)\\n    # or specify a Dataset from the hub (the dataset will be downloaded automatically from the datasets Hub).\\n\\n    # In distributed training, the load_dataset function guarantees that only one local process can concurrently\\n    # download the dataset.\\n    def path_to_img(example):\\n        example['image'] = Image.open(example['image:FILE'])\\n        return example\\n\\n    if args.dataset_name is not None:\\n        # Downloading and loading a dataset from the hub.\\n        dataset = MsDataset.load(\\n            args.dataset_name,\\n            args.dataset_config_name,\\n            data_dir=args.train_data_dir,\\n        )\\n        if not isinstance(dataset, dict):\\n            dataset = {'train': dataset}\\n    else:\\n        data_files = {}\\n        if args.train_data_dir is not None:\\n            data_files['train'] = os.path.join(args.train_data_dir, '**')\\n        dataset = load_dataset(\\n            'imagefolder',\\n            data_files=data_files,\\n            cache_dir=args.cache_dir,\\n        )\\n        # See more about loading custom images at\\n        # https://huggingface.co/docs/datasets/v2.4.0/en/image_load#imagefolder\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize inputs and targets.\\n    column_names = dataset['train'].column_names\\n\\n    # 6. Get the column names for input/target.\\n    dataset_columns = DATASET_NAME_MAPPING.get(args.dataset_name, None)\\n    if args.image_column is None:\\n        image_column = dataset_columns[1] if dataset_columns is not None else column_names[1]\\n    else:\\n        image_column = args.image_column\\n        if image_column not in column_names:\\n            raise ValueError(\\n                f\\\"--image_column' value '{args.image_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if args.caption_column is None:\\n        caption_column = dataset_columns[0] if dataset_columns is not None else column_names[0]\\n    else:\\n        caption_column = args.caption_column\\n        if caption_column not in column_names:\\n            raise ValueError(\\n                f\\\"--caption_column' value '{args.caption_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if image_column.endswith(':FILE'):\\n        dataset['train'] = dataset['train'].map(path_to_img)\\n        image_column = 'image'\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize input captions and transform the images.\\n    def tokenize_captions(examples, is_train=True):\\n        captions = []\\n        for caption in examples[caption_column]:\\n            if isinstance(caption, str):\\n                captions.append(caption)\\n            elif isinstance(caption, (list, np.ndarray)):\\n                # take a random caption if there are multiple\\n                captions.append(random.choice(caption) if is_train else caption[0])\\n            else:\\n                raise ValueError(\\n                    f'Caption column `{caption_column}` should contain either strings or lists of strings.')\\n        inputs = tokenizer(\\n            captions, max_length=tokenizer.model_max_length, padding='max_length', truncation=True, return_tensors='pt')\\n        return inputs.input_ids\\n\\n    # Preprocessing the datasets.\\n    train_transforms = transforms.Compose([\\n        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),\\n        transforms.CenterCrop(args.resolution) if args.center_crop else transforms.RandomCrop(args.resolution),\\n        transforms.RandomHorizontalFlip() if args.random_flip else transforms.Lambda(lambda x: x),\\n        transforms.ToTensor(),\\n        transforms.Normalize([0.5], [0.5]),\\n    ])\\n\\n    def preprocess_train(examples):\\n        images = [image.convert('RGB') for image in examples[image_column]]\\n        examples['pixel_values'] = [train_transforms(image) for image in images]\\n        examples['input_ids'] = tokenize_captions(examples)\\n        return examples\\n\\n    with accelerator.main_process_first():\\n        if args.max_train_samples is not None:\\n            dataset['train'] = dataset['train'].shuffle(seed=args.seed).select(range(args.max_train_samples))\\n        # Set the training transforms\\n        train_dataset = dataset['train'].with_transform(preprocess_train)\\n\\n    def collate_fn(examples):\\n        pixel_values = torch.stack([example['pixel_values'] for example in examples])\\n        pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n        input_ids = torch.stack([example['input_ids'] for example in examples])\\n        return {'pixel_values': pixel_values, 'input_ids': input_ids}\\n\\n    # DataLoaders creation:\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        shuffle=True,\\n        collate_fn=collate_fn,\\n        batch_size=args.train_batch_size,\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * accelerator.num_processes,\\n        num_training_steps=args.max_train_steps * accelerator.num_processes,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader,\\n                                                                          lr_scheduler)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        accelerator.init_trackers('text2image-fine-tune', config=vars(args))\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the most recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        unet.train()\\n        train_loss = 0.0\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(unet):\\n                # Convert images to latent space\\n                latents = vae.encode(batch['pixel_values'].to(dtype=weight_dtype)).latent_dist.sample()\\n                latents = latents * vae.config.scaling_factor\\n\\n                # Sample noise that we'll add to the latents\\n                noise = torch.randn_like(latents)\\n                if args.noise_offset:\\n                    # https://www.crosslabs.org//blog/diffusion-with-offset-noise\\n                    noise += args.noise_offset * torch.randn(\\n                        (latents.shape[0], latents.shape[1], 1, 1), device=latents.device)\\n\\n                bsz = latents.shape[0]\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=latents.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the latents according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)\\n\\n                # Get the text embedding for conditioning\\n                encoder_hidden_states = text_encoder(batch['input_ids'])[0]\\n\\n                # Get the target for loss depending on the prediction type\\n                if args.prediction_type is not None:\\n                    # set prediction_type of scheduler if defined\\n                    noise_scheduler.register_to_config(prediction_type=args.prediction_type)\\n\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(latents, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n                # Predict the noise residual and compute loss\\n                model_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample\\n\\n                if args.snr_gamma is None:\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n                else:\\n                    # Compute loss-weights as per Section 3.4 of https://arxiv.org/abs/2303.09556.\\n                    # Since we predict the noise instead of x_0, the original formulation is slightly changed.\\n                    # This is discussed in Section 4.2 of the same paper.\\n                    snr = compute_snr(noise_scheduler, timesteps)\\n                    if noise_scheduler.config.prediction_type == 'v_prediction':\\n                        # Velocity objective requires that we add one to SNR values before we divide by them.\\n                        snr = snr + 1\\n                    mse_loss_weights = (\\n                        torch.stack([snr, args.snr_gamma * torch.ones_like(timesteps)], dim=1).min(dim=1)[0] / snr)\\n\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='none')\\n                    loss = loss.mean(dim=list(range(1, len(loss.shape)))) * mse_loss_weights\\n                    loss = loss.mean()\\n\\n                # Gather the losses across all processes for logging (if we use distributed training).\\n                avg_loss = accelerator.gather(loss.repeat(args.train_batch_size)).mean()\\n                train_loss += avg_loss.item() / args.gradient_accumulation_steps\\n\\n                # Backpropagate\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    params_to_clip = lora_layers\\n                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad()\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n                accelerator.log({'train_loss': train_loss}, step=global_step)\\n                train_loss = 0.0\\n\\n                if global_step % args.checkpointing_steps == 0:\\n                    if accelerator.is_main_process:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint, we need to have at _most_ \\\\\\n                            # `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n\\n                        unet.save_pretrained(save_path)\\n                        logger.info(f'Saved state to {save_path}')\\n\\n            logs = {'step_loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n        if accelerator.is_main_process:\\n            if args.validation_prompt is not None and epoch % args.validation_epochs == 0:\\n                logger.info(f'Running validation... \\\\n Generating {args.num_validation_images} images with prompt:'\\n                            f' {args.validation_prompt}.')\\n                # create pipeline\\n                pipeline = DiffusionPipeline.from_pretrained(\\n                    args.pretrained_model_name_or_path,\\n                    unet=accelerator.unwrap_model(unet.base_model),\\n                    revision=args.revision,\\n                    variant=args.variant,\\n                    torch_dtype=weight_dtype,\\n                )\\n                pipeline = pipeline.to(accelerator.device)\\n                pipeline.set_progress_bar_config(disable=True)\\n\\n                # run inference\\n                generator = torch.Generator(device=accelerator.device)\\n                if args.seed is not None:\\n                    generator = generator.manual_seed(args.seed)\\n                images = []\\n                for _ in range(args.num_validation_images):\\n                    images.append(\\n                        pipeline(args.validation_prompt, num_inference_steps=30, generator=generator).images[0])\\n\\n                for tracker in accelerator.trackers:\\n                    if tracker.name == 'tensorboard':\\n                        np_images = np.stack([np.asarray(img) for img in images])\\n                        tracker.writer.add_images('validation', np_images, epoch, dataformats='NHWC')\\n                    if tracker.name == 'wandb':\\n                        tracker.log({\\n                            'validation': [\\n                                wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                                for i, image in enumerate(images)\\n                            ]\\n                        })\\n\\n                del pipeline\\n                torch.cuda.empty_cache()\\n\\n    # Save the lora layers\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        unet = unet.to(torch.float32)\\n\\n        unet.save_pretrained(args.output_dir)\\n\\n        if args.push_to_hub:\\n            save_model_card(\\n                args.hub_model_id,\\n                images=images,\\n                base_model=args.base_model_id,\\n                dataset_name=args.dataset_name,\\n                repo_folder=args.output_dir,\\n            )\\n            push_to_hub(args.hub_model_id, args.output_dir, args.hub_token)\\n\\n    # Final inference\\n    # Load previous pipeline\\n    pipeline = DiffusionPipeline.from_pretrained(\\n        args.pretrained_model_name_or_path, revision=args.revision, variant=args.variant, torch_dtype=weight_dtype)\\n    pipeline = pipeline.to(accelerator.device)\\n\\n    # load attention processors\\n    pipeline.unet = Swift.from_pretrained(pipeline.unet, args.output_dir)\\n\\n    # run inference\\n    generator = torch.Generator(device=accelerator.device)\\n    if args.seed is not None:\\n        generator = generator.manual_seed(args.seed)\\n    images = []\\n    for _ in range(args.num_validation_images):\\n        images.append(pipeline(args.validation_prompt, num_inference_steps=30, generator=generator).images[0])\\n\\n    if accelerator.is_main_process:\\n        for tracker in accelerator.trackers:\\n            if len(images) != 0:\\n                if tracker.name == 'tensorboard':\\n                    np_images = np.stack([np.asarray(img) for img in images])\\n                    tracker.writer.add_images('test', np_images, epoch, dataformats='NHWC')\\n                if tracker.name == 'wandb':\\n                    tracker.log({\\n                        'test': [\\n                            wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                            for i, image in enumerate(images)\\n                        ]\\n                    })\\n\\n    accelerator.end_training()\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n\\nimport argparse\\nimport copy\\nimport gc\\nimport logging\\nimport math\\nimport os\\nimport shutil\\nimport warnings\\nfrom pathlib import Path\\n\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import ProjectConfiguration, set_seed\\nfrom diffusers import (AutoencoderKL, DDPMScheduler, DiffusionPipeline, DPMSolverMultistepScheduler,\\n                       StableDiffusionPipeline, UNet2DConditionModel)\\nfrom diffusers.loaders import LoraLoaderMixin\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.utils import check_min_version, is_wandb_available\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom huggingface_hub.utils import insecure_hashlib\\nfrom modelscope import AutoTokenizer\\nfrom packaging import version\\nfrom PIL import Image\\nfrom PIL.ImageOps import exif_transpose\\nfrom torch.utils.data import Dataset\\nfrom torchvision import transforms\\nfrom tqdm.auto import tqdm\\nfrom transformers import PretrainedConfig\\n\\nfrom swift import LoRAConfig, Swift, push_to_hub, snapshot_download\\n\\nlogger = get_logger(__name__)\\n\\n\\n# TODO: This function should be removed once training scripts are rewritten in PEFT\\ndef text_encoder_lora_state_dict(text_encoder):\\n    state_dict = {}\\n\\n    def text_encoder_attn_modules(text_encoder):\\n        from transformers import CLIPTextModel, CLIPTextModelWithProjection\\n\\n        attn_modules = []\\n\\n        if isinstance(text_encoder, (CLIPTextModel, CLIPTextModelWithProjection)):\\n            for i, layer in enumerate(text_encoder.text_model.encoder.layers):\\n                name = f'text_model.encoder.layers.{i}.self_attn'\\n                mod = layer.self_attn\\n                attn_modules.append((name, mod))\\n\\n        return attn_modules\\n\\n    for name, module in text_encoder_attn_modules(text_encoder):\\n        for k, v in module.q_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.q_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.k_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.k_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.v_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.v_proj.lora_linear_layer.{k}'] = v\\n\\n        for k, v in module.out_proj.lora_linear_layer.state_dict().items():\\n            state_dict[f'{name}.out_proj.lora_linear_layer.{k}'] = v\\n\\n    return state_dict\\n\\n\\ndef save_model_card(\\n    repo_id: str,\\n    images=None,\\n    base_model=str,\\n    train_text_encoder=False,\\n    prompt=str,\\n    repo_folder=None,\\n    pipeline: DiffusionPipeline = None,\\n):\\n    img_str = ''\\n    for i, image in enumerate(images):\\n        image.save(os.path.join(repo_folder, f'image_{i}.png'))\\n        img_str += f'![img_{i}](./image_{i}.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: creativeml-openrail-m\\nbase_model: {base_model}\\ninstance_prompt: {prompt}\\ntags:\\n- {'stable-diffusion' if isinstance(pipeline, StableDiffusionPipeline) else 'if'}\\n- {'stable-diffusion-diffusers' if isinstance(pipeline, StableDiffusionPipeline) else 'if-diffusers'}\\n- text-to-image\\n- diffusers\\n- lora\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# LoRA DreamBooth - {repo_id}\\n\\nThese are LoRA adaption weights for {base_model}. The weights were trained on {prompt} using\\n[DreamBooth](https://dreambooth.github.io/). You can find some example images in the following. \\\\n\\n{img_str}\\n\\nLoRA for the text encoder was enabled: {train_text_encoder}.\\n\\\"\\\"\\\"\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str, revision: str):\\n    text_encoder_config = PretrainedConfig.from_pretrained(\\n        pretrained_model_name_or_path,\\n        subfolder='text_encoder',\\n        revision=revision,\\n    )\\n    model_class = text_encoder_config.architectures[0]\\n\\n    if model_class == 'CLIPTextModel':\\n        from transformers import CLIPTextModel\\n\\n        return CLIPTextModel\\n    elif model_class == 'RobertaSeriesModelWithTransformation':\\n        from diffusers.pipelines.alt_diffusion.modeling_roberta_series import RobertaSeriesModelWithTransformation\\n\\n        return RobertaSeriesModelWithTransformation\\n    elif model_class == 'T5EncoderModel':\\n        from transformers import T5EncoderModel\\n\\n        return T5EncoderModel\\n    else:\\n        raise ValueError(f'{model_class} is not supported.')\\n\\n\\ndef parse_args(input_args=None):\\n    parser = argparse.ArgumentParser(description='Simple example of a dreambooth inferenc.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--tokenizer_name',\\n        type=str,\\n        default=None,\\n        help='Pretrained tokenizer name or path if not the same as model_name',\\n    )\\n    parser.add_argument(\\n        '--instance_data_dir',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='A folder containing the training data of instance images.',\\n    )\\n    parser.add_argument(\\n        '--class_data_dir',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='A folder containing the training data of class images.',\\n    )\\n    parser.add_argument(\\n        '--instance_prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt with identifier specifying the instance',\\n    )\\n    parser.add_argument(\\n        '--class_prompt',\\n        type=str,\\n        default=None,\\n        help='The prompt to specify images in the same class as provided instance images.',\\n    )\\n    parser.add_argument(\\n        '--validation_prompt',\\n        type=str,\\n        default=None,\\n        help='A prompt that is used during validation to verify that the model is learning.',\\n    )\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images that should be generated during validation with `validation_prompt`.',\\n    )\\n    parser.add_argument(\\n        '--validation_epochs',\\n        type=int,\\n        default=50,\\n        help=('Run dreambooth validation every X epochs. Dreambooth validation consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`.'),\\n    )\\n    parser.add_argument(\\n        '--with_prior_preservation',\\n        default=False,\\n        action='store_true',\\n        help='Flag to add prior preservation loss.',\\n    )\\n    parser.add_argument('--prior_loss_weight', type=float, default=1.0, help='The weight of prior preservation loss.')\\n    parser.add_argument(\\n        '--num_class_images',\\n        type=int,\\n        default=100,\\n        help=('Minimal class images for prior preservation loss. If there are not enough images already present in'\\n              ' class_data_dir, additional images will be sampled with class_prompt.'),\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='lora-dreambooth-model',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=512,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--center_crop',\\n        default=False,\\n        action='store_true',\\n        help=('Whether to center crop the input images to the resolution. If not set, the images will be randomly'\\n              ' cropped. The images will be resized to the resolution first before cropping.'),\\n    )\\n    parser.add_argument(\\n        '--train_text_encoder',\\n        action='store_true',\\n        help='Whether to train the text encoder. If set, the text encoder should be float32 precision.',\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=4, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--sample_batch_size', type=int, default=4, help='Batch size (per device) for sampling images.')\\n    parser.add_argument('--num_train_epochs', type=int, default=1)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=('Save a checkpoint of the training state every X updates. These checkpoints can be used both as final'\\n              ' checkpoints in case they are better than the last checkpoint, and are also suitable for resuming'\\n              ' training using `--resume_from_checkpoint`.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=5e-4,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--lr_num_cycles',\\n        type=int,\\n        default=1,\\n        help='Number of hard resets of the lr in cosine_with_restarts scheduler.',\\n    )\\n    parser.add_argument('--lr_power', type=float, default=1.0, help='Power factor of the polynomial scheduler.')\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument(\\n        '--prior_generation_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp32', 'fp16', 'bf16'],\\n        help=('Choose prior generation precision between fp32, fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to  fp16 if a GPU is available else fp32.'),\\n    )\\n    parser.add_argument('--local_rank', type=int, default=-1, help='For distributed training: local_rank')\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument(\\n        '--pre_compute_text_embeddings',\\n        action='store_true',\\n        help='Whether or not to pre-compute text embeddings. '\\n        'If text embeddings are pre-computed, the text encoder will not be kept in memory during training '\\n        'and will leave more GPU memory available for training the rest of the model. '\\n        'This is not compatible with `--train_text_encoder`.',\\n    )\\n    parser.add_argument(\\n        '--tokenizer_max_length',\\n        type=int,\\n        default=None,\\n        required=False,\\n        help=\\\"The maximum length of the tokenizer. If not set, will default to the tokenizer's max length.\\\",\\n    )\\n    parser.add_argument(\\n        '--text_encoder_use_attention_mask',\\n        action='store_true',\\n        required=False,\\n        help='Whether to use attention mask for the text encoder',\\n    )\\n    parser.add_argument(\\n        '--validation_images',\\n        required=False,\\n        default=None,\\n        nargs='+',\\n        help='Optional set of images to use for validation. Used when the target pipeline takes an initial image '\\n        'as input such as when training image variation or superresolution.',\\n    )\\n    parser.add_argument(\\n        '--class_labels_conditioning',\\n        required=False,\\n        default=None,\\n        help='The optional `class_label` conditioning to pass to the unet, available values are `timesteps`.',\\n    )\\n    parser.add_argument(\\n        '--rank',\\n        type=int,\\n        default=4,\\n        help=('The dimension of the LoRA update matrices.'),\\n    )\\n\\n    if input_args is not None:\\n        args = parser.parse_args(input_args)\\n    else:\\n        args = parser.parse_args()\\n\\n    env_local_rank = int(os.environ.get('LOCAL_RANK', -1))\\n    if env_local_rank != -1 and env_local_rank != args.local_rank:\\n        args.local_rank = env_local_rank\\n\\n    if args.with_prior_preservation:\\n        if args.class_data_dir is None:\\n            raise ValueError('You must specify a data directory for class images.')\\n        if args.class_prompt is None:\\n            raise ValueError('You must specify prompt for class images.')\\n    else:\\n        # logger is not available yet\\n        if args.class_data_dir is not None:\\n            warnings.warn('You need not use --class_data_dir without --with_prior_preservation.')\\n        if args.class_prompt is not None:\\n            warnings.warn('You need not use --class_prompt without --with_prior_preservation.')\\n\\n    if args.train_text_encoder and args.pre_compute_text_embeddings:\\n        raise ValueError('`--train_text_encoder` cannot be used with `--pre_compute_text_embeddings`')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n    return args\\n\\n\\nclass DreamBoothDataset(Dataset):\\n    \\\"\\\"\\\"\\n    A dataset to prepare the instance and class images with the prompts for fine-tuning the model.\\n    It pre-processes the images and the tokenizes prompts.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        instance_data_root,\\n        instance_prompt,\\n        tokenizer,\\n        class_data_root=None,\\n        class_prompt=None,\\n        class_num=None,\\n        size=512,\\n        center_crop=False,\\n        encoder_hidden_states=None,\\n        class_prompt_encoder_hidden_states=None,\\n        tokenizer_max_length=None,\\n    ):\\n        self.size = size\\n        self.center_crop = center_crop\\n        self.tokenizer = tokenizer\\n        self.encoder_hidden_states = encoder_hidden_states\\n        self.class_prompt_encoder_hidden_states = class_prompt_encoder_hidden_states\\n        self.tokenizer_max_length = tokenizer_max_length\\n\\n        self.instance_data_root = Path(instance_data_root)\\n        if not self.instance_data_root.exists():\\n            raise ValueError(\\\"Instance images root doesn't exists.\\\")\\n\\n        self.instance_images_path = list(Path(instance_data_root).iterdir())\\n        self.num_instance_images = len(self.instance_images_path)\\n        self.instance_prompt = instance_prompt\\n        self._length = self.num_instance_images\\n\\n        if class_data_root is not None:\\n            self.class_data_root = Path(class_data_root)\\n            self.class_data_root.mkdir(parents=True, exist_ok=True)\\n            self.class_images_path = list(self.class_data_root.iterdir())\\n            if class_num is not None:\\n                self.num_class_images = min(len(self.class_images_path), class_num)\\n            else:\\n                self.num_class_images = len(self.class_images_path)\\n            self._length = max(self.num_class_images, self.num_instance_images)\\n            self.class_prompt = class_prompt\\n        else:\\n            self.class_data_root = None\\n\\n        self.image_transforms = transforms.Compose([\\n            transforms.Resize(size, interpolation=transforms.InterpolationMode.BILINEAR),\\n            transforms.CenterCrop(size) if center_crop else transforms.RandomCrop(size),\\n            transforms.ToTensor(),\\n            transforms.Normalize([0.5], [0.5]),\\n        ])\\n\\n    def __len__(self):\\n        return self._length\\n\\n    def __getitem__(self, index):\\n        example = {}\\n        instance_image = Image.open(self.instance_images_path[index % self.num_instance_images])\\n        instance_image = exif_transpose(instance_image)\\n\\n        if not instance_image.mode == 'RGB':\\n            instance_image = instance_image.convert('RGB')\\n        example['instance_images'] = self.image_transforms(instance_image)\\n\\n        if self.encoder_hidden_states is not None:\\n            example['instance_prompt_ids'] = self.encoder_hidden_states\\n        else:\\n            text_inputs = tokenize_prompt(\\n                self.tokenizer, self.instance_prompt, tokenizer_max_length=self.tokenizer_max_length)\\n            example['instance_prompt_ids'] = text_inputs.input_ids\\n            example['instance_attention_mask'] = text_inputs.attention_mask\\n\\n        if self.class_data_root:\\n            class_image = Image.open(self.class_images_path[index % self.num_class_images])\\n            class_image = exif_transpose(class_image)\\n\\n            if not class_image.mode == 'RGB':\\n                class_image = class_image.convert('RGB')\\n            example['class_images'] = self.image_transforms(class_image)\\n\\n            if self.class_prompt_encoder_hidden_states is not None:\\n                example['class_prompt_ids'] = self.class_prompt_encoder_hidden_states\\n            else:\\n                class_text_inputs = tokenize_prompt(\\n                    self.tokenizer, self.class_prompt, tokenizer_max_length=self.tokenizer_max_length)\\n                example['class_prompt_ids'] = class_text_inputs.input_ids\\n                example['class_attention_mask'] = class_text_inputs.attention_mask\\n\\n        return example\\n\\n\\ndef collate_fn(examples, with_prior_preservation=False):\\n    has_attention_mask = 'instance_attention_mask' in examples[0]\\n\\n    input_ids = [example['instance_prompt_ids'] for example in examples]\\n    pixel_values = [example['instance_images'] for example in examples]\\n\\n    if has_attention_mask:\\n        attention_mask = [example['instance_attention_mask'] for example in examples]\\n\\n    # Concat class and instance examples for prior preservation.\\n    # We do this to avoid doing two forward passes.\\n    if with_prior_preservation:\\n        input_ids += [example['class_prompt_ids'] for example in examples]\\n        pixel_values += [example['class_images'] for example in examples]\\n        if has_attention_mask:\\n            attention_mask += [example['class_attention_mask'] for example in examples]\\n\\n    pixel_values = torch.stack(pixel_values)\\n    pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n\\n    input_ids = torch.cat(input_ids, dim=0)\\n\\n    batch = {\\n        'input_ids': input_ids,\\n        'pixel_values': pixel_values,\\n    }\\n\\n    if has_attention_mask:\\n        batch['attention_mask'] = attention_mask\\n\\n    return batch\\n\\n\\nclass PromptDataset(Dataset):\\n    'A simple dataset to prepare the prompts to generate class images on multiple GPUs.'\\n\\n    def __init__(self, prompt, num_samples):\\n        self.prompt = prompt\\n        self.num_samples = num_samples\\n\\n    def __len__(self):\\n        return self.num_samples\\n\\n    def __getitem__(self, index):\\n        example = {}\\n        example['prompt'] = self.prompt\\n        example['index'] = index\\n        return example\\n\\n\\ndef tokenize_prompt(tokenizer, prompt, tokenizer_max_length=None):\\n    if tokenizer_max_length is not None:\\n        max_length = tokenizer_max_length\\n    else:\\n        max_length = tokenizer.model_max_length\\n\\n    text_inputs = tokenizer(\\n        prompt,\\n        truncation=True,\\n        padding='max_length',\\n        max_length=max_length,\\n        return_tensors='pt',\\n    )\\n\\n    return text_inputs\\n\\n\\ndef encode_prompt(text_encoder, input_ids, attention_mask, text_encoder_use_attention_mask=None):\\n    text_input_ids = input_ids.to(text_encoder.device)\\n\\n    if text_encoder_use_attention_mask:\\n        attention_mask = attention_mask.to(text_encoder.device)\\n    else:\\n        attention_mask = None\\n\\n    prompt_embeds = text_encoder(\\n        text_input_ids,\\n        attention_mask=attention_mask,\\n    )\\n    prompt_embeds = prompt_embeds[0]\\n\\n    return prompt_embeds\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n    )\\n\\n    if args.report_to == 'wandb':\\n        if not is_wandb_available():\\n            raise ImportError('Make sure to install wandb if you want to use it for logging during training.')\\n        import wandb\\n\\n    # Currently, it's not possible to do gradient accumulation when training two models with accelerate.accumulate\\n    # This will be enabled soon in accelerate. For now, we don't allow gradient accumulation when training two models.\\n    # TODO (sayakpaul): Remove this check when gradient accumulation with two models is enabled in accelerate.\\n    if args.train_text_encoder and args.gradient_accumulation_steps > 1 and accelerator.num_processes > 1:\\n        raise ValueError(\\n            'Gradient accumulation is not supported when training the text encoder in distributed training. '\\n            'Please set gradient_accumulation_steps to 1. This feature will be supported in the future.')\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Generate class images if prior preservation is enabled.\\n    if args.with_prior_preservation:\\n        class_images_dir = Path(args.class_data_dir)\\n        if not class_images_dir.exists():\\n            class_images_dir.mkdir(parents=True)\\n        cur_class_images = len(list(class_images_dir.iterdir()))\\n\\n        if cur_class_images < args.num_class_images:\\n            torch_dtype = torch.float16 if accelerator.device.type == 'cuda' else torch.float32\\n            if args.prior_generation_precision == 'fp32':\\n                torch_dtype = torch.float32\\n            elif args.prior_generation_precision == 'fp16':\\n                torch_dtype = torch.float16\\n            elif args.prior_generation_precision == 'bf16':\\n                torch_dtype = torch.bfloat16\\n            pipeline = DiffusionPipeline.from_pretrained(\\n                args.pretrained_model_name_or_path,\\n                torch_dtype=torch_dtype,\\n                safety_checker=None,\\n                revision=args.revision,\\n                variant=args.variant,\\n            )\\n            pipeline.set_progress_bar_config(disable=True)\\n\\n            num_new_images = args.num_class_images - cur_class_images\\n            logger.info(f'Number of class images to sample: {num_new_images}.')\\n\\n            sample_dataset = PromptDataset(args.class_prompt, num_new_images)\\n            sample_dataloader = torch.utils.data.DataLoader(sample_dataset, batch_size=args.sample_batch_size)\\n\\n            sample_dataloader = accelerator.prepare(sample_dataloader)\\n            pipeline.to(accelerator.device)\\n\\n            for example in tqdm(\\n                    sample_dataloader, desc='Generating class images', disable=not accelerator.is_local_main_process):\\n                images = pipeline(example['prompt']).images\\n\\n                for i, image in enumerate(images):\\n                    hash_image = insecure_hashlib.sha1(image.tobytes()).hexdigest()\\n                    image_filename = class_images_dir / f\\\"{example['index'][i] + cur_class_images}-{hash_image}.jpg\\\"\\n                    image.save(image_filename)\\n\\n            del pipeline\\n            if torch.cuda.is_available():\\n                torch.cuda.empty_cache()\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load the tokenizer\\n    if args.tokenizer_name:\\n        tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, revision=args.revision, use_fast=False)\\n    elif args.pretrained_model_name_or_path:\\n        tokenizer = AutoTokenizer.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            subfolder='tokenizer',\\n            revision=args.revision,\\n            use_fast=False,\\n        )\\n\\n    # import correct text encoder class\\n    text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)\\n\\n    # Load scheduler and models\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    text_encoder = text_encoder_cls.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n    try:\\n        vae = AutoencoderKL.from_pretrained(\\n            args.pretrained_model_name_or_path, subfolder='vae', revision=args.revision, variant=args.variant)\\n    except OSError:\\n        # IF does not have a VAE so let's just set it to None\\n        # We don't have to error out here\\n        vae = None\\n\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n\\n    # We only train the additional adapter LoRA layers\\n    if vae is not None:\\n        vae.requires_grad_(False)\\n    text_encoder.requires_grad_(False)\\n    unet.requires_grad_(False)\\n\\n    # For mixed precision training we cast all non-trainable weights\\n    # (vae, non-lora text_encoder and non-lora unet) to half-precision\\n    # as these weights are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Move unet, vae and text_encoder to device and cast to weight_dtype\\n    unet.to(accelerator.device, dtype=weight_dtype)\\n    if vae is not None:\\n        vae.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder.to(accelerator.device, dtype=weight_dtype)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn(\\n                    'xFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training,'\\n                    ' please update xFormers to at least 0.0.17. See '\\n                    'https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    if args.gradient_checkpointing:\\n        unet.enable_gradient_checkpointing()\\n        if args.train_text_encoder:\\n            text_encoder.gradient_checkpointing_enable()\\n\\n    # now we will add new LoRA weights to the attention layers\\n    unet_lora_config = LoRAConfig(\\n        r=args.rank,\\n        init_lora_weights='gaussian',\\n        target_modules=['to_k', 'to_q', 'to_v', 'to_out.0', 'add_k_proj', 'add_v_proj'],\\n    )\\n    unet = Swift.prepare_model(unet, unet_lora_config)\\n\\n    # The text encoder comes from 🤗 transformers, we will also attach adapters to it.\\n    if args.train_text_encoder:\\n        text_lora_config = LoRAConfig(\\n            r=args.rank, init_lora_weights='gaussian', target_modules=['q_proj', 'k_proj', 'v_proj', 'out_proj'])\\n        text_encoder = Swift.prepare_model(text_encoder, text_lora_config)\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Use 8-bit Adam for lower memory usage or to fine-tune the model in 16GB GPUs\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError('To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`.')\\n\\n        optimizer_class = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_class = torch.optim.AdamW\\n\\n    # Optimizer creation\\n    params_to_optimize = list(filter(lambda p: p.requires_grad, unet.parameters()))\\n    if args.train_text_encoder:\\n        params_to_optimize = params_to_optimize + list(filter(lambda p: p.requires_grad, text_encoder.parameters()))\\n\\n    optimizer = optimizer_class(\\n        params_to_optimize,\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    if args.pre_compute_text_embeddings:\\n\\n        def compute_text_embeddings(prompt):\\n            with torch.no_grad():\\n                text_inputs = tokenize_prompt(tokenizer, prompt, tokenizer_max_length=args.tokenizer_max_length)\\n                prompt_embeds = encode_prompt(\\n                    text_encoder,\\n                    text_inputs.input_ids,\\n                    text_inputs.attention_mask,\\n                    text_encoder_use_attention_mask=args.text_encoder_use_attention_mask,\\n                )\\n\\n            return prompt_embeds\\n\\n        pre_computed_encoder_hidden_states = compute_text_embeddings(args.instance_prompt)\\n        validation_prompt_negative_prompt_embeds = compute_text_embeddings('')\\n\\n        if args.validation_prompt is not None:\\n            validation_prompt_encoder_hidden_states = compute_text_embeddings(args.validation_prompt)\\n        else:\\n            validation_prompt_encoder_hidden_states = None\\n\\n        if args.class_prompt is not None:\\n            pre_computed_class_prompt_encoder_hidden_states = compute_text_embeddings(args.class_prompt)\\n        else:\\n            pre_computed_class_prompt_encoder_hidden_states = None\\n\\n        text_encoder = None\\n        tokenizer = None\\n\\n        gc.collect()\\n        torch.cuda.empty_cache()\\n    else:\\n        pre_computed_encoder_hidden_states = None\\n        validation_prompt_encoder_hidden_states = None\\n        validation_prompt_negative_prompt_embeds = None\\n        pre_computed_class_prompt_encoder_hidden_states = None\\n\\n    # Dataset and DataLoaders creation:\\n    train_dataset = DreamBoothDataset(\\n        instance_data_root=args.instance_data_dir,\\n        instance_prompt=args.instance_prompt,\\n        class_data_root=args.class_data_dir if args.with_prior_preservation else None,\\n        class_prompt=args.class_prompt,\\n        class_num=args.num_class_images,\\n        tokenizer=tokenizer,\\n        size=args.resolution,\\n        center_crop=args.center_crop,\\n        encoder_hidden_states=pre_computed_encoder_hidden_states,\\n        class_prompt_encoder_hidden_states=pre_computed_class_prompt_encoder_hidden_states,\\n        tokenizer_max_length=args.tokenizer_max_length,\\n    )\\n\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        batch_size=args.train_batch_size,\\n        shuffle=True,\\n        collate_fn=lambda examples: collate_fn(examples, args.with_prior_preservation),\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * accelerator.num_processes,\\n        num_training_steps=args.max_train_steps * accelerator.num_processes,\\n        num_cycles=args.lr_num_cycles,\\n        power=args.lr_power,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    if args.train_text_encoder:\\n        unet, text_encoder, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(\\n            unet, text_encoder, optimizer, train_dataloader, lr_scheduler)\\n    else:\\n        unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader,\\n                                                                              lr_scheduler)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        tracker_config = vars(copy.deepcopy(args))\\n        tracker_config.pop('validation_images')\\n        accelerator.init_trackers('dreambooth-lora', config=tracker_config)\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num batches each epoch = {len(train_dataloader)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the mos recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        unet.train()\\n        if args.train_text_encoder:\\n            text_encoder.train()\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(unet):\\n                pixel_values = batch['pixel_values'].to(dtype=weight_dtype)\\n\\n                if vae is not None:\\n                    # Convert images to latent space\\n                    model_input = vae.encode(pixel_values).latent_dist.sample()\\n                    model_input = model_input * vae.config.scaling_factor\\n                else:\\n                    model_input = pixel_values\\n\\n                # Sample noise that we'll add to the latents\\n                noise = torch.randn_like(model_input)\\n                bsz, channels, height, width = model_input.shape\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(\\n                    0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=model_input.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the model input according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_model_input = noise_scheduler.add_noise(model_input, noise, timesteps)\\n\\n                # Get the text embedding for conditioning\\n                if args.pre_compute_text_embeddings:\\n                    encoder_hidden_states = batch['input_ids']\\n                else:\\n                    encoder_hidden_states = encode_prompt(\\n                        text_encoder,\\n                        batch['input_ids'],\\n                        batch['attention_mask'],\\n                        text_encoder_use_attention_mask=args.text_encoder_use_attention_mask,\\n                    )\\n\\n                if accelerator.unwrap_model(unet).config.in_channels == channels * 2:\\n                    noisy_model_input = torch.cat([noisy_model_input, noisy_model_input], dim=1)\\n\\n                if args.class_labels_conditioning == 'timesteps':\\n                    class_labels = timesteps\\n                else:\\n                    class_labels = None\\n\\n                # Predict the noise residual\\n                model_pred = unet(noisy_model_input, timesteps, encoder_hidden_states, class_labels=class_labels).sample\\n\\n                # if model predicts variance, throw away the prediction. we will only train on the\\n                # simplified training objective. This means that all schedulers using the fine tuned\\n                # model must be configured to use one of the fixed variance variance types.\\n                if model_pred.shape[1] == 6:\\n                    model_pred, _ = torch.chunk(model_pred, 2, dim=1)\\n\\n                # Get the target for loss depending on the prediction type\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(model_input, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n                if args.with_prior_preservation:\\n                    # Chunk the noise and model_pred into two parts and compute the loss on each part separately.\\n                    model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0)\\n                    target, target_prior = torch.chunk(target, 2, dim=0)\\n\\n                    # Compute instance loss\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n\\n                    # Compute prior loss\\n                    prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction='mean')\\n\\n                    # Add the prior loss to the instance loss.\\n                    loss = loss + args.prior_loss_weight * prior_loss\\n                else:\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    accelerator.clip_grad_norm_(params_to_optimize, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad()\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n\\n                if accelerator.is_main_process:\\n                    if global_step % args.checkpointing_steps == 0:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint,\\n                            # we need to have at _most_ `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        accelerator.unwrap_model(unet).to(torch.float32).save_pretrained(\\n                            os.path.join(save_path, 'unet'))\\n\\n                        if args.train_text_encoder:\\n                            accelerator.unwrap_model(text_encoder).save_pretrained(\\n                                os.path.join(save_path, 'text_encoder'))\\n                        logger.info(f'Saved state to {save_path}')\\n\\n            logs = {'loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n            accelerator.log(logs, step=global_step)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n        if accelerator.is_main_process:\\n            if args.validation_prompt is not None and epoch % args.validation_epochs == 0:\\n                logger.info(f'Running validation... \\\\n Generating {args.num_validation_images} images with prompt:'\\n                            f' {args.validation_prompt}.')\\n                # create pipeline\\n                pipeline = DiffusionPipeline.from_pretrained(\\n                    args.pretrained_model_name_or_path,\\n                    unet=accelerator.unwrap_model(unet.base_model),\\n                    text_encoder=None if args.pre_compute_text_embeddings else accelerator.unwrap_model(text_encoder),\\n                    revision=args.revision,\\n                    variant=args.variant,\\n                    torch_dtype=weight_dtype,\\n                )\\n\\n                # We train on the simplified learning objective.\\n                # If we were previously predicting a variance, we need the scheduler to ignore it\\n                scheduler_args = {}\\n\\n                if 'variance_type' in pipeline.scheduler.config:\\n                    variance_type = pipeline.scheduler.config.variance_type\\n\\n                    if variance_type in ['learned', 'learned_range']:\\n                        variance_type = 'fixed_small'\\n\\n                    scheduler_args['variance_type'] = variance_type\\n\\n                pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config,\\n                                                                             **scheduler_args)\\n\\n                pipeline = pipeline.to(accelerator.device)\\n                pipeline.set_progress_bar_config(disable=True)\\n\\n                # run inference\\n                generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n                if args.pre_compute_text_embeddings:\\n                    pipeline_args = {\\n                        'prompt_embeds': validation_prompt_encoder_hidden_states,\\n                        'negative_prompt_embeds': validation_prompt_negative_prompt_embeds,\\n                    }\\n                else:\\n                    pipeline_args = {'prompt': args.validation_prompt}\\n\\n                if args.validation_images is None:\\n                    images = []\\n                    for _ in range(args.num_validation_images):\\n                        with torch.cuda.amp.autocast():\\n                            image = pipeline(**pipeline_args, generator=generator).images[0]\\n                            images.append(image)\\n                else:\\n                    images = []\\n                    for image in args.validation_images:\\n                        image = Image.open(image)\\n                        with torch.cuda.amp.autocast():\\n                            image = pipeline(**pipeline_args, image=image, generator=generator).images[0]\\n                        images.append(image)\\n\\n                for tracker in accelerator.trackers:\\n                    if tracker.name == 'tensorboard':\\n                        np_images = np.stack([np.asarray(img) for img in images])\\n                        tracker.writer.add_images('validation', np_images, epoch, dataformats='NHWC')\\n                    if tracker.name == 'wandb':\\n                        tracker.log({\\n                            'validation': [\\n                                wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                                for i, image in enumerate(images)\\n                            ]\\n                        })\\n\\n                del pipeline\\n                torch.cuda.empty_cache()\\n\\n    # Save the lora layers\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        unet = accelerator.unwrap_model(unet)\\n        unet = unet.to(torch.float32)\\n        unet.save_pretrained(os.path.join(args.output_dir, 'unet'))\\n\\n        if args.train_text_encoder:\\n            text_encoder = accelerator.unwrap_model(text_encoder)\\n            text_encoder.save_pretrained(os.path.join(args.output_dir, 'text_encoder'))\\n\\n        # Final inference\\n        # Load previous pipeline\\n        pipeline = DiffusionPipeline.from_pretrained(\\n            args.pretrained_model_name_or_path, revision=args.revision, variant=args.variant, torch_dtype=weight_dtype)\\n\\n        # We train on the simplified learning objective.\\n        # If we were previously predicting a variance, we need the scheduler to ignore it\\n        scheduler_args = {}\\n\\n        if 'variance_type' in pipeline.scheduler.config:\\n            variance_type = pipeline.scheduler.config.variance_type\\n\\n            if variance_type in ['learned', 'learned_range']:\\n                variance_type = 'fixed_small'\\n\\n            scheduler_args['variance_type'] = variance_type\\n\\n        pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config, **scheduler_args)\\n\\n        pipeline = pipeline.to(accelerator.device)\\n\\n        # load attention processors\\n        pipeline.unet = Swift.from_pretrained(pipeline.unet, os.path.join(args.output_dir, 'unet'))\\n        if args.train_text_encoder:\\n            pipeline.text_encoder = Swift.from_pretrained(pipeline.text_encoder,\\n                                                          os.path.join(args.output_dir, 'text_encoder'))\\n\\n        # run inference\\n        images = []\\n        if args.validation_prompt and args.num_validation_images > 0:\\n            generator = torch.Generator(device=accelerator.device).manual_seed(args.seed) if args.seed else None\\n            images = [\\n                pipeline(args.validation_prompt, num_inference_steps=25, generator=generator).images[0]\\n                for _ in range(args.num_validation_images)\\n            ]\\n\\n            for tracker in accelerator.trackers:\\n                if tracker.name == 'tensorboard':\\n                    np_images = np.stack([np.asarray(img) for img in images])\\n                    tracker.writer.add_images('test', np_images, epoch, dataformats='NHWC')\\n                if tracker.name == 'wandb':\\n                    tracker.log({\\n                        'test': [\\n                            wandb.Image(image, caption=f'{i}: {args.validation_prompt}')\\n                            for i, image in enumerate(images)\\n                        ]\\n                    })\\n\\n        if args.push_to_hub:\\n            save_model_card(\\n                args.hub_model_id,\\n                images=images,\\n                base_model=args.base_model_id,\\n                train_text_encoder=args.train_text_encoder,\\n                prompt=args.instance_prompt,\\n                repo_folder=args.output_dir,\\n                pipeline=pipeline,\\n            )\\n            push_to_hub(args.hub_model_id, args.output_dir, args.hub_token)\\n\\n    accelerator.end_training()\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n\\nimport argparse\\nimport copy\\nimport gc\\nimport importlib\\nimport itertools\\nimport logging\\nimport math\\nimport os\\nimport shutil\\nimport warnings\\nfrom pathlib import Path\\n\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import ProjectConfiguration, set_seed\\nfrom diffusers import AutoencoderKL, DDPMScheduler, DiffusionPipeline, StableDiffusionPipeline, UNet2DConditionModel\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.training_utils import compute_snr\\nfrom diffusers.utils import is_wandb_available\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom huggingface_hub.utils import insecure_hashlib\\nfrom modelscope import AutoTokenizer\\nfrom packaging import version\\nfrom PIL import Image\\nfrom PIL.ImageOps import exif_transpose\\nfrom torch.utils.data import Dataset\\nfrom torchvision import transforms\\nfrom tqdm.auto import tqdm\\nfrom transformers import PretrainedConfig\\n\\nfrom swift import push_to_hub, snapshot_download\\n\\nif is_wandb_available():\\n    import wandb\\n\\nlogger = get_logger(__name__)\\n\\n\\ndef save_model_card(\\n    repo_id: str,\\n    images=None,\\n    base_model=str,\\n    train_text_encoder=False,\\n    prompt=str,\\n    repo_folder=None,\\n    pipeline: DiffusionPipeline = None,\\n):\\n    img_str = ''\\n    for i, image in enumerate(images):\\n        image.save(os.path.join(repo_folder, f'image_{i}.png'))\\n        img_str += f'![img_{i}](./image_{i}.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: creativeml-openrail-m\\nbase_model: {base_model}\\ninstance_prompt: {prompt}\\ntags:\\n- {'stable-diffusion' if isinstance(pipeline, StableDiffusionPipeline) else 'if'}\\n- {'stable-diffusion-diffusers' if isinstance(pipeline, StableDiffusionPipeline) else 'if-diffusers'}\\n- text-to-image\\n- diffusers\\n- dreambooth\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# DreamBooth - {repo_id}\\n\\nThis is a dreambooth model derived from {base_model}.\\nThe weights were trained on {prompt} using [DreamBooth](https://dreambooth.github.io/).\\nYou can find some example images in the following. \\\\n\\n{img_str}\\n\\nDreamBooth for the text encoder was enabled: {train_text_encoder}.\\n\\\"\\\"\\\"\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef log_validation(\\n    text_encoder,\\n    tokenizer,\\n    unet,\\n    vae,\\n    args,\\n    accelerator,\\n    weight_dtype,\\n    global_step,\\n    prompt_embeds,\\n    negative_prompt_embeds,\\n):\\n    logger.info(f'Running validation... \\\\n Generating {args.num_validation_images} images with prompt:'\\n                f' {args.validation_prompt}.')\\n\\n    pipeline_args = {}\\n\\n    if vae is not None:\\n        pipeline_args['vae'] = vae\\n\\n    if text_encoder is not None:\\n        text_encoder = accelerator.unwrap_model(text_encoder)\\n\\n    # create pipeline (note: unet and vae are loaded again in float32)\\n    pipeline = DiffusionPipeline.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        tokenizer=tokenizer,\\n        text_encoder=text_encoder,\\n        unet=accelerator.unwrap_model(unet),\\n        revision=args.revision,\\n        variant=args.variant,\\n        torch_dtype=weight_dtype,\\n        **pipeline_args,\\n    )\\n\\n    # We train on the simplified learning objective.\\n    # If we were previously predicting a variance, we need the scheduler to ignore it\\n    scheduler_args = {}\\n\\n    if 'variance_type' in pipeline.scheduler.config:\\n        variance_type = pipeline.scheduler.config.variance_type\\n\\n        if variance_type in ['learned', 'learned_range']:\\n            variance_type = 'fixed_small'\\n\\n        scheduler_args['variance_type'] = variance_type\\n\\n    module = importlib.import_module('diffusers')\\n    scheduler_class = getattr(module, args.validation_scheduler)\\n    pipeline.scheduler = scheduler_class.from_config(pipeline.scheduler.config, **scheduler_args)\\n    pipeline = pipeline.to(accelerator.device)\\n    pipeline.set_progress_bar_config(disable=True)\\n\\n    if args.pre_compute_text_embeddings:\\n        pipeline_args = {\\n            'prompt_embeds': prompt_embeds,\\n            'negative_prompt_embeds': negative_prompt_embeds,\\n        }\\n    else:\\n        pipeline_args = {'prompt': args.validation_prompt}\\n\\n    # run inference\\n    generator = None if args.seed is None else torch.Generator(device=accelerator.device).manual_seed(args.seed)\\n    images = []\\n    if args.validation_images is None:\\n        for _ in range(args.num_validation_images):\\n            with torch.autocast('cuda'):\\n                image = pipeline(**pipeline_args, num_inference_steps=25, generator=generator).images[0]\\n            images.append(image)\\n    else:\\n        for image in args.validation_images:\\n            image = Image.open(image)\\n            image = pipeline(**pipeline_args, image=image, generator=generator).images[0]\\n            images.append(image)\\n\\n    for tracker in accelerator.trackers:\\n        if tracker.name == 'tensorboard':\\n            np_images = np.stack([np.asarray(img) for img in images])\\n            tracker.writer.add_images('validation', np_images, global_step, dataformats='NHWC')\\n        if tracker.name == 'wandb':\\n            tracker.log({\\n                'validation':\\n                [wandb.Image(image, caption=f'{i}: {args.validation_prompt}') for i, image in enumerate(images)]\\n            })\\n\\n    del pipeline\\n    torch.cuda.empty_cache()\\n\\n    return images\\n\\n\\ndef import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str, revision: str):\\n    text_encoder_config = PretrainedConfig.from_pretrained(\\n        pretrained_model_name_or_path,\\n        subfolder='text_encoder',\\n        revision=revision,\\n    )\\n    model_class = text_encoder_config.architectures[0]\\n\\n    if model_class == 'CLIPTextModel':\\n        from transformers import CLIPTextModel\\n\\n        return CLIPTextModel\\n    elif model_class == 'RobertaSeriesModelWithTransformation':\\n        from diffusers.pipelines.alt_diffusion.modeling_roberta_series import RobertaSeriesModelWithTransformation\\n\\n        return RobertaSeriesModelWithTransformation\\n    elif model_class == 'T5EncoderModel':\\n        from transformers import T5EncoderModel\\n\\n        return T5EncoderModel\\n    else:\\n        raise ValueError(f'{model_class} is not supported.')\\n\\n\\ndef parse_args(input_args=None):\\n    parser = argparse.ArgumentParser(description='Simple example of a training script.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--tokenizer_name',\\n        type=str,\\n        default=None,\\n        help='Pretrained tokenizer name or path if not the same as model_name',\\n    )\\n    parser.add_argument(\\n        '--instance_data_dir',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='A folder containing the training data of instance images.',\\n    )\\n    parser.add_argument(\\n        '--class_data_dir',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='A folder containing the training data of class images.',\\n    )\\n    parser.add_argument(\\n        '--instance_prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt with identifier specifying the instance',\\n    )\\n    parser.add_argument(\\n        '--class_prompt',\\n        type=str,\\n        default=None,\\n        help='The prompt to specify images in the same class as provided instance images.',\\n    )\\n    parser.add_argument(\\n        '--with_prior_preservation',\\n        default=False,\\n        action='store_true',\\n        help='Flag to add prior preservation loss.',\\n    )\\n    parser.add_argument('--prior_loss_weight', type=float, default=1.0, help='The weight of prior preservation loss.')\\n    parser.add_argument(\\n        '--num_class_images',\\n        type=int,\\n        default=100,\\n        help=('Minimal class images for prior preservation loss. If there are not enough images already present in'\\n              ' class_data_dir, additional images will be sampled with class_prompt.'),\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='dreambooth-model',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=512,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--center_crop',\\n        default=False,\\n        action='store_true',\\n        help=('Whether to center crop the input images to the resolution. If not set, the images will be randomly'\\n              ' cropped. The images will be resized to the resolution first before cropping.'),\\n    )\\n    parser.add_argument(\\n        '--train_text_encoder',\\n        action='store_true',\\n        help='Whether to train the text encoder. If set, the text encoder should be float32 precision.',\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=4, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--sample_batch_size', type=int, default=4, help='Batch size (per device) for sampling images.')\\n    parser.add_argument('--num_train_epochs', type=int, default=1)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=\\n        ('Save a checkpoint of the training state every X updates. Checkpoints can be used for resuming training '\\n         'via `--resume_from_checkpoint`. '\\n         'In the case that the checkpoint is better than the final trained model, the checkpoint can also be used for '\\n         'inference.'\\n         'Using a checkpoint for inference requires separate loading of the original pipeline '\\n         'and the individual checkpointed model components.'\\n         'See https://huggingface.co/docs/diffusers/main/en/training/dreambooth'\\n         '#performing-inference-using-a-saved-checkpoint for step by step instructions.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store. Passed as `total_limit` to the `Accelerator` `ProjectConfiguration`.'\\n              ' See Accelerator::save_state '\\n              'https://huggingface.co/docs/accelerate/package_reference/accelerator#accelerate.Accelerator.save_state'\\n              ' for more details'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=5e-6,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--lr_num_cycles',\\n        type=int,\\n        default=1,\\n        help='Number of hard resets of the lr in cosine_with_restarts scheduler.',\\n    )\\n    parser.add_argument('--lr_power', type=float, default=1.0, help='Power factor of the polynomial scheduler.')\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument(\\n        '--validation_prompt',\\n        type=str,\\n        default=None,\\n        help='A prompt that is used during validation to verify that the model is learning.',\\n    )\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images that should be generated during validation with `validation_prompt`.',\\n    )\\n    parser.add_argument(\\n        '--validation_steps',\\n        type=int,\\n        default=100,\\n        help=('Run validation every X steps. Validation consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`'\\n              ' and logging the images.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument(\\n        '--prior_generation_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp32', 'fp16', 'bf16'],\\n        help=('Choose prior generation precision between fp32, fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to  fp16 if a GPU is available else fp32.'),\\n    )\\n    parser.add_argument('--local_rank', type=int, default=-1, help='For distributed training: local_rank')\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument(\\n        '--set_grads_to_none',\\n        action='store_true',\\n        help=('Save more memory by using setting grads to None instead of zero. Be aware, that this changes certain'\\n              ' behaviors, so disable this argument if it causes any problems. More info:'\\n              ' https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.zero_grad.html'),\\n    )\\n\\n    parser.add_argument(\\n        '--offset_noise',\\n        action='store_true',\\n        default=False,\\n        help=('Fine-tuning against a modified noise'\\n              ' See: https://www.crosslabs.org//blog/diffusion-with-offset-noise for more information.'),\\n    )\\n    parser.add_argument(\\n        '--snr_gamma',\\n        type=float,\\n        default=None,\\n        help='SNR weighting gamma to be used if rebalancing the loss. Recommended value is 5.0. '\\n        'More details here: https://arxiv.org/abs/2303.09556.',\\n    )\\n    parser.add_argument(\\n        '--pre_compute_text_embeddings',\\n        action='store_true',\\n        help='Whether or not to pre-compute text embeddings. '\\n        'If text embeddings are pre-computed, the text encoder will not be kept in memory during training '\\n        'and will leave more GPU memory available for training the rest of the model. '\\n        'This is not compatible with `--train_text_encoder`.',\\n    )\\n    parser.add_argument(\\n        '--tokenizer_max_length',\\n        type=int,\\n        default=None,\\n        required=False,\\n        help=\\\"The maximum length of the tokenizer. If not set, will default to the tokenizer's max length.\\\",\\n    )\\n    parser.add_argument(\\n        '--text_encoder_use_attention_mask',\\n        action='store_true',\\n        required=False,\\n        help='Whether to use attention mask for the text encoder',\\n    )\\n    parser.add_argument(\\n        '--skip_save_text_encoder', action='store_true', required=False, help='Set to not save text encoder')\\n    parser.add_argument(\\n        '--validation_images',\\n        required=False,\\n        default=None,\\n        nargs='+',\\n        help='Optional set of images to use for validation. Used when the target pipeline takes an initial image '\\n        'as input such as when training image variation or superresolution.',\\n    )\\n    parser.add_argument(\\n        '--class_labels_conditioning',\\n        required=False,\\n        default=None,\\n        help='The optional `class_label` conditioning to pass to the unet, available values are `timesteps`.',\\n    )\\n    parser.add_argument(\\n        '--validation_scheduler',\\n        type=str,\\n        default='DPMSolverMultistepScheduler',\\n        choices=['DPMSolverMultistepScheduler', 'DDPMScheduler'],\\n        help='Select which scheduler to use for validation. DDPMScheduler is recommended for DeepFloyd IF.',\\n    )\\n\\n    if input_args is not None:\\n        args = parser.parse_args(input_args)\\n    else:\\n        args = parser.parse_args()\\n\\n    env_local_rank = int(os.environ.get('LOCAL_RANK', -1))\\n    if env_local_rank != -1 and env_local_rank != args.local_rank:\\n        args.local_rank = env_local_rank\\n\\n    if args.with_prior_preservation:\\n        if args.class_data_dir is None:\\n            raise ValueError('You must specify a data directory for class images.')\\n        if args.class_prompt is None:\\n            raise ValueError('You must specify prompt for class images.')\\n    else:\\n        # logger is not available yet\\n        if args.class_data_dir is not None:\\n            warnings.warn('You need not use --class_data_dir without --with_prior_preservation.')\\n        if args.class_prompt is not None:\\n            warnings.warn('You need not use --class_prompt without --with_prior_preservation.')\\n\\n    if args.train_text_encoder and args.pre_compute_text_embeddings:\\n        raise ValueError('`--train_text_encoder` cannot be used with `--pre_compute_text_embeddings`')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    return args\\n\\n\\nclass DreamBoothDataset(Dataset):\\n    \\\"\\\"\\\"\\n    A dataset to prepare the instance and class images with the prompts for fine-tuning the model.\\n    It pre-processes the images and the tokenizes prompts.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        instance_data_root,\\n        instance_prompt,\\n        tokenizer,\\n        class_data_root=None,\\n        class_prompt=None,\\n        class_num=None,\\n        size=512,\\n        center_crop=False,\\n        encoder_hidden_states=None,\\n        class_prompt_encoder_hidden_states=None,\\n        tokenizer_max_length=None,\\n    ):\\n        self.size = size\\n        self.center_crop = center_crop\\n        self.tokenizer = tokenizer\\n        self.encoder_hidden_states = encoder_hidden_states\\n        self.class_prompt_encoder_hidden_states = class_prompt_encoder_hidden_states\\n        self.tokenizer_max_length = tokenizer_max_length\\n\\n        self.instance_data_root = Path(instance_data_root)\\n        if not self.instance_data_root.exists():\\n            raise ValueError(f\\\"Instance {self.instance_data_root} images root doesn't exists.\\\")\\n\\n        self.instance_images_path = list(Path(instance_data_root).iterdir())\\n        self.num_instance_images = len(self.instance_images_path)\\n        self.instance_prompt = instance_prompt\\n        self._length = self.num_instance_images\\n\\n        if class_data_root is not None:\\n            self.class_data_root = Path(class_data_root)\\n            self.class_data_root.mkdir(parents=True, exist_ok=True)\\n            self.class_images_path = list(self.class_data_root.iterdir())\\n            if class_num is not None:\\n                self.num_class_images = min(len(self.class_images_path), class_num)\\n            else:\\n                self.num_class_images = len(self.class_images_path)\\n            self._length = max(self.num_class_images, self.num_instance_images)\\n            self.class_prompt = class_prompt\\n        else:\\n            self.class_data_root = None\\n\\n        self.image_transforms = transforms.Compose([\\n            transforms.Resize(size, interpolation=transforms.InterpolationMode.BILINEAR),\\n            transforms.CenterCrop(size) if center_crop else transforms.RandomCrop(size),\\n            transforms.ToTensor(),\\n            transforms.Normalize([0.5], [0.5]),\\n        ])\\n\\n    def __len__(self):\\n        return self._length\\n\\n    def __getitem__(self, index):\\n        example = {}\\n        instance_image = Image.open(self.instance_images_path[index % self.num_instance_images])\\n        instance_image = exif_transpose(instance_image)\\n\\n        if not instance_image.mode == 'RGB':\\n            instance_image = instance_image.convert('RGB')\\n        example['instance_images'] = self.image_transforms(instance_image)\\n\\n        if self.encoder_hidden_states is not None:\\n            example['instance_prompt_ids'] = self.encoder_hidden_states\\n        else:\\n            text_inputs = tokenize_prompt(\\n                self.tokenizer, self.instance_prompt, tokenizer_max_length=self.tokenizer_max_length)\\n            example['instance_prompt_ids'] = text_inputs.input_ids\\n            example['instance_attention_mask'] = text_inputs.attention_mask\\n\\n        if self.class_data_root:\\n            class_image = Image.open(self.class_images_path[index % self.num_class_images])\\n            class_image = exif_transpose(class_image)\\n\\n            if not class_image.mode == 'RGB':\\n                class_image = class_image.convert('RGB')\\n            example['class_images'] = self.image_transforms(class_image)\\n\\n            if self.class_prompt_encoder_hidden_states is not None:\\n                example['class_prompt_ids'] = self.class_prompt_encoder_hidden_states\\n            else:\\n                class_text_inputs = tokenize_prompt(\\n                    self.tokenizer, self.class_prompt, tokenizer_max_length=self.tokenizer_max_length)\\n                example['class_prompt_ids'] = class_text_inputs.input_ids\\n                example['class_attention_mask'] = class_text_inputs.attention_mask\\n\\n        return example\\n\\n\\ndef collate_fn(examples, with_prior_preservation=False):\\n    has_attention_mask = 'instance_attention_mask' in examples[0]\\n\\n    input_ids = [example['instance_prompt_ids'] for example in examples]\\n    pixel_values = [example['instance_images'] for example in examples]\\n\\n    if has_attention_mask:\\n        attention_mask = [example['instance_attention_mask'] for example in examples]\\n\\n    # Concat class and instance examples for prior preservation.\\n    # We do this to avoid doing two forward passes.\\n    if with_prior_preservation:\\n        input_ids += [example['class_prompt_ids'] for example in examples]\\n        pixel_values += [example['class_images'] for example in examples]\\n\\n        if has_attention_mask:\\n            attention_mask += [example['class_attention_mask'] for example in examples]\\n\\n    pixel_values = torch.stack(pixel_values)\\n    pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n\\n    input_ids = torch.cat(input_ids, dim=0)\\n\\n    batch = {\\n        'input_ids': input_ids,\\n        'pixel_values': pixel_values,\\n    }\\n\\n    if has_attention_mask:\\n        attention_mask = torch.cat(attention_mask, dim=0)\\n        batch['attention_mask'] = attention_mask\\n\\n    return batch\\n\\n\\nclass PromptDataset(Dataset):\\n    'A simple dataset to prepare the prompts to generate class images on multiple GPUs.'\\n\\n    def __init__(self, prompt, num_samples):\\n        self.prompt = prompt\\n        self.num_samples = num_samples\\n\\n    def __len__(self):\\n        return self.num_samples\\n\\n    def __getitem__(self, index):\\n        example = {}\\n        example['prompt'] = self.prompt\\n        example['index'] = index\\n        return example\\n\\n\\ndef model_has_vae(args):\\n    config_file_name = os.path.join('vae', AutoencoderKL.config_name)\\n    if os.path.isdir(args.pretrained_model_name_or_path):\\n        config_file_name = os.path.join(args.pretrained_model_name_or_path, config_file_name)\\n        return os.path.isfile(config_file_name)\\n    else:\\n        raise NotImplementedError()\\n\\n\\ndef tokenize_prompt(tokenizer, prompt, tokenizer_max_length=None):\\n    if tokenizer_max_length is not None:\\n        max_length = tokenizer_max_length\\n    else:\\n        max_length = tokenizer.model_max_length\\n\\n    text_inputs = tokenizer(\\n        prompt,\\n        truncation=True,\\n        padding='max_length',\\n        max_length=max_length,\\n        return_tensors='pt',\\n    )\\n\\n    return text_inputs\\n\\n\\ndef encode_prompt(text_encoder, input_ids, attention_mask, text_encoder_use_attention_mask=None):\\n    text_input_ids = input_ids.to(text_encoder.device)\\n\\n    if text_encoder_use_attention_mask:\\n        attention_mask = attention_mask.to(text_encoder.device)\\n    else:\\n        attention_mask = None\\n\\n    prompt_embeds = text_encoder(\\n        text_input_ids,\\n        attention_mask=attention_mask,\\n    )\\n    prompt_embeds = prompt_embeds[0]\\n\\n    return prompt_embeds\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n    )\\n\\n    if args.report_to == 'wandb':\\n        if not is_wandb_available():\\n            raise ImportError('Make sure to install wandb if you want to use it for logging during training.')\\n\\n    # Currently, it's not possible to do gradient accumulation when training two models with accelerate.accumulate\\n    # This will be enabled soon in accelerate. For now, we don't allow gradient accumulation when training two models.\\n    # TODO (patil-suraj): Remove this check when gradient accumulation with two models is enabled in accelerate.\\n    if args.train_text_encoder and args.gradient_accumulation_steps > 1 and accelerator.num_processes > 1:\\n        raise ValueError(\\n            'Gradient accumulation is not supported when training the text encoder in distributed training. '\\n            'Please set gradient_accumulation_steps to 1. This feature will be supported in the future.')\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Generate class images if prior preservation is enabled.\\n    if args.with_prior_preservation:\\n        class_images_dir = Path(args.class_data_dir)\\n        if not class_images_dir.exists():\\n            class_images_dir.mkdir(parents=True)\\n        cur_class_images = len(list(class_images_dir.iterdir()))\\n\\n        if cur_class_images < args.num_class_images:\\n            torch_dtype = torch.float16 if accelerator.device.type == 'cuda' else torch.float32\\n            if args.prior_generation_precision == 'fp32':\\n                torch_dtype = torch.float32\\n            elif args.prior_generation_precision == 'fp16':\\n                torch_dtype = torch.float16\\n            elif args.prior_generation_precision == 'bf16':\\n                torch_dtype = torch.bfloat16\\n            pipeline = DiffusionPipeline.from_pretrained(\\n                args.pretrained_model_name_or_path,\\n                torch_dtype=torch_dtype,\\n                safety_checker=None,\\n                revision=args.revision,\\n                variant=args.variant,\\n            )\\n            pipeline.set_progress_bar_config(disable=True)\\n\\n            num_new_images = args.num_class_images - cur_class_images\\n            logger.info(f'Number of class images to sample: {num_new_images}.')\\n\\n            sample_dataset = PromptDataset(args.class_prompt, num_new_images)\\n            sample_dataloader = torch.utils.data.DataLoader(sample_dataset, batch_size=args.sample_batch_size)\\n\\n            sample_dataloader = accelerator.prepare(sample_dataloader)\\n            pipeline.to(accelerator.device)\\n\\n            for example in tqdm(\\n                    sample_dataloader, desc='Generating class images', disable=not accelerator.is_local_main_process):\\n                images = pipeline(example['prompt']).images\\n\\n                for i, image in enumerate(images):\\n                    hash_image = insecure_hashlib.sha1(image.tobytes()).hexdigest()\\n                    image_filename = class_images_dir / f\\\"{example['index'][i] + cur_class_images}-{hash_image}.jpg\\\"\\n                    image.save(image_filename)\\n\\n            del pipeline\\n            if torch.cuda.is_available():\\n                torch.cuda.empty_cache()\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load the tokenizer\\n    if args.tokenizer_name:\\n        tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, revision=args.revision, use_fast=False)\\n    elif args.pretrained_model_name_or_path:\\n        tokenizer = AutoTokenizer.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            subfolder='tokenizer',\\n            revision=args.revision,\\n            use_fast=False,\\n        )\\n\\n    # import correct text encoder class\\n    text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)\\n\\n    # Load scheduler and models\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    text_encoder = text_encoder_cls.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n\\n    if model_has_vae(args):\\n        vae = AutoencoderKL.from_pretrained(\\n            args.pretrained_model_name_or_path, subfolder='vae', revision=args.revision, variant=args.variant)\\n    else:\\n        vae = None\\n\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n\\n    # create custom saving & loading hooks so that `accelerator.save_state(...)` serializes in a nice format\\n    def save_model_hook(models, weights, output_dir):\\n        if accelerator.is_main_process:\\n            for model in models:\\n                sub_dir = 'unet' if isinstance(model, type(accelerator.unwrap_model(unet))) else 'text_encoder'\\n                model.save_pretrained(os.path.join(output_dir, sub_dir))\\n\\n                # make sure to pop weight so that corresponding model is not saved again\\n                weights.pop()\\n\\n    def load_model_hook(models, input_dir):\\n        while len(models) > 0:\\n            # pop models so that they are not loaded again\\n            model = models.pop()\\n\\n            if isinstance(model, type(accelerator.unwrap_model(text_encoder))):\\n                # load transformers style into model\\n                load_model = text_encoder_cls.from_pretrained(input_dir, subfolder='text_encoder')\\n                model.config = load_model.config\\n            else:\\n                # load diffusers style into model\\n                load_model = UNet2DConditionModel.from_pretrained(input_dir, subfolder='unet')\\n                model.register_to_config(**load_model.config)\\n\\n            model.load_state_dict(load_model.state_dict())\\n            del load_model\\n\\n    accelerator.register_save_state_pre_hook(save_model_hook)\\n    accelerator.register_load_state_pre_hook(load_model_hook)\\n\\n    if vae is not None:\\n        vae.requires_grad_(False)\\n\\n    if not args.train_text_encoder:\\n        text_encoder.requires_grad_(False)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn(\\n                    'xFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training,'\\n                    ' please update xFormers to at least 0.0.17. See '\\n                    'https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    if args.gradient_checkpointing:\\n        unet.enable_gradient_checkpointing()\\n        if args.train_text_encoder:\\n            text_encoder.gradient_checkpointing_enable()\\n\\n    # Check that all trainable models are in full precision\\n    low_precision_error_string = (\\n        'Please make sure to always have all model weights in full float32 precision when starting training - even if'\\n        ' doing mixed precision training. copy of the weights should still be float32.')\\n\\n    if accelerator.unwrap_model(unet).dtype != torch.float32:\\n        raise ValueError(\\n            f'Unet loaded as datatype {accelerator.unwrap_model(unet).dtype}. {low_precision_error_string}')\\n\\n    if args.train_text_encoder and accelerator.unwrap_model(text_encoder).dtype != torch.float32:\\n        raise ValueError(f'Text encoder loaded as datatype {accelerator.unwrap_model(text_encoder).dtype}.'\\n                         f' {low_precision_error_string}')\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Use 8-bit Adam for lower memory usage or to fine-tune the model in 16GB GPUs\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError('To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`.')\\n\\n        optimizer_class = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_class = torch.optim.AdamW\\n\\n    # Optimizer creation\\n    params_to_optimize = (\\n        itertools.chain(unet.parameters(), text_encoder.parameters()) if args.train_text_encoder else unet.parameters())\\n    optimizer = optimizer_class(\\n        params_to_optimize,\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    if args.pre_compute_text_embeddings:\\n\\n        def compute_text_embeddings(prompt):\\n            with torch.no_grad():\\n                text_inputs = tokenize_prompt(tokenizer, prompt, tokenizer_max_length=args.tokenizer_max_length)\\n                prompt_embeds = encode_prompt(\\n                    text_encoder,\\n                    text_inputs.input_ids,\\n                    text_inputs.attention_mask,\\n                    text_encoder_use_attention_mask=args.text_encoder_use_attention_mask,\\n                )\\n\\n            return prompt_embeds\\n\\n        pre_computed_encoder_hidden_states = compute_text_embeddings(args.instance_prompt)\\n        validation_prompt_negative_prompt_embeds = compute_text_embeddings('')\\n\\n        if args.validation_prompt is not None:\\n            validation_prompt_encoder_hidden_states = compute_text_embeddings(args.validation_prompt)\\n        else:\\n            validation_prompt_encoder_hidden_states = None\\n\\n        if args.class_prompt is not None:\\n            pre_computed_class_prompt_encoder_hidden_states = compute_text_embeddings(args.class_prompt)\\n        else:\\n            pre_computed_class_prompt_encoder_hidden_states = None\\n\\n        text_encoder = None\\n        tokenizer = None\\n\\n        gc.collect()\\n        torch.cuda.empty_cache()\\n    else:\\n        pre_computed_encoder_hidden_states = None\\n        validation_prompt_encoder_hidden_states = None\\n        validation_prompt_negative_prompt_embeds = None\\n        pre_computed_class_prompt_encoder_hidden_states = None\\n\\n    # Dataset and DataLoaders creation:\\n    train_dataset = DreamBoothDataset(\\n        instance_data_root=args.instance_data_dir,\\n        instance_prompt=args.instance_prompt,\\n        class_data_root=args.class_data_dir if args.with_prior_preservation else None,\\n        class_prompt=args.class_prompt,\\n        class_num=args.num_class_images,\\n        tokenizer=tokenizer,\\n        size=args.resolution,\\n        center_crop=args.center_crop,\\n        encoder_hidden_states=pre_computed_encoder_hidden_states,\\n        class_prompt_encoder_hidden_states=pre_computed_class_prompt_encoder_hidden_states,\\n        tokenizer_max_length=args.tokenizer_max_length,\\n    )\\n\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        batch_size=args.train_batch_size,\\n        shuffle=True,\\n        collate_fn=lambda examples: collate_fn(examples, args.with_prior_preservation),\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * accelerator.num_processes,\\n        num_training_steps=args.max_train_steps * accelerator.num_processes,\\n        num_cycles=args.lr_num_cycles,\\n        power=args.lr_power,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    if args.train_text_encoder:\\n        unet, text_encoder, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(\\n            unet, text_encoder, optimizer, train_dataloader, lr_scheduler)\\n    else:\\n        unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader,\\n                                                                              lr_scheduler)\\n\\n    # For mixed precision training we cast all non-trainable weights\\n    # (vae, non-lora text_encoder and non-lora unet) to half-precision\\n    # as these weights are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Move vae and text_encoder to device and cast to weight_dtype\\n    if vae is not None:\\n        vae.to(accelerator.device, dtype=weight_dtype)\\n\\n    if not args.train_text_encoder and text_encoder is not None:\\n        text_encoder.to(accelerator.device, dtype=weight_dtype)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        tracker_config = vars(copy.deepcopy(args))\\n        tracker_config.pop('validation_images')\\n        accelerator.init_trackers('dreambooth', config=tracker_config)\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num batches each epoch = {len(train_dataloader)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the most recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        unet.train()\\n        if args.train_text_encoder:\\n            text_encoder.train()\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(unet):\\n                pixel_values = batch['pixel_values'].to(dtype=weight_dtype)\\n\\n                if vae is not None:\\n                    # Convert images to latent space\\n                    model_input = vae.encode(batch['pixel_values'].to(dtype=weight_dtype)).latent_dist.sample()\\n                    model_input = model_input * vae.config.scaling_factor\\n                else:\\n                    model_input = pixel_values\\n\\n                # Sample noise that we'll add to the model input\\n                if args.offset_noise:\\n                    noise = torch.randn_like(model_input) + 0.1 * torch.randn(\\n                        model_input.shape[0], model_input.shape[1], 1, 1, device=model_input.device)\\n                else:\\n                    noise = torch.randn_like(model_input)\\n                bsz, channels, height, width = model_input.shape\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(\\n                    0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=model_input.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the model input according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_model_input = noise_scheduler.add_noise(model_input, noise, timesteps)\\n\\n                # Get the text embedding for conditioning\\n                if args.pre_compute_text_embeddings:\\n                    encoder_hidden_states = batch['input_ids']\\n                else:\\n                    encoder_hidden_states = encode_prompt(\\n                        text_encoder,\\n                        batch['input_ids'],\\n                        batch['attention_mask'],\\n                        text_encoder_use_attention_mask=args.text_encoder_use_attention_mask,\\n                    )\\n\\n                if accelerator.unwrap_model(unet).config.in_channels == channels * 2:\\n                    noisy_model_input = torch.cat([noisy_model_input, noisy_model_input], dim=1)\\n\\n                if args.class_labels_conditioning == 'timesteps':\\n                    class_labels = timesteps\\n                else:\\n                    class_labels = None\\n\\n                # Predict the noise residual\\n                model_pred = unet(noisy_model_input, timesteps, encoder_hidden_states, class_labels=class_labels).sample\\n\\n                if model_pred.shape[1] == 6:\\n                    model_pred, _ = torch.chunk(model_pred, 2, dim=1)\\n\\n                # Get the target for loss depending on the prediction type\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(model_input, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n                if args.with_prior_preservation:\\n                    # Chunk the noise and model_pred into two parts and compute the loss on each part separately.\\n                    model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0)\\n                    target, target_prior = torch.chunk(target, 2, dim=0)\\n                    # Compute prior loss\\n                    prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction='mean')\\n\\n                # Compute instance loss\\n                if args.snr_gamma is None:\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n                else:\\n                    # Compute loss-weights as per Section 3.4 of https://arxiv.org/abs/2303.09556.\\n                    # Since we predict the noise instead of x_0, the original formulation is slightly changed.\\n                    # This is discussed in Section 4.2 of the same paper.\\n                    snr = compute_snr(noise_scheduler, timesteps)\\n                    base_weight = (\\n                        torch.stack([snr, args.snr_gamma * torch.ones_like(timesteps)], dim=1).min(dim=1)[0] / snr)\\n\\n                    if noise_scheduler.config.prediction_type == 'v_prediction':\\n                        # Velocity objective needs to be floored to an SNR weight of one.\\n                        mse_loss_weights = base_weight + 1\\n                    else:\\n                        # Epsilon and sample both use the same loss weights.\\n                        mse_loss_weights = base_weight\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='none')\\n                    loss = loss.mean(dim=list(range(1, len(loss.shape)))) * mse_loss_weights\\n                    loss = loss.mean()\\n\\n                if args.with_prior_preservation:\\n                    # Add the prior loss to the instance loss.\\n                    loss = loss + args.prior_loss_weight * prior_loss\\n\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    params_to_clip = (\\n                        itertools.chain(unet.parameters(), text_encoder.parameters())\\n                        if args.train_text_encoder else unet.parameters())\\n                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad(set_to_none=args.set_grads_to_none)\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n\\n                if accelerator.is_main_process:\\n                    if global_step % args.checkpointing_steps == 0:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint,\\n                            # we need to have at _most_ `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        logger.info(f'Saved state to {save_path}')\\n\\n                    images = []\\n\\n                    if args.validation_prompt is not None and global_step % args.validation_steps == 0:\\n                        images = log_validation(\\n                            text_encoder,\\n                            tokenizer,\\n                            unet,\\n                            vae,\\n                            args,\\n                            accelerator,\\n                            weight_dtype,\\n                            global_step,\\n                            validation_prompt_encoder_hidden_states,\\n                            validation_prompt_negative_prompt_embeds,\\n                        )\\n\\n            logs = {'loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n            accelerator.log(logs, step=global_step)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n    # Create the pipeline using the trained modules and save it.\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        pipeline_args = {}\\n\\n        if text_encoder is not None:\\n            pipeline_args['text_encoder'] = accelerator.unwrap_model(text_encoder)\\n\\n        if args.skip_save_text_encoder:\\n            pipeline_args['text_encoder'] = None\\n\\n        pipeline = DiffusionPipeline.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            unet=accelerator.unwrap_model(unet),\\n            revision=args.revision,\\n            variant=args.variant,\\n            **pipeline_args,\\n        )\\n\\n        # We train on the simplified learning objective.\\n        # If we were previously predicting a variance, we need the scheduler to ignore it\\n        scheduler_args = {}\\n\\n        if 'variance_type' in pipeline.scheduler.config:\\n            variance_type = pipeline.scheduler.config.variance_type\\n\\n            if variance_type in ['learned', 'learned_range']:\\n                variance_type = 'fixed_small'\\n\\n            scheduler_args['variance_type'] = variance_type\\n\\n        pipeline.scheduler = pipeline.scheduler.from_config(pipeline.scheduler.config, **scheduler_args)\\n\\n        pipeline.save_pretrained(args.output_dir)\\n\\n        if args.push_to_hub:\\n            save_model_card(\\n                args.hub_model_id,\\n                images=images,\\n                base_model=args.base_model_id,\\n                train_text_encoder=args.train_text_encoder,\\n                prompt=args.instance_prompt,\\n                repo_folder=args.output_dir,\\n                pipeline=pipeline,\\n            )\\n            push_to_hub(args.hub_model_id, args.output_dir, args.hub_token)\\n\\n    accelerator.end_training()\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n\\nimport argparse\\nimport functools\\nimport gc\\nimport logging\\nimport math\\nimport os\\nimport random\\nimport shutil\\nfrom pathlib import Path\\n\\nimport accelerate\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.utils import ProjectConfiguration, set_seed\\nfrom datasets import load_dataset\\nfrom diffusers import (AutoencoderKL, ControlNetModel, DDPMScheduler, StableDiffusionXLControlNetPipeline,\\n                       UNet2DConditionModel, UniPCMultistepScheduler)\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.utils import is_wandb_available, make_image_grid\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom modelscope import AutoTokenizer, MsDataset\\nfrom packaging import version\\nfrom PIL import Image\\nfrom torchvision import transforms\\nfrom tqdm.auto import tqdm\\nfrom transformers import PretrainedConfig\\n\\nfrom swift import push_to_hub, snapshot_download\\n\\nif is_wandb_available():\\n    import wandb\\n\\nlogger = get_logger(__name__)\\n\\n\\ndef log_validation(vae, unet, controlnet, args, accelerator, weight_dtype, step):\\n    logger.info('Running validation... ')\\n\\n    controlnet = accelerator.unwrap_model(controlnet)\\n\\n    pipeline = StableDiffusionXLControlNetPipeline.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        vae=vae,\\n        unet=unet,\\n        controlnet=controlnet,\\n        revision=args.revision,\\n        variant=args.variant,\\n        torch_dtype=weight_dtype,\\n    )\\n    pipeline.scheduler = UniPCMultistepScheduler.from_config(pipeline.scheduler.config)\\n    pipeline = pipeline.to(accelerator.device)\\n    pipeline.set_progress_bar_config(disable=True)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        pipeline.enable_xformers_memory_efficient_attention()\\n\\n    if args.seed is None:\\n        generator = None\\n    else:\\n        generator = torch.Generator(device=accelerator.device).manual_seed(args.seed)\\n\\n    if len(args.validation_image) == len(args.validation_prompt):\\n        validation_images = args.validation_image\\n        validation_prompts = args.validation_prompt\\n    elif len(args.validation_image) == 1:\\n        validation_images = args.validation_image * len(args.validation_prompt)\\n        validation_prompts = args.validation_prompt\\n    elif len(args.validation_prompt) == 1:\\n        validation_images = args.validation_image\\n        validation_prompts = args.validation_prompt * len(args.validation_image)\\n    else:\\n        raise ValueError(\\n            'number of `args.validation_image` and `args.validation_prompt` should be checked in `parse_args`')\\n\\n    image_logs = []\\n\\n    for validation_prompt, validation_image in zip(validation_prompts, validation_images):\\n        validation_image = Image.open(validation_image).convert('RGB')\\n        validation_image = validation_image.resize((args.resolution, args.resolution))\\n\\n        images = []\\n\\n        for _ in range(args.num_validation_images):\\n            with torch.autocast('cuda'):\\n                image = pipeline(\\n                    prompt=validation_prompt, image=validation_image, num_inference_steps=20,\\n                    generator=generator).images[0]\\n            images.append(image)\\n\\n        image_logs.append({\\n            'validation_image': validation_image,\\n            'images': images,\\n            'validation_prompt': validation_prompt\\n        })\\n\\n    for tracker in accelerator.trackers:\\n        if tracker.name == 'tensorboard':\\n            for log in image_logs:\\n                images = log['images']\\n                validation_prompt = log['validation_prompt']\\n                validation_image = log['validation_image']\\n\\n                formatted_images = []\\n\\n                formatted_images.append(np.asarray(validation_image))\\n\\n                for image in images:\\n                    formatted_images.append(np.asarray(image))\\n\\n                formatted_images = np.stack(formatted_images)\\n\\n                tracker.writer.add_images(validation_prompt, formatted_images, step, dataformats='NHWC')\\n        elif tracker.name == 'wandb':\\n            formatted_images = []\\n\\n            for log in image_logs:\\n                images = log['images']\\n                validation_prompt = log['validation_prompt']\\n                validation_image = log['validation_image']\\n\\n                formatted_images.append(wandb.Image(validation_image, caption='Controlnet conditioning'))\\n\\n                for image in images:\\n                    image = wandb.Image(image, caption=validation_prompt)\\n                    formatted_images.append(image)\\n\\n            tracker.log({'validation': formatted_images})\\n        else:\\n            logger.warn(f'image logging not implemented for {tracker.name}')\\n\\n        del pipeline\\n        gc.collect()\\n        torch.cuda.empty_cache()\\n\\n        return image_logs\\n\\n\\ndef import_model_class_from_model_name_or_path(pretrained_model_name_or_path: str,\\n                                               revision: str,\\n                                               subfolder: str = 'text_encoder'):\\n    text_encoder_config = PretrainedConfig.from_pretrained(\\n        pretrained_model_name_or_path, subfolder=subfolder, revision=revision)\\n    model_class = text_encoder_config.architectures[0]\\n\\n    if model_class == 'CLIPTextModel':\\n        from transformers import CLIPTextModel\\n\\n        return CLIPTextModel\\n    elif model_class == 'CLIPTextModelWithProjection':\\n        from transformers import CLIPTextModelWithProjection\\n\\n        return CLIPTextModelWithProjection\\n    else:\\n        raise ValueError(f'{model_class} is not supported.')\\n\\n\\ndef save_model_card(repo_id: str, image_logs=None, base_model=str, repo_folder=None):\\n    img_str = ''\\n    if image_logs is not None:\\n        img_str = 'You can find some example images below.\\\\n'\\n        for i, log in enumerate(image_logs):\\n            images = log['images']\\n            validation_prompt = log['validation_prompt']\\n            validation_image = log['validation_image']\\n            validation_image.save(os.path.join(repo_folder, 'image_control.png'))\\n            img_str += f'prompt: {validation_prompt}\\\\n'\\n            images = [validation_image] + images\\n            make_image_grid(images, 1, len(images)).save(os.path.join(repo_folder, f'images_{i}.png'))\\n            img_str += f'![images_{i})](./images_{i}.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: openrail++\\nbase_model: {base_model}\\ntags:\\n- stable-diffusion-xl\\n- stable-diffusion-xl-diffusers\\n- text-to-image\\n- diffusers\\n- controlnet\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# controlnet-{repo_id}\\n\\nThese are controlnet weights trained on {base_model} with new type of conditioning.\\n{img_str}\\n\\\"\\\"\\\"\\n\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef parse_args(input_args=None):\\n    parser = argparse.ArgumentParser(description='Simple example of a ControlNet training script.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--pretrained_vae_model_name_or_path',\\n        type=str,\\n        default=None,\\n        help='Path to an improved VAE to stabilize training. '\\n        'For more details check out: https://github.com/huggingface/diffusers/pull/4038.',\\n    )\\n    parser.add_argument(\\n        '--controlnet_model_name_or_path',\\n        type=str,\\n        default=None,\\n        help='Path to pretrained controlnet model or model identifier from huggingface.co/models or '\\n        'modelscope.cn/models. If not specified controlnet weights are initialized from unet.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--tokenizer_name',\\n        type=str,\\n        default=None,\\n        help='Pretrained tokenizer name or path if not the same as model_name',\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='controlnet-model',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument(\\n        '--cache_dir',\\n        type=str,\\n        default=None,\\n        help='The directory where the downloaded models and datasets will be stored.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=512,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--crops_coords_top_left_h',\\n        type=int,\\n        default=0,\\n        help=('Coordinate for (the height) to be included in the crop coordinate embeddings needed by SDXL UNet.'),\\n    )\\n    parser.add_argument(\\n        '--crops_coords_top_left_w',\\n        type=int,\\n        default=0,\\n        help=('Coordinate for (the height) to be included in the crop coordinate embeddings needed by SDXL UNet.'),\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=4, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--num_train_epochs', type=int, default=1)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=\\n        ('Save a checkpoint of the training state every X updates. Checkpoints can be used for resuming training '\\n         'via `--resume_from_checkpoint`. '\\n         'In the case that the checkpoint is better than the final trained model, the checkpoint can also be used for '\\n         'inference.'\\n         'Using a checkpoint for inference requires separate loading of the original pipeline '\\n         'and the individual checkpointed model components.'\\n         'See https://huggingface.co/docs/diffusers/main/en/training/dreambooth'\\n         '#performing-inference-using-a-saved-checkpoint for step by step'\\n         'instructions.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=5e-6,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--lr_num_cycles',\\n        type=int,\\n        default=1,\\n        help='Number of hard resets of the lr in cosine_with_restarts scheduler.',\\n    )\\n    parser.add_argument('--lr_power', type=float, default=1.0, help='Power factor of the polynomial scheduler.')\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument(\\n        '--set_grads_to_none',\\n        action='store_true',\\n        help=('Save more memory by using setting grads to None instead of zero. Be aware, that this changes certain'\\n              ' behaviors, so disable this argument if it causes any problems. More info:'\\n              ' https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.zero_grad.html'),\\n    )\\n    parser.add_argument(\\n        '--dataset_name',\\n        type=str,\\n        default=None,\\n        help=('The name of the Dataset (from the HuggingFace hub) to train on (could be your own, possibly private,'\\n              ' dataset). It can also be a path pointing to a local copy of a dataset in your filesystem,'\\n              ' or to a folder containing files that 🤗 Datasets can understand.'),\\n    )\\n    parser.add_argument(\\n        '--dataset_config_name',\\n        type=str,\\n        default=None,\\n        help=\\\"The config of the Dataset, leave as None if there's only one config.\\\",\\n    )\\n    parser.add_argument(\\n        '--train_data_dir',\\n        type=str,\\n        default=None,\\n        help=('A folder containing the training data. Folder contents must follow the structure described in'\\n              ' https://huggingface.co/docs/datasets/image_dataset#imagefolder. In particular, a `metadata.jsonl` file'\\n              ' must exist to provide the captions for the images. Ignored if `dataset_name` is specified.'),\\n    )\\n    parser.add_argument(\\n        '--image_column', type=str, default='image', help='The column of the dataset containing the target image.')\\n    parser.add_argument(\\n        '--conditioning_image_column',\\n        type=str,\\n        default='conditioning_image',\\n        help='The column of the dataset containing the controlnet conditioning image.',\\n    )\\n    parser.add_argument(\\n        '--caption_column',\\n        type=str,\\n        default='text',\\n        help='The column of the dataset containing a caption or a list of captions.',\\n    )\\n    parser.add_argument(\\n        '--max_train_samples',\\n        type=int,\\n        default=None,\\n        help=('For debugging purposes or quicker training, truncate the number of training examples to this '\\n              'value if set.'),\\n    )\\n    parser.add_argument(\\n        '--proportion_empty_prompts',\\n        type=float,\\n        default=0,\\n        help='Proportion of image prompts to be replaced with empty strings. Defaults to 0 (no prompt replacement).',\\n    )\\n    parser.add_argument(\\n        '--validation_prompt',\\n        type=str,\\n        default=None,\\n        nargs='+',\\n        help=('A set of prompts evaluated every `--validation_steps` and logged to `--report_to`.'\\n              ' Provide either a matching number of `--validation_image`s, a single `--validation_image`'\\n              ' to be used with all prompts, or a single prompt that will be used with all `--validation_image`s.'),\\n    )\\n    parser.add_argument(\\n        '--validation_image',\\n        type=str,\\n        default=None,\\n        nargs='+',\\n        help=('A set of paths to the controlnet conditioning image be evaluated every `--validation_steps`'\\n              ' and logged to `--report_to`. Provide either a matching number of `--validation_prompt`s, a'\\n              ' a single `--validation_prompt` to be used with all `--validation_image`s, or a single'\\n              ' `--validation_image` that will be used with all `--validation_prompt`s.'),\\n    )\\n    parser.add_argument(\\n        '--num_validation_images',\\n        type=int,\\n        default=4,\\n        help='Number of images to be generated for each `--validation_image`, `--validation_prompt` pair',\\n    )\\n    parser.add_argument(\\n        '--validation_steps',\\n        type=int,\\n        default=100,\\n        help=('Run validation every X steps. Validation consists of running the prompt'\\n              ' `args.validation_prompt` multiple times: `args.num_validation_images`'\\n              ' and logging the images.'),\\n    )\\n    parser.add_argument(\\n        '--tracker_project_name',\\n        type=str,\\n        default='sd_xl_train_controlnet',\\n        help=('The `project_name` argument passed to Accelerator.init_trackers for'\\n              ' more information see '\\n              'https://huggingface.co/docs/accelerate/v0.17.0/en/package_reference/accelerator#accelerate.Accelerator'),\\n    )\\n\\n    if input_args is not None:\\n        args = parser.parse_args(input_args)\\n    else:\\n        args = parser.parse_args()\\n\\n    if args.dataset_name is None and args.train_data_dir is None:\\n        raise ValueError('Specify either `--dataset_name` or `--train_data_dir`')\\n\\n    if args.dataset_name is not None and args.train_data_dir is not None:\\n        raise ValueError('Specify only one of `--dataset_name` or `--train_data_dir`')\\n\\n    if args.proportion_empty_prompts < 0 or args.proportion_empty_prompts > 1:\\n        raise ValueError('`--proportion_empty_prompts` must be in the range [0, 1].')\\n\\n    if args.validation_prompt is not None and args.validation_image is None:\\n        raise ValueError('`--validation_image` must be set if `--validation_prompt` is set')\\n\\n    if args.validation_prompt is None and args.validation_image is not None:\\n        raise ValueError('`--validation_prompt` must be set if `--validation_image` is set')\\n\\n    if (args.validation_image is not None and args.validation_prompt is not None and len(args.validation_image) != 1\\n            and len(args.validation_prompt) != 1 and len(args.validation_image) != len(args.validation_prompt)):\\n        raise ValueError('Must provide either 1 `--validation_image`, 1 `--validation_prompt`,'\\n                         ' or the same number of `--validation_prompt`s and `--validation_image`s')\\n\\n    if args.resolution % 8 != 0:\\n        raise ValueError('`--resolution` must be divisible by 8 for consistently sized encoded images '\\n                         'between the VAE and the controlnet encoder.')\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    if args.controlnet_model_name_or_path and not os.path.exists(args.controlnet_model_name_or_path):\\n        args.controlnet_model_name_or_path = snapshot_download(args.controlnet_model_name_or_path)\\n\\n    if args.pretrained_vae_model_name_or_path and not os.path.exists(args.pretrained_vae_model_name_or_path):\\n        args.pretrained_vae_model_name_or_path = snapshot_download(args.pretrained_vae_model_name_or_path)\\n\\n    return args\\n\\n\\ndef get_train_dataset(args, accelerator):\\n    # Get the datasets: you can either provide your own training and evaluation files (see below)\\n    # or specify a Dataset from the hub (the dataset will be downloaded automatically from the datasets Hub).\\n\\n    # In distributed training, the load_dataset function guarantees that only one local process can concurrently\\n    # download the dataset.\\n    if args.dataset_name is not None:\\n        # Downloading and loading a dataset from the hub.\\n        dataset = MsDataset.load(\\n            args.dataset_name,\\n            args.dataset_config_name,\\n        )\\n        if not isinstance(dataset, dict):\\n            dataset = {'train': dataset}\\n    else:\\n        if args.train_data_dir is not None:\\n            dataset = load_dataset(\\n                args.train_data_dir,\\n                cache_dir=args.cache_dir,\\n            )\\n        # See more about loading custom images at\\n        # https://huggingface.co/docs/datasets/v2.0.0/en/dataset_script\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize inputs and targets.\\n    column_names = dataset['train'].column_names\\n\\n    # 6. Get the column names for input/target.\\n    if args.image_column is None:\\n        image_column = column_names[0]\\n        logger.info(f'image column defaulting to {image_column}')\\n    else:\\n        image_column = args.image_column\\n        if image_column not in column_names:\\n            raise ValueError(f\\\"`--image_column` value '{args.image_column}' not found in dataset columns. \\\"\\n                             f\\\"Dataset columns are: {', '.join(column_names)}\\\")\\n\\n    if args.caption_column is None:\\n        caption_column = column_names[1]\\n        logger.info(f'caption column defaulting to {caption_column}')\\n    else:\\n        caption_column = args.caption_column\\n        if caption_column not in column_names:\\n            raise ValueError(f\\\"`--caption_column` value '{args.caption_column}' not found in dataset columns. \\\"\\n                             f\\\"Dataset columns are: {', '.join(column_names)}\\\")\\n\\n    if args.conditioning_image_column is None:\\n        conditioning_image_column = column_names[2]\\n        logger.info(f'conditioning image column defaulting to {conditioning_image_column}')\\n    else:\\n        conditioning_image_column = args.conditioning_image_column\\n        if conditioning_image_column not in column_names:\\n            raise ValueError(\\n                f\\\"`--conditioning_image_column` value '{args.conditioning_image_column}' not found in dataset columns.\\\"\\n                f\\\" Dataset columns are: {', '.join(column_names)}\\\")\\n\\n    with accelerator.main_process_first():\\n        train_dataset = dataset['train'].shuffle(seed=args.seed)\\n        if args.max_train_samples is not None:\\n            train_dataset = train_dataset.select(range(args.max_train_samples))\\n    return train_dataset\\n\\n\\n# Adapted from pipelines.StableDiffusionXLPipeline.encode_prompt\\ndef encode_prompt(prompt_batch, text_encoders, tokenizers, proportion_empty_prompts, is_train=True):\\n    prompt_embeds_list = []\\n\\n    captions = []\\n    for caption in prompt_batch:\\n        if random.random() < proportion_empty_prompts:\\n            captions.append('')\\n        elif isinstance(caption, str):\\n            captions.append(caption)\\n        elif isinstance(caption, (list, np.ndarray)):\\n            # take a random caption if there are multiple\\n            captions.append(random.choice(caption) if is_train else caption[0])\\n\\n    with torch.no_grad():\\n        for tokenizer, text_encoder in zip(tokenizers, text_encoders):\\n            text_inputs = tokenizer(\\n                captions,\\n                padding='max_length',\\n                max_length=tokenizer.model_max_length,\\n                truncation=True,\\n                return_tensors='pt',\\n            )\\n            text_input_ids = text_inputs.input_ids\\n            prompt_embeds = text_encoder(\\n                text_input_ids.to(text_encoder.device),\\n                output_hidden_states=True,\\n            )\\n\\n            # We are only ALWAYS interested in the pooled output of the final text encoder\\n            pooled_prompt_embeds = prompt_embeds[0]\\n            prompt_embeds = prompt_embeds.hidden_states[-2]\\n            bs_embed, seq_len, _ = prompt_embeds.shape\\n            prompt_embeds = prompt_embeds.view(bs_embed, seq_len, -1)\\n            prompt_embeds_list.append(prompt_embeds)\\n\\n    prompt_embeds = torch.concat(prompt_embeds_list, dim=-1)\\n    pooled_prompt_embeds = pooled_prompt_embeds.view(bs_embed, -1)\\n    return prompt_embeds, pooled_prompt_embeds\\n\\n\\ndef prepare_train_dataset(args, dataset, accelerator):\\n    image_transforms = transforms.Compose([\\n        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),\\n        transforms.CenterCrop(args.resolution),\\n        transforms.ToTensor(),\\n        transforms.Normalize([0.5], [0.5]),\\n    ])\\n\\n    conditioning_image_transforms = transforms.Compose([\\n        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),\\n        transforms.CenterCrop(args.resolution),\\n        transforms.ToTensor(),\\n    ])\\n\\n    def preprocess_train(examples):\\n        images = [image.convert('RGB') for image in examples[args.image_column]]\\n        images = [image_transforms(image) for image in images]\\n\\n        conditioning_images = [image.convert('RGB') for image in examples[args.conditioning_image_column]]\\n        conditioning_images = [conditioning_image_transforms(image) for image in conditioning_images]\\n\\n        examples['pixel_values'] = images\\n        examples['conditioning_pixel_values'] = conditioning_images\\n\\n        return examples\\n\\n    with accelerator.main_process_first():\\n        dataset = dataset.with_transform(preprocess_train)\\n\\n    return dataset\\n\\n\\ndef collate_fn(examples):\\n    pixel_values = torch.stack([example['pixel_values'] for example in examples])\\n    pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n\\n    conditioning_pixel_values = torch.stack([example['conditioning_pixel_values'] for example in examples])\\n    conditioning_pixel_values = conditioning_pixel_values.to(memory_format=torch.contiguous_format).float()\\n\\n    prompt_ids = torch.stack([torch.tensor(example['prompt_embeds']) for example in examples])\\n\\n    add_text_embeds = torch.stack([torch.tensor(example['text_embeds']) for example in examples])\\n    add_time_ids = torch.stack([torch.tensor(example['time_ids']) for example in examples])\\n\\n    return {\\n        'pixel_values': pixel_values,\\n        'conditioning_pixel_values': conditioning_pixel_values,\\n        'prompt_ids': prompt_ids,\\n        'unet_added_conditions': {\\n            'text_embeds': add_text_embeds,\\n            'time_ids': add_time_ids\\n        },\\n    }\\n\\n\\ndef main():\\n    args = parse_args()\\n    logging_dir = Path(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n    )\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load the tokenizers\\n    tokenizer_one = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n    tokenizer_two = AutoTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        subfolder='tokenizer_2',\\n        revision=args.revision,\\n        use_fast=False,\\n    )\\n\\n    # import correct text encoder classes\\n    text_encoder_cls_one = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)\\n    text_encoder_cls_two = import_model_class_from_model_name_or_path(\\n        args.pretrained_model_name_or_path, args.revision, subfolder='text_encoder_2')\\n\\n    # Load scheduler and models\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    text_encoder_one = text_encoder_cls_one.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n    text_encoder_two = text_encoder_cls_two.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='text_encoder_2', revision=args.revision, variant=args.variant)\\n    vae_path = (\\n        args.pretrained_model_name_or_path\\n        if args.pretrained_vae_model_name_or_path is None else args.pretrained_vae_model_name_or_path)\\n    vae = AutoencoderKL.from_pretrained(\\n        vae_path,\\n        subfolder='vae' if args.pretrained_vae_model_name_or_path is None else None,\\n        revision=args.revision,\\n        variant=args.variant,\\n    )\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n\\n    if args.controlnet_model_name_or_path:\\n        logger.info('Loading existing controlnet weights')\\n        controlnet = ControlNetModel.from_pretrained(args.controlnet_model_name_or_path)\\n    else:\\n        logger.info('Initializing controlnet weights from unet')\\n        controlnet = ControlNetModel.from_unet(unet)\\n\\n    # `accelerate` 0.16.0 will have better support for customized saving\\n    if version.parse(accelerate.__version__) >= version.parse('0.16.0'):\\n        # create custom saving & loading hooks so that `accelerator.save_state(...)` serializes in a nice format\\n        def save_model_hook(models, weights, output_dir):\\n            if accelerator.is_main_process:\\n                i = len(weights) - 1\\n\\n                while len(weights) > 0:\\n                    weights.pop()\\n                    model = models[i]\\n\\n                    sub_dir = 'controlnet'\\n                    model.save_pretrained(os.path.join(output_dir, sub_dir))\\n\\n                    i -= 1\\n\\n        def load_model_hook(models, input_dir):\\n            while len(models) > 0:\\n                # pop models so that they are not loaded again\\n                model = models.pop()\\n\\n                # load diffusers style into model\\n                load_model = ControlNetModel.from_pretrained(input_dir, subfolder='controlnet')\\n                model.register_to_config(**load_model.config)\\n\\n                model.load_state_dict(load_model.state_dict())\\n                del load_model\\n\\n        accelerator.register_save_state_pre_hook(save_model_hook)\\n        accelerator.register_load_state_pre_hook(load_model_hook)\\n\\n    vae.requires_grad_(False)\\n    unet.requires_grad_(False)\\n    text_encoder_one.requires_grad_(False)\\n    text_encoder_two.requires_grad_(False)\\n    controlnet.train()\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn('xFormers 0.0.16 cannot be used for training in some GPUs. '\\n                            'If you observe problems during training, please update xFormers to at least 0.0.17. '\\n                            'See https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n            controlnet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    if args.gradient_checkpointing:\\n        controlnet.enable_gradient_checkpointing()\\n        unet.enable_gradient_checkpointing()\\n\\n    # Check that all trainable models are in full precision\\n    low_precision_error_string = (\\n        ' Please make sure to always have all model weights in full float32 precision when starting training - even if'\\n        ' doing mixed precision training, copy of the weights should still be float32.')\\n\\n    if accelerator.unwrap_model(controlnet).dtype != torch.float32:\\n        raise ValueError(\\n            f'Controlnet loaded as datatype {accelerator.unwrap_model(controlnet).dtype}. {low_precision_error_string}')\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Use 8-bit Adam for lower memory usage or to fine-tune the model in 16GB GPUs\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError('To use 8-bit Adam, please install the bitsandbytes library: `pip install bitsandbytes`.')\\n\\n        optimizer_class = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_class = torch.optim.AdamW\\n\\n    # Optimizer creation\\n    params_to_optimize = controlnet.parameters()\\n    optimizer = optimizer_class(\\n        params_to_optimize,\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    # For mixed precision training we cast the text_encoder and vae weights to half-precision\\n    # as these models are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n\\n    # Move vae, unet and text_encoder to device and cast to weight_dtype\\n    # The VAE is in float32 to avoid NaN losses.\\n    if args.pretrained_vae_model_name_or_path is not None:\\n        vae.to(accelerator.device, dtype=weight_dtype)\\n    else:\\n        vae.to(accelerator.device, dtype=torch.float32)\\n    unet.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder_one.to(accelerator.device, dtype=weight_dtype)\\n    text_encoder_two.to(accelerator.device, dtype=weight_dtype)\\n\\n    # Here, we compute not just the text embeddings but also the additional embeddings\\n    # needed for the SD XL UNet to operate.\\n    def compute_embeddings(batch, proportion_empty_prompts, text_encoders, tokenizers, is_train=True):\\n        original_size = (args.resolution, args.resolution)\\n        target_size = (args.resolution, args.resolution)\\n        crops_coords_top_left = (args.crops_coords_top_left_h, args.crops_coords_top_left_w)\\n        prompt_batch = batch[args.caption_column]\\n\\n        prompt_embeds, pooled_prompt_embeds = encode_prompt(prompt_batch, text_encoders, tokenizers,\\n                                                            proportion_empty_prompts, is_train)\\n        add_text_embeds = pooled_prompt_embeds\\n\\n        # Adapted from pipeline.StableDiffusionXLPipeline._get_add_time_ids\\n        add_time_ids = list(original_size + crops_coords_top_left + target_size)\\n        add_time_ids = torch.tensor([add_time_ids])\\n\\n        prompt_embeds = prompt_embeds.to(accelerator.device)\\n        add_text_embeds = add_text_embeds.to(accelerator.device)\\n        add_time_ids = add_time_ids.repeat(len(prompt_batch), 1)\\n        add_time_ids = add_time_ids.to(accelerator.device, dtype=prompt_embeds.dtype)\\n        unet_added_cond_kwargs = {'text_embeds': add_text_embeds, 'time_ids': add_time_ids}\\n\\n        return {'prompt_embeds': prompt_embeds, **unet_added_cond_kwargs}\\n\\n    # Let's first compute all the embeddings so that we can free up the text encoders\\n    # from memory.\\n    text_encoders = [text_encoder_one, text_encoder_two]\\n    tokenizers = [tokenizer_one, tokenizer_two]\\n    train_dataset = get_train_dataset(args, accelerator)\\n    compute_embeddings_fn = functools.partial(\\n        compute_embeddings,\\n        text_encoders=text_encoders,\\n        tokenizers=tokenizers,\\n        proportion_empty_prompts=args.proportion_empty_prompts,\\n    )\\n    with accelerator.main_process_first():\\n        from datasets.fingerprint import Hasher\\n\\n        # fingerprint used by the cache for the other processes to load the result\\n        # details: https://github.com/huggingface/diffusers/pull/4038#discussion_r1266078401\\n        new_fingerprint = Hasher.hash(args)\\n        train_dataset = train_dataset.map(compute_embeddings_fn, batched=True, new_fingerprint=new_fingerprint)\\n\\n    del text_encoders, tokenizers\\n    gc.collect()\\n    torch.cuda.empty_cache()\\n\\n    # Then get the training dataset ready to be passed to the dataloader.\\n    train_dataset = prepare_train_dataset(args, train_dataset, accelerator)\\n\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        shuffle=True,\\n        collate_fn=collate_fn,\\n        batch_size=args.train_batch_size,\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * accelerator.num_processes,\\n        num_training_steps=args.max_train_steps * accelerator.num_processes,\\n        num_cycles=args.lr_num_cycles,\\n        power=args.lr_power,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    controlnet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(controlnet, optimizer, train_dataloader,\\n                                                                                lr_scheduler)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        tracker_config = dict(vars(args))\\n\\n        # tensorboard cannot handle list types for config\\n        tracker_config.pop('validation_prompt')\\n        tracker_config.pop('validation_image')\\n\\n        accelerator.init_trackers(args.tracker_project_name, config=tracker_config)\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num batches each epoch = {len(train_dataloader)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the most recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    image_logs = None\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(controlnet):\\n                # Convert images to latent space\\n                if args.pretrained_vae_model_name_or_path is not None:\\n                    pixel_values = batch['pixel_values'].to(dtype=weight_dtype)\\n                else:\\n                    pixel_values = batch['pixel_values']\\n                latents = vae.encode(pixel_values).latent_dist.sample()\\n                latents = latents * vae.config.scaling_factor\\n                if args.pretrained_vae_model_name_or_path is None:\\n                    latents = latents.to(weight_dtype)\\n\\n                # Sample noise that we'll add to the latents\\n                noise = torch.randn_like(latents)\\n                bsz = latents.shape[0]\\n\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=latents.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the latents according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)\\n\\n                # ControlNet conditioning.\\n                controlnet_image = batch['conditioning_pixel_values'].to(dtype=weight_dtype)\\n                down_block_res_samples, mid_block_res_sample = controlnet(\\n                    noisy_latents,\\n                    timesteps,\\n                    encoder_hidden_states=batch['prompt_ids'],\\n                    added_cond_kwargs=batch['unet_added_conditions'],\\n                    controlnet_cond=controlnet_image,\\n                    return_dict=False,\\n                )\\n\\n                # Predict the noise residual\\n                model_pred = unet(\\n                    noisy_latents,\\n                    timesteps,\\n                    encoder_hidden_states=batch['prompt_ids'],\\n                    added_cond_kwargs=batch['unet_added_conditions'],\\n                    down_block_additional_residuals=[\\n                        sample.to(dtype=weight_dtype) for sample in down_block_res_samples\\n                    ],\\n                    mid_block_additional_residual=mid_block_res_sample.to(dtype=weight_dtype),\\n                ).sample\\n\\n                # Get the target for loss depending on the prediction type\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(latents, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n                loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    params_to_clip = controlnet.parameters()\\n                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad(set_to_none=args.set_grads_to_none)\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                progress_bar.update(1)\\n                global_step += 1\\n\\n                if accelerator.is_main_process:\\n                    if global_step % args.checkpointing_steps == 0:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint,\\n                            # we need to have at _most_ `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(f'{len(checkpoints)} checkpoints already exist, '\\n                                            f'removing {len(removing_checkpoints)} checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        logger.info(f'Saved state to {save_path}')\\n\\n                    if args.validation_prompt is not None and global_step % args.validation_steps == 0:\\n                        image_logs = log_validation(vae, unet, controlnet, args, accelerator, weight_dtype, global_step)\\n\\n            logs = {'loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n            accelerator.log(logs, step=global_step)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n    # Create the pipeline using using the trained modules and save it.\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        controlnet = accelerator.unwrap_model(controlnet)\\n        controlnet.save_pretrained(args.output_dir)\\n        if args.push_to_hub:\\n            save_model_card(\\n                args.hub_model_id,\\n                image_logs=image_logs,\\n                base_model=args.base_model_id,\\n                repo_folder=args.output_dir,\\n            )\\n            push_to_hub(args.hub_model_id, args.output_dir, args.hub_token)\\n\\n    accelerator.end_training()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import StableDiffusionXLPipeline, UNet2DConditionModel\\nfrom modelscope import snapshot_download\\n\\nfrom swift import Swift\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a text to image lora sdxl inference.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-v1-5',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--lora_model_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained lora model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=30,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.pretrained_model_name_or_path):\\n        model_path = args.pretrained_model_name_or_path\\n    else:\\n        model_path = snapshot_download(args.pretrained_model_name_or_path, revision=args.revision)\\n\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    pipe = StableDiffusionXLPipeline.from_pretrained(model_path, torch_dtype=torch_dtype)\\n    if args.lora_model_path is not None:\\n        pipe.unet = Swift.from_pretrained(pipe.unet, args.lora_model_path)\\n    pipe.to('cuda')\\n    image = pipe(\\n        prompt=args.prompt, num_inference_steps=args.num_inference_steps, guidance_scale=args.guidance_scale).images[0]\\n    image.save(args.image_save_path)\\n\\n\\nimport argparse\\nimport os\\n\\nimport torch\\nfrom diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline, UniPCMultistepScheduler\\nfrom diffusers.utils import load_image\\nfrom modelscope import snapshot_download\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a ControlNet inference.')\\n    parser.add_argument(\\n        '--base_model_path',\\n        type=str,\\n        default='AI-ModelScope/stable-diffusion-xl-base-1.0',\\n        required=True,\\n        help='Path to pretrained model or model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--controlnet_path',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='The path to trained controlnet model.',\\n    )\\n    parser.add_argument(\\n        '--prompt',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`',\\n    )\\n    parser.add_argument(\\n        '--control_image_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to conditioning image.',\\n    )\\n    parser.add_argument(\\n        '--image_save_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='The path to save generated image',\\n    )\\n    parser.add_argument(\\n        '--torch_dtype',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=('Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n              ' 1.10.and an Nvidia Ampere GPU.  Default to the value of the'\\n              ' mixed_precision passed with the `accelerate.launch` command in training script.'),\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for inference.')\\n    parser.add_argument(\\n        '--num_inference_steps',\\n        type=int,\\n        default=20,\\n        help=('The number of denoising steps. More denoising steps usually lead to a higher quality image at the \\\\\\n                expense of slower inference.'),\\n    )\\n    parser.add_argument(\\n        '--guidance_scale',\\n        type=float,\\n        default=7.5,\\n        help=('A higher guidance scale value encourages the model to generate images closely linked to the text \\\\\\n                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.'),\\n    )\\n\\n    args = parser.parse_args()\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if os.path.exists(args.base_model_path):\\n        base_model_path = args.base_model_path\\n    else:\\n        base_model_path = snapshot_download(args.base_model_path, revision=args.revision)\\n\\n    if args.torch_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif args.torch_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = torch.float32\\n\\n    controlnet = ControlNetModel.from_pretrained(args.controlnet_path, torch_dtype=torch_dtype)\\n    pipe = StableDiffusionXLControlNetPipeline.from_pretrained(\\n        base_model_path, controlnet=controlnet, torch_dtype=torch_dtype)\\n\\n    # speed up diffusion process with faster scheduler and memory optimization\\n    pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)\\n    # memory optimization.\\n    pipe.enable_model_cpu_offload()\\n\\n    control_image = load_image(args.control_image_path)\\n\\n    # generate image\\n    generator = torch.manual_seed(args.seed)\\n    image = pipe(\\n        args.prompt, num_inference_steps=args.num_inference_steps, generator=generator, image=control_image).images[0]\\n    image.save(args.image_save_path)\\n\\n\\nfrom .infer_controlnet import main as infer_controlnet\\nfrom .infer_controlnet_sdxl import main as infer_controlnet_sdxl\\nfrom .infer_dreambooth import main as infer_dreambooth\\nfrom .infer_dreambooth_lora import main as infer_dreambooth_lora\\nfrom .infer_dreambooth_lora_sdxl import main as infer_dreambooth_lora_sdxl\\nfrom .infer_text_to_image import main as infer_text_to_image\\nfrom .infer_text_to_image_lora import main as infer_text_to_image_lora\\nfrom .infer_text_to_image_lora_sdxl import main as infer_text_to_image_lora_sdxl\\nfrom .infer_text_to_image_sdxl import main as infer_text_to_image_sdxl\\nfrom .train_controlnet import main as train_controlnet\\nfrom .train_controlnet_sdxl import main as train_controlnet_sdxl\\nfrom .train_dreambooth import main as train_dreambooth\\nfrom .train_dreambooth_lora import main as train_dreambooth_lora\\nfrom .train_dreambooth_lora_sdxl import main as train_dreambooth_lora_sdxl\\nfrom .train_text_to_image import main as train_text_to_image\\nfrom .train_text_to_image_lora import main as train_text_to_image_lora\\nfrom .train_text_to_image_lora_sdxl import main as train_text_to_image_lora_sdxl\\nfrom .train_text_to_image_sdxl import main as train_text_to_image_sdxl\\n\\n\\n#!/usr/bin/env python\\n# Copyright 2023 The HuggingFace Inc. team. All rights reserved.\\n#\\n# Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n# you may not use this file except in compliance with the License.\\n# You may obtain a copy of the License at\\n#\\n#     http://www.apache.org/licenses/LICENSE-2.0\\n#\\n# Unless required by applicable law or agreed to in writing, software\\n# distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n# See the License for the specific language governing permissions and\\n\\nimport argparse\\nimport logging\\nimport math\\nimport os\\nimport random\\nimport shutil\\nfrom pathlib import Path\\n\\nimport accelerate\\nimport datasets\\nimport diffusers\\nimport numpy as np\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate import Accelerator\\nfrom accelerate.logging import get_logger\\nfrom accelerate.state import AcceleratorState\\nfrom accelerate.utils import ProjectConfiguration, set_seed\\nfrom datasets import load_dataset\\nfrom diffusers import AutoencoderKL, DDPMScheduler, StableDiffusionPipeline, UNet2DConditionModel\\nfrom diffusers.optimization import get_scheduler\\nfrom diffusers.training_utils import EMAModel, compute_snr\\nfrom diffusers.utils import check_min_version, deprecate, is_wandb_available, make_image_grid\\nfrom diffusers.utils.import_utils import is_xformers_available\\nfrom modelscope import MsDataset\\nfrom packaging import version\\nfrom PIL import Image\\nfrom torchvision import transforms\\nfrom tqdm.auto import tqdm\\nfrom transformers import CLIPTextModel, CLIPTokenizer\\nfrom transformers.utils import ContextManagers\\n\\nfrom swift import push_to_hub, snapshot_download\\n\\nif is_wandb_available():\\n    import wandb\\n\\nlogger = get_logger(__name__, log_level='INFO')\\n\\nDATASET_NAME_MAPPING = {\\n    'AI-ModelScope/pokemon-blip-captions': ('text', 'image:FILE'),\\n}\\n\\n\\ndef save_model_card(\\n    args,\\n    repo_id: str,\\n    images=None,\\n    repo_folder=None,\\n):\\n    img_str = ''\\n    if len(images) > 0:\\n        image_grid = make_image_grid(images, 1, len(args.validation_prompts))\\n        image_grid.save(os.path.join(repo_folder, 'val_imgs_grid.png'))\\n        img_str += '![val_imgs_grid](./val_imgs_grid.png)\\\\n'\\n\\n    yaml = f\\\"\\\"\\\"\\n---\\nlicense: creativeml-openrail-m\\nbase_model: {args.pretrained_model_name_or_path}\\ndatasets:\\n- {args.dataset_name}\\ntags:\\n- stable-diffusion\\n- stable-diffusion-diffusers\\n- text-to-image\\n- diffusers\\ninference: true\\n---\\n    \\\"\\\"\\\"\\n    model_card = f\\\"\\\"\\\"\\n# Text-to-image finetuning - {repo_id}\\n\\nThis pipeline was finetuned from **{args.pretrained_model_name_or_path}** on the **{args.dataset_name}** dataset. Below\\nare some example images generated with the finetuned pipeline using the following prompts: {args.validation_prompts}: \\\\n\\n{img_str}\\n\\n## Pipeline usage\\n\\nYou can use the pipeline like so:\\n\\n```python\\nfrom diffusers import DiffusionPipeline\\nimport torch\\n\\npipeline = DiffusionPipeline.from_pretrained(\\\"{repo_id}\\\", torch_dtype=torch.float16)\\nprompt = \\\"{args.validation_prompts[0]}\\\"\\nimage = pipeline(prompt).images[0]\\nimage.save(\\\"my_image.png\\\")\\n```\\n\\n## Training info\\n\\nThese are the key hyperparameters used during training:\\n\\n* Epochs: {args.num_train_epochs}\\n* Learning rate: {args.learning_rate}\\n* Batch size: {args.train_batch_size}\\n* Gradient accumulation steps: {args.gradient_accumulation_steps}\\n* Image resolution: {args.resolution}\\n* Mixed-precision: {args.mixed_precision}\\n\\n\\\"\\\"\\\"\\n    wandb_info = ''\\n    if is_wandb_available():\\n        wandb_run_url = None\\n        if wandb.run is not None:\\n            wandb_run_url = wandb.run.url\\n\\n    if wandb_run_url is not None:\\n        wandb_info = f\\\"\\\"\\\"\\nMore information on all the CLI arguments and the environment are available on your [`wandb` run page]({wandb_run_url}).\\n\\\"\\\"\\\"\\n\\n    model_card += wandb_info\\n\\n    with open(os.path.join(repo_folder, 'README.md'), 'w') as f:\\n        f.write(yaml + model_card)\\n\\n\\ndef log_validation(vae, text_encoder, tokenizer, unet, args, accelerator, weight_dtype, epoch):\\n    logger.info('Running validation... ')\\n\\n    pipeline = StableDiffusionPipeline.from_pretrained(\\n        args.pretrained_model_name_or_path,\\n        vae=accelerator.unwrap_model(vae),\\n        text_encoder=accelerator.unwrap_model(text_encoder),\\n        tokenizer=tokenizer,\\n        unet=accelerator.unwrap_model(unet),\\n        safety_checker=None,\\n        revision=args.revision,\\n        variant=args.variant,\\n        torch_dtype=weight_dtype,\\n    )\\n    pipeline = pipeline.to(accelerator.device)\\n    pipeline.set_progress_bar_config(disable=True)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        pipeline.enable_xformers_memory_efficient_attention()\\n\\n    if args.seed is None:\\n        generator = None\\n    else:\\n        generator = torch.Generator(device=accelerator.device).manual_seed(args.seed)\\n\\n    images = []\\n    for i in range(len(args.validation_prompts)):\\n        with torch.autocast('cuda'):\\n            image = pipeline(args.validation_prompts[i], num_inference_steps=20, generator=generator).images[0]\\n\\n        images.append(image)\\n\\n    for tracker in accelerator.trackers:\\n        if tracker.name == 'tensorboard':\\n            np_images = np.stack([np.asarray(img) for img in images])\\n            tracker.writer.add_images('validation', np_images, epoch, dataformats='NHWC')\\n        elif tracker.name == 'wandb':\\n            tracker.log({\\n                'validation':\\n                [wandb.Image(image, caption=f'{i}: {args.validation_prompts[i]}') for i, image in enumerate(images)]\\n            })\\n        else:\\n            logger.warn(f'image logging not implemented for {tracker.name}')\\n\\n    del pipeline\\n    torch.cuda.empty_cache()\\n\\n    return images\\n\\n\\ndef parse_args():\\n    parser = argparse.ArgumentParser(description='Simple example of a training script.')\\n    parser.add_argument(\\n        '--input_perturbation', type=float, default=0, help='The scale of input perturbation. Recommended 0.1.')\\n    parser.add_argument(\\n        '--pretrained_model_name_or_path',\\n        type=str,\\n        default=None,\\n        required=True,\\n        help='Path to pretrained model or model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help='Revision of pretrained model identifier from huggingface.co/models or modelscope.cn/models.',\\n    )\\n    parser.add_argument(\\n        '--variant',\\n        type=str,\\n        default=None,\\n        help=\\\"Variant of the model files of the pretrained model identifier from huggingface.co/models, 'e.g.' fp16\\\",\\n    )\\n    parser.add_argument(\\n        '--dataset_name',\\n        type=str,\\n        default=None,\\n        help=('The name of the Dataset (from the HuggingFace hub) to train on (could be your own, possibly private,'\\n              ' dataset). It can also be a path pointing to a local copy of a dataset in your filesystem,'\\n              ' or to a folder containing files that 🤗 Datasets can understand.'),\\n    )\\n    parser.add_argument(\\n        '--dataset_config_name',\\n        type=str,\\n        default=None,\\n        help=\\\"The config of the Dataset, leave as None if there's only one config.\\\",\\n    )\\n    parser.add_argument(\\n        '--train_data_dir',\\n        type=str,\\n        default=None,\\n        help=('A folder containing the training data. Folder contents must follow the structure described in'\\n              ' https://huggingface.co/docs/datasets/image_dataset#imagefolder. In particular, a `metadata.jsonl` file'\\n              ' must exist to provide the captions for the images. Ignored if `dataset_name` is specified.'),\\n    )\\n    parser.add_argument(\\n        '--image_column', type=str, default='image:FILE', help='The column of the dataset containing an image.')\\n    parser.add_argument(\\n        '--caption_column',\\n        type=str,\\n        default='text',\\n        help='The column of the dataset containing a caption or a list of captions.',\\n    )\\n    parser.add_argument(\\n        '--max_train_samples',\\n        type=int,\\n        default=None,\\n        help=('For debugging purposes or quicker training, truncate the number of training examples to this '\\n              'value if set.'),\\n    )\\n    parser.add_argument(\\n        '--validation_prompts',\\n        type=str,\\n        default=None,\\n        nargs='+',\\n        help=('A set of prompts evaluated every `--validation_epochs` and logged to `--report_to`.'),\\n    )\\n    parser.add_argument(\\n        '--output_dir',\\n        type=str,\\n        default='sd-model-finetuned',\\n        help='The output directory where the model predictions and checkpoints will be written.',\\n    )\\n    parser.add_argument(\\n        '--cache_dir',\\n        type=str,\\n        default=None,\\n        help='The directory where the downloaded models and datasets will be stored.',\\n    )\\n    parser.add_argument('--seed', type=int, default=None, help='A seed for reproducible training.')\\n    parser.add_argument(\\n        '--resolution',\\n        type=int,\\n        default=512,\\n        help=('The resolution for input images, all the images in the train/validation dataset will be resized to this'\\n              ' resolution'),\\n    )\\n    parser.add_argument(\\n        '--center_crop',\\n        default=False,\\n        action='store_true',\\n        help=('Whether to center crop the input images to the resolution. If not set, the images will be randomly'\\n              ' cropped. The images will be resized to the resolution first before cropping.'),\\n    )\\n    parser.add_argument(\\n        '--random_flip',\\n        action='store_true',\\n        help='whether to randomly flip images horizontally',\\n    )\\n    parser.add_argument(\\n        '--train_batch_size', type=int, default=16, help='Batch size (per device) for the training dataloader.')\\n    parser.add_argument('--num_train_epochs', type=int, default=100)\\n    parser.add_argument(\\n        '--max_train_steps',\\n        type=int,\\n        default=None,\\n        help='Total number of training steps to perform.  If provided, overrides num_train_epochs.',\\n    )\\n    parser.add_argument(\\n        '--gradient_accumulation_steps',\\n        type=int,\\n        default=1,\\n        help='Number of updates steps to accumulate before performing a backward/update pass.',\\n    )\\n    parser.add_argument(\\n        '--gradient_checkpointing',\\n        action='store_true',\\n        help='Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.',\\n    )\\n    parser.add_argument(\\n        '--learning_rate',\\n        type=float,\\n        default=1e-4,\\n        help='Initial learning rate (after the potential warmup period) to use.',\\n    )\\n    parser.add_argument(\\n        '--scale_lr',\\n        action='store_true',\\n        default=False,\\n        help='Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.',\\n    )\\n    parser.add_argument(\\n        '--lr_scheduler',\\n        type=str,\\n        default='constant',\\n        help=('The scheduler type to use. Choose between [\\\"linear\\\", \\\"cosine\\\", \\\"cosine_with_restarts\\\", \\\"polynomial\\\",'\\n              ' \\\"constant\\\", \\\"constant_with_warmup\\\"]'),\\n    )\\n    parser.add_argument(\\n        '--lr_warmup_steps', type=int, default=500, help='Number of steps for the warmup in the lr scheduler.')\\n    parser.add_argument(\\n        '--snr_gamma',\\n        type=float,\\n        default=None,\\n        help='SNR weighting gamma to be used if rebalancing the loss. Recommended value is 5.0. '\\n        'More details here: https://arxiv.org/abs/2303.09556.',\\n    )\\n    parser.add_argument(\\n        '--use_8bit_adam', action='store_true', help='Whether or not to use 8-bit Adam from bitsandbytes.')\\n    parser.add_argument(\\n        '--allow_tf32',\\n        action='store_true',\\n        help=('Whether or not to allow TF32 on Ampere GPUs. Can be used to speed up training. For more information, see'\\n              ' https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices'),\\n    )\\n    parser.add_argument('--use_ema', action='store_true', help='Whether to use EMA model.')\\n    parser.add_argument(\\n        '--non_ema_revision',\\n        type=str,\\n        default=None,\\n        required=False,\\n        help=('Revision of pretrained non-ema model identifier. Must be a branch, tag or git identifier of the local or'\\n              ' remote repository specified with --pretrained_model_name_or_path.'),\\n    )\\n    parser.add_argument(\\n        '--dataloader_num_workers',\\n        type=int,\\n        default=0,\\n        help=(\\n            'Number of subprocesses to use for data loading. 0 means that the data will be loaded in the main process.'\\n        ),\\n    )\\n    parser.add_argument('--adam_beta1', type=float, default=0.9, help='The beta1 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_beta2', type=float, default=0.999, help='The beta2 parameter for the Adam optimizer.')\\n    parser.add_argument('--adam_weight_decay', type=float, default=1e-2, help='Weight decay to use.')\\n    parser.add_argument('--adam_epsilon', type=float, default=1e-08, help='Epsilon value for the Adam optimizer')\\n    parser.add_argument('--max_grad_norm', default=1.0, type=float, help='Max gradient norm.')\\n    parser.add_argument('--push_to_hub', action='store_true', help='Whether or not to push the model to the Hub.')\\n    parser.add_argument('--hub_token', type=str, default=None, help='The token to use to push to the Model Hub.')\\n    parser.add_argument(\\n        '--prediction_type',\\n        type=str,\\n        default=None,\\n        help=\\\"The prediction_type that shall be used for training. Choose between 'epsilon' or 'v_prediction' or leave \\\\\\n        `None`. If left to `None` the default prediction type of the scheduler: \\\\\\n        `noise_scheduler.config.prediciton_type` is chosen.\\\",\\n    )\\n    parser.add_argument(\\n        '--hub_model_id',\\n        type=str,\\n        default=None,\\n        help='The name of the repository to keep in sync with the local `output_dir`.',\\n    )\\n    parser.add_argument(\\n        '--logging_dir',\\n        type=str,\\n        default='logs',\\n        help=('[TensorBoard](https://www.tensorflow.org/tensorboard) log directory. Will default to'\\n              ' *output_dir/runs/**CURRENT_DATETIME_HOSTNAME***.'),\\n    )\\n    parser.add_argument(\\n        '--mixed_precision',\\n        type=str,\\n        default=None,\\n        choices=['no', 'fp16', 'bf16'],\\n        help=(\\n            'Whether to use mixed precision. Choose between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >='\\n            ' 1.10.and an Nvidia Ampere GPU.  Default to the value of accelerate config of the current system or the'\\n            ' flag passed with the `accelerate.launch` command. Use this argument to override the accelerate config.'),\\n    )\\n    parser.add_argument(\\n        '--report_to',\\n        type=str,\\n        default='tensorboard',\\n        help=('The integration to report the results and logs to. Supported platforms are `\\\"tensorboard\\\"`'\\n              ' (default), `\\\"wandb\\\"` and `\\\"comet_ml\\\"`. Use `\\\"all\\\"` to report to all integrations.'),\\n    )\\n    parser.add_argument('--local_rank', type=int, default=-1, help='For distributed training: local_rank')\\n    parser.add_argument(\\n        '--checkpointing_steps',\\n        type=int,\\n        default=500,\\n        help=(\\n            'Save a checkpoint of the training state every X updates. These checkpoints are only suitable for resuming'\\n            ' training using `--resume_from_checkpoint`.'),\\n    )\\n    parser.add_argument(\\n        '--checkpoints_total_limit',\\n        type=int,\\n        default=None,\\n        help=('Max number of checkpoints to store.'),\\n    )\\n    parser.add_argument(\\n        '--resume_from_checkpoint',\\n        type=str,\\n        default=None,\\n        help=('Whether training should be resumed from a previous checkpoint. Use a path saved by'\\n              ' `--checkpointing_steps`, or `\\\"latest\\\"` to automatically select the last available checkpoint.'),\\n    )\\n    parser.add_argument(\\n        '--enable_xformers_memory_efficient_attention', action='store_true', help='Whether or not to use xformers.')\\n    parser.add_argument('--noise_offset', type=float, default=0, help='The scale of noise offset.')\\n    parser.add_argument(\\n        '--validation_epochs',\\n        type=int,\\n        default=5,\\n        help='Run validation every X epochs.',\\n    )\\n    parser.add_argument(\\n        '--tracker_project_name',\\n        type=str,\\n        default='text2image-fine-tune',\\n        help=('The `project_name` argument passed to Accelerator.init_trackers for'\\n              ' more information see '\\n              'https://huggingface.co/docs/accelerate/v0.17.0/en/package_reference/accelerator#accelerate.Accelerator'),\\n    )\\n\\n    args = parser.parse_args()\\n    env_local_rank = int(os.environ.get('LOCAL_RANK', -1))\\n    if env_local_rank != -1 and env_local_rank != args.local_rank:\\n        args.local_rank = env_local_rank\\n\\n    # Sanity checks\\n    if args.dataset_name is None and args.train_data_dir is None:\\n        raise ValueError('Need either a dataset name or a training folder.')\\n\\n    # default to using the same revision for the non-ema model if not specified\\n    if args.non_ema_revision is None:\\n        args.non_ema_revision = args.revision\\n\\n    args.base_model_id = args.pretrained_model_name_or_path\\n    if not os.path.exists(args.pretrained_model_name_or_path):\\n        args.pretrained_model_name_or_path = snapshot_download(\\n            args.pretrained_model_name_or_path, revision=args.revision)\\n    return args\\n\\n\\ndef main():\\n    args = parse_args()\\n\\n    if args.non_ema_revision is not None:\\n        deprecate(\\n            'non_ema_revision!=None',\\n            '0.15.0',\\n            message=(\\n                \\\"Downloading 'non_ema' weights from revision branches of the Hub is deprecated. Please make sure to\\\"\\n                ' use `--variant=non_ema` instead.'),\\n        )\\n    logging_dir = os.path.join(args.output_dir, args.logging_dir)\\n\\n    accelerator_project_config = ProjectConfiguration(project_dir=args.output_dir, logging_dir=logging_dir)\\n\\n    accelerator = Accelerator(\\n        gradient_accumulation_steps=args.gradient_accumulation_steps,\\n        mixed_precision=args.mixed_precision,\\n        log_with=args.report_to,\\n        project_config=accelerator_project_config,\\n    )\\n\\n    # Make one log on every process with the configuration for debugging.\\n    logging.basicConfig(\\n        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',\\n        datefmt='%m/%d/%Y %H:%M:%S',\\n        level=logging.INFO,\\n    )\\n    logger.info(accelerator.state, main_process_only=False)\\n    if accelerator.is_local_main_process:\\n        datasets.utils.logging.set_verbosity_warning()\\n        transformers.utils.logging.set_verbosity_warning()\\n        diffusers.utils.logging.set_verbosity_info()\\n    else:\\n        datasets.utils.logging.set_verbosity_error()\\n        transformers.utils.logging.set_verbosity_error()\\n        diffusers.utils.logging.set_verbosity_error()\\n\\n    # If passed along, set the training seed now.\\n    if args.seed is not None:\\n        set_seed(args.seed)\\n\\n    # Handle the repository creation\\n    if accelerator.is_main_process:\\n        if args.output_dir is not None:\\n            os.makedirs(args.output_dir, exist_ok=True)\\n\\n    # Load scheduler, tokenizer and models.\\n    noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder='scheduler')\\n    tokenizer = CLIPTokenizer.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='tokenizer', revision=args.revision)\\n\\n    def deepspeed_zero_init_disabled_context_manager():\\n        \\\"\\\"\\\"\\n        returns either a context list that includes one that will disable zero.Init or an empty context list\\n        \\\"\\\"\\\"\\n        deepspeed_plugin = AcceleratorState().deepspeed_plugin if accelerate.state.is_initialized() else None\\n        if deepspeed_plugin is None:\\n            return []\\n\\n        return [deepspeed_plugin.zero3_init_context_manager(enable=False)]\\n\\n    # Currently Accelerate doesn't know how to handle multiple models under Deepspeed ZeRO stage 3.\\n    # For this to work properly all models must be run through `accelerate.prepare`. But accelerate\\n    # will try to assign the same optimizer with the same weights to all models during\\n    # `deepspeed.initialize`, which of course doesn't work.\\n    #\\n    # For now the following workaround will partially support Deepspeed ZeRO-3, by excluding the 2\\n    # frozen models from being partitioned during `zero.Init` which gets called during\\n    # `from_pretrained` So CLIPTextModel and AutoencoderKL will not enjoy the parameter sharding\\n    # across multiple gpus and only UNet2DConditionModel will get ZeRO sharded.\\n    with ContextManagers(deepspeed_zero_init_disabled_context_manager()):\\n        text_encoder = CLIPTextModel.from_pretrained(\\n            args.pretrained_model_name_or_path, subfolder='text_encoder', revision=args.revision, variant=args.variant)\\n        vae = AutoencoderKL.from_pretrained(\\n            args.pretrained_model_name_or_path, subfolder='vae', revision=args.revision, variant=args.variant)\\n\\n    unet = UNet2DConditionModel.from_pretrained(\\n        args.pretrained_model_name_or_path, subfolder='unet', revision=args.non_ema_revision)\\n\\n    # Freeze vae and text_encoder and set unet to trainable\\n    vae.requires_grad_(False)\\n    text_encoder.requires_grad_(False)\\n    unet.train()\\n\\n    # Create EMA for the unet.\\n    if args.use_ema:\\n        ema_unet = UNet2DConditionModel.from_pretrained(\\n            args.pretrained_model_name_or_path, subfolder='unet', revision=args.revision, variant=args.variant)\\n        ema_unet = EMAModel(ema_unet.parameters(), model_cls=UNet2DConditionModel, model_config=ema_unet.config)\\n\\n    if args.enable_xformers_memory_efficient_attention:\\n        if is_xformers_available():\\n            import xformers\\n\\n            xformers_version = version.parse(xformers.__version__)\\n            if xformers_version == version.parse('0.0.16'):\\n                logger.warn(\\n                    'xFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training,'\\n                    ' please update xFormers to at least 0.0.17. See '\\n                    'https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.')\\n            unet.enable_xformers_memory_efficient_attention()\\n        else:\\n            raise ValueError('xformers is not available. Make sure it is installed correctly')\\n\\n    # `accelerate` 0.16.0 will have better support for customized saving\\n    if version.parse(accelerate.__version__) >= version.parse('0.16.0'):\\n        # create custom saving & loading hooks so that `accelerator.save_state(...)` serializes in a nice format\\n        def save_model_hook(models, weights, output_dir):\\n            if accelerator.is_main_process:\\n                if args.use_ema:\\n                    ema_unet.save_pretrained(os.path.join(output_dir, 'unet_ema'))\\n\\n                for i, model in enumerate(models):\\n                    model.save_pretrained(os.path.join(output_dir, 'unet'))\\n\\n                    # make sure to pop weight so that corresponding model is not saved again\\n                    weights.pop()\\n\\n        def load_model_hook(models, input_dir):\\n            if args.use_ema:\\n                load_model = EMAModel.from_pretrained(os.path.join(input_dir, 'unet_ema'), UNet2DConditionModel)\\n                ema_unet.load_state_dict(load_model.state_dict())\\n                ema_unet.to(accelerator.device)\\n                del load_model\\n\\n            for i in range(len(models)):\\n                # pop models so that they are not loaded again\\n                model = models.pop()\\n\\n                # load diffusers style into model\\n                load_model = UNet2DConditionModel.from_pretrained(input_dir, subfolder='unet')\\n                model.register_to_config(**load_model.config)\\n\\n                model.load_state_dict(load_model.state_dict())\\n                del load_model\\n\\n        accelerator.register_save_state_pre_hook(save_model_hook)\\n        accelerator.register_load_state_pre_hook(load_model_hook)\\n\\n    if args.gradient_checkpointing:\\n        unet.enable_gradient_checkpointing()\\n\\n    # Enable TF32 for faster training on Ampere GPUs,\\n    # cf https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices\\n    if args.allow_tf32:\\n        torch.backends.cuda.matmul.allow_tf32 = True\\n\\n    if args.scale_lr:\\n        args.learning_rate = (\\n            args.learning_rate * args.gradient_accumulation_steps * args.train_batch_size * accelerator.num_processes)\\n\\n    # Initialize the optimizer\\n    if args.use_8bit_adam:\\n        try:\\n            import bitsandbytes as bnb\\n        except ImportError:\\n            raise ImportError(\\n                'Please install bitsandbytes to use 8-bit Adam. You can do so by running `pip install bitsandbytes`')\\n\\n        optimizer_cls = bnb.optim.AdamW8bit\\n    else:\\n        optimizer_cls = torch.optim.AdamW\\n\\n    optimizer = optimizer_cls(\\n        unet.parameters(),\\n        lr=args.learning_rate,\\n        betas=(args.adam_beta1, args.adam_beta2),\\n        weight_decay=args.adam_weight_decay,\\n        eps=args.adam_epsilon,\\n    )\\n\\n    # Get the datasets: you can either provide your own training and evaluation files (see below)\\n    # or specify a Dataset from the hub (the dataset will be downloaded automatically from the datasets Hub).\\n\\n    # In distributed training, the load_dataset function guarantees that only one local process can concurrently\\n    # download the dataset.\\n    def path_to_img(example):\\n        example['image'] = Image.open(example['image:FILE'])\\n        return example\\n\\n    if args.dataset_name is not None:\\n        # Downloading and loading a dataset from the hub.\\n        dataset = MsDataset.load(\\n            args.dataset_name,\\n            args.dataset_config_name,\\n            data_dir=args.train_data_dir,\\n        )\\n        if not isinstance(dataset, dict):\\n            dataset = {'train': dataset}\\n    else:\\n        data_files = {}\\n        if args.train_data_dir is not None:\\n            data_files['train'] = os.path.join(args.train_data_dir, '**')\\n        dataset = load_dataset(\\n            'imagefolder',\\n            data_files=data_files,\\n            cache_dir=args.cache_dir,\\n        )\\n        # See more about loading custom images at\\n        # https://huggingface.co/docs/datasets/v2.4.0/en/image_load#imagefolder\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize inputs and targets.\\n    column_names = dataset['train'].column_names\\n\\n    # 6. Get the column names for input/target.\\n    dataset_columns = DATASET_NAME_MAPPING.get(args.dataset_name, None)\\n    if args.image_column is None:\\n        image_column = dataset_columns[1] if dataset_columns is not None else column_names[1]\\n    else:\\n        image_column = args.image_column\\n        if image_column not in column_names:\\n            raise ValueError(\\n                f\\\"--image_column' value '{args.image_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if args.caption_column is None:\\n        caption_column = dataset_columns[0] if dataset_columns is not None else column_names[0]\\n    else:\\n        caption_column = args.caption_column\\n        if caption_column not in column_names:\\n            raise ValueError(\\n                f\\\"--caption_column' value '{args.caption_column}' needs to be one of: {', '.join(column_names)}\\\")\\n    if image_column.endswith(':FILE'):\\n        dataset['train'] = dataset['train'].map(path_to_img)\\n        image_column = 'image'\\n\\n    # Preprocessing the datasets.\\n    # We need to tokenize input captions and transform the images.\\n    def tokenize_captions(examples, is_train=True):\\n        captions = []\\n        for caption in examples[caption_column]:\\n            if isinstance(caption, str):\\n                captions.append(caption)\\n            elif isinstance(caption, (list, np.ndarray)):\\n                # take a random caption if there are multiple\\n                captions.append(random.choice(caption) if is_train else caption[0])\\n            else:\\n                raise ValueError(\\n                    f'Caption column `{caption_column}` should contain either strings or lists of strings.')\\n        inputs = tokenizer(\\n            captions, max_length=tokenizer.model_max_length, padding='max_length', truncation=True, return_tensors='pt')\\n        return inputs.input_ids\\n\\n    # Preprocessing the datasets.\\n    train_transforms = transforms.Compose([\\n        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),\\n        transforms.CenterCrop(args.resolution) if args.center_crop else transforms.RandomCrop(args.resolution),\\n        transforms.RandomHorizontalFlip() if args.random_flip else transforms.Lambda(lambda x: x),\\n        transforms.ToTensor(),\\n        transforms.Normalize([0.5], [0.5]),\\n    ])\\n\\n    def preprocess_train(examples):\\n        images = [image.convert('RGB') for image in examples[image_column]]\\n        examples['pixel_values'] = [train_transforms(image) for image in images]\\n        examples['input_ids'] = tokenize_captions(examples)\\n        return examples\\n\\n    with accelerator.main_process_first():\\n        if args.max_train_samples is not None:\\n            dataset['train'] = dataset['train'].shuffle(seed=args.seed).select(range(args.max_train_samples))\\n        # Set the training transforms\\n        train_dataset = dataset['train'].with_transform(preprocess_train)\\n\\n    def collate_fn(examples):\\n        pixel_values = torch.stack([example['pixel_values'] for example in examples])\\n        pixel_values = pixel_values.to(memory_format=torch.contiguous_format).float()\\n        input_ids = torch.stack([example['input_ids'] for example in examples])\\n        return {'pixel_values': pixel_values, 'input_ids': input_ids}\\n\\n    # DataLoaders creation:\\n    train_dataloader = torch.utils.data.DataLoader(\\n        train_dataset,\\n        shuffle=True,\\n        collate_fn=collate_fn,\\n        batch_size=args.train_batch_size,\\n        num_workers=args.dataloader_num_workers,\\n    )\\n\\n    # Scheduler and math around the number of training steps.\\n    overrode_max_train_steps = False\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if args.max_train_steps is None:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n        overrode_max_train_steps = True\\n\\n    lr_scheduler = get_scheduler(\\n        args.lr_scheduler,\\n        optimizer=optimizer,\\n        num_warmup_steps=args.lr_warmup_steps * accelerator.num_processes,\\n        num_training_steps=args.max_train_steps * accelerator.num_processes,\\n    )\\n\\n    # Prepare everything with our `accelerator`.\\n    unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader,\\n                                                                          lr_scheduler)\\n\\n    if args.use_ema:\\n        ema_unet.to(accelerator.device)\\n\\n    # For mixed precision training we cast all non-trainable weigths (vae, non-lora text_encoder and non-lora unet)\\n    # to half-precision\\n    # as these weights are only used for inference, keeping weights in full precision is not required.\\n    weight_dtype = torch.float32\\n    if accelerator.mixed_precision == 'fp16':\\n        weight_dtype = torch.float16\\n        args.mixed_precision = accelerator.mixed_precision\\n    elif accelerator.mixed_precision == 'bf16':\\n        weight_dtype = torch.bfloat16\\n        args.mixed_precision = accelerator.mixed_precision\\n\\n    # Move text_encode and vae to gpu and cast to weight_dtype\\n    text_encoder.to(accelerator.device, dtype=weight_dtype)\\n    vae.to(accelerator.device, dtype=weight_dtype)\\n\\n    # We need to recalculate our total training steps as the size of the training dataloader may have changed.\\n    num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)\\n    if overrode_max_train_steps:\\n        args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch\\n    # Afterwards we recalculate our number of training epochs\\n    args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)\\n\\n    # We need to initialize the trackers we use, and also store our configuration.\\n    # The trackers initializes automatically on the main process.\\n    if accelerator.is_main_process:\\n        tracker_config = dict(vars(args))\\n        tracker_config.pop('validation_prompts')\\n        accelerator.init_trackers(args.tracker_project_name, tracker_config)\\n\\n    # Train!\\n    total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps\\n\\n    logger.info('***** Running training *****')\\n    logger.info(f'  Num examples = {len(train_dataset)}')\\n    logger.info(f'  Num Epochs = {args.num_train_epochs}')\\n    logger.info(f'  Instantaneous batch size per device = {args.train_batch_size}')\\n    logger.info(f'  Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}')\\n    logger.info(f'  Gradient Accumulation steps = {args.gradient_accumulation_steps}')\\n    logger.info(f'  Total optimization steps = {args.max_train_steps}')\\n    global_step = 0\\n    first_epoch = 0\\n\\n    # Potentially load in the weights and states from a previous save\\n    if args.resume_from_checkpoint:\\n        if args.resume_from_checkpoint != 'latest':\\n            path = os.path.basename(args.resume_from_checkpoint)\\n        else:\\n            # Get the most recent checkpoint\\n            dirs = os.listdir(args.output_dir)\\n            dirs = [d for d in dirs if d.startswith('checkpoint')]\\n            dirs = sorted(dirs, key=lambda x: int(x.split('-')[1]))\\n            path = dirs[-1] if len(dirs) > 0 else None\\n\\n        if path is None:\\n            accelerator.print(\\n                f\\\"Checkpoint '{args.resume_from_checkpoint}' does not exist. Starting a new training run.\\\")\\n            args.resume_from_checkpoint = None\\n            initial_global_step = 0\\n        else:\\n            accelerator.print(f'Resuming from checkpoint {path}')\\n            accelerator.load_state(os.path.join(args.output_dir, path))\\n            global_step = int(path.split('-')[1])\\n\\n            initial_global_step = global_step\\n            first_epoch = global_step // num_update_steps_per_epoch\\n\\n    else:\\n        initial_global_step = 0\\n\\n    progress_bar = tqdm(\\n        range(0, args.max_train_steps),\\n        initial=initial_global_step,\\n        desc='Steps',\\n        # Only show the progress bar once on each machine.\\n        disable=not accelerator.is_local_main_process,\\n    )\\n\\n    for epoch in range(first_epoch, args.num_train_epochs):\\n        train_loss = 0.0\\n        for step, batch in enumerate(train_dataloader):\\n            with accelerator.accumulate(unet):\\n                # Convert images to latent space\\n                latents = vae.encode(batch['pixel_values'].to(weight_dtype)).latent_dist.sample()\\n                latents = latents * vae.config.scaling_factor\\n\\n                # Sample noise that we'll add to the latents\\n                noise = torch.randn_like(latents)\\n                if args.noise_offset:\\n                    # https://www.crosslabs.org//blog/diffusion-with-offset-noise\\n                    noise += args.noise_offset * torch.randn(\\n                        (latents.shape[0], latents.shape[1], 1, 1), device=latents.device)\\n                if args.input_perturbation:\\n                    new_noise = noise + args.input_perturbation * torch.randn_like(noise)\\n                bsz = latents.shape[0]\\n                # Sample a random timestep for each image\\n                timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz, ), device=latents.device)\\n                timesteps = timesteps.long()\\n\\n                # Add noise to the latents according to the noise magnitude at each timestep\\n                # (this is the forward diffusion process)\\n                if args.input_perturbation:\\n                    noisy_latents = noise_scheduler.add_noise(latents, new_noise, timesteps)\\n                else:\\n                    noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)\\n\\n                # Get the text embedding for conditioning\\n                encoder_hidden_states = text_encoder(batch['input_ids'])[0]\\n\\n                # Get the target for loss depending on the prediction type\\n                if args.prediction_type is not None:\\n                    # set prediction_type of scheduler if defined\\n                    noise_scheduler.register_to_config(prediction_type=args.prediction_type)\\n\\n                if noise_scheduler.config.prediction_type == 'epsilon':\\n                    target = noise\\n                elif noise_scheduler.config.prediction_type == 'v_prediction':\\n                    target = noise_scheduler.get_velocity(latents, noise, timesteps)\\n                else:\\n                    raise ValueError(f'Unknown prediction type {noise_scheduler.config.prediction_type}')\\n\\n                # Predict the noise residual and compute loss\\n                model_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample\\n\\n                if args.snr_gamma is None:\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='mean')\\n                else:\\n                    # Compute loss-weights as per Section 3.4 of https://arxiv.org/abs/2303.09556.\\n                    # Since we predict the noise instead of x_0, the original formulation is slightly changed.\\n                    # This is discussed in Section 4.2 of the same paper.\\n                    snr = compute_snr(noise_scheduler, timesteps)\\n                    if noise_scheduler.config.prediction_type == 'v_prediction':\\n                        # Velocity objective requires that we add one to SNR values before we divide by them.\\n                        snr = snr + 1\\n                    mse_loss_weights = (\\n                        torch.stack([snr, args.snr_gamma * torch.ones_like(timesteps)], dim=1).min(dim=1)[0] / snr)\\n\\n                    loss = F.mse_loss(model_pred.float(), target.float(), reduction='none')\\n                    loss = loss.mean(dim=list(range(1, len(loss.shape)))) * mse_loss_weights\\n                    loss = loss.mean()\\n\\n                # Gather the losses across all processes for logging (if we use distributed training).\\n                avg_loss = accelerator.gather(loss.repeat(args.train_batch_size)).mean()\\n                train_loss += avg_loss.item() / args.gradient_accumulation_steps\\n\\n                # Backpropagate\\n                accelerator.backward(loss)\\n                if accelerator.sync_gradients:\\n                    accelerator.clip_grad_norm_(unet.parameters(), args.max_grad_norm)\\n                optimizer.step()\\n                lr_scheduler.step()\\n                optimizer.zero_grad()\\n\\n            # Checks if the accelerator has performed an optimization step behind the scenes\\n            if accelerator.sync_gradients:\\n                if args.use_ema:\\n                    ema_unet.step(unet.parameters())\\n                progress_bar.update(1)\\n                global_step += 1\\n                accelerator.log({'train_loss': train_loss}, step=global_step)\\n                train_loss = 0.0\\n\\n                if global_step % args.checkpointing_steps == 0:\\n                    if accelerator.is_main_process:\\n                        # _before_ saving state, check if this save would set us over the `checkpoints_total_limit`\\n                        if args.checkpoints_total_limit is not None:\\n                            checkpoints = os.listdir(args.output_dir)\\n                            checkpoints = [d for d in checkpoints if d.startswith('checkpoint')]\\n                            checkpoints = sorted(checkpoints, key=lambda x: int(x.split('-')[1]))\\n\\n                            # before we save the new checkpoint, we need to have at _most_ \\\\\\n                            # `checkpoints_total_limit - 1` checkpoints\\n                            if len(checkpoints) >= args.checkpoints_total_limit:\\n                                num_to_remove = len(checkpoints) - args.checkpoints_total_limit + 1\\n                                removing_checkpoints = checkpoints[0:num_to_remove]\\n\\n                                logger.info(\\n                                    f'{len(checkpoints)} checkpoints already exist, removing {len(removing_checkpoints)}\\\\\\n                                     checkpoints')\\n                                logger.info(f\\\"removing checkpoints: {', '.join(removing_checkpoints)}\\\")\\n\\n                                for removing_checkpoint in removing_checkpoints:\\n                                    removing_checkpoint = os.path.join(args.output_dir, removing_checkpoint)\\n                                    shutil.rmtree(removing_checkpoint)\\n\\n                        save_path = os.path.join(args.output_dir, f'checkpoint-{global_step}')\\n                        accelerator.save_state(save_path)\\n                        logger.info(f'Saved state to {save_path}')\\n\\n            logs = {'step_loss': loss.detach().item(), 'lr': lr_scheduler.get_last_lr()[0]}\\n            progress_bar.set_postfix(**logs)\\n\\n            if global_step >= args.max_train_steps:\\n                break\\n\\n        if accelerator.is_main_process:\\n            if args.validation_prompts is not None and epoch % args.validation_epochs == 0:\\n                if args.use_ema:\\n                    # Store the UNet parameters temporarily and load the EMA parameters to perform inference.\\n                    ema_unet.store(unet.parameters())\\n                    ema_unet.copy_to(unet.parameters())\\n                log_validation(\\n                    vae,\\n                    text_encoder,\\n                    tokenizer,\\n                    unet,\\n                    args,\\n                    accelerator,\\n                    weight_dtype,\\n                    global_step,\\n                )\\n                if args.use_ema:\\n                    # Switch back to the original UNet parameters.\\n                    ema_unet.restore(unet.parameters())\\n\\n    # Create the pipeline using the trained modules and save it.\\n    accelerator.wait_for_everyone()\\n    if accelerator.is_main_process:\\n        unet = accelerator.unwrap_model(unet)\\n        if args.use_ema:\\n            ema_unet.copy_to(unet.parameters())\\n\\n        pipeline = StableDiffusionPipeline.from_pretrained(\\n            args.pretrained_model_name_or_path,\\n            text_encoder=text_encoder,\\n            vae=vae,\\n            unet=unet,\\n            revision=args.revision,\\n            variant=args.variant,\\n        )\\n        pipeline.save_pretrained(args.output_dir)\\n\\n        # Run a final round of inference.\\n        images = []\\n        if args.validation_prompts is not None:\\n            logger.info('Running inference for collecting generated images...')\\n            pipeline = pipeline.to(accelerator.device)\\n            pipeline.torch_dtype = weight_dtype\\n            pipeline.set_progress_bar_config(disable=True)\\n\\n            if args.enable_xformers_memory_efficient_attention:\\n                pipeline.enable_xformers_memory_efficient_attention()\\n\\n            if args.seed is None:\\n                generator = None\\n            else:\\n                generator = torch.Generator(device=accelerator.device).manual_seed(args.seed)\\n\\n            for i in range(len(args.validation_prompts)):\\n                with torch.autocast('cuda'):\\n                    image = pipeline(args.validation_prompts[i], num_inference_steps=20, generator=generator).images[0]\\n                images.append(image)\\n\\n        if args.push_to_hub:\\n            save_model_card(args, args.hub_model_id, images, repo_folder=args.output_dir)\\n            push_to_hub(args.hub_model_id, args.output_dir, args.hub_token)\\n\\n    accelerator.end_training()\\n\\n\\nif __name__ == '__main__':\\n    main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport asyncio\\nimport inspect\\nimport logging\\nimport re\\nimport time\\nfrom concurrent.futures import ThreadPoolExecutor\\nfrom dataclasses import asdict\\nfrom http import HTTPStatus\\nfrom threading import Thread\\nfrom typing import Any, Dict, List, Optional, Union\\n\\nimport json\\nimport torch\\nfrom fastapi import FastAPI, Request\\nfrom fastapi.responses import JSONResponse, StreamingResponse\\nfrom peft import PeftModel\\nfrom transformers import GenerationConfig\\n\\nfrom swift.utils import get_logger, get_main, get_seed, seed_everything\\nfrom .agent import split_action_action_input\\nfrom .infer import merge_lora, prepare_model_template\\nfrom .utils import (TEMPLATE_MAPPING, ChatCompletionMessageToolCall, ChatCompletionRequest, ChatCompletionResponse,\\n                    ChatCompletionResponseChoice, ChatCompletionResponseStreamChoice, ChatCompletionStreamResponse,\\n                    ChatMessage, CompletionRequest, CompletionResponse, CompletionResponseChoice,\\n                    CompletionResponseStreamChoice, CompletionStreamResponse, DeltaMessage, DeployArguments, Function,\\n                    Model, ModelList, Template, UsageInfo, compat_openai, inference, inference_stream, is_quant_model,\\n                    messages_join_observation, messages_to_history, random_uuid, set_generation_config)\\n\\nlogger = get_logger()\\n\\nglobal_stats = {}\\ndefault_global_stats = {\\n    'num_prompt_tokens': 0,\\n    'num_generated_tokens': 0,\\n    'num_samples': 0,\\n    'runtime': 0.,\\n    'samples/s': 0.,\\n    'tokens/s': 0.\\n}\\n\\n\\nasync def _log_stats_hook(log_interval: int):\\n    global global_stats\\n    while True:\\n        global_stats = default_global_stats.copy()\\n        t = time.perf_counter()\\n        await asyncio.sleep(log_interval)\\n        runtime = time.perf_counter() - t\\n        global_stats['runtime'] = runtime\\n        global_stats['samples/s'] = global_stats['num_samples'] / runtime\\n        global_stats['tokens/s'] = global_stats['num_generated_tokens'] / runtime\\n        for k, v in global_stats.items():\\n            global_stats[k] = round(v, 8)\\n        logger.info(global_stats)\\n\\n\\ndef _update_stats(response) -> None:\\n    if response is None:\\n        return\\n    usage_info = response.usage\\n    global_stats['num_prompt_tokens'] += usage_info.prompt_tokens\\n    global_stats['num_generated_tokens'] += usage_info.completion_tokens\\n    global_stats['num_samples'] += 1\\n\\n\\ndef lifespan(app: FastAPI):\\n    global _args\\n    if _args.log_interval > 0:\\n        thread = Thread(target=lambda: asyncio.run(_log_stats_hook(_args.log_interval)))\\n        thread.start()\\n    yield\\n\\n\\napp = FastAPI(lifespan=lifespan)\\n_args: Optional[DeployArguments] = None\\nmodel = None\\nllm_engine = None\\ntemplate: Optional[Template] = None\\n\\n\\ndef create_error_response(status_code: Union[int, str, HTTPStatus], message: str) -> JSONResponse:\\n    status_code = int(status_code)\\n    return JSONResponse({'message': message, 'object': 'error'}, status_code)\\n\\n\\n@app.get('/v1/models')\\nasync def get_available_models():\\n    global _args\\n    model_list = [_args.served_model_name or _args.model_type]\\n    if _args.lora_request_list is not None:\\n        model_list += [lora_request.lora_name for lora_request in _args.lora_request_list]\\n    data = [\\n        Model(\\n            id=model_id,\\n            is_chat=not is_generation_template(_args.template_type),\\n            is_multimodal=_args.is_multimodal,\\n            owned_by=_args.owned_by) for model_id in model_list\\n    ]\\n    return ModelList(data=data)\\n\\n\\nasync def check_length(request: Union[ChatCompletionRequest, CompletionRequest],\\n                       input_ids: List[int],\\n                       strict: bool = False) -> Optional[str]:\\n    global llm_engine, model, _args\\n    if _args.infer_backend in {'vllm', 'lmdeploy'}:\\n        max_model_len = llm_engine.max_model_len\\n    else:\\n        max_model_len = model.max_model_len\\n    num_tokens = len(input_ids)\\n    max_tokens = request.max_tokens\\n    if max_model_len is None:\\n        max_model_len = 8192\\n        logger.warning(\\n            'The current model is unable to retrieve `max_model_len`. It is set to the default value of 8192.')\\n    max_new_tokens = max_model_len - num_tokens\\n    if max_tokens is None:\\n        request.max_tokens = max_new_tokens\\n    elif max_new_tokens < max_tokens:\\n        if strict:\\n            error_msg = (f'Your prompt has {num_tokens} tokens, and you have set the `max_tokens` to {max_tokens}, '\\n                         f'but the maximum model length supported is {max_model_len}. '\\n                         'Please reduce the number of tokens in the prompt or the `max_tokens`.')\\n            return error_msg\\n        else:\\n            logger.warning(f'max_model_len({max_model_len}) - num_tokens({num_tokens}) < max_tokens({max_tokens}). '\\n                           f'Setting max_tokens: {max_model_len - num_tokens}')\\n            request.max_tokens = max_new_tokens\\n\\n\\nasync def check_model(request: Union[ChatCompletionRequest, CompletionRequest]) -> Optional[str]:\\n    model_list = await get_available_models()\\n    model_type_list = [model.id for model in model_list.data]\\n    if request.model in model_type_list:\\n        return\\n    else:\\n        return f'`{request.model}` is not in the model_list: `{model_type_list}`.'\\n\\n\\ndef is_generation_template(template_type: str) -> bool:\\n    template_info = TEMPLATE_MAPPING[template_type]\\n    is_generation = template_info.get('is_generation', False)\\n    return is_generation\\n\\n\\ndef logger_request(request_info: Dict[str, Any]) -> None:\\n    request_info = str(request_info)\\n    pattern = r'<(?:img|audio|video)>(.+?)</(?:img|audio|video)>'\\n    match_iter = re.finditer(pattern, request_info)\\n    for match_ in match_iter:\\n        base64_str = match_.group(1)\\n        if len(base64_str) >= 1000:\\n            base64_str = f'<<<base64:{base64_str[:50]}..>>>'\\n        request_info = f'{request_info[:match_.start(1)]}{base64_str}{request_info[match_.end(1):]}'\\n    logger.info(request_info)\\n\\n\\nasync def _prepare_request(request: Union[ChatCompletionRequest, CompletionRequest], raw_request: Request):\\n    global template, model, llm_engine, _args\\n    if _args.api_key is not None:\\n        is_valid = _check_api_key(raw_request, _args.api_key)\\n        if not is_valid:\\n            return create_error_response(HTTPStatus.BAD_REQUEST, 'API key error')\\n\\n    if isinstance(request.top_logprobs, int) and request.top_logprobs > _args.max_logprobs:\\n        return create_error_response(\\n            HTTPStatus.BAD_REQUEST, f'The value of top_logprobs({request.top_logprobs}) is greater than '\\n            f'the server\\\\'s max_logprobs({_args.max_logprobs}).')\\n\\n    if _args.infer_backend in {'vllm', 'lmdeploy'}:\\n        model_or_engine = llm_engine\\n    else:\\n        model_or_engine = model\\n\\n    error_msg = await check_model(request)\\n    if error_msg is not None:\\n        return create_error_response(HTTPStatus.BAD_REQUEST, error_msg)\\n\\n    if request.seed is not None:\\n        seed_everything(request.seed, verbose=False)\\n    _request = {'model': request.model}\\n    if isinstance(request, ChatCompletionRequest):\\n        if is_generation_template(\\n                template.template_type) and not (len(request.messages) == 1 and request.messages[0]['role'] == 'user'):\\n            return create_error_response(\\n                HTTPStatus.BAD_REQUEST, f'The chat template `{template.template_type}` corresponding to '\\n                f'the model `{model_or_engine.model_type}` is in text generation format. '\\n                'Please use the `completions` API.')\\n        messages = request.messages\\n        compat_openai(messages, request)\\n        # For agent, check if response is endwith observations and join tool observation\\n        messages_join_observation(messages)\\n        example = messages_to_history(messages)\\n        if request.tool_choice is not None and request.tools is not None:\\n            if isinstance(request.tool_choice, dict):\\n                name = request.tool_choice['function']['name']\\n                tool = next((t for t in request.tools if t['function']['name'] == name), None)\\n                if tool is None:\\n                    raise ValueError(f\\\"Tool choice '{name}' not found in tools.\\\")\\n                example['tools'] = [tool]\\n            elif request.tool_choice == 'auto':\\n                example['tools'] = request.tools\\n        request_id = f'chatcmpl-{random_uuid()}'\\n        _request['messages'] = messages\\n    else:\\n        if not is_generation_template(template.template_type):\\n            return create_error_response(\\n                HTTPStatus.BAD_REQUEST, f'The chat template `{template.template_type}` corresponding to '\\n                f'the model `{model_or_engine.model_type}` is in chat format. '\\n                'Please use the `chat.completions` API.')\\n        prompt = request.prompt\\n        example = {'query': prompt}\\n        request_id = f'cmpl-{random_uuid()}'\\n        _request['prompt'] = prompt\\n\\n    for media_key in ['images', 'audios', 'videos']:\\n        medias = getattr(request, media_key, None)\\n        if medias:\\n            example[media_key] = medias\\n    executor = ThreadPoolExecutor(max_workers=1)\\n    loop = asyncio.get_running_loop()\\n    inputs = (await loop.run_in_executor(executor, template.encode, example))[0]\\n    request_info = {'request_id': request_id}\\n    request_info.update(_request)\\n\\n    if 'input_ids' in inputs:\\n        input_ids = inputs['input_ids']\\n        error_msg = await check_length(request, input_ids)\\n        if error_msg is not None:\\n            return create_error_response(HTTPStatus.BAD_REQUEST, error_msg)\\n\\n    return request_info, inputs, example\\n\\n\\ndef _get_logprobs_vllm(logprobs_list: Optional[List[Dict[int, float]]],\\n                       token_ids: List[int],\\n                       top_logprobs: Optional[int] = None) -> Optional[Dict[str, Any]]:\\n    if logprobs_list is None:\\n        return None\\n    res = []\\n    for logprobs, token_id in zip(logprobs_list, token_ids):\\n        logprob = logprobs[token_id]\\n        _res = {\\n            'token': logprob.decoded_token,\\n            'logprob': logprob.logprob,\\n            'bytes': list(logprob.decoded_token.encode('utf8'))\\n        }\\n        if top_logprobs is not None:\\n            res_top_logprobs = []\\n            for k, logprob in logprobs.items():\\n                if logprob.logprob == float('-inf') or k == token_id:\\n                    continue\\n                res_top_logprobs.append({\\n                    'token': logprob.decoded_token,\\n                    'logprob': logprob.logprob,\\n                    'bytes': list(logprob.decoded_token.encode('utf8'))\\n                })\\n            _res['top_logprobs'] = res_top_logprobs\\n        res.append(_res)\\n    return {'content': res}\\n\\n\\n@torch.inference_mode()\\nasync def inference_vllm_async(request: Union[ChatCompletionRequest, CompletionRequest], raw_request: Request):\\n    global llm_engine, template, _args\\n    from .utils import VllmGenerationConfig, add_vllm_request\\n    created_time = int(time.time())\\n\\n    result = await _prepare_request(request, raw_request)\\n    if isinstance(result, JSONResponse):\\n        return result\\n\\n    request_info, inputs, _ = result\\n    request_id = request_info['request_id']\\n\\n    kwargs = {'max_tokens': request.max_tokens}\\n    for key in ['n', 'best_of', 'frequency_penalty', 'length_penalty', 'presence_penalty', 'num_beams']:\\n        kwargs[key] = getattr(request, key)\\n    for key in ['temperature', 'top_k', 'top_p', 'repetition_penalty']:\\n        new_value = getattr(request, key)\\n        if new_value is None:\\n            kwargs[key] = getattr(llm_engine.generation_config, key)\\n        else:\\n            kwargs[key] = new_value\\n    kwargs['stop'] = (llm_engine.generation_config.stop or []) + (getattr(request, 'stop') or [])\\n    kwargs['seed'] = request.seed\\n\\n    if request.logprobs:\\n        kwargs['logprobs'] = 1\\n        if request.top_logprobs is not None:\\n            kwargs['logprobs'] = max(1, request.top_logprobs)\\n\\n    generation_config = VllmGenerationConfig(**kwargs)\\n    if generation_config.use_beam_search and request.stream:\\n        error_msg = 'Streaming generation does not support beam search.'\\n        raise ValueError(error_msg)\\n    tokenizer = template.tokenizer\\n    if tokenizer.eos_token is not None and tokenizer.eos_token not in generation_config.stop:\\n        generation_config.stop.append(tokenizer.eos_token)\\n    if isinstance(template.suffix[-1], str) and template.suffix[-1] not in generation_config.stop:\\n        generation_config.stop.append(template.suffix[-1])\\n    if isinstance(template.suffix[-1], list):\\n        token_str = tokenizer.decode(template.suffix[-1])\\n        if token_str not in generation_config.stop:\\n            generation_config.stop.append(token_str)\\n    request_info['generation_config'] = generation_config\\n    request_info.update({'stream': request.stream})\\n    if _args.verbose:\\n        logger_request(request_info)\\n\\n    generate_kwargs = {}\\n    if _args.vllm_enable_lora and request.model != _args.model_type:\\n        lora_request = None\\n        for lora_req in _args.lora_request_list:\\n            if lora_req.lora_name == request.model:\\n                lora_request = lora_req\\n                break\\n        assert lora_request is not None\\n        generate_kwargs['lora_request'] = lora_request\\n\\n    result_generator = add_vllm_request(\\n        llm_engine, inputs, request_id=request_id, generation_config=generation_config, **generate_kwargs)\\n\\n    async def _generate_full():\\n        result = None\\n        async for result in result_generator:\\n            if await raw_request.is_disconnected():\\n                await llm_engine.abort(request_id)\\n                return create_error_response(HTTPStatus.BAD_REQUEST, 'Client disconnected')\\n        assert result is not None\\n        num_prompt_tokens = len(result.prompt_token_ids)\\n        num_generated_tokens = sum(len(output.token_ids) for output in result.outputs)\\n        usage_info = UsageInfo(\\n            prompt_tokens=num_prompt_tokens,\\n            completion_tokens=num_generated_tokens,\\n            total_tokens=num_prompt_tokens + num_generated_tokens,\\n        )\\n\\n        if isinstance(request, ChatCompletionRequest):\\n            choices = []\\n            for output in result.outputs:\\n                response = template.generate_ids_to_response(output.token_ids)\\n                logprobs = _get_logprobs_vllm(output.logprobs, output.token_ids, request.top_logprobs)\\n                action, action_input = split_action_action_input(response)\\n                toolcall = None\\n                if action is not None:\\n                    toolcall = [\\n                        ChatCompletionMessageToolCall(\\n                            id=f'toolcall-{random_uuid()}',\\n                            type='function',\\n                            function=Function(name=action, arguments=action_input))\\n                    ]\\n                choice = ChatCompletionResponseChoice(\\n                    index=output.index,\\n                    message=ChatMessage(role='assistant', content=response, tool_calls=toolcall),\\n                    finish_reason=output.finish_reason,\\n                    logprobs=logprobs)\\n                choices.append(choice)\\n            response = ChatCompletionResponse(\\n                model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n        else:\\n            choices = []\\n            for output in result.outputs:\\n                response = template.generate_ids_to_response(output.token_ids)\\n                logprobs = _get_logprobs_vllm(output.logprobs, output.token_ids, request.top_logprobs)\\n                choice = CompletionResponseChoice(\\n                    index=output.index, text=response, finish_reason=output.finish_reason, logprobs=logprobs)\\n                choices.append(choice)\\n            response = CompletionResponse(\\n                model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n        if _args.log_interval > 0:\\n            _update_stats(response)\\n        return response\\n\\n    async def _generate_stream():\\n        print_idx_list = [[0] for _ in range(request.n)]\\n        total_res = ['' for _ in range(request.n)]\\n        response = None\\n        async for result in result_generator:\\n            num_prompt_tokens = len(result.prompt_token_ids)\\n            num_generated_tokens = sum(len(output.token_ids) for output in result.outputs)\\n            usage_info = UsageInfo(\\n                prompt_tokens=num_prompt_tokens,\\n                completion_tokens=num_generated_tokens,\\n                total_tokens=num_prompt_tokens + num_generated_tokens,\\n            )\\n            is_diff = False\\n            has_finished = False\\n            for output in result.outputs:\\n                output.delta_text = template.generate_ids_to_response(\\n                    output.token_ids, output.finished(), return_delta=True, print_idx=print_idx_list[output.index])\\n                total_res[output.index] += output.delta_text\\n                is_diff |= bool(output.delta_text)\\n                has_finished |= output.finish_reason is not None\\n            if not is_diff and not has_finished:\\n                continue\\n            if isinstance(request, ChatCompletionRequest):\\n                choices = []\\n                for output in result.outputs:\\n                    toolcall = None\\n                    if output.finish_reason is not None:\\n                        action, action_input = split_action_action_input(total_res[output.index])\\n                        if action is not None:\\n                            toolcall = [\\n                                ChatCompletionMessageToolCall(\\n                                    id=f'toolcall-{random_uuid()}',\\n                                    type='function',\\n                                    function=Function(name=action, arguments=action_input))\\n                            ]\\n                    choice = ChatCompletionResponseStreamChoice(\\n                        index=output.index,\\n                        delta=DeltaMessage(role='assistant', content=output.delta_text, tool_calls=toolcall),\\n                        finish_reason=output.finish_reason)\\n                    choices.append(choice)\\n                response = ChatCompletionStreamResponse(\\n                    model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n            else:\\n                choices = []\\n                for output in result.outputs:\\n                    choice = CompletionResponseStreamChoice(\\n                        index=output.index, text=output.delta_text, finish_reason=output.finish_reason)\\n                    choices.append(choice)\\n                response = CompletionStreamResponse(\\n                    model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n            yield f'data:{json.dumps(asdict(response), ensure_ascii=False)}\\\\n\\\\n'\\n        if _args.log_interval > 0:\\n            _update_stats(response)\\n        yield 'data:[DONE]\\\\n\\\\n'\\n\\n    if request.stream:\\n        return StreamingResponse(_generate_stream())\\n    else:\\n        return await _generate_full()\\n\\n\\ndef _get_logprobs_lmdeploy(logprobs_list: Optional[List[Dict[int, float]]],\\n                           token_ids: List[int],\\n                           top_logprobs: Optional[int] = None) -> Optional[Dict[str, Any]]:\\n    if logprobs_list is None:\\n        return None\\n    tokenizer = template.tokenizer\\n    res = []\\n    for logprobs, token_id in zip(logprobs_list, token_ids):\\n        token = tokenizer.decode(token_id)\\n        _res = {'token': token, 'logprob': logprobs[token_id], 'bytes': list(token.encode('utf8'))}\\n        if top_logprobs is not None:\\n            res_top_logprobs = []\\n            for k, logprob in logprobs.items():\\n                if k == token_id:\\n                    continue\\n                token = tokenizer.decode(k)\\n                res_top_logprobs.append({'token': token, 'logprob': logprob, 'bytes': list(token.encode('utf8'))})\\n            _res['top_logprobs'] = res_top_logprobs\\n        res.append(_res)\\n    return {'content': res}\\n\\n\\n@torch.inference_mode()\\nasync def inference_lmdeploy_async(request: Union[ChatCompletionRequest, CompletionRequest], raw_request: Request):\\n    global llm_engine, template, _args\\n    created_time = int(time.time())\\n    from .utils.lmdeploy_utils import LmdeployGenerationConfig, _add_stop_word\\n\\n    result = await _prepare_request(request, raw_request)\\n    if isinstance(result, JSONResponse):\\n        return result\\n\\n    request_info, inputs, _ = result\\n    request_id = request_info['request_id']\\n\\n    kwargs = {'max_new_tokens': request.max_tokens}\\n    for key in ['temperature', 'top_k', 'top_p', 'repetition_penalty']:\\n        new_value = getattr(request, key)\\n        if new_value is None:\\n            kwargs[key] = getattr(llm_engine.generation_config, key)\\n        else:\\n            kwargs[key] = new_value\\n\\n    tokenizer = template.tokenizer\\n    stop_words = (llm_engine.generation_config.stop_words or []).copy()\\n    for stop_word in getattr(request, 'stop') or []:\\n        _add_stop_word(stop_words, stop_word, tokenizer=tokenizer)\\n    _add_stop_word(stop_words, tokenizer.eos_token_id, tokenizer=tokenizer)\\n    _add_stop_word(stop_words, template.suffix[-1], tokenizer=tokenizer)\\n    kwargs['stop_words'] = stop_words\\n    if request.seed is None:\\n        request.seed = get_seed()\\n    kwargs['random_seed'] = request.seed\\n\\n    if request.logprobs:\\n        kwargs['logprobs'] = 1\\n        if request.top_logprobs is not None:\\n            kwargs['logprobs'] = max(1, request.top_logprobs)\\n\\n    generation_config = LmdeployGenerationConfig(**kwargs)\\n    request_info['generation_config'] = generation_config\\n    request_info.update({'stream': request.stream})\\n    if _args.verbose:\\n        logger_request(request_info)\\n\\n    session_id = time.time_ns()\\n    generator = await llm_engine.get_generator(False, session_id)\\n    images = inputs.pop('images', None) or []\\n    if len(images) > 0:\\n        inputs['images'] = await llm_engine.vl_encoder.async_infer(images)\\n        await template.prepare_lmdeploy_inputs(inputs)\\n\\n    async def _generate_full():\\n        async with llm_engine.safe_run(session_id):\\n            async for output in generator.async_stream_infer(\\n                    session_id=session_id, **inputs, stream_output=False, gen_config=generation_config):\\n                pass\\n        response = template.generate_ids_to_response(output.token_ids)\\n        logprobs = _get_logprobs_lmdeploy(output.logprobs, output.token_ids, request.top_logprobs)\\n        num_prompt_tokens = len(inputs['input_ids'])\\n        num_generated_tokens = len(output.token_ids)\\n        usage_info = UsageInfo(\\n            prompt_tokens=num_prompt_tokens,\\n            completion_tokens=num_generated_tokens,\\n            total_tokens=num_prompt_tokens + num_generated_tokens)\\n        finish_reason = None\\n        if output.status.name == 'FINISH':\\n            finish_reason = 'stop'\\n\\n        if isinstance(request, ChatCompletionRequest):\\n            action, action_input = split_action_action_input(response)\\n            toolcall = None\\n            if action is not None:\\n                toolcall = [\\n                    ChatCompletionMessageToolCall(\\n                        id=f'toolcall-{random_uuid()}',\\n                        type='function',\\n                        function=Function(name=action, arguments=action_input))\\n                ]\\n            choices = [\\n                ChatCompletionResponseChoice(\\n                    index=0,\\n                    message=ChatMessage(role='assistant', content=response, tool_calls=toolcall),\\n                    finish_reason=finish_reason,\\n                    logprobs=logprobs)\\n            ]\\n            response = ChatCompletionResponse(\\n                model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n        else:\\n            choices = [CompletionResponseChoice(index=0, text=response, finish_reason=finish_reason, logprobs=logprobs)]\\n            response = CompletionResponse(\\n                model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n        if _args.log_interval > 0:\\n            _update_stats(response)\\n        return response\\n\\n    async def _generate_stream():\\n        num_prompt_tokens = len(inputs['input_ids'])\\n        total_response = ''\\n        print_idx = [0]\\n        async with llm_engine.safe_run(session_id):\\n            async_iter = generator.async_stream_infer(\\n                session_id=session_id, **inputs, stream_output=True, gen_config=generation_config).__aiter__()\\n            is_finished = False\\n            response = None\\n            while not is_finished:\\n                try:\\n                    output = await async_iter.__anext__()\\n                except StopAsyncIteration:\\n                    is_finished = True\\n                num_generated_tokens = len(output.token_ids)\\n                usage_info = UsageInfo(\\n                    prompt_tokens=num_prompt_tokens,\\n                    completion_tokens=num_generated_tokens,\\n                    total_tokens=num_prompt_tokens + num_generated_tokens,\\n                )\\n                delta_text = template.generate_ids_to_response(\\n                    output.token_ids, is_finished, return_delta=True, print_idx=print_idx)\\n\\n                finish_reason = None\\n                if output.status.name == 'FINISH':\\n                    finish_reason = 'stop'\\n                if not delta_text and finish_reason != 'stop':\\n                    continue\\n                total_response += delta_text\\n                if isinstance(request, ChatCompletionRequest):\\n                    toolcall = None\\n                    if finish_reason == 'stop':\\n                        action, action_input = split_action_action_input(total_response)\\n                        if action is not None:\\n                            toolcall = [\\n                                ChatCompletionMessageToolCall(\\n                                    id=f'toolcall-{random_uuid()}',\\n                                    type='function',\\n                                    function=Function(name=action, arguments=action_input))\\n                            ]\\n                    choices = [\\n                        ChatCompletionResponseStreamChoice(\\n                            index=0,\\n                            delta=DeltaMessage(role='assistant', content=delta_text, tool_calls=toolcall),\\n                            finish_reason=finish_reason)\\n                    ]\\n                    response = ChatCompletionStreamResponse(\\n                        model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n                else:\\n                    choices = [CompletionResponseStreamChoice(index=0, text=delta_text, finish_reason=finish_reason)]\\n                    response = CompletionStreamResponse(\\n                        model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n                yield f'data:{json.dumps(asdict(response), ensure_ascii=False)}\\\\n\\\\n'\\n            if _args.log_interval > 0:\\n                _update_stats(response)\\n            yield 'data:[DONE]\\\\n\\\\n'\\n\\n    if request.stream:\\n        return StreamingResponse(_generate_stream())\\n    else:\\n        return await _generate_full()\\n\\n\\nclass _GenerationConfig(GenerationConfig):\\n\\n    def __repr__(self) -> str:\\n        parameters = inspect.signature(self.to_json_string).parameters\\n        kwargs = {}\\n        if 'ignore_metadata' in parameters:\\n            kwargs['ignore_metadata'] = True\\n        gen_kwargs = json.loads(self.to_json_string(**kwargs))\\n        gen_kwargs.pop('transformers_version', None)\\n        return f'GenerationConfig({gen_kwargs})'\\n\\n\\ndef _check_api_key(raw_request: Request, api_key: str) -> bool:\\n    authorization = dict(raw_request.headers).get('authorization')\\n    if authorization is None:\\n        return False\\n    if not authorization.startswith('Bearer '):\\n        return False\\n    request_api_key = authorization[7:]\\n    return request_api_key == api_key\\n\\n\\ndef _get_logprobs_pt(logits_list: Optional[List[torch.Tensor]],\\n                     sequences: torch.Tensor,\\n                     top_logprobs: Optional[int] = None) -> Optional[Dict[str, Any]]:\\n    if logits_list is None:\\n        return None\\n    res = []\\n    tokenizer = template.tokenizer\\n    for logits, token_id in zip(logits_list, sequences):\\n        token = tokenizer.decode(token_id)\\n        logprobs = torch.log_softmax(logits[0], -1)\\n        logprob = logprobs[token_id].item()\\n        sorted_logprobs_idx = logprobs.argsort(descending=True).tolist()\\n        _res = {'token': token, 'logprob': logprob, 'bytes': list(token.encode('utf8'))}\\n        if top_logprobs is not None:\\n            res_top_logprobs = []\\n            for idx in sorted_logprobs_idx[:top_logprobs]:\\n                token = tokenizer.decode(idx)\\n                logprob = logprobs[idx].item()\\n                if idx == token_id or logprob == float('-inf'):\\n                    continue\\n                res_top_logprobs.append({'token': token, 'logprob': logprob, 'bytes': list(token.encode('utf8'))})\\n            _res['top_logprobs'] = res_top_logprobs\\n        res.append(_res)\\n    return {'content': res}\\n\\n\\n@torch.inference_mode()\\nasync def inference_pt_async(request: Union[ChatCompletionRequest, CompletionRequest], raw_request: Request):\\n    global model, template, _args\\n    created_time = int(time.time())\\n    result = await _prepare_request(request, raw_request)\\n    if isinstance(result, JSONResponse):\\n        return result\\n\\n    request_info, _, example = result\\n    request_id = request_info['request_id']\\n\\n    kwargs = {'max_new_tokens': request.max_tokens}\\n    # not use: 'n', 'best_of', 'frequency_penalty', 'presence_penalty'\\n    for key in ['length_penalty', 'num_beams']:\\n        kwargs[key] = getattr(request, key)\\n    for key in ['temperature', 'top_k', 'top_p', 'repetition_penalty']:\\n        new_value = getattr(request, key)\\n        if new_value is None:\\n            kwargs[key] = getattr(model.generation_config, key)\\n            if key == 'temperature':\\n                do_sample = getattr(model.generation_config, 'do_sample')\\n                if not do_sample:\\n                    kwargs[key] = 0\\n        else:\\n            kwargs[key] = new_value\\n\\n    if kwargs['temperature'] == 0:\\n        kwargs['do_sample'] = False\\n        kwargs['temperature'] = 1\\n        kwargs['top_p'] = 1\\n        kwargs['top_k'] = 50\\n    else:\\n        kwargs['do_sample'] = True\\n    kwargs['return_dict_in_generate'] = True\\n    if request.logprobs:\\n        kwargs['output_logits'] = True\\n\\n    generation_config = _GenerationConfig(**kwargs)\\n    _old_generation_config = model.generation_config\\n    set_generation_config(model, generation_config)  # inplace\\n    model.generation_config = _old_generation_config\\n    request_info['generation_config'] = generation_config\\n    stop = (_args.stop_words or []) + (getattr(request, 'stop') or [])\\n    request_info.update({'seed': request.seed, 'stop': stop, 'stream': request.stream})\\n    if _args.verbose:\\n        logger_request(request_info)\\n\\n    adapter_kwargs = {}\\n    if _args.lora_request_list is not None:\\n        if _args.use_dora or is_quant_model(_args.model_type, model) or _args.is_multimodal:\\n            if _args.use_dora:\\n                error_msg = 'Dora'\\n            elif is_quant_model(_args.model_type, model):\\n                error_msg = 'GPTQ/AWQ/AQLM model'\\n            else:\\n                error_msg = 'Multimodal model'\\n            if request.model != 'default-lora':\\n                return create_error_response(HTTPStatus.BAD_REQUEST, f'{error_msg} only support `default-lora`')\\n        elif request.model != _args.model_type:\\n            adapter_names = None\\n            for lora_req in _args.lora_request_list:\\n                if lora_req.lora_name == request.model:\\n                    adapter_names = request.model\\n                    break\\n            assert adapter_names is not None\\n            adapter_kwargs['adapter_names'] = [adapter_names]\\n        elif isinstance(model, PeftModel):\\n            adapter_kwargs['adapter_names'] = ['-']  # use base model\\n\\n    async def _generate_full():\\n        generation_info = {}\\n        resp = inference(\\n            model,\\n            template,\\n            **example,\\n            stop_words=stop,\\n            generation_config=generation_config,\\n            generation_info=generation_info,\\n            **adapter_kwargs)\\n        response = resp['response']\\n        logprobs = _get_logprobs_pt(resp.get('logits'), resp.get('sequences'), request.top_logprobs)\\n\\n        num_prompt_tokens = generation_info['num_prompt_tokens']\\n        num_generated_tokens = generation_info['num_generated_tokens']\\n        usage_info = UsageInfo(\\n            prompt_tokens=num_prompt_tokens,\\n            completion_tokens=num_generated_tokens,\\n            total_tokens=num_prompt_tokens + num_generated_tokens,\\n        )\\n        if isinstance(request, ChatCompletionRequest):\\n            action, action_input = split_action_action_input(response)\\n            toolcall = None\\n            if action is not None:\\n                toolcall = [\\n                    ChatCompletionMessageToolCall(\\n                        id=f'toolcall-{random_uuid()}',\\n                        type='function',\\n                        function=Function(name=action, arguments=action_input))\\n                ]\\n            choices = [\\n                ChatCompletionResponseChoice(\\n                    index=0,\\n                    message=ChatMessage(role='assistant', content=response, tool_calls=toolcall),\\n                    finish_reason=None,\\n                    logprobs=logprobs)\\n            ]\\n            response = ChatCompletionResponse(\\n                model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n        else:\\n            choices = [CompletionResponseChoice(index=0, text=response, finish_reason=None, logprobs=logprobs)]\\n            response = CompletionResponse(\\n                model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n        if _args.log_interval > 0:\\n            _update_stats(response)\\n        return response\\n\\n    def _generate_stream():\\n        generation_info = {}\\n        gen = inference_stream(\\n            model,\\n            template,\\n            **example,\\n            stop_words=stop,\\n            generation_config=generation_config,\\n            generation_info=generation_info,\\n            **adapter_kwargs)\\n\\n        print_idx = 0\\n        response = ''\\n        is_finished = False\\n        while not is_finished:\\n            try:\\n                response = next(gen)['response']\\n            except StopIteration:\\n                is_finished = True\\n            num_prompt_tokens = generation_info['num_prompt_tokens']\\n            num_generated_tokens = generation_info['num_generated_tokens']\\n            usage_info = UsageInfo(\\n                prompt_tokens=num_prompt_tokens,\\n                completion_tokens=num_generated_tokens,\\n                total_tokens=num_prompt_tokens + num_generated_tokens,\\n            )\\n            delta_text = response[print_idx:]\\n            if not delta_text and not is_finished:\\n                continue\\n            print_idx = len(response)\\n            if isinstance(request, ChatCompletionRequest):\\n                toolcall = None\\n                if is_finished:\\n                    action, action_input = split_action_action_input(response)\\n                    if action:\\n                        toolcall = [\\n                            ChatCompletionMessageToolCall(\\n                                id=f'toolcall-{random_uuid()}',\\n                                type='function',\\n                                function=Function(name=action, arguments=action_input))\\n                        ]\\n                choices = [\\n                    ChatCompletionResponseStreamChoice(\\n                        index=0,\\n                        delta=DeltaMessage(role='assistant', content=delta_text, tool_calls=toolcall),\\n                        finish_reason=None)\\n                ]\\n                resp = ChatCompletionStreamResponse(\\n                    model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n            else:\\n                choices = [CompletionResponseStreamChoice(index=0, text=delta_text, finish_reason=None)]\\n                resp = CompletionStreamResponse(\\n                    model=request.model, choices=choices, usage=usage_info, id=request_id, created=created_time)\\n            yield f'data:{json.dumps(asdict(resp), ensure_ascii=False)}\\\\n\\\\n'\\n        if _args.log_interval > 0:\\n            _update_stats(resp)\\n        yield 'data:[DONE]\\\\n\\\\n'\\n\\n    if request.stream:\\n        return StreamingResponse(_generate_stream())\\n    else:\\n        return await _generate_full()\\n\\n\\n@app.post('/v1/chat/completions')\\nasync def create_chat_completion(request: ChatCompletionRequest, raw_request: Request):\\n    global _args\\n    assert _args is not None\\n    if request.stop is None:\\n        request.stop = []\\n    if _args.infer_backend == 'vllm':\\n        return await inference_vllm_async(request, raw_request)\\n    elif _args.infer_backend == 'lmdeploy':\\n        return await inference_lmdeploy_async(request, raw_request)\\n    else:\\n        return await inference_pt_async(request, raw_request)\\n\\n\\n@app.post('/v1/completions')\\nasync def create_completion(request: CompletionRequest, raw_request: Request):\\n    global _args\\n    assert _args is not None\\n    if request.stop is None:\\n        request.stop = []\\n    if _args.infer_backend == 'vllm':\\n        return await inference_vllm_async(request, raw_request)\\n    elif _args.infer_backend == 'lmdeploy':\\n        return await inference_lmdeploy_async(request, raw_request)\\n    else:\\n        return await inference_pt_async(request, raw_request)\\n\\n\\ndef llm_deploy(args: DeployArguments) -> None:\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n    logger_format = logging.Formatter('%(levelname)s: %(asctime)s %(filename)s:%(lineno)d] %(message)s')\\n    logger.handlers[0].setFormatter(logger_format)\\n    import uvicorn\\n    global llm_engine, model, template, _args\\n    _args = args\\n    if args.merge_lora:\\n        merge_lora(args, device_map=args.merge_device_map)\\n    if args.infer_backend == 'vllm':\\n        from .utils import prepare_vllm_engine_template\\n        llm_engine, template = prepare_vllm_engine_template(args, use_async=True)\\n        template._is_vllm = True\\n    elif args.infer_backend == 'lmdeploy':\\n        from .utils import prepare_lmdeploy_engine_template\\n        llm_engine, template = prepare_lmdeploy_engine_template(args)\\n        template._is_lmdeploy = True\\n    else:\\n        model, template = prepare_model_template(args)\\n    uvicorn.run(app, host=args.host, port=args.port, ssl_keyfile=args.ssl_keyfile, ssl_certfile=args.ssl_certfile)\\n\\n\\ndeploy_main = get_main(DeployArguments, llm_deploy)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nfrom typing import List, Optional\\n\\nimport json\\nimport torch\\n\\nfrom swift.llm import get_model_tokenizer, get_template\\nfrom swift.utils import (check_json_format, get_logger, get_main, get_model_info, push_to_ms_hub, seed_everything,\\n                         show_layers)\\nfrom .infer import merge_lora, prepare_model_template, save_checkpoint\\nfrom .utils import ExportArguments, Template, get_dataset, swift_to_peft_format\\n\\nlogger = get_logger()\\n\\n_args: Optional[ExportArguments] = None\\ntemplate: Optional[Template] = None\\n\\n\\ndef _get_dataset(*args, **kwargs):\\n    global _args, template\\n    assert _args is not None\\n    assert template is not None\\n    data = _args.dataset\\n    n_samples = _args.quant_n_samples\\n    block_size = _args.quant_seqlen\\n\\n    # only use train_dataset\\n    dataset = get_dataset(\\n        data,\\n        0,\\n        _args.dataset_seed,\\n        check_dataset_strategy=_args.check_dataset_strategy,\\n        model_name=_args.model_name,\\n        model_author=_args.model_author)[0]\\n    logger.info(f'quant_dataset: {dataset}')\\n    dataset = dataset.shuffle()\\n\\n    samples = []\\n    n_run = 0\\n    for data in dataset:\\n        input_ids = template.encode(data)[0].get('input_ids')\\n        if input_ids is None or len(input_ids) == 0:\\n            continue\\n        sample = torch.tensor(input_ids)\\n        samples.append(sample)\\n        n_run += 1\\n        if n_run == n_samples:\\n            break\\n    # now concatenate all samples and split according to block size\\n    cat_samples = torch.cat(samples, dim=0)  # shape: [X]\\n    n_split = cat_samples.shape[0] // block_size\\n    logger.info(f'Split into {n_split} blocks')\\n    if _args.quant_method == 'awq':\\n        return [cat_samples[None, i * block_size:(i + 1) * block_size] for i in range(n_split)]\\n    else:  # gptq\\n        res = []\\n        for i in range(n_split):\\n            input_ids = cat_samples[None, i * block_size:(i + 1) * block_size]\\n            attention_mask = torch.ones_like(input_ids)\\n            res.append({'input_ids': input_ids, 'attention_mask': attention_mask})\\n        return res\\n\\n\\ndef awq_model_quantize(awq_model, tokenizer, batch_size) -> None:\\n\\n    from awq.quantize import quantizer\\n    from transformers import AwqConfig\\n\\n    assert _args is not None\\n    logger.info(f'Quantization dataset: {_args.dataset}')\\n    _origin_get_calib_dataset = quantizer.get_calib_dataset\\n    quantizer.get_calib_dataset = _get_dataset\\n    group_size = 128\\n    quant_config = {'zero_point': True, 'q_group_size': group_size, 'w_bit': _args.quant_bits, 'version': 'GEMM'}\\n    logger.info('Start quantizing the model...')\\n    awq_model.quantize(tokenizer, quant_config=quant_config, n_parallel_calib_samples=batch_size)\\n    quantizer.get_calib_dataset = _origin_get_calib_dataset  # recover\\n    awq_model.model.config.quantization_config = AwqConfig(\\n        bits=_args.quant_bits, group_size=group_size, zero_point=True, version='GEMM')\\n\\n\\ndef gptq_model_quantize(model, tokenizer, batch_size):\\n    from optimum.gptq import GPTQQuantizer, quantizer\\n    global _args\\n    logger.info(f'Quantization dataset: {_args.dataset}')\\n    gptq_quantizer = GPTQQuantizer(bits=_args.quant_bits, dataset=','.join(_args.dataset), batch_size=batch_size)\\n    _origin_get_dataset = quantizer.get_dataset\\n    quantizer.get_dataset = _get_dataset\\n    logger.info('Start quantizing the model...')\\n    logger.warning('The process of packing the model takes a long time and there is no progress bar. '\\n                   'Please be patient and wait...')\\n    gptq_quantizer.quantize_model(model, tokenizer)\\n    quantizer.get_dataset = _origin_get_dataset  # recover\\n    return gptq_quantizer\\n\\n\\ndef replace_and_concat(template: 'Template', template_list: List, placeholder: str, keyword: str):\\n    final_str = ''\\n    for t in template_list:\\n        if isinstance(t, str):\\n            final_str += t.replace(placeholder, keyword)\\n        elif isinstance(t, (tuple, list)):\\n            if isinstance(t[0], int):\\n                final_str += template.tokenizer.decode(t)\\n            else:\\n                for attr in t:\\n                    if attr == 'bos_token_id':\\n                        final_str += template.tokenizer.bos_token\\n                    elif attr == 'eos_token_id':\\n                        final_str += template.tokenizer.eos_token\\n                    else:\\n                        raise ValueError(f'Unknown token: {attr}')\\n    return final_str\\n\\n\\ndef llm_export(args: ExportArguments) -> None:\\n    global _args, template\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n    if args.to_peft_format:\\n        assert args.sft_type == 'lora', f'args.sft_type: {args.sft_type}'\\n        args.ckpt_dir = swift_to_peft_format(args.ckpt_dir)\\n\\n    if args.merge_lora:\\n        # fix parameter conflict\\n        quant_method = args.quant_method\\n        args.quant_method = None\\n        merge_lora(args, device_map=args.merge_device_map)\\n        args.quant_method = quant_method\\n\\n    if args.to_ollama:\\n\\n        logger.info('Exporting to ollama:')\\n        logger.info('If you have a gguf file, try to pass the file by :--gguf_file /xxx/xxx.gguf, '\\n                    'else SWIFT will use the original(merged) model dir')\\n        os.makedirs(args.ollama_output_dir, exist_ok=True)\\n        if args.ckpt_dir is not None:\\n            model_dir = args.ckpt_dir\\n        else:\\n            model_dir = args.model_id_or_path\\n        logger.info(f'Using model_dir: {model_dir}')\\n        _, tokenizer = get_model_tokenizer(\\n            args.model_type, model_id_or_path=model_dir, revision=args.model_revision, load_model=False)\\n        model_dir = tokenizer.model_dir\\n        template = get_template(\\n            args.template_type,\\n            tokenizer,\\n            args.system,\\n            args.max_length,\\n            args.truncation_strategy,\\n            tools_prompt=args.tools_prompt)\\n        with open(os.path.join(args.ollama_output_dir, 'Modelfile'), 'w') as f:\\n            f.write(f'FROM {model_dir}\\\\n')\\n            f.write(f'TEMPLATE \\\"\\\"\\\"{{{{ if .System }}}}'\\n                    f'{replace_and_concat(template, template.system_prefix, \\\"{{SYSTEM}}\\\", \\\"{{ .System }}\\\")}'\\n                    f'{{{{ else }}}}{replace_and_concat(template, template.prefix, \\\"\\\", \\\"\\\")}'\\n                    f'{{{{ end }}}}')\\n            f.write(f'{{{{ if .Prompt }}}}'\\n                    f'{replace_and_concat(template, template.prompt, \\\"{{QUERY}}\\\", \\\"{{ .Prompt }}\\\")}'\\n                    f'{{{{ end }}}}')\\n            f.write('{{ .Response }}')\\n            f.write(replace_and_concat(template, template.suffix, '', '') + '\\\"\\\"\\\"\\\\n')\\n            f.write(f'PARAMETER stop \\\"{replace_and_concat(template, template.suffix, \\\"\\\", \\\"\\\")}\\\"\\\\n')\\n            if args.stop_words:\\n                for stop_word in args.stop_words:\\n                    f.write(f'PARAMETER stop \\\"{stop_word}\\\"\\\\n')\\n            if args.temperature:\\n                f.write(f'PARAMETER temperature {args.temperature}\\\\n')\\n            if args.top_k:\\n                f.write(f'PARAMETER top_k {args.top_k}\\\\n')\\n            if args.top_p:\\n                f.write(f'PARAMETER top_p {args.top_p}\\\\n')\\n            if args.repetition_penalty:\\n                f.write(f'PARAMETER repeat_penalty {args.repetition_penalty}\\\\n')\\n\\n        logger.info('Save Modelfile done, you can start ollama by:')\\n        logger.info('> ollama serve')\\n        logger.info('In another terminal:')\\n        logger.info('> ollama create my-custom-model ' f'-f {os.path.join(args.ollama_output_dir, \\\"Modelfile\\\")}')\\n        logger.info('> ollama run my-custom-model')\\n    elif args.quant_bits > 0:\\n        assert args.quant_output_dir is not None\\n        _args = args\\n        assert args.quantization_bit == 0, f'args.quantization_bit: {args.quantization_bit}'\\n        assert args.sft_type == 'full', 'you need to merge lora'\\n        if args.quant_method == 'awq':\\n            from awq import AutoAWQForCausalLM\\n            model, template = prepare_model_template(\\n                args, device_map=args.quant_device_map, verbose=False, automodel_class=AutoAWQForCausalLM)\\n            awq_model_quantize(model, template.tokenizer, args.quant_batch_size)\\n            model.save_quantized(args.quant_output_dir)\\n        elif args.quant_method == 'gptq':\\n            model, template = prepare_model_template(args, device_map=args.quant_device_map, verbose=False)\\n            gptq_quantizer = gptq_model_quantize(model, template.tokenizer, args.quant_batch_size)\\n            model.config.quantization_config.pop('dataset', None)\\n            gptq_quantizer.save(model, args.quant_output_dir)\\n        elif args.quant_method == 'bnb':\\n            args.quantization_bit = args.quant_bits\\n            args.bnb_4bit_compute_dtype, args.load_in_4bit, args.load_in_8bit = args.select_bnb()\\n            model, template = prepare_model_template(args, device_map=args.quant_device_map, verbose=False)\\n            model.save_pretrained(args.quant_output_dir)\\n        else:\\n            raise ValueError(f'args.quant_method: {args.quant_method}')\\n\\n        logger.info(get_model_info(model))\\n        show_layers(model)\\n        logger.info('Saving quantized weights...')\\n        model_cache_dir = model.model_dir\\n        save_checkpoint(\\n            None,\\n            template.tokenizer,\\n            model_cache_dir,\\n            args.ckpt_dir,\\n            args.quant_output_dir,\\n            sft_args_kwargs={\\n                'dtype': args.dtype,\\n                'quant_method': args.quant_method\\n            })\\n        logger.info(f'Successfully quantized the model and saved in {args.quant_output_dir}.')\\n        args.ckpt_dir = args.quant_output_dir\\n    elif args.to_megatron:\\n        if os.path.exists(args.megatron_output_dir):\\n            logger.info(f'The file in Megatron format already exists in the directory: {args.megatron_output_dir}. '\\n                        'Skipping the conversion process.')\\n        else:\\n            from swift.llm.megatron import MegatronArguments, convert_hf_to_megatron, patch_megatron\\n            model, tokenizer = get_model_tokenizer(\\n                args.model_type,\\n                torch.float32, {'device_map': 'auto'},\\n                model_id_or_path=args.model_id_or_path,\\n                revision=args.model_revision)\\n            res = MegatronArguments.load_megatron_config(tokenizer.model_dir)\\n            res['model_type'] = args.model_type\\n            res['target_tensor_model_parallel_size'] = args.tp\\n            res['target_pipeline_model_parallel_size'] = args.pp\\n            res['load'] = model.model_dir\\n            res['save'] = args.megatron_output_dir\\n            res['seed'] = args.seed\\n            res['use_cpu_initialization'] = True\\n            megatron_args = MegatronArguments(**res)\\n            extra_args = megatron_args.parse_to_megatron()\\n            patch_megatron(tokenizer)\\n            convert_hf_to_megatron(model, extra_args, args.torch_dtype)\\n            fpath = os.path.join(args.megatron_output_dir, 'export_args.json')\\n            with open(fpath, 'w', encoding='utf-8') as f:\\n                json.dump(check_json_format(args.__dict__), f, ensure_ascii=False, indent=2)\\n            logger.info('Successfully converted HF format to Megatron format and '\\n                        f'saved it in the {args.megatron_output_dir} directory.')\\n    elif args.to_hf:\\n        if os.path.exists(args.hf_output_dir):\\n            logger.info(f'The file in HF format already exists in the directory: {args.hf_output_dir}. '\\n                        'Skipping the conversion process.')\\n        else:\\n            from swift.llm.megatron import MegatronArguments, convert_megatron_to_hf, patch_megatron\\n            hf_model, tokenizer = get_model_tokenizer(\\n                args.model_type,\\n                torch.float32, {'device_map': 'auto'},\\n                model_id_or_path=args.model_id_or_path,\\n                revision=args.model_revision)\\n            res = MegatronArguments.load_megatron_config(tokenizer.model_dir)\\n            res['model_type'] = args.model_type\\n            res['target_tensor_model_parallel_size'] = args.tp\\n            res['target_pipeline_model_parallel_size'] = args.pp\\n            res['load'] = args.ckpt_dir\\n            res['save'] = args.hf_output_dir\\n            res['use_cpu_initialization'] = True\\n            megatron_args = MegatronArguments(**res)\\n            extra_args = megatron_args.parse_to_megatron()\\n            extra_args['hf_ckpt_path'] = hf_model.model_dir\\n            patch_megatron(tokenizer)\\n            convert_megatron_to_hf(hf_model, extra_args)\\n            if args.torch_dtype is not None:\\n                hf_model.to(args.torch_dtype)\\n            save_checkpoint(hf_model, tokenizer, hf_model.model_dir, args.ckpt_dir, args.hf_output_dir)\\n            logger.info('Successfully converted Megatron format to HF format and '\\n                        f'saved it in the {args.hf_output_dir} directory.')\\n    if args.push_to_hub:\\n        ckpt_dir = args.ckpt_dir\\n        if ckpt_dir is None:\\n            ckpt_dir = args.model_id_or_path\\n        assert ckpt_dir is not None, 'You need to specify `ckpt_dir`.'\\n        push_to_ms_hub(ckpt_dir, args.hub_model_id, args.hub_token, args.hub_private_repo, args.commit_message)\\n\\n\\nexport_main = get_main(ExportArguments, llm_export)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\n\\n\\ndef ta_accelerate(model,\\n                  fsdp_num,\\n                  layer_cls_name,\\n                  bf16=True,\\n                  fp16=False,\\n                  gradient_checkpointing=True,\\n                  fsdp_flatten_parameters=False):\\n    \\\"\\\"\\\" accelerate LLM training using TorchAcc(only available internally).\\n    \\\"\\\"\\\"\\n    import torchacc as ta\\n    assert layer_cls_name is not None\\n\\n    def get_ta_config():\\n        config = ta.Config()\\n        config.compute.fp16 = fp16\\n        config.compute.bf16 = bf16\\n\\n        config.memory.gc = gradient_checkpointing\\n        if config.memory.gc:\\n            config.memory.gc_cls = {layer_cls_name}\\n\\n        config.dist.fsdp.size = fsdp_num\\n        config.dist.fsdp.wrap_layer_cls = {layer_cls_name}\\n        config.dist.fsdp.flatten_parameters = fsdp_flatten_parameters\\n        config.dist.dp.size = 1\\n\\n        if fsdp_num > 1:\\n            os.environ['ACCELERATE_USE_FSDP'] = 'true'\\n\\n        return config\\n\\n    ta_config = get_ta_config()\\n    model = ta.accelerate(model, config=ta_config)\\n    return model\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Optional\\n\\nimport json\\nimport torch\\nfrom transformers import GenerationConfig\\n\\nfrom swift.tuners import Swift\\nfrom swift.tuners.rome import RomeConfig\\nfrom swift.utils import get_logger, get_main, get_model_info, seed_everything, show_layers\\nfrom .utils import (RomeArguments, Template, get_dataset, get_model_tokenizer, get_template, inference,\\n                    set_generation_config)\\n\\nlogger = get_logger()\\n\\n\\ndef rome_infer(args: RomeArguments) -> None:\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n    logger.info('Rome does not support quantization for now, all quantization args will be ignored.')\\n    logger.info(f'device_count: {torch.cuda.device_count()}')\\n\\n    # Loading Model and Tokenizer\\n    model_kwargs = {'low_cpu_mem_usage': True, 'device_map': 'auto'}\\n    kwargs = {'use_flash_attn': args.use_flash_attn}\\n    model, tokenizer = get_model_tokenizer(args.model_type, args.torch_dtype, model_kwargs, **kwargs)\\n    logger.info(f'model_config: {model.config}')\\n    generation_config = GenerationConfig(\\n        max_new_tokens=args.max_new_tokens,\\n        temperature=args.temperature,\\n        top_k=args.top_k,\\n        top_p=args.top_p,\\n        do_sample=args.do_sample,\\n        repetition_penalty=args.repetition_penalty,\\n        num_beams=args.num_beams,\\n        pad_token_id=tokenizer.pad_token_id,\\n        eos_token_id=tokenizer.eos_token_id)\\n    set_generation_config(model, generation_config)\\n    logger.info(f'model.generation_config: {model.generation_config}')\\n    if args.overwrite_generation_config:\\n        generation_config.save_pretrained(args.ckpt_dir)\\n\\n    with open(args.rome_request_file, 'r', encoding='utf-8') as f:\\n        request = json.load(f)\\n\\n    rome_type: Optional[str] = None\\n    if args.model_type in ('llama2-13b-chat', 'llama2-13b', 'llama-13b-chat', 'llama-13b'):\\n        rome_type = 'llama-13b'\\n        batch_first = True\\n    elif args.model_type in ('llama2-7b-chat', 'llama2-7b', 'llama-7b-chat', 'llama-7b'):\\n        rome_type = 'llama-7b'\\n        batch_first = True\\n    elif 'chatglm' in args.model_type and '6b' in args.model_type:\\n        rome_type = 'chatglm-6b'\\n        batch_first = False\\n\\n    config = RomeConfig(\\n        model_type=rome_type,\\n        knowledge=request,\\n        tokenizer=tokenizer,\\n        batch_first=batch_first,\\n    )\\n    model = Swift.prepare_model(model, config, inference_mode=True)\\n\\n    show_layers(model)\\n    logger.info(get_model_info(model))\\n\\n    # Inference\\n    template: Template = get_template(args.template_type, tokenizer, args.system, args.max_length,\\n                                      args.truncation_strategy)\\n    args.system = template.default_system\\n    logger.info(f'system: {args.system}')\\n\\n    # Inference\\n    if args.eval_human:\\n        while True:\\n            query = input('<<< ')\\n            inference(model, template, query, stream=args.stream, verbose=True)\\n    else:\\n        _, val_dataset = get_dataset(args.dataset, args.dataset_test_ratio, args.dataset_seed)\\n        mini_val_dataset = val_dataset.select(range(min(args.val_dataset_sample, val_dataset.shape[0])))\\n        for data in mini_val_dataset:\\n            inference(\\n                model,\\n                template,\\n                data.get('query'),\\n                data.get('history'),\\n                data.get('system'),\\n                stream=args.stream,\\n                verbose=True)\\n            print()\\n            print(f\\\"[LABELS]{data.get('response')}\\\")\\n            print('-' * 80)\\n            # input('next[ENTER]')\\n\\n\\nrome_main = get_main(RomeArguments, rome_infer)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nfrom functools import partial\\nfrom typing import Any, Dict, Optional, Tuple\\n\\nimport json\\nimport torch\\nimport transformers\\nfrom datasets import Dataset as HfDataset\\nfrom packaging import version\\nfrom transformers import BitsAndBytesConfig, GenerationConfig, IntervalStrategy\\nfrom transformers.integrations import is_deepspeed_zero3_enabled\\nfrom transformers.utils import is_torch_npu_available, strtobool\\n\\nfrom swift.torchacc_utils import patch_acc_model\\nfrom swift.trainers import TrainerFactory\\nfrom swift.trainers.utils import can_return_loss, find_labels\\nfrom swift.utils import (append_to_jsonl, check_json_format, compute_acc_metrics, compute_nlg_metrics, get_dist_setting,\\n                         get_logger, get_main, get_model_info, is_ddp_plus_mp, is_dist, is_master, plot_images,\\n                         preprocess_logits_for_metrics, seed_everything, show_layers, use_torchacc)\\nfrom .accelerator import ta_accelerate\\nfrom .tuner import prepare_model\\nfrom .utils import (TEMPLATE_MAPPING, LazyLLMDataset, PtArguments, RLHFArguments, SftArguments, Template, dataset_map,\\n                    deep_getattr, dynamic_vit_gradient_checkpointing, get_dataset, get_mllm_arch, get_model_tokenizer,\\n                    get_template, get_time_info, print_example, set_generation_config, sort_by_max_length, stat_dataset)\\n\\nlogger = get_logger()\\n\\n\\ndef _get_train_val_dataset(args: SftArguments) -> Tuple[HfDataset, Optional[HfDataset]]:\\n    # Loading Dataset\\n    train_dataset, val_dataset = get_dataset(\\n        args.dataset,\\n        args.dataset_test_ratio,\\n        args.dataset_seed,\\n        check_dataset_strategy=args.check_dataset_strategy,\\n        model_name=args.model_name,\\n        model_author=args.model_author,\\n        streaming=args.streaming,\\n        streaming_val_size=args.streaming_val_size,\\n        streaming_buffer_size=args.streaming_buffer_size)\\n    if len(args.val_dataset) > 0:\\n        # Loading val dataset\\n        _, val_dataset = get_dataset(\\n            args.val_dataset,\\n            1.0,\\n            args.dataset_seed,\\n            check_dataset_strategy=args.check_dataset_strategy,\\n            model_name=args.model_name,\\n            model_author=args.model_author,\\n            streaming=args.streaming,\\n            streaming_val_size=args.streaming_val_size,\\n            streaming_buffer_size=args.streaming_buffer_size)\\n\\n    train_dataset, val_dataset = args._handle_dataset_compat(train_dataset, val_dataset)\\n    # The random shuffling of the training set occurs in the dataloader of the trainer.\\n    logger.info(f'train_dataset: {train_dataset}')\\n    logger.info(f'val_dataset: {val_dataset}')\\n    return train_dataset, val_dataset\\n\\n\\ndef llm_sft_megatron(args: SftArguments) -> Dict[str, Any]:\\n    assert os.path.exists(args.resume_from_checkpoint), (\\n        f'Please run `CUDA_VISIBLE_DEVICES=0 swift export --model_type {args.model_type} --tp {args.tp} --pp {args.pp} '\\n        f'--megatron_output_dir {args.resume_from_checkpoint} --to_megatron true` '\\n        'to convert the weights to Megatron format.')\\n    from swift.llm.megatron import (MegatronArguments, patch_megatron, get_megatron_model_convert, forward_step,\\n                                    train_valid_test_datasets_provider as _train_valid_test_datasets_provider)\\n    from megatron.core.enums import ModelType\\n    from megatron.training import pretrain\\n    _, tokenizer = get_model_tokenizer(\\n        args.model_type, model_id_or_path=args.model_id_or_path, revision=args.model_revision, load_model=False)\\n\\n    # Loading Dataset\\n    template: Template = get_template(args.template_type, tokenizer, args.system, args.max_length,\\n                                      args.truncation_strategy)\\n\\n    train_dataset, val_dataset = _get_train_val_dataset(args)\\n    td0, tkwargs0 = template.encode(train_dataset[0])\\n    print_example(td0, tokenizer, tkwargs0)\\n    train_dataset = LazyLLMDataset(train_dataset, template.encode)\\n    if val_dataset is not None:\\n        val_dataset = LazyLLMDataset(val_dataset, template.encode)\\n\\n    res = MegatronArguments.load_megatron_config(tokenizer.model_dir)\\n    res.update(MegatronArguments.from_sft_args(args, train_dataset, val_dataset))\\n    megatron_args = MegatronArguments(**res)\\n    extra_args = megatron_args.parse_to_megatron()\\n\\n    model_provider, _ = get_megatron_model_convert(args.model_type)\\n    train_valid_test_datasets_provider = partial(\\n        _train_valid_test_datasets_provider, train_dataset=train_dataset, val_dataset=val_dataset, template=template)\\n    train_valid_test_datasets_provider.is_distributed = True\\n    patch_megatron(tokenizer)\\n    pretrain(\\n        train_valid_test_datasets_provider,\\n        model_provider,\\n        ModelType.encoder_or_decoder,\\n        forward_step,\\n        args_defaults=extra_args)\\n    logger.info(f'output_dir: {args.output_dir}')\\n    if is_master():\\n        fpath = os.path.join(args.output_dir, 'sft_args.json')\\n        logger.info(f'The {args.__class__.__name__} will be saved in: {fpath}')\\n        with open(fpath, 'w', encoding='utf-8') as f:\\n            json.dump(check_json_format(args.__dict__), f, ensure_ascii=False, indent=2)\\n    logging_path = os.path.join(args.output_dir, 'logging.jsonl')\\n    logger.info(f'The logging file will be saved in: {logging_path}')\\n    # Visualization\\n    if is_master():\\n        images_dir = os.path.join(args.output_dir, 'images')\\n        logger.info(f'images_dir: {images_dir}')\\n        plot_images(images_dir, args.logging_dir, ['train/loss'], 0.9)\\n    return {}\\n\\n\\ndef get_default_device_map():\\n    if is_deepspeed_zero3_enabled() or os.environ.get('ACCELERATE_USE_FSDP', 'False') == 'true':\\n        return None\\n    local_rank = get_dist_setting()[1]\\n    if is_torch_npu_available():\\n        if local_rank >= 0:\\n            return f'npu:{local_rank}'\\n        else:\\n            return 'npu:0'\\n    if torch.cuda.device_count() == 0:\\n        return 'cpu'\\n    elif torch.cuda.device_count() == 1:\\n        return 'cuda:0'\\n    elif is_dist() and not is_ddp_plus_mp():\\n        return f'cuda:{local_rank}'\\n    else:\\n        return 'auto'\\n\\n\\ndef prepare_model_template_train(args, msg: Optional[Dict[str, Any]] = None):\\n\\n    if args.gpu_memory_fraction is not None:\\n        for device_id in range(torch.cuda.device_count()):\\n            torch.cuda.set_per_process_memory_fraction(max(min(args.gpu_memory_fraction, 1.0), 0.01), device=device_id)\\n\\n    if is_torch_npu_available():\\n        print(f'device_count: {torch.npu.device_count()}')\\n    else:\\n        print(f'device_count: {torch.cuda.device_count()}')\\n    print(f'rank: {args.rank}, local_rank: {args.local_rank}, '\\n          f'world_size: {args.world_size}, local_world_size: {args.local_world_size}')\\n\\n    # Loading Model and Tokenizer\\n    model_kwargs = {}\\n    if not use_torchacc():\\n        if args.device_map_config is not None:\\n            device_map = args.device_map_config\\n        else:\\n            device_map = get_default_device_map()\\n        model_kwargs['device_map'] = device_map\\n        if device_map == 'auto':\\n            model_kwargs['low_cpu_mem_usage'] = True\\n    if args.device_max_memory:\\n        n_gpu = torch.cuda.device_count()\\n        assert len(args.device_max_memory) == n_gpu // args.local_world_size\\n        model_kwargs['max_memory'] = {\\n            i: mem\\n            for i, mem in zip(range(max(args.local_rank, 0), n_gpu, args.local_world_size), args.device_max_memory)\\n        }\\n\\n    # quantization\\n    if args.quant_method == 'hqq':\\n        from transformers import HqqConfig\\n        if args.hqq_dynamic_config_path is not None:\\n            cwd = os.getcwd()\\n            config_path = args.hqq_dynamic_config_path if os.path.isabs(args.hqq_dynamic_config_path) else os.path.join(\\n                cwd, args.hqq_dynamic_config_path)\\n            with open(config_path, 'r') as json_file:\\n                quantization_config = HqqConfig(dynamic_config=json.load(json_file))\\n        else:\\n            if args.quantization_bit == 0:\\n                logger.info(\\\"You haven't set the quantization_bit parameter; set it to 8.\\\")\\n                args.quantization_bit = 8\\n            quantization_config = HqqConfig(nbits=args.quantization_bit, axis=args.hqq_axis)\\n        logger.info(f'quantization_config: {quantization_config.__dict__}')\\n        model_kwargs['quantization_config'] = quantization_config\\n    elif args.quant_method == 'eetq':\\n        from transformers import EetqConfig\\n        quantization_config = EetqConfig('int8')\\n        logger.info(f'quantization_config: {quantization_config.__dict__}')\\n        model_kwargs['quantization_config'] = quantization_config\\n    elif args.load_in_8bit or args.load_in_4bit:  # bnb\\n        quantization_config = BitsAndBytesConfig(\\n            args.load_in_8bit,\\n            args.load_in_4bit,\\n            bnb_4bit_compute_dtype=args.bnb_4bit_compute_dtype,\\n            bnb_4bit_quant_type=args.bnb_4bit_quant_type,\\n            bnb_4bit_use_double_quant=args.bnb_4bit_use_double_quant)\\n        logger.info(f'quantization_config: {quantization_config.__dict__}')\\n        model_kwargs['quantization_config'] = quantization_config\\n\\n    kwargs = {\\n        'max_length': args.max_length,\\n        'use_unsloth': args.tuner_backend == 'unsloth',\\n        'load_in_4bit': args.quantization_bit == 4\\n    }\\n    if args.use_flash_attn is not None:\\n        kwargs['use_flash_attn'] = args.use_flash_attn\\n    if args.local_repo_path:\\n        kwargs['local_repo_path'] = args.local_repo_path\\n\\n    if args.rope_scaling:\\n        kwargs['rope_scaling'] = args.rope_scaling\\n\\n    model, tokenizer = get_model_tokenizer(\\n        args.model_type,\\n        args.torch_dtype,\\n        model_kwargs,\\n        model_id_or_path=args.model_id_or_path,\\n        revision=args.model_revision,\\n        quant_method=args.quant_method,\\n        is_training=True,\\n        **kwargs)\\n\\n    if hasattr(model, 'hf_device_map'):\\n        logger.info(f'model.hf_device_map: {model.hf_device_map}')\\n    for k in ['gptq', 'awq', 'aqlm']:\\n        if getattr(model, f'is_{k}', None):\\n            args.quant_method = k\\n            logger.info(f'Setting args.quant_method: {args.quant_method}')\\n            break\\n    logger.info(f'model_config: {model.config}')\\n\\n    generation_config = GenerationConfig(\\n        max_new_tokens=args.max_new_tokens,\\n        temperature=args.temperature,\\n        top_k=args.top_k,\\n        top_p=args.top_p,\\n        do_sample=args.do_sample,\\n        repetition_penalty=args.repetition_penalty,\\n        num_beams=args.num_beams,\\n        pad_token_id=tokenizer.pad_token_id,\\n        eos_token_id=tokenizer.eos_token_id)\\n    set_generation_config(model, generation_config)\\n    logger.info(f'model.generation_config: {model.generation_config}')\\n    args.training_args.generation_config = model.generation_config\\n\\n    if use_torchacc():\\n        import torchacc as ta\\n        # Get `label` and `return_loss` before 'ta_accelerate' because it will\\n        # wrapper the model and make these properties wrong.\\n        label_names = find_labels(model)\\n        return_loss = can_return_loss(model)\\n        model = patch_acc_model(model, args)\\n\\n    if args.is_multimodal and args.gradient_checkpointing and args.vit_use_gc:\\n        dynamic_vit_gradient_checkpointing(model, args.model_type)\\n\\n    if args.gradient_checkpointing:\\n        model.config.use_cache = False  # fix transformers==4.36\\n        logger.info('Setting model.config.use_cache: False')\\n        model.enable_input_require_grads()\\n        mllm_arch = get_mllm_arch(args.model_type)\\n        if mllm_arch is not None:\\n            for vision_tower_name in mllm_arch.vision_tower:\\n                vision_tower = deep_getattr(model, vision_tower_name)\\n                if hasattr(vision_tower, 'enable_input_require_grads'):\\n                    try:\\n                        vision_tower.enable_input_require_grads()\\n                    except NotImplementedError:\\n                        pass\\n\\n    # Preparing LoRA\\n    model, callbacks = prepare_model(model, args)\\n\\n    show_layers(model)\\n    logger.info(model)\\n    model_info = get_model_info(model)\\n    logger.info(model_info)\\n    if isinstance(msg, dict):\\n        msg['model_info'] = model_info\\n\\n    if use_torchacc():\\n        model.config.use_cache = False\\n        logger.info('Setting model.config.use_cache: False')\\n        model = ta_accelerate(\\n            model,\\n            args.fsdp_num,\\n            args.model_layer_cls_name,\\n            args.bf16,\\n            args.fp16,\\n            gradient_checkpointing=True,\\n            fsdp_flatten_parameters=(args.sft_type == 'full'))\\n        model.label_names = label_names\\n        model.return_loss = return_loss\\n\\n    template_kwargs = {}\\n    template_kwargs['use_loss_scale'] = args.use_loss_scale\\n    if args.loss_scale_config_path is not None:\\n        cwd = os.getcwd()\\n        config_path = args.loss_scale_config_path if os.path.isabs(args.loss_scale_config_path) else os.path.join(\\n            cwd, args.loss_scale_config_path)\\n        with open(config_path, 'r') as json_file:\\n            template_kwargs['loss_scale_map'] = json.load(json_file)\\n    template_kwargs['tools_prompt'] = args.tools_prompt\\n    if args.sequence_parallel_size and args.sequence_parallel_size > 1:\\n        template_kwargs['sequence_parallel_size'] = args.sequence_parallel_size\\n    template_kwargs['rescale_image'] = args.rescale_image\\n    template: Template = get_template(\\n        args.template_type,\\n        tokenizer,\\n        args.system,\\n        args.max_length,\\n        args.truncation_strategy,\\n        model=model,\\n        **template_kwargs)\\n    template._is_training = True\\n    if args.streaming:\\n        template.encode = partial(template.encode, streaming=args.streaming)\\n    args.system = template.default_system\\n    logger.info(f'system: {args.system}')\\n    logger.info(f'args.lazy_tokenize: {args.lazy_tokenize}')\\n\\n    if not isinstance(args, RLHFArguments):\\n        return model, template, callbacks\\n\\n    # ref_model\\n    ref_model = None\\n    if not args.ref_model_free and (args.ref_model_type or args.sft_type == 'full'):\\n        if args.ref_model_type:\\n            kwargs['model_id_or_path'] = args.ref_model_id_or_path\\n            kwargs['revision'] = args.ref_model_revision\\n        else:\\n            kwargs['model_id_or_path'] = args.model_id_or_path\\n            kwargs['revision'] = args.model_revision\\n\\n        # Be aware of the unexpected behavior caused by double monkey patching.\\n        ref_model, _ = get_model_tokenizer(\\n            args.ref_model_type or args.model_type,\\n            args.torch_dtype,\\n            model_kwargs,\\n            quant_method=args.quant_method,\\n            **kwargs)\\n        ref_model.requires_grad_(False).eval()\\n\\n    template.ref_model = ref_model\\n    return model, ref_model, template, callbacks\\n\\n\\ndef prepare_dataset(args, template: Template, msg: Optional[Dict[str, Any]] = None):\\n    training_args = args.training_args\\n    train_dataset, val_dataset = _get_train_val_dataset(args)\\n    if use_torchacc():\\n        training_args.train_dataset_sample = train_dataset.shape[0] if train_dataset is not None else 0\\n\\n    if val_dataset is None:\\n        training_args.evaluation_strategy = IntervalStrategy.NO\\n        training_args.eval_strategy = IntervalStrategy.NO\\n        training_args.do_eval = False\\n\\n    tokenizer = template.tokenizer\\n    dataset_info = {}\\n    if args.packing:\\n        from swift.llm.utils.utils import ConstantLengthDataset\\n        train_dataset = ConstantLengthDataset.get_packed_dataset(\\n            template, train_dataset, args.max_length, lazy_tokenize=args.lazy_tokenize)\\n        if val_dataset is not None:\\n            val_dataset = ConstantLengthDataset.get_packed_dataset(\\n                template, val_dataset, args.max_length, lazy_tokenize=args.lazy_tokenize)\\n        if not args.lazy_tokenize:\\n            print_example(train_dataset[0], tokenizer, {})\\n            dataset_info['train_dataset'] = stat_dataset(train_dataset)\\n            if val_dataset is not None:\\n                dataset_info['val_dataset'] = stat_dataset(val_dataset)\\n    elif not args.lazy_tokenize:\\n        model = template.model\\n        if not args.streaming:\\n            if args.preprocess_num_proc > 1:\\n                use_model = TEMPLATE_MAPPING[args.template_type].get('use_model', False)\\n                if use_model:\\n                    args.preprocess_num_proc = 1\\n                    logger.warning('The current Template does not support num_proc. '\\n                                   f'Setting args.preprocess_num_proc to: {args.preprocess_num_proc}')\\n                else:\\n                    template.model = None\\n        td0, tkwargs0 = template.encode(train_dataset[0])\\n        print_example(td0, tokenizer, tkwargs0)\\n        train_dataset = dataset_map(train_dataset, template.encode, args.preprocess_num_proc, streaming=args.streaming)\\n        if val_dataset is not None:\\n            val_dataset = dataset_map(val_dataset, template.encode, args.preprocess_num_proc, streaming=args.streaming)\\n        template.model = model  # recover\\n        if args.test_oom_error:\\n            train_dataset = sort_by_max_length(train_dataset, 20000)\\n        # Data analysis\\n        if train_dataset is None:\\n            logger.error('Error accessing train_dataset properties. '\\n                         'Please ensure that the dataset is properly initialized,'\\n                         'and every sample of the train_dataset not empty.')\\n            raise AttributeError('Failed to access dataset attributes,train_dataset is None. This might be because:\\\\n'\\n                                 '(1) The dataset contains None for input or labels;\\\\n'\\n                                 \\\"(2) The 'max_length' setting is too short causing data truncation.\\\")\\n        if not args.streaming:\\n            dataset_info['train_dataset'] = stat_dataset(train_dataset)\\n            if val_dataset is not None:\\n                dataset_info['val_dataset'] = stat_dataset(val_dataset)\\n    else:\\n        td0, tkwargs0 = template.encode(train_dataset[0])\\n        print_example(td0, tokenizer, tkwargs0)\\n        train_dataset = LazyLLMDataset(train_dataset, template.encode)\\n        if val_dataset is not None:\\n            val_dataset = LazyLLMDataset(val_dataset, template.encode)\\n    if isinstance(msg, dict):\\n        msg['dataset_info'] = dataset_info\\n    return train_dataset, val_dataset\\n\\n\\ndef trainer_train(args,\\n                  model,\\n                  template,\\n                  train_dataset,\\n                  val_dataset,\\n                  callbacks=None,\\n                  msg=None,\\n                  ref_model=None) -> Dict[str, Any]:\\n    if msg is None:\\n        msg = {}\\n    training_args = args.training_args\\n    padding_to = args.max_length if args.sft_type == 'longlora' else None\\n    tokenizer = template.tokenizer\\n    data_collator = partial(template.data_collator, padding_to=padding_to)\\n\\n    if use_torchacc():\\n        train_batch_size = args.batch_size\\n        eval_batch_size = args.eval_batch_size\\n        train_batch_size *= args.world_size\\n        eval_batch_size *= args.world_size\\n        training_args.per_device_train_batch_size = train_batch_size\\n        training_args.per_device_eval_batch_size = eval_batch_size\\n        training_args.group_by_length = use_torchacc()\\n\\n    logger.info(f'training_args: {training_args}')\\n\\n    trainer_cls, trainer_kwargs = TrainerFactory.get_trainer_info(args)\\n    if not hasattr(model.config, 'is_encoder_decoder'):\\n        model.config.is_encoder_decoder = False\\n    is_encoder_decoder = model.config.is_encoder_decoder\\n    trainer_kwargs['is_encoder_decoder'] = is_encoder_decoder\\n    if args.check_model_is_latest is False:\\n        trainer_kwargs['check_model'] = False\\n    if isinstance(args, RLHFArguments):\\n        trainer_kwargs['ref_model'] = ref_model\\n    elif args.predict_with_generate:\\n        trainer_kwargs['compute_metrics'] = partial(compute_nlg_metrics, tokenizer=tokenizer)\\n    else:\\n        compute_metrics = partial(\\n            compute_acc_metrics, acc_strategy=args.acc_strategy, is_encoder_decoder=is_encoder_decoder)\\n        trainer_kwargs['compute_metrics'] = compute_metrics\\n        trainer_kwargs['preprocess_logits_for_metrics'] = preprocess_logits_for_metrics\\n\\n    trainer = trainer_cls(\\n        model=model,\\n        args=training_args,\\n        data_collator=data_collator,\\n        train_dataset=train_dataset,\\n        eval_dataset=val_dataset,\\n        tokenizer=tokenizer,\\n        callbacks=callbacks,\\n        **trainer_kwargs)\\n    trainer.is_multimodal = args.is_multimodal\\n    trainer.sft_args = args\\n    if use_torchacc():\\n        trainer.label_names = model.label_names\\n        trainer.can_return_loss = model.return_loss\\n    if is_master():\\n        for args_obj, fname in zip([args, training_args], ['sft_args.json', 'training_args.json']):\\n            fpath = os.path.join(args.output_dir, fname)\\n            logger.info(f'The {args_obj.__class__.__name__} will be saved in: {fpath}')\\n            with open(fpath, 'w', encoding='utf-8') as f:\\n                json.dump(check_json_format(args_obj.__dict__), f, ensure_ascii=False, indent=2)\\n    logging_path = os.path.join(args.output_dir, 'logging.jsonl')\\n    logger.info(f'The logging file will be saved in: {logging_path}')\\n    with template.training_context():\\n        trainer.train(training_args.resume_from_checkpoint)\\n    last_model_checkpoint = getattr(trainer.state, 'last_model_checkpoint', None)\\n    logger.info(f'last_model_checkpoint: {last_model_checkpoint}')\\n    logger.info(f'best_model_checkpoint: {trainer.state.best_model_checkpoint}')\\n    # Visualization\\n    if is_master() and not use_torchacc():\\n        if 'tensorboard' in training_args.report_to:\\n            images_dir = os.path.join(args.output_dir, 'images')\\n            logger.info(f'images_dir: {images_dir}')\\n            plot_images(images_dir, args.logging_dir, ['train/loss'], 0.9)\\n        if args.push_to_hub:\\n            trainer.push_to_hub()\\n    run_info = {\\n        'memory': trainer.perf['memory'],\\n        'last_model_checkpoint': last_model_checkpoint,\\n        'best_model_checkpoint': trainer.state.best_model_checkpoint,\\n        'best_metric': trainer.state.best_metric,\\n        'global_step': trainer.state.global_step,\\n        'log_history': trainer.state.log_history,\\n        **msg\\n    }\\n    if not args.streaming:\\n        train_time = get_time_info(trainer.state.log_history, len(train_dataset))\\n        run_info.update({'train_time': train_time})\\n    for key in ['gen_time', 'gen_len']:\\n        if key in trainer.perf and trainer.perf[key] != 0:\\n            run_info[key] = trainer.perf[key]\\n    if is_master():\\n        jsonl_path = os.path.join(args.output_dir, 'logging.jsonl')\\n        append_to_jsonl(jsonl_path, run_info)\\n    return run_info\\n\\n\\ndef llm_sft(args: SftArguments) -> Dict[str, Any]:\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n\\n    is_generation = TEMPLATE_MAPPING[args.template_type].get('is_generation', False)\\n    if is_generation and type(args) is SftArguments:\\n        logger.warning(f\\\"Please check if args.template_type: '{args.template_type}' is correct. \\\"\\n                       'Currently, SFT is in progress, but the template is used for PT.')\\n    elif not is_generation and type(args) is PtArguments:\\n        logger.warning(f\\\"Please check if args.template_type: '{args.template_type}' is correct. \\\"\\n                       'Currently, PT is in progress, but the template is used for SFT.')\\n\\n    if args.train_backend == 'megatron':\\n        return llm_sft_megatron(args)\\n    msg = {}\\n    model, template, callbacks = prepare_model_template_train(args, msg)\\n    train_dataset, val_dataset = prepare_dataset(args, template, msg)\\n    return trainer_train(args, model, template, train_dataset, val_dataset, callbacks=callbacks, msg=msg)\\n\\n\\ndef get_sft_main(args, llm):\\n    if use_torchacc():\\n        import torchacc as ta\\n        import torch_xla.runtime as xr\\n        xla_cache_path = os.getenv('TORCHACC_CACHE_PATH')\\n        read_only = strtobool(os.getenv('TORCHACC_CACHE_PATH_READ_ONLY', '0'))\\n        suffix = f'_rank{xr.global_ordinal()}'\\n        if xla_cache_path and not xla_cache_path.endswith(suffix):\\n            xr.initialize_cache(xla_cache_path + suffix, readonly=read_only)\\n        if version.parse(transformers.__version__) < version.parse('4.41.0'):\\n            # This patch should be called before `llm_sft`.\\n            ta.accelerate_hf_trainer()\\n    return get_main(args, llm)\\n\\n\\nsft_main = get_sft_main(SftArguments, llm_sft)\\npt_main = get_sft_main(PtArguments, llm_sft)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Iterator, Tuple\\n\\nfrom swift.utils import get_logger, get_main, seed_everything\\nfrom .infer import merge_lora, prepare_model_template\\nfrom .utils import AppUIArguments, History, inference_stream, limit_history_length\\n\\nlogger = get_logger()\\n\\n\\ndef clear_session() -> History:\\n    return []\\n\\n\\ndef gradio_generation_demo(args: AppUIArguments) -> None:\\n    import gradio as gr\\n    if args.infer_backend == 'vllm':\\n        from swift.llm import prepare_vllm_engine_template, inference_stream_vllm as inference_stream_x\\n        llm_engine, template = prepare_vllm_engine_template(args)\\n    elif args.infer_backend == 'lmdeploy':\\n        from swift.llm import prepare_lmdeploy_engine_template, inference_stream_lmdeploy as inference_stream_x\\n        llm_engine, template = prepare_lmdeploy_engine_template(args)\\n    else:\\n        model, template = prepare_model_template(args)\\n\\n    def model_generation(query: str) -> Iterator[str]:\\n        if args.infer_backend in {'vllm', 'lmdeploy'}:\\n            gen = inference_stream_x(llm_engine, template, [{'query': query}])\\n            for resp_list in gen:\\n                response = resp_list[0]['response']\\n                yield response\\n        else:\\n            gen = inference_stream(model, template, query, None)\\n            for response, _ in gen:\\n                yield response\\n\\n    model_name = args.model_type.title()\\n\\n    with gr.Blocks() as demo:\\n        gr.Markdown(f'<center><font size=8>{model_name} Bot</center>')\\n        with gr.Row():\\n            with gr.Column(scale=1):\\n                input_box = gr.Textbox(lines=16, label='Input', max_lines=16)\\n            with gr.Column(scale=1):\\n                output_box = gr.Textbox(lines=16, label='Output', max_lines=16)\\n        send = gr.Button('🚀 发送')\\n        send.click(model_generation, inputs=[input_box], outputs=[output_box])\\n    # Compatible with InferArguments\\n    share = getattr(args, 'share', False)\\n    host = getattr(args, 'host', '127.0.0.1')\\n    port = getattr(args, 'port', 7860)\\n    demo.queue().launch(height=1000, share=share, server_name=host, server_port=port)\\n\\n\\ndef gradio_chat_demo(args: AppUIArguments) -> None:\\n    import gradio as gr\\n    if args.infer_backend == 'vllm':\\n        from swift.llm import prepare_vllm_engine_template, inference_stream_vllm as inference_stream_x\\n        llm_engine, template = prepare_vllm_engine_template(args)\\n    elif args.infer_backend == 'lmdeploy':\\n        from swift.llm import prepare_lmdeploy_engine_template, inference_stream_lmdeploy as inference_stream_x\\n        llm_engine, template = prepare_lmdeploy_engine_template(args)\\n    else:\\n        model, template = prepare_model_template(args)\\n\\n    def model_chat(query: str, history: History) -> Iterator[Tuple[str, History]]:\\n        old_history, history = limit_history_length(template, query, history, args.max_length)\\n        if args.infer_backend in {'vllm', 'lmdeploy'}:\\n            gen = inference_stream_x(llm_engine, template, [{'query': query, 'history': history}])\\n            for resp_list in gen:\\n                history = resp_list[0]['history']\\n                total_history = old_history + history\\n                yield '', total_history\\n        else:\\n            gen = inference_stream(model, template, query, history)\\n            for _, history in gen:\\n                total_history = old_history + history\\n                yield '', total_history\\n\\n    model_name = args.model_type.title()\\n    with gr.Blocks() as demo:\\n        gr.Markdown(f'<center><font size=8>{model_name} Bot</center>')\\n\\n        chatbot = gr.Chatbot(label=f'{model_name}')\\n        message = gr.Textbox(lines=1, label='Input')\\n        with gr.Row():\\n            clear_history = gr.Button('🧹 清除历史对话')\\n            send = gr.Button('🚀 发送')\\n        message.submit(model_chat, inputs=[message, chatbot], outputs=[message, chatbot])\\n        send.click(model_chat, inputs=[message, chatbot], outputs=[message, chatbot])\\n        clear_history.click(fn=clear_session, inputs=[], outputs=[chatbot], queue=False)\\n    # Compatible with InferArguments\\n    share = getattr(args, 'share', False)\\n    host = getattr(args, 'host', '127.0.0.1')\\n    port = getattr(args, 'port', 7860)\\n    demo.queue().launch(height=1000, share=share, server_name=host, server_port=port)\\n\\n\\ndef llm_app_ui(args: AppUIArguments) -> None:\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n    args.eval_human = True\\n    if args.merge_lora:\\n        merge_lora(args, device_map=args.merge_device_map)\\n    if args.template_type.endswith('generation'):\\n        gradio_generation_demo(args)\\n    else:\\n        gradio_chat_demo(args)\\n\\n\\napp_ui_main = get_main(AppUIArguments, llm_app_ui)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Any, Dict\\n\\nfrom swift.trainers import TrainerFactory\\nfrom swift.utils import get_logger, get_main, seed_everything\\nfrom .sft import prepare_dataset, prepare_model_template_train, trainer_train\\nfrom .utils import TEMPLATE_MAPPING, RLHFArguments\\n\\nlogger = get_logger()\\n\\n\\ndef llm_rlhf(args: RLHFArguments) -> Dict[str, Any]:\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n\\n    is_generation = TEMPLATE_MAPPING[args.template_type].get('is_generation', False)\\n    if is_generation:\\n        logger.warning(f\\\"Please check if args.template_type: '{args.template_type}' is correct.\\\")\\n\\n    msg = {}\\n    model, ref_model, template, callbacks = prepare_model_template_train(args)\\n    with TrainerFactory.patch_template(args, template):\\n        train_dataset, val_dataset = prepare_dataset(args, template, msg)\\n\\n        return trainer_train(\\n            args, model, template, train_dataset, val_dataset, callbacks=callbacks, msg=msg, ref_model=ref_model)\\n\\n\\nrlhf_main = get_main(RLHFArguments, llm_rlhf)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nimport types\\n\\nimport numpy as np\\nimport torch\\nimport transformers\\nfrom packaging import version\\n\\nfrom swift.trainers import TrainerCallback\\nfrom swift.tuners import (AdaLoraConfig, AdapterConfig, BOFTConfig, IA3Config, LLaMAProConfig, LongLoRAModelType,\\n                          LoraConfig, LoRAConfig, NEFTuneConfig, ReftConfig, Swift, VeraConfig)\\nfrom swift.utils import activate_model_parameters, freeze_model_parameters, get_logger, use_torchacc\\nfrom swift.utils.module_mapping import MODEL_KEYS_MAPPING\\nfrom .utils import SftArguments, find_all_linears, find_embedding, find_ln, is_adapter\\nfrom .utils.callbacks import DynamicLayerActivationCallback, TrainerAdapterCallback\\n\\nlogger = get_logger()\\n\\n\\ndef handle_target_modules(model, args: SftArguments) -> None:\\n    if args.sft_type == 'ia3':\\n        assert len(args.ia3_feedforward_modules) > 0, ('Setting ia3_target_modules to `ALL` '\\n                                                       'need to pass MLP linear names to `ia3_feedforward_modules`')\\n    target_modules = args.target_modules\\n    if args.lora_use_embedding:\\n        target_modules.remove('EMBEDDING')\\n        target_modules += find_embedding(model)\\n    if args.lora_use_all:\\n        target_modules.remove('ALL')\\n        target_modules += find_all_linears(model, args.quantization_bit, args.model_type, args.quant_method)\\n    args.target_modules = target_modules\\n    if not args.target_regex:\\n        logger.info(f'target_modules: {args.target_modules}')\\n\\n\\ndef handle_same_dim_target_modules(model: torch.nn.Module, config: VeraConfig):\\n    target_modules = config.target_modules\\n    modules_dict = {\\n        name: module.weight.shape\\n        for name, module in model.named_modules()\\n        if isinstance(module, torch.nn.Linear) and any([t in name for t in target_modules])\\n    }  # only Linear for now\\n    if len(set(modules_dict.values())) > 1:\\n        v = [t for t in target_modules if 'v' in t]\\n        if not v:\\n            raise ValueError('Please manually pass in `vera_target_modules`, do not use `DEFAULT` or `ALL`,'\\n                             'because Vera need all target linears to be the same size.')\\n        v = v[0]\\n        shape = [shape for name, shape in modules_dict.items() if v in name][0]\\n        names = [_name for _name, _shape in modules_dict.items() if _shape == shape]\\n        config.target_modules = [t for t in target_modules if any([t in name for name in names])]\\n    return config\\n\\n\\ndef handle_modules_to_save(model, args: SftArguments) -> None:\\n    modules_to_save = args.modules_to_save\\n    if args.lora_m2s_use_embedding:\\n        modules_to_save += find_embedding(model)\\n    if args.lora_m2s_use_ln:\\n        modules_to_save += find_ln(model)\\n    args.modules_to_save = modules_to_save\\n    logger.info(f'modules_to_save: {args.modules_to_save}')\\n\\n\\ndef apply_liger(model_type: str):\\n    from liger_kernel.transformers import (apply_liger_kernel_to_llama, apply_liger_kernel_to_mistral,\\n                                           apply_liger_kernel_to_mixtral, apply_liger_kernel_to_gemma,\\n                                           apply_liger_kernel_to_qwen2)\\n    if 'llama3' in model_type:\\n        apply_liger_kernel_to_llama()\\n    elif 'mistral' in model_type:\\n        apply_liger_kernel_to_mistral()\\n    elif 'mixtral' in model_type:\\n        apply_liger_kernel_to_mixtral()\\n    elif 'gemma' in model_type:\\n        apply_liger_kernel_to_gemma()\\n    elif 'qwen2' in model_type:\\n        apply_liger_kernel_to_qwen2()\\n    else:\\n        raise ValueError(f'Unsupported liger model_type: {model_type}')\\n\\n\\ndef prepare_model(model, args: SftArguments):\\n    if args.use_liger:\\n        # Apply liger\\n        apply_liger(args.model_type)\\n\\n    # This model_type is used to map the model structure\\n    model_type = args.model_type or args.model_id_or_path\\n    for key in MODEL_KEYS_MAPPING.keys():\\n        if key in model_type.lower():\\n            model_type = key\\n            break\\n\\n    # Preparing LoRA\\n    if is_adapter(args.sft_type):\\n        if args.resume_from_checkpoint is None:\\n            handle_target_modules(model, args)\\n            handle_modules_to_save(model, args)\\n            if args.init_lora_weights and args.init_lora_weights.lower() in ('true', 'false'):\\n                args.init_lora_weights = args.init_lora_weights.lower() in ('true', 'True')\\n            if args.target_regex:\\n                logger.info(f'Value of target_modules: `{args.target_modules}` will have no effect '\\n                            f'because target_regex value: `{args.target_regex}` exists.')\\n            lora_kwargs = {\\n                'r': args.lora_rank,\\n                'target_modules': args.target_regex or args.target_modules,\\n                'lora_alpha': args.lora_alpha,\\n                'lora_dropout': args.lora_dropout,\\n                'bias': args.lora_bias_trainable,\\n                'modules_to_save': args.modules_to_save,\\n                'use_rslora': args.use_rslora,\\n                'use_dora': args.use_dora,\\n                'lorap_lr_ratio': args.lora_lr_ratio,\\n                'init_lora_weights': args.init_lora_weights,\\n            }\\n\\n            if args.sft_type in ('lora', 'longlora'):\\n                # Fix the name of the layer in xcomposer that contains Plora.\\n                if any(['lora_' in n for n, p in model.named_parameters()]):\\n                    model.requires_grad_(False)\\n                if args.lora_dtype == 'AUTO':\\n                    args.lora_dtype = None\\n                if args.tuner_backend == 'swift':\\n                    lora_config = LoRAConfig(lora_dtype=args.lora_dtype, **lora_kwargs)\\n                    model = Swift.prepare_model(model, lora_config)\\n                    logger.info(f'lora_config: {lora_config}')\\n                elif args.tuner_backend == 'peft':\\n                    lora_config = LoraConfig(task_type='CAUSAL_LM', lora_dtype=args.lora_dtype, **lora_kwargs)\\n                    model = Swift.prepare_model(model, lora_config)\\n                    logger.info(f'lora_config: {lora_config}')\\n                elif args.tuner_backend == 'unsloth':\\n                    from unsloth import FastLanguageModel\\n                    assert args.sft_type == 'lora', 'Unsloth does not support LongLoRA'\\n                    lora_kwargs.pop('lorap_lr_ratio')\\n                    model = FastLanguageModel.get_peft_model(\\n                        model,\\n                        use_gradient_checkpointing=True,\\n                        max_seq_length=args.max_length,\\n                        **lora_kwargs,\\n                    )\\n                    logger.info(f'unsloth_config: {lora_kwargs}')\\n                if args.sft_type == 'longlora':\\n                    assert LongLoRAModelType.LLAMA in args.model_type\\n                    assert version.parse(transformers.__version__) >= version.parse('4.39.3')\\n                    from swift.tuners.longlora.llama import replace_llama_attn\\n                    replace_llama_attn(model)\\n                    model.config.group_size_ratio = 0.25\\n            elif args.sft_type == 'adalora':\\n                lora_kwargs.pop('lorap_lr_ratio', None)\\n                lora_kwargs['rank_pattern'] = None\\n                adalora_config = AdaLoraConfig(\\n                    task_type='CAUSAL_LM',\\n                    **lora_kwargs,\\n                    target_r=args.adalora_target_r,\\n                    init_r=args.adalora_init_r,\\n                    tinit=args.adalora_tinit,\\n                    tfinal=args.adalora_tfinal,\\n                    deltaT=args.adalora_deltaT,\\n                    beta1=args.adalora_beta1,\\n                    beta2=args.adalora_beta2,\\n                    orth_reg_weight=args.adalora_orth_reg_weight,\\n                )\\n                model = Swift.prepare_model(model, adalora_config)\\n                logger.info(f'adalora_config: {adalora_config}')\\n            elif args.sft_type == 'ia3':\\n                ia3_config = IA3Config(\\n                    task_type='CAUSAL_LM',\\n                    target_modules=args.target_modules,\\n                    feedforward_modules=args.ia3_feedforward_modules or [],\\n                    modules_to_save=args.modules_to_save,\\n                )\\n                model = Swift.prepare_model(model, ia3_config)\\n                logger.info(f'ia3_config: {ia3_config}')\\n            elif args.sft_type == 'llamapro':\\n                llamapro_config = LLaMAProConfig(\\n                    model_type=model_type,\\n                    num_new_blocks=args.llamapro_num_new_blocks,\\n                    num_groups=args.llamapro_num_groups)\\n                model = Swift.prepare_model(model, llamapro_config)\\n                logger.info(f'llamapro_config: {llamapro_config}')\\n            elif args.sft_type == 'adapter':\\n                assert model_type in MODEL_KEYS_MAPPING\\n                mlp_key = MODEL_KEYS_MAPPING[model_type].mlp\\n                mlp_key = mlp_key.split('.{}.')[1]\\n                adapter_config = AdapterConfig(\\n                    dim=model.config.hidden_size,\\n                    target_modules=[mlp_key],\\n                    hidden_pos=0,\\n                    adapter_length=args.adapter_length,\\n                    act_layer=args.adapter_act)\\n                model = Swift.prepare_model(model, adapter_config)\\n                logger.info(f'adapter_config: {adapter_config}')\\n            elif args.sft_type == 'vera':\\n                vera_config = VeraConfig(\\n                    r=args.vera_rank,\\n                    target_modules=args.target_modules,\\n                    projection_prng_key=args.vera_projection_prng_key,\\n                    vera_dropout=args.vera_dropout,\\n                    d_initial=args.vera_d_initial,\\n                    modules_to_save=args.modules_to_save,\\n                )\\n                vera_config = handle_same_dim_target_modules(model, vera_config)\\n                model = Swift.prepare_model(model, vera_config)\\n                logger.info(f'vera_config: {vera_config}')\\n            elif args.sft_type == 'boft':\\n                boft_config = BOFTConfig(\\n                    boft_block_size=args.boft_block_size,\\n                    boft_block_num=args.boft_block_num,\\n                    boft_n_butterfly_factor=args.boft_n_butterfly_factor,\\n                    target_modules=args.target_modules,\\n                    boft_dropout=args.boft_dropout,\\n                    modules_to_save=args.modules_to_save,\\n                )\\n                model = Swift.prepare_model(model, boft_config)\\n                logger.info(f'boft_config: {boft_config}')\\n            elif args.sft_type == 'fourierft':\\n                from peft import FourierFTConfig\\n                fourier_config = FourierFTConfig(\\n                    target_modules=args.target_modules,\\n                    modules_to_save=args.modules_to_save,\\n                    n_frequency=args.fourier_n_frequency,\\n                    scaling=args.fourier_scaling,\\n                )\\n                model = Swift.prepare_model(model, fourier_config)\\n                logger.info(f'fourier_config: {fourier_config}')\\n            elif args.sft_type == 'reft':\\n                reft_config = ReftConfig(\\n                    model_type=model_type,\\n                    layer_key=args.reft_layer_key,\\n                    r=args.reft_rank,\\n                    layers=args.reft_layers,\\n                    intervention_type=args.reft_intervention_type,\\n                    args=args.reft_args,\\n                )\\n                logger.info(f'reft config: {reft_config}')\\n                model = Swift.prepare_model(model, {'reft': reft_config})\\n        else:\\n            if use_torchacc():\\n                model = Swift.from_pretrained(\\n                    model, args.resume_from_checkpoint, adapter_name='default', is_trainable=True)\\n            else:\\n                model = Swift.from_pretrained(model, args.resume_from_checkpoint, is_trainable=True)\\n        # fix bug: Attempting to unscale FP16 gradients.\\n        #   peft: https://github.com/huggingface/peft/issues/1249\\n        #   modules_to_save + fp16\\n        is_logging = False\\n        for p in model.parameters():\\n            if p.requires_grad and p.dtype == torch.float16:\\n                if not is_logging:\\n                    logger.info('Convert trainable parameters from fp16 to fp32.')\\n                    is_logging = True\\n                p.data = p.data.to(dtype=torch.float32)\\n    elif args.sft_type == 'full':\\n        model.train()\\n        model.requires_grad_(True)\\n\\n        freeze_model_parameters(model, args.freeze_parameters_ratio, args.freeze_parameters)\\n        if len(args.additional_trainable_parameters) > 0:\\n            activate_model_parameters(model, args.additional_trainable_parameters)\\n        if use_torchacc() and args.resume_from_checkpoint is not None:\\n            import safetensors\\n            weights_file = os.path.join(args.resume_from_checkpoint, 'pytorch_model.bin')\\n            safe_weights_file = os.path.join(args.resume_from_checkpoint, 'model.safetensors')\\n            if os.path.isfile(weights_file) or os.path.isfile(safe_weights_file):\\n                if args.save_safetensors and os.path.isfile(safe_weights_file):\\n                    state_dict = safetensors.torch.load_file(safe_weights_file, device='cpu')\\n                else:\\n                    state_dict = torch.load(weights_file, map_location='cpu')\\n                model.load_state_dict(state_dict, False)\\n                del state_dict\\n            else:\\n                from transformers.modeling_utils import load_sharded_checkpoint\\n                # We load the sharded checkpoint\\n                load_result = load_sharded_checkpoint(\\n                    model, args.resume_from_checkpoint, strict=False, prefer_safe=args.save_safetensors)\\n                if len(load_result.missing_keys) != 0:\\n                    if model._keys_to_ignore_on_save is not None and set(load_result.missing_keys) == set(\\n                            model._keys_to_ignore_on_save):\\n                        model.tie_weights()\\n                    else:\\n                        logger.warning(\\n                            f'There were missing keys in the checkpoint model loaded: {load_result.missing_keys}.')\\n                if len(load_result.unexpected_keys) != 0:\\n                    logger.warning(\\n                        f'There were unexpected keys in the checkpoint model loaded: {load_result.unexpected_keys}.')\\n    else:\\n        raise ValueError(f'args.sft_type: {args.sft_type}')\\n\\n    if args.sequence_parallel_size > 1:\\n        from swift.trainers.xtuner import dispatch_module_xtuner\\n        dispatch_module_xtuner(model)\\n    if args.neftune_backend == 'swift' and args.neftune_noise_alpha not in {None, 0.}:\\n        neftune_config = NEFTuneConfig(noise_alpha=args.neftune_noise_alpha)\\n        model = Swift.prepare_model(model, {'neftune': neftune_config})\\n        logger.info(f'neftune_config: {neftune_config}')\\n\\n    if args.use_galore:\\n        from swift.trainers.optimizers.galore import GaLoreConfig\\n        if args.galore_target_modules is None:\\n            args.galore_target_modules = find_all_linears(model, 0, args.model_type, args.quant_method)\\n        if args.galore_with_embedding:\\n            args.galore_target_modules += find_embedding(model)\\n        args.training_args.galore_config = GaLoreConfig(\\n            target_modules=args.galore_target_modules,\\n            rank=args.galore_rank,\\n            update_proj_gap=args.galore_update_proj_gap,\\n            galore_scale=args.galore_scale,\\n            proj_type=args.galore_proj_type,\\n            optim_per_parameter=args.galore_optim_per_parameter,\\n            quantize=args.galore_quantization,\\n            proj_quant=args.galore_proj_quant,\\n            proj_bits=args.galore_proj_bits,\\n            proj_group_size=args.galore_proj_group_size,\\n            cos_threshold=args.galore_cos_threshold,\\n            gamma_proj=args.galore_gamma_proj,\\n            queue_size=args.galore_queue_size,\\n        )\\n\\n    callbacks = []\\n    if args.lisa_activated_layers > 0:\\n        assert args.sft_type == 'full', 'LISA only supports full parameter training.'\\n        lisa_callback = DynamicLayerActivationCallback(\\n            n_layers=args.lisa_activated_layers,  # Number of layers to activate\\n            step_interval=args.lisa_step_interval,  # Step interval to update active layers\\n            model=model)\\n        lisa_callback.switch_active_layers()  # Make trainable parameters printing a correct value\\n        callbacks.append(lisa_callback)\\n\\n    if is_adapter(args.sft_type) and args.tuner_backend == 'swift':\\n        callbacks.append(TrainerAdapterCallback(args))\\n    return model, callbacks\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport datetime as dt\\nimport os\\nimport re\\nimport shutil\\nfrom typing import Any, Dict, List, Literal, Optional, Tuple\\n\\nimport json\\nimport numpy as np\\nimport torch\\nfrom tqdm import tqdm\\nfrom transformers import BitsAndBytesConfig, GenerationConfig, PreTrainedModel, PreTrainedTokenizerBase\\nfrom transformers.utils import is_torch_npu_available\\n\\nfrom swift.tuners import Swift\\nfrom swift.utils import (append_to_jsonl, get_logger, get_main, get_model_info, read_multi_line, seed_everything,\\n                         show_layers)\\nfrom .utils import (DeployArguments, InferArguments, MediaTag, Template, get_additional_saved_files, get_dataset,\\n                    get_model_tokenizer, get_template, inference, inference_stream, is_adapter, is_quant_model,\\n                    sample_dataset, set_generation_config)\\n\\nlogger = get_logger()\\n\\n\\ndef save_checkpoint(model: Optional[PreTrainedModel],\\n                    tokenizer: PreTrainedTokenizerBase,\\n                    model_cache_dir: str,\\n                    ckpt_dir: Optional[str],\\n                    target_dir: str,\\n                    *,\\n                    save_safetensors: bool = True,\\n                    sft_args_kwargs: Optional[Dict[str, Any]] = None,\\n                    **kwargs) -> None:\\n    if sft_args_kwargs is None:\\n        sft_args_kwargs = {}\\n    if model is not None:\\n        model.save_pretrained(target_dir, safe_serialization=save_safetensors)\\n    if hasattr(tokenizer, 'processor'):\\n        tokenizer.processor.save_pretrained(target_dir)\\n    tokenizer.save_pretrained(target_dir)\\n    model_type = getattr(tokenizer, 'model_type')\\n    fname_list = ['generation_config.json', 'preprocessor_config.json']\\n    if model_type is not None:\\n        fname_list += get_additional_saved_files(model_type)\\n\\n    for fname in fname_list:\\n        tgt_path = os.path.join(target_dir, fname)\\n        for model_dir in [ckpt_dir, model_cache_dir]:\\n            if model_dir is None:\\n                continue\\n            src_path = os.path.join(model_dir, fname)\\n            if os.path.isfile(src_path):\\n                shutil.copy(src_path, tgt_path)\\n                break\\n            elif os.path.isdir(src_path):\\n                shutil.copytree(src_path, tgt_path)\\n                break\\n    # configuration.json\\n    configuration_fname = 'configuration.json'\\n    new_configuration_path = os.path.join(target_dir, configuration_fname)\\n    for model_dir in [ckpt_dir, model_cache_dir]:\\n        if model_dir is None:\\n            continue\\n        old_configuration_path = os.path.join(model_dir, configuration_fname)\\n        if os.path.exists(old_configuration_path):\\n            with open(old_configuration_path, 'r', encoding='utf-8') as f:\\n                res = json.load(f)\\n            res.pop('adapter_cfg', None)\\n            with open(new_configuration_path, 'w', encoding='utf-8') as f:\\n                json.dump(res, f, ensure_ascii=False, indent=4)\\n            break\\n    if ckpt_dir is not None:\\n        # sft_args.json\\n        sft_args_fname = 'sft_args.json'\\n        old_sft_args_path = os.path.join(ckpt_dir, sft_args_fname)\\n        new_sft_args_path = os.path.join(target_dir, sft_args_fname)\\n        if os.path.exists(old_sft_args_path):\\n            with open(old_sft_args_path, 'r', encoding='utf-8') as f:\\n                res = json.load(f)\\n            res['sft_type'] = 'full'\\n            for k in ['dtype', 'quant_method']:\\n                v = sft_args_kwargs.get(k)\\n                if v is not None:\\n                    res[k] = v\\n            with open(new_sft_args_path, 'w', encoding='utf-8') as f:\\n                json.dump(res, f, ensure_ascii=False, indent=2)\\n\\n\\ndef merge_lora(args: InferArguments,\\n               replace_if_exists=False,\\n               device_map: Optional[str] = None,\\n               **kwargs) -> Optional[str]:\\n    logger.info(f'replace_if_exists: {replace_if_exists}')\\n    assert args.ckpt_dir is not None, 'args.ckpt_dir is not specified.'\\n    assert args.sft_type in ('lora', 'adalora', 'longlora', 'llamapro'), 'Only supports lora & llamapro series models'\\n    assert not is_quant_model(\\n        args.model_type), f'{args.model_type} is a quantized model and does not support merge-lora.'\\n    if args.quantization_bit != 0:\\n        logger.warning('It is not recommended to merge quantized models, '\\n                       'as this can result in performance degradation')\\n    ckpt_dir, ckpt_name = os.path.split(args.ckpt_dir)\\n    merged_lora_path = os.path.join(ckpt_dir, f'{ckpt_name}-merged')\\n    logger.info(f'merged_lora_path: `{merged_lora_path}`')\\n    if os.path.exists(merged_lora_path) and not replace_if_exists:\\n        logger.info(f'The weight directory for the merged LoRA already exists in {args.ckpt_dir}, '\\n                    'skipping the saving process. '\\n                    'you can pass `replace_if_exists=True` to overwrite it.')\\n    else:\\n        if device_map is None:\\n            device_map = args.merge_device_map\\n        logger.info(f'merge_device_map: {device_map}')\\n        model, template = prepare_model_template(args, device_map=device_map, verbose=False)\\n        logger.info('Merge LoRA...')\\n        Swift.merge_and_unload(model)\\n        model = model.model\\n        logger.info('Saving merged weights...')\\n        save_checkpoint(\\n            model,\\n            template.tokenizer,\\n            model.model_dir,\\n            args.ckpt_dir,\\n            merged_lora_path,\\n            save_safetensors=args.save_safetensors,\\n            sft_args_kwargs={'dtype': args.dtype})\\n        logger.info(f'Successfully merged LoRA and saved in {merged_lora_path}.')\\n    logger.info(\\\"Setting args.sft_type: 'full'\\\")\\n    logger.info(f'Setting args.ckpt_dir: {merged_lora_path}')\\n    args.sft_type = 'full'\\n    args.ckpt_dir = merged_lora_path\\n    return merged_lora_path\\n\\n\\ndef prepare_model_template(args: InferArguments,\\n                           *,\\n                           device_map: Optional[str] = None,\\n                           verbose: bool = True,\\n                           automodel_class=None) -> Tuple[PreTrainedModel, Template]:\\n    from .sft import get_default_device_map\\n    if is_torch_npu_available():\\n        print(f'device_count: {torch.npu.device_count()}')\\n    else:\\n        print(f'device_count: {torch.cuda.device_count()}')\\n    model_kwargs = {}\\n    if device_map is None:\\n        device_map = get_default_device_map()\\n    model_kwargs['device_map'] = device_map\\n    if device_map == 'auto':\\n        model_kwargs['low_cpu_mem_usage'] = True\\n    model_kwargs['device_map'] = device_map\\n    if args.device_max_memory:\\n        assert len(args.device_max_memory) == torch.cuda.device_count()\\n        model_kwargs['max_memory'] = {i: mem for i, mem in enumerate(args.device_max_memory)}\\n\\n    # Loading Model and Tokenizer\\n    if hasattr(args, 'quant_config'):\\n        model_kwargs['quantization_config'] = args.quant_config\\n    elif args.load_in_8bit or args.load_in_4bit:\\n        quantization_config = BitsAndBytesConfig(\\n            args.load_in_8bit,\\n            args.load_in_4bit,\\n            bnb_4bit_compute_dtype=args.bnb_4bit_compute_dtype,\\n            bnb_4bit_quant_type=args.bnb_4bit_quant_type,\\n            bnb_4bit_use_double_quant=args.bnb_4bit_use_double_quant)\\n        if args.bnb_4bit_compute_dtype is None:\\n            quantization_config.bnb_4bit_compute_dtype = None\\n        logger.info(f'quantization_config: {quantization_config.__dict__}')\\n        model_kwargs['quantization_config'] = quantization_config\\n    kwargs = {}\\n    if args.use_flash_attn is not None:\\n        kwargs['use_flash_attn'] = args.use_flash_attn\\n    model_id_or_path = None\\n    if args.sft_type == 'full' and args.ckpt_dir is not None:\\n        model_id_or_path = args.ckpt_dir\\n    elif args.model_id_or_path is not None:\\n        model_id_or_path = args.model_id_or_path\\n    if automodel_class is not None:\\n        kwargs['automodel_class'] = automodel_class\\n    if args.local_repo_path:\\n        kwargs['local_repo_path'] = args.local_repo_path\\n    if args.rope_scaling:\\n        kwargs['rope_scaling'] = args.rope_scaling\\n        kwargs['max_length'] = args.max_length\\n    model, tokenizer = get_model_tokenizer(\\n        args.model_type,\\n        args.torch_dtype,\\n        model_kwargs,\\n        model_id_or_path=model_id_or_path,\\n        revision=args.model_revision,\\n        quant_method=args.quant_method,\\n        **kwargs)\\n    if verbose:\\n        logger.info(f'model_config: {model.config}')\\n\\n    generation_config = GenerationConfig(\\n        max_new_tokens=args.max_new_tokens,\\n        temperature=args.temperature,\\n        top_k=args.top_k,\\n        top_p=args.top_p,\\n        do_sample=args.do_sample,\\n        repetition_penalty=args.repetition_penalty,\\n        num_beams=args.num_beams,\\n        pad_token_id=tokenizer.pad_token_id,\\n        eos_token_id=tokenizer.eos_token_id)\\n    set_generation_config(model, generation_config)\\n    logger.info(f'model.generation_config: {model.generation_config}')\\n\\n    if model.generation_config.num_beams != 1:\\n        args.stream = False\\n        logger.info('Setting args.stream: False')\\n    if model.max_model_len is None:\\n        model.max_model_len = args.max_model_len\\n    elif args.max_model_len is not None:\\n        if args.max_model_len <= model.max_model_len:\\n            model.max_model_len = args.max_model_len\\n        else:\\n            raise ValueError('args.max_model_len exceeds the maximum max_model_len supported by the model.'\\n                             f'args.max_model_len: {args.max_model_len}, model.max_model_len: {model.max_model_len}')\\n    # Preparing LoRA\\n    if is_adapter(args.sft_type) and args.ckpt_dir is not None:\\n        if isinstance(args, DeployArguments) and args.lora_request_list is not None:\\n            logger.info(f'args.lora_request_list: {args.lora_request_list}')\\n            for lora_request in args.lora_request_list:\\n                model = Swift.from_pretrained(\\n                    model, lora_request.lora_local_path, lora_request.lora_name, inference_mode=True)\\n        else:\\n            model = Swift.from_pretrained(model, args.ckpt_dir, inference_mode=True)\\n        model = model.to(model.dtype)\\n    model.requires_grad_(False)\\n\\n    if verbose:\\n        show_layers(model)\\n        logger.info(model)\\n    logger.info(get_model_info(model))\\n    template: Template = get_template(\\n        args.template_type,\\n        tokenizer,\\n        args.system,\\n        args.max_length,\\n        args.truncation_strategy,\\n        model=model,\\n        tools_prompt=args.tools_prompt)\\n    args.system = template.default_system\\n    logger.info(f'system: {args.system}')\\n    return model, template\\n\\n\\ndef read_media_file(infer_kwargs: Dict[str, Any], infer_media_type: Literal['none', 'round', 'dialogue', 'interleave'],\\n                    media_type: Literal['image', 'video', 'audio'], query: str) -> None:\\n    if infer_media_type == 'none':\\n        return\\n\\n    def _input_media(media_type: Literal['image', 'video', 'audio']) -> None:\\n        media_key = MediaTag.media_keys[media_type]\\n        media_files = infer_kwargs.get(media_key) or []\\n        a_an = 'an' if media_type[0] in {'i', 'a'} else 'a'\\n        text = f'Input {a_an} {media_type} path or URL <<< '\\n        media_files += [input(text) or None]\\n        infer_kwargs[media_key] = media_files\\n\\n    if infer_media_type == 'interleave':\\n        media_tags = re.findall('|'.join(list(MediaTag.standard_tags.values())), query)\\n        standard_tags_r = {v: k for k, v in MediaTag.standard_tags.items()}\\n        for tag in media_tags:\\n            media_type = standard_tags_r[tag]\\n            _input_media(media_type)\\n        return\\n\\n    media_key = MediaTag.media_keys[media_type]\\n    media_files = infer_kwargs.get(media_key) or []\\n    if infer_media_type == 'round' or len(media_files) == 0:\\n        _input_media(media_type)\\n\\n\\ndef llm_infer(args: InferArguments) -> Dict[str, List[Dict[str, Any]]]:\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n    if args.merge_lora:\\n        merge_lora(args, device_map=args.merge_device_map)\\n\\n    if args.infer_backend == 'vllm':\\n        from .utils import (prepare_vllm_engine_template, inference_stream_vllm as inference_stream_x, inference_vllm as\\n                            inference_x)\\n        llm_engine, template = prepare_vllm_engine_template(args)\\n    elif args.infer_backend == 'lmdeploy':\\n        from .utils import (prepare_lmdeploy_engine_template, inference_stream_lmdeploy as inference_stream_x,\\n                            inference_lmdeploy as inference_x)\\n        llm_engine, template = prepare_lmdeploy_engine_template(args)\\n    else:\\n        if args.quant_method == 'hqq':\\n            from transformers import HqqConfig\\n            if args.hqq_dynamic_config_path is not None:\\n                cwd = os.getcwd()\\n                config_path = args.hqq_dynamic_config_path if os.path.isabs(\\n                    args.hqq_dynamic_config_path) else os.path.join(cwd, args.hqq_dynamic_config_path)\\n                with open(config_path, 'r') as json_file:\\n                    args.quant_config = HqqConfig(dynamic_config=json.load(json_file))\\n            else:\\n                if args.quantization_bit == 0:\\n                    logger.info(\\\"You haven't set the quantization_bit parameter; set it to 8.\\\")\\n                    args.quantization_bit = 8\\n                args.quant_config = HqqConfig(nbits=args.quantization_bit, axis=args.hqq_axis)\\n        elif args.quant_method == 'eetq':\\n            from transformers import EetqConfig\\n            args.quant_config = EetqConfig('int8')\\n        model, template = prepare_model_template(args, device_map=args.device_map_config)\\n        if args.overwrite_generation_config:\\n            assert args.ckpt_dir is not None, 'args.ckpt_dir is not specified.'\\n            model.generation_config.save_pretrained(args.ckpt_dir)\\n    lora_request = None\\n    if args.vllm_enable_lora:\\n        assert len(args.lora_request_list) == 1\\n        lora_request = args.lora_request_list[0]\\n    # Inference\\n    result: List[Dict[str, Any]] = []\\n    jsonl_path = None\\n    if args.save_result:\\n        if args.result_dir:\\n            result_dir = args.result_dir\\n        else:\\n            result_dir = args.ckpt_dir\\n            if result_dir is None:\\n                result_dir = llm_engine.model_dir if args.infer_backend in {'vllm', 'lmdeploy'} else model.model_dir\\n            if result_dir is not None:\\n                result_dir = os.path.join(result_dir, 'infer_result')\\n        if result_dir is not None:\\n            os.makedirs(result_dir, exist_ok=True)\\n            time = dt.datetime.now().strftime('%Y%m%d-%H%M%S')\\n            jsonl_path = os.path.join(result_dir, f'{time}.jsonl')\\n    if args.eval_human:\\n        input_mode: Literal['S', 'M'] = 'S'\\n        logger.info('Input `exit` or `quit` to exit the conversation.')\\n        logger.info('Input `multi-line` to switch to multi-line input mode.')\\n        logger.info('Input `reset-system` to reset the system and clear the history.')\\n        if template.support_multi_round:\\n            logger.info('Input `clear` to clear the history.')\\n        else:\\n            logger.info('The current template only supports single-round dialogues.')\\n        history = []\\n        infer_kwargs = {}\\n        if args.infer_media_type != 'none':\\n            logger.info('Please enter the conversation content first, followed by the path to the multimedia file.')\\n        system = None\\n        read_system = False\\n        while True:\\n            if input_mode == 'S':\\n                addi_prompt = ''\\n                if read_system:\\n                    addi_prompt = '[S]'\\n                query = input(f'<<<{addi_prompt} ')\\n            else:\\n                addi_prompt = '[M]'\\n                if read_system:\\n                    addi_prompt = '[MS]'\\n                query = read_multi_line(addi_prompt)\\n            if query.strip().lower() in {'exit', 'quit'}:\\n                break\\n            elif query.strip().lower() == 'clear':\\n                history = []\\n                infer_kwargs = {}\\n                continue\\n            elif query.strip() == '' and not read_system:\\n                continue\\n            elif query.strip().lower() == 'reset-system':\\n                read_system = True\\n                continue\\n            if read_system:\\n                if query == '':\\n                    system = None\\n                else:\\n                    system = query\\n                read_system = False\\n                history = []\\n                infer_kwargs = {}\\n                continue\\n            if input_mode == 'S' and query.strip().lower() == 'multi-line':\\n                input_mode = 'M'\\n                logger.info('End multi-line input with `#`.')\\n                logger.info('Input `single-line` to switch to single-line input mode.')\\n                continue\\n            if input_mode == 'M' and query.strip().lower() == 'single-line':\\n                input_mode = 'S'\\n                continue\\n            if not template.support_multi_round:\\n                history = []\\n                infer_kwargs = {}\\n\\n            read_media_file(infer_kwargs, args.infer_media_type, args.media_type, query)\\n            infer_kwargs['truncation_strategy'] = args.truncation_strategy\\n            if system is None and template.use_default_system:\\n                system = template.default_system\\n            if args.infer_backend in {'vllm', 'lmdeploy'}:\\n                request_list = [{'query': query, 'history': history, 'system': system, **infer_kwargs}]\\n                if args.stream:\\n                    gen = inference_stream_x(llm_engine, template, request_list, lora_request=lora_request)\\n                    print_idx = 0\\n                    for resp_list in gen:\\n                        response = resp_list[0]['response']\\n                        new_history = resp_list[0]['history']\\n                        if len(response) > print_idx:\\n                            print(response[print_idx:], end='', flush=True)\\n                            print_idx = len(response)\\n                    print()\\n                else:\\n                    resp_list = inference_x(llm_engine, template, request_list, lora_request=lora_request)\\n                    response = resp_list[0]['response']\\n                    new_history = resp_list[0]['history']\\n                    print(response)\\n            else:\\n                if args.stop_words:\\n                    infer_kwargs['stop_words'] = args.stop_words\\n                if args.stream:\\n                    gen = inference_stream(model, template, query, history, system, **infer_kwargs)\\n                    print_idx = 0\\n                    for response, new_history in gen:\\n                        if len(response) > print_idx:\\n                            print(response[print_idx:], end='', flush=True)\\n                            print_idx = len(response)\\n                    print()\\n                else:\\n                    response, new_history = inference(model, template, query, history, system, **infer_kwargs)\\n                    print(response)\\n            print('-' * 50)\\n            obj = {\\n                'system': system,\\n                'query': query,\\n                'response': response,\\n                'history': history,\\n            }\\n            for media_key in MediaTag.media_keys.values():\\n                media_files = infer_kwargs.get(media_key)\\n                if media_files is not None:\\n                    obj[media_key] = media_files\\n            history = new_history\\n            if jsonl_path is not None:\\n                append_to_jsonl(jsonl_path, obj)\\n            result.append(obj)\\n    else:\\n        dataset_kwargs = {\\n            'dataset_seed': args.dataset_seed,\\n            'check_dataset_strategy': args.check_dataset_strategy,\\n            'model_name': args.model_name,\\n            'model_author': args.model_author\\n        }\\n        if len(args.val_dataset) > 0:\\n            _, val_dataset = get_dataset(args.val_dataset, 1.0, **dataset_kwargs)\\n        else:\\n            _, val_dataset = get_dataset(args.dataset, args.dataset_test_ratio, **dataset_kwargs)\\n        _, val_dataset = args._handle_dataset_compat(_, val_dataset)\\n        assert val_dataset is not None\\n        if 0 <= args.show_dataset_sample < val_dataset.shape[0]:\\n            random_state = np.random.RandomState(args.dataset_seed)\\n            logger.info(f'show_dataset_sample: {args.show_dataset_sample}')\\n            val_dataset = sample_dataset(val_dataset, args.show_dataset_sample, random_state)\\n        logger.info(f'val_dataset: {val_dataset}')\\n\\n        if args.verbose is None:\\n            if len(val_dataset) >= 20:\\n                args.verbose = False\\n            else:\\n                args.verbose = True\\n            logger.info(f'Setting args.verbose: {args.verbose}')\\n        if not args.verbose and args.stream:\\n            args.stream = False\\n            logger.info(f'Setting args.stream: {args.stream}')\\n\\n        if args.infer_backend in {'vllm', 'lmdeploy'} and not args.stream:\\n            if args.verbose:\\n                args.verbose = False\\n                logger.info('Setting args.verbose: False')\\n            label_list = None\\n            if 'response' in val_dataset.features:\\n                label_list = val_dataset['response']\\n                val_dataset = val_dataset.remove_columns('response')\\n            request_list = []\\n            for data in val_dataset:\\n                request = {'query': data['query']}\\n                history = data.get('history')\\n                system = data.get('system')\\n                if history is None:\\n                    history = []\\n                request['history'] = history\\n                if system is None and template.use_default_system:\\n                    system = template.default_system\\n                request['system'] = system\\n                for media_key in MediaTag.media_keys.values():\\n                    media_files = data.get(media_key)\\n                    if media_files is not None:\\n                        request[media_key] = media_files\\n                request['truncation_strategy'] = args.truncation_strategy\\n                request_list.append(request)\\n            resp_list = inference_x(llm_engine, template, request_list, use_tqdm=True)\\n            result = []\\n            if label_list is not None:\\n                for request, label in zip(request_list, label_list):\\n                    request['label'] = label\\n            for request, resp in zip(request_list, resp_list):\\n                obj = {\\n                    'system': request['system'],\\n                    'query': request['query'],\\n                    'response': resp['response'],\\n                    'label': request.pop('label', None),\\n                    'history': request['history'],\\n                }\\n                for media_key in MediaTag.media_keys.values():\\n                    media_files = request.get(media_key)\\n                    if media_files is not None:\\n                        obj[media_key] = media_files\\n                if jsonl_path is not None:\\n                    append_to_jsonl(jsonl_path, obj)\\n                result.append(obj)\\n        else:\\n            if not args.verbose:\\n                val_dataset = tqdm(val_dataset)\\n            for data in val_dataset:\\n                kwargs = {'query': data['query']}\\n                history = data.get('history')\\n                system = data.get('system')\\n                tools = data.get('tools')\\n                objects = data.get('objects')\\n                if args.verbose and system is not None:\\n                    print(f'[SYSTEM]{system}')\\n                if history is None:\\n                    history = []\\n                kwargs['history'] = history\\n                if system is None and template.use_default_system:\\n                    system = template.default_system\\n                kwargs['system'] = system\\n                for media_key in MediaTag.media_keys.values():\\n                    media_files = data.get(media_key)\\n                    if media_files is not None:\\n                        kwargs[media_key] = media_files\\n                if tools is not None:\\n                    kwargs['tools'] = tools\\n                if objects is not None:\\n                    kwargs['objects'] = objects\\n                kwargs['truncation_strategy'] = args.truncation_strategy\\n                if args.infer_backend in {'vllm', 'lmdeploy'}:\\n                    assert args.stream\\n                    if args.verbose:\\n                        print(f\\\"[QUERY]{data['query']}\\\\n[RESPONSE]\\\", end='')\\n                    gen = inference_stream_x(llm_engine, template, [kwargs], lora_request=lora_request)\\n                    print_idx = 0\\n                    for resp_list in gen:\\n                        response = resp_list[0]['response']\\n                        if args.verbose and len(response) > print_idx:\\n                            print(response[print_idx:], end='', flush=True)\\n                            print_idx = len(response)\\n                    print()\\n                else:\\n                    response, _ = inference(\\n                        model, template, stream=args.stream and args.verbose, verbose=args.verbose, **kwargs)\\n                label = data.pop('response', None)\\n                obj = {\\n                    'system': kwargs['system'],\\n                    'query': kwargs['query'],\\n                    'response': response,\\n                    'label': label,\\n                    'history': kwargs['history'],\\n                }\\n                for media_key in MediaTag.media_keys.values():\\n                    media_files = kwargs.get(media_key)\\n                    if media_files is not None:\\n                        obj[media_key] = media_files\\n                if jsonl_path is not None:\\n                    append_to_jsonl(jsonl_path, obj)\\n                result.append(obj)\\n                if args.verbose:\\n                    print()\\n                    print(f'[LABELS]{label}')\\n                    for media_key in MediaTag.media_keys.values():\\n                        media_files = kwargs.get(media_key)\\n                        if media_files is not None:\\n                            print(f'[{media_key.upper()}]{media_files}')\\n                    print('-' * 50, flush=True)\\n\\n    if jsonl_path is not None:\\n        logger.info(f'save_result_path: {jsonl_path}')\\n    return {'result': result}\\n\\n\\ninfer_main = get_main(InferArguments, llm_infer)\\nmerge_lora_main = get_main(InferArguments, merge_lora)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import TYPE_CHECKING\\n\\nfrom swift.utils.import_utils import _LazyModule\\nfrom .utils import *\\n\\nif TYPE_CHECKING:\\n    # Recommend using `xxx_main`\\n    from .app_ui import gradio_chat_demo, gradio_generation_demo, app_ui_main\\n    from .deploy import deploy_main\\n    from .infer import merge_lora, prepare_model_template, infer_main, merge_lora_main\\n    from .rome import rome_main\\n    from .sft import sft_main, pt_main\\n    from .export import export_main\\n    from .eval import eval_main\\n    from .rlhf import rlhf_main\\nelse:\\n    _extra_objects = {k: v for k, v in globals().items() if not k.startswith('_')}\\n    _import_structure = {\\n        'app_ui': ['gradio_chat_demo', 'gradio_generation_demo', 'app_ui_main'],\\n        'deploy': ['deploy_main'],\\n        'rlhf': ['rlhf_main'],\\n        'infer': ['merge_lora', 'prepare_model_template', 'infer_main', 'merge_lora_main'],\\n        'rome': ['rome_main'],\\n        'sft': ['sft_main', 'pt_main'],\\n        'export': ['export_main'],\\n        'eval': ['eval_main'],\\n    }\\n\\n    import sys\\n\\n    sys.modules[__name__] = _LazyModule(\\n        __name__,\\n        globals()['__file__'],\\n        _import_structure,\\n        module_spec=__spec__,\\n        extra_objects=_extra_objects,\\n    )\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport asyncio\\nimport datetime as dt\\nimport multiprocessing\\nimport os\\nimport time\\nfrom contextlib import contextmanager\\nfrom typing import Any, Dict, List, Optional, Tuple\\n\\nimport json\\nfrom evalscope.backend.opencompass import OpenCompassBackendManager\\nfrom evalscope.backend.vlm_eval_kit import VLMEvalKitBackendManager\\nfrom evalscope.config import TaskConfig\\nfrom evalscope.constants import DEFAULT_ROOT_CACHE_DIR\\nfrom evalscope.models.custom import CustomModel\\nfrom evalscope.run import run_task\\nfrom evalscope.summarizer import Summarizer\\nfrom evalscope.utils import EvalBackend\\nfrom openai import APIConnectionError\\nfrom tqdm import tqdm\\nfrom transformers import GenerationConfig\\n\\nfrom swift.utils import append_to_jsonl, get_logger, get_main, seed_everything\\nfrom .infer import merge_lora, prepare_model_template\\nfrom .utils import DeployArguments, EvalArguments, XRequestConfig, inference, inference_client_async\\n\\nlogger = get_logger()\\n\\n\\nclass EvalModel(CustomModel):\\n\\n    def __init__(self, args: EvalArguments, model_name: str, **kwargs) -> None:\\n        if args.eval_url is None:\\n            if args.merge_lora:\\n                merge_lora(args, device_map=args.merge_device_map)\\n            if args.infer_backend == 'vllm':\\n                from .utils import prepare_vllm_engine_template\\n                self.llm_engine, self.template = prepare_vllm_engine_template(args)\\n            else:\\n                self.model, self.template = prepare_model_template(args)\\n\\n        self.args = args\\n        super().__init__(config={'model_id': model_name}, **kwargs)\\n        self.model_name = model_name\\n\\n    @staticmethod\\n    async def _call_openai(model_type: str, query: str, eval_url: str, *, is_chat_model: bool,\\n                           request_config: XRequestConfig, prog_bar: tqdm) -> Tuple[str, Optional[int]]:\\n        # idx: maintain the order\\n        resp = await inference_client_async(\\n            model_type, query, is_chat_request=is_chat_model, request_config=request_config, url=eval_url)\\n        if is_chat_model:\\n            response = resp.choices[0].message.content\\n        else:\\n            response = resp.choices[0].text\\n        prog_bar.update()\\n        return response\\n\\n    async def call_openai_batched(self, prompts: List[str], request_config: XRequestConfig) -> List[str]:\\n        assert self.args.eval_is_chat_model is not None\\n        use_tqdm = True if len(prompts) >= 20 else False\\n        prog_bar = tqdm(total=len(prompts), dynamic_ncols=True, disable=not use_tqdm)\\n        tasks = []\\n        for prompt in prompts:\\n            tasks.append(\\n                self._call_openai(\\n                    self.args.model_type,\\n                    prompt,\\n                    self.args.eval_url,\\n                    is_chat_model=self.args.eval_is_chat_model,\\n                    request_config=request_config,\\n                    prog_bar=prog_bar))\\n        response_list: List[Optional[str]] = await asyncio.gather(*tasks)\\n        prog_bar.close()\\n        return response_list\\n\\n    def predict(self, prompts: List[str], **kwargs) -> List[Dict[str, Any]]:\\n        infer_cfg = kwargs['infer_cfg'].copy()\\n        infer_cfg.pop('limit', None)\\n        infer_cfg.pop('max_length', None)\\n        assert infer_cfg.get('max_new_tokens') is not None, f'infer_cfg: {infer_cfg}'\\n        do_sample = infer_cfg.pop('do_sample', None)\\n\\n        if self.args.eval_url is not None:\\n            if do_sample is False:\\n                infer_cfg['temperature'] = 0\\n            max_new_tokens = infer_cfg.pop('max_new_tokens', None)\\n            if max_new_tokens is not None:\\n                infer_cfg['max_tokens'] = max_new_tokens\\n\\n            request_config = XRequestConfig(**infer_cfg)\\n            response_list = asyncio.run(self.call_openai_batched(prompts, request_config))\\n\\n        elif self.args.infer_backend == 'vllm':\\n            from .utils import inference_vllm, VllmGenerationConfig\\n            if do_sample is False:\\n                infer_cfg['temperature'] = 0\\n            generation_config = VllmGenerationConfig(**infer_cfg)\\n\\n            request_list = [{'query': prompt} for prompt in prompts]\\n            use_tqdm = True if len(request_list) >= 20 else False\\n            resp_list = inference_vllm(\\n                self.llm_engine, self.template, request_list, generation_config=generation_config, use_tqdm=use_tqdm)\\n            response_list = [resp['response'] for resp in resp_list]\\n        else:\\n            if do_sample is False:\\n                # fix warning\\n                infer_cfg['temperature'] = 1.\\n                infer_cfg['top_p'] = 1.\\n                infer_cfg['top_k'] = 50\\n            if do_sample is not None:\\n                infer_cfg['do_sample'] = do_sample\\n            response_list = []\\n            generation_config = GenerationConfig(**infer_cfg)\\n            use_tqdm = True if len(prompts) >= 5 else False\\n            prog_bar = tqdm(total=len(prompts), dynamic_ncols=True, disable=not use_tqdm)\\n            for prompt in prompts:\\n                response, _ = inference(self.model, self.template, prompt, generation_config=generation_config)\\n                response_list.append(response)\\n                prog_bar.update()\\n            prog_bar.close()\\n        res_d = []\\n        for response in response_list:\\n            res_d.append({\\n                'choices': [{\\n                    'index': 0,\\n                    'message': {\\n                        'content': response,\\n                        'role': 'assistant'\\n                    }\\n                }],\\n                'created': int(time.time()),\\n                'model': self.model_name,\\n                'object': 'chat.completion',\\n            })\\n        return res_d\\n\\n\\ndef run_custom_model(args: EvalArguments):\\n    from swift.llm import deploy_main\\n    port = args.port\\n    args = args.__dict__\\n    attrs = dir(DeployArguments)\\n    for key in list(args.keys()):\\n        if key not in attrs:\\n            args.pop(key)\\n    args['verbose'] = False\\n    deploy_args = DeployArguments(**args)\\n    deploy_args.port = port\\n    deploy_main(deploy_args)\\n\\n\\nclass EvalDatasetContext:\\n\\n    def __init__(self):\\n        self.cache_dir = self.prepare_evalscope_dataset()\\n\\n    def __enter__(self):\\n        data_dir = os.path.join(self.cache_dir, 'data')\\n        local_dir = os.path.join(os.getcwd(), 'data')\\n        if os.path.exists(local_dir) and not os.path.islink(local_dir):\\n            raise AssertionError('Please promise your pwd dir does not contain a `data` dir.')\\n        if os.path.islink(local_dir):\\n            os.remove(os.path.join(local_dir))\\n        os.symlink(data_dir, local_dir)\\n\\n    def __exit__(self, *args, **kwargs):\\n        pass\\n\\n    @staticmethod\\n    def prepare_evalscope_dataset():\\n        from swift.llm.utils.media import MediaCache\\n        return MediaCache.download(\\n            'https://www.modelscope.cn/api/v1/datasets/swift/evalscope_resource/'\\n            'repo?Revision=master&FilePath=eval.zip', 'evalscope')\\n\\n\\ndef get_model_type(port, timeout):\\n    cnt = 0\\n    while True:\\n        from openai import OpenAI\\n        client = OpenAI(\\n            api_key='EMPTY',\\n            base_url=f'http://localhost:{port}/v1',\\n        )\\n        try:\\n            return client.models.list().data\\n        except APIConnectionError as e:\\n            cnt += 1\\n            if cnt > timeout:\\n                logger.error('Cannot get model_type from the deploy service, please check the error to continue eval')\\n                raise e\\n            else:\\n                time.sleep(1)\\n\\n\\ndef opencompass_runner(args: EvalArguments, dataset: List[str], model_type: str, is_chat: bool, url: str):\\n    eval_limit = args.eval_limit\\n    if eval_limit is not None and '[' not in eval_limit:\\n        eval_limit = int(eval_limit)\\n    limit_config = {'limit': eval_limit} if eval_limit else {}\\n    task_cfg = dict(\\n        eval_backend='OpenCompass',\\n        eval_config={\\n            'datasets':\\n            dataset,\\n            'reuse':\\n            'latest' if args.eval_use_cache else None,\\n            'batch_size':\\n            args.eval_batch_size,\\n            'work_dir':\\n            args.eval_output_dir,\\n            'models': [\\n                {\\n                    'path': model_type,\\n                    'openai_api_base': url,\\n                    'is_chat': is_chat,\\n                    'key': args.eval_token,\\n                    'temperature': args.temperature\\n                },\\n            ],\\n            **limit_config,\\n        },\\n    )\\n    with EvalDatasetContext():\\n        run_task(task_cfg=task_cfg)\\n\\n    return Summarizer.get_report_from_cfg(task_cfg=task_cfg)\\n\\n\\ndef vlmeval_runner(args: EvalArguments, dataset: List[str], model_type: str, is_chat: bool, url: str):\\n    eval_limit = args.eval_limit\\n    if eval_limit is not None and '[' not in eval_limit:\\n        eval_limit = int(eval_limit)\\n    limit_config = {'limit': eval_limit} if eval_limit else {}\\n    if args.eval_batch_size or args.eval_use_cache:\\n        logger.warn('VLMEval does not support `eval_batch_size` or `eval_use_cache`')\\n    task_cfg = dict(\\n        eval_backend='VLMEvalKit',\\n        eval_config={\\n            'data':\\n            dataset,\\n            'work_dir':\\n            args.eval_output_dir,\\n            'model': [\\n                {\\n                    'name': 'CustomAPIModel',\\n                    'api_base': url,\\n                    'key': args.eval_token,\\n                    'type': model_type,\\n                    'temperature': args.temperature\\n                },\\n            ],\\n            **limit_config,\\n            'nproc':\\n            args.eval_nproc,\\n        },\\n    )\\n    run_task(task_cfg=task_cfg)\\n    return Summarizer.get_report_from_cfg(task_cfg=task_cfg)\\n\\n\\n@contextmanager\\ndef deploy_context(args):\\n    from swift.utils.torch_utils import _find_free_port\\n    process = None\\n    try:\\n        if not args.eval_url:\\n            port = _find_free_port()\\n            args.port = port\\n            mp = multiprocessing.get_context('spawn')\\n            process = mp.Process(target=run_custom_model, args=(args, ))\\n            process.start()\\n        yield\\n    finally:\\n        if process is not None:\\n            process.kill()\\n            process.join()\\n            logger.info('The deployment process has been terminated.')\\n\\n\\ndef eval_opencompass(args: EvalArguments) -> List[Dict[str, Any]]:\\n    logger.info(f'args: {args}')\\n    if args.eval_few_shot:\\n        logger.warn('OpenCompass does not support `eval_few_shot`')\\n    with deploy_context(args):\\n        if not args.eval_url:\\n            port = args.port\\n            # health check: try to get model_type until raises\\n            get_model_type(port, args.deploy_timeout)\\n            model_type = 'default-lora' if args.sft_type in ('lora',\\n                                                             'longlora') and not args.merge_lora else args.model_type\\n            from .deploy import is_generation_template\\n            if is_generation_template(args.template_type):\\n                url = f'http://127.0.0.1:{port}/v1/completions'\\n            else:\\n                url = f'http://127.0.0.1:{port}/v1/chat/completions'\\n            is_chat = not is_generation_template(args.template_type)\\n        else:\\n            url = args.eval_url\\n            url = url.rstrip('/')\\n            if args.eval_is_chat_model:\\n                url += '/chat/completions'\\n            else:\\n                url += '/completions'\\n            model_type = args.model_type\\n            is_chat = args.eval_is_chat_model\\n\\n        nlp_datasets = set(OpenCompassBackendManager.list_datasets()) & set(args.eval_dataset)\\n        mm_datasets = set(VLMEvalKitBackendManager.list_supported_datasets()) & set(args.eval_dataset)\\n\\n        final_report = []\\n        for dataset, runner in zip([list(nlp_datasets), list(mm_datasets)], [opencompass_runner, vlmeval_runner]):\\n            if not dataset:\\n                continue\\n\\n            report = runner(args, dataset, model_type, is_chat, url)\\n            logger.info(f'Final report:{report}\\\\n')\\n            final_report.extend(report)\\n    if not final_report:\\n        raise ValueError(f'Cannot load final report, please check your dataset: {args.eval_dataset} and the eval log')\\n    return final_report\\n\\n\\ndef eval_llmuses(args: EvalArguments) -> List[Dict[str, Any]]:\\n    model_name = args.model_type\\n    tm = dt.datetime.now().strftime('%Y%m%d_%H%M%S')\\n    model_name += f'-{args.name or tm}'\\n    custom_names = []\\n    if args.custom_eval_config is not None:\\n        assert os.path.isfile(args.custom_eval_config)\\n        with open(args.custom_eval_config, 'r') as f:\\n            custom_eval = json.load(f)\\n            for _ds in custom_eval:\\n                custom_names.append(_ds['name'])\\n                TaskConfig.registry(_ds['name'], _ds['pattern'], _ds['dataset'], subset_list=_ds.get('subset_list'))\\n    eval_model = EvalModel(args, model_name)\\n\\n    generation_config = {\\n        'do_sample': args.do_sample,\\n        'repetition_penalty': args.repetition_penalty,\\n        'max_length': args.max_length,\\n        'max_new_tokens': args.max_new_tokens,\\n        'temperature': args.temperature,\\n        'top_k': args.top_k,\\n        'top_p': args.top_p,\\n    }\\n\\n    task_configs = TaskConfig.load(custom_model=eval_model, tasks=args.eval_dataset + custom_names)\\n    for task_config in task_configs:\\n        task_config.generation_config = generation_config\\n        task_config.dataset_dir = DEFAULT_ROOT_CACHE_DIR\\n        task_config.use_cache = args.eval_use_cache\\n        if args.eval_limit is not None:\\n            task_config.limit = int(args.eval_limit)\\n        eval_few_shot = args.eval_few_shot\\n        if 'mmlu' in task_config.datasets:\\n            eval_few_shot = 0  # fix\\n        if eval_few_shot is not None:\\n            for dataset in task_config.datasets:\\n                if not task_config.dataset_args.get(dataset):\\n                    task_config.dataset_args[dataset] = {}\\n                task_config.dataset_args[dataset]['few_shot_num'] = eval_few_shot\\n\\n    run_task(task_cfg=task_configs)\\n    final_report: List[dict] = Summarizer.get_report_from_cfg(task_cfg=task_configs)\\n    logger.info(f'Final report:{final_report}\\\\n')\\n\\n    result_dir = os.path.join(args.eval_output_dir, tm)\\n    if result_dir is None:\\n        result_dir = eval_model.llm_engine.model_dir if args.infer_backend == 'vllm' else eval_model.model.model_dir\\n    assert result_dir is not None\\n    os.makedirs(result_dir, exist_ok=True)\\n    jsonl_path = os.path.join(result_dir, 'eval_result.jsonl')\\n    result = {report['name']: report['score'] for report in final_report}\\n    logger.info(f'result: {result}')\\n    result_info = {\\n        'result': result,\\n        'model': args.model_type,\\n        'time': tm,\\n    }\\n    append_to_jsonl(jsonl_path, result_info)\\n    logger.info(f'save_result_path: {jsonl_path}')\\n    return final_report\\n\\n\\ndef llm_eval(args: EvalArguments) -> List[Dict[str, Any]]:\\n    logger.info(f'args: {args}')\\n    seed_everything(args.seed)\\n    args.eval_output_dir = os.path.join(args.eval_output_dir, args.name or 'default')\\n    if args.custom_eval_config:\\n        args.eval_backend = EvalBackend.NATIVE.value\\n        if args.eval_dataset:\\n            logger.warn('--custom_eval_config cannot use together with --eval_dataset')\\n            args.eval_dataset = []\\n    if args.eval_backend == EvalBackend.OPEN_COMPASS.value:\\n        return eval_opencompass(args)\\n    else:\\n        return eval_llmuses(args)\\n\\n\\neval_main = get_main(EvalArguments, llm_eval)\\n\\n\\n{\\n    \\\"Action:\\\": [2.0, 2.0],\\n    \\\"Action Input:\\\": [2.0, 2.0],\\n    \\\"Thought:\\\": [1.0, 1.0],\\n    \\\"Final Answer:\\\": [1.0, 1.0],\\n    \\\"Observation:\\\": [2.0, 0.0],\\n    \\\"Next:\\\": [2,0, 2.0]\\n}\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Dict, List, Optional, Tuple, Union\\n\\nfrom swift.utils import get_logger\\nfrom swift.utils.utils import split_str_parts_by\\n\\nlogger = get_logger()\\n\\nREACT_PROMPT = \\\"\\\"\\\"Answer the following questions as best as you can. You have access to the following tools:\\n\\n{tool_list}\\n\\nUse the following format:\\n\\nThought: you should always think about what to do\\nAction: the action to take, should be one of [{tool_names}]\\nAction Input: the input to the action\\nObservation: the result of the action\\n... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\nFinal Answer: the final answer to the original input question\\n\\nBegin!\\n\\\"\\\"\\\"\\n\\nREACT_ZH_PROMPT = \\\"\\\"\\\"尽你所能回答以下问题。你拥有如下工具：\\n\\n{tool_list}\\n\\n使用以下格式回答：\\n\\nThought: 思考你应该做什么\\nAction: 工具的名称，必须是[{tool_names}]之一\\nAction Input: 工具的输入\\nObservation: 工具返回的结果\\n... (Thought/Action/Action Input/Observation的过程可以重复零次或多次)\\nFinal Answer: 对输入问题的最终答案\\n\\n开始！\\n\\\"\\\"\\\"\\n\\nTOOLBENCH_PROMPT = '''You can use many tools(functions) to do the following task.\\nFirst I will give you the task description, and your task start.\\nAt each step, you need to give your thought to analyze the status now and what to do next, \\\\\\nwith a function call to actually excute your step. Your output should follow this format:\\nThought:\\nAction:\\nAction Input:\\n\\nAfter the call, you will get the call result, and you are now in a new state.\\nThen you will analyze your status now, then decide what to do next...\\nAfter many (Thought-call) pairs, you finally perform the task, then you can give your finial answer.\\nRemember:\\n1.the state change is irreversible, you can't go back to one of the former state, if you want to restart the task, \\\\\\nsay \\\\\\\"I give up and restart\\\\\\\".\\n2.All the thought is short, at most in 5 sentence.\\n3.You can do more then one trys, so if your plan is to continusly try some conditions, \\\\\\nyou can do one of the conditions per try.\\nLet's Begin!\\nTask description: You should use functions to help handle the real time user querys. Remember:\\n1.ALWAYS call \\\\\\\"Finish\\\\\\\" function at the end of the task. And the final answer should contain enough information \\\\\\nto show to the user,If you can't handle the task, \\\\\\nor you find that function calls always fail(the function is not valid now), \\\\\\nuse function Finish->give_up_and_restart.\\n2.Do not use origin tool names, use only subfunctions' names.\\nSpecifically, you have access to the following APIs: {tool_list}'''\\n\\nGLM4_PROMPT = '''你是一个名为 ChatGLM 的人工智能助手。你是基于智谱AI训练的语言模型 GLM-4 模型开发的，你的任务是针对用户的问题和要求提供适当的答复和支持。\\n\\n# 可用工具\\n\\n{tool_list}'''\\n\\n\\ndef calculate_loss_scale(query: str,\\n                         response: str,\\n                         use_loss_scale=False,\\n                         response_loss_scale_map: Optional[Dict[str, list]] = None,\\n                         query_loss_scale_map: Optional[Dict[str, list]] = None) -> Tuple[List[str], List[float]]:\\n    \\\"\\\"\\\"Calculate the loss scale by splitting the agent response.\\n\\n    This algorithm comes from paper: https://arxiv.org/pdf/2309.00986.pdf\\n\\n    Agent response format:\\n\\n    ```text\\n        Thought: you should always think about what to do\\n        Action: the action to take, should be one of the above tools[fire_recognition,\\n            fire_alert, call_police, call_fireman]\\n        Action Input: the input to the action\\n        Observation: the result of the action\\n        ... (this Thought/Action/Action Input/Observation can be repeated zero or more times)\\n        Thought: I now know the final answer\\n        Final Answer: the final answer to the original input question\\n    ```\\n\\n    Args:\\n        response: The response text\\n        use_loss_scale: Use weighted loss. With this, some part of the loss will be enhanced to improve performance.\\n\\n    Returns:\\n        A tuple of agent response parts and their weights.\\n    \\\"\\\"\\\"\\n    if use_loss_scale:\\n        # query loss scale map\\n        if query_loss_scale_map is not None:\\n            for key in query_loss_scale_map.keys():\\n                if key in query:\\n                    if isinstance(query_loss_scale_map[key], (float, int)):\\n                        query_loss_scale_map[key] = [query_loss_scale_map[key]]\\n                    loss_scale_value = query_loss_scale_map[key][0]\\n                    return [response], [float(loss_scale_value)]\\n        delimiters = list(k for k in response_loss_scale_map.keys() if len(response_loss_scale_map[k]) == 2)\\n        agent_parts = split_str_parts_by(response, delimiters)\\n        regex_delimiters = {k: v for k, v in response_loss_scale_map.items() if len(v) == 1}\\n        if len(regex_delimiters):\\n            split_parts_by_regex(agent_parts, regex_delimiters)\\n        weights = []\\n        agent_content = []\\n        for c in agent_parts:\\n            if isinstance(c['key'], (float, int)):\\n                weights += [c['key']]\\n                agent_content.append(c['content'])\\n            else:\\n                if c['key'] in response_loss_scale_map:\\n                    weights += [response_loss_scale_map[c['key']][0]]\\n                    weights += [response_loss_scale_map[c['key']][1]]\\n                    agent_content.append(c['key'])\\n                    agent_content.append(c['content'])\\n                else:\\n                    weights += [1.0]\\n                    agent_content.append(c['content'])\\n        return agent_content, weights\\n    else:\\n        return [response], [1.0]\\n\\n\\ndef split_action_action_input(response: str) -> Tuple[Optional[str], Optional[str]]:\\n    agent_keyword = [\\n        'action:', 'Action:', 'ACTION:', 'action input:', 'Action Input:', 'Action input:', 'ACTION INPUT:', 'Thought:',\\n        'Final Answer:', 'Observation:'\\n    ]\\n    agent_parts = split_str_parts_by(response, agent_keyword)\\n    action = None\\n    action_input = None\\n    for c in agent_parts:\\n        if c['key'].lower() == 'action:':\\n            action = c['content']\\n        elif c['key'].lower() == 'action input:':\\n            action_input = c['content']\\n    if action:\\n        action = action.strip().replace('\\\\n', '')\\n    if action_input:\\n        action_input.strip().replace('\\\\n', '')\\n    return action, action_input\\n\\n\\ndef split_parts_by_regex(text_list: list, regex_delimiters: Dict[str, List[float]]) -> None:\\n    import re\\n    compiled_patterns = [(re.compile(pattern), scale) for pattern, scale in regex_delimiters.items()]\\n    for i in range(len(text_list) - 1, -1, -1):\\n        item = text_list[i]\\n        if item.get('key') == '':\\n            res_text = item['content']\\n            last_idx = 0\\n            segments = []\\n\\n            for pattern, scale in compiled_patterns:\\n                matches = list(re.finditer(pattern, res_text))\\n                for match in matches:\\n                    if match.start() > last_idx:\\n                        segments.append({'key': '', 'content': res_text[last_idx:match.start()]})\\n                    segments.append({'key': scale[0], 'content': match.group(0)})\\n                    last_idx = match.end()\\n\\n            if last_idx < len(res_text):\\n                segments.insert(0, {'key': '', 'content': res_text[last_idx:]})\\n\\n            if segments:\\n                text_list[i:i + 1] = segments\\n\\n\\ndef get_tools_prompt(TOOLS: List[Dict[str, Union[str, dict]]], prompt_format: str = 'react_en') -> Optional[str]:\\n    tool_descs = []\\n    tool_names = []\\n    for info in TOOLS:  # info: Dict[str, Union[str, dict]]\\n        try:\\n            if 'function' in info:\\n                info = info['function']\\n            tool_names.append(info['name'])\\n            tool_descs.append(str(info))  # info: dict\\n        except KeyError:\\n            print('invalid tools format, please check'\\n                  'https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/Agent-deployment-best-practice.md')\\n            return None\\n    if prompt_format == 'react_en':\\n        return REACT_PROMPT.format(tool_list='\\\\n\\\\n'.join(tool_descs), tool_names=','.join(tool_names))\\n    elif prompt_format == 'react_zh':\\n        return REACT_ZH_PROMPT.format(tool_list='\\\\n\\\\n'.join(tool_descs), tool_names=','.join(tool_names))\\n    elif prompt_format == 'glm4':\\n        tool_list = ''\\n        for name, tool in zip(tool_names, tool_descs):\\n            tool_list += f'## {name}\\\\n\\\\n{tool}\\\\n\\\\n'\\n        return GLM4_PROMPT.format(tool_list=tool_list)\\n    return TOOLBENCH_PROMPT.format(tool_list='\\\\n\\\\n'.join(tool_descs))\\n\\n\\n{\\n    \\\"response\\\":{\\n        \\\"Name:\\\": [1.0, 3.0],\\n        \\\"Action:\\\": [1.0, 3.0],\\n        \\\"ACTION:\\\": [1.0,3.0],\\n        \\\"Tool:\\\": [1.0, 3.0],\\n        \\\"Command\\\": [1.0, 3.0],\\n        \\\"Arguments:\\\": [1.0, 3.0],\\n        \\\"action input\\\": [1.0, 3.0],\\n        \\\"ACTION_INPUT:\\\":[1.0, 3.0],\\n        \\\"Action Input:\\\": [1.0, 3.0],\\n        \\\"Thought:\\\": [1.0, 1.0],\\n        \\\"Final Answer:\\\": [1.0, 1.0],\\n        \\\"Observation:\\\": [2.0, 0.0]\\n    },\\n    \\\"query\\\":{\\n        \\\"What is the tool you want to use\\\": [3.0],\\n        \\\"What are the required parameter names\\\": [3.0],\\n        \\\"What is the value of\\\": [3.0],\\n        \\\"What are the required parameter names for this tool\\\": [3.0]\\n    }\\n}\\n\\n\\n{\\n    \\\"Action:\\\": [2.0, 2.0],\\n    \\\"Action Input:\\\": [2.0, 2.0],\\n    \\\"Thought:\\\": [1.0, 1.0],\\n    \\\"Final Answer:\\\": [1.0, 1.0],\\n    \\\"Observation:\\\": [2.0, 0.0]\\n}\\n\\n\\nfrom .utils import calculate_loss_scale, get_tools_prompt, split_action_action_input\\n\\n\\nimport hashlib\\nimport os\\nimport shutil\\nfrom typing import Any, Dict, Literal, Optional, Union\\n\\nimport numpy as np\\nfrom modelscope.hub.utils.utils import get_cache_dir\\n\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass MediaTag:\\n\\n    task_prompts = {\\n        'ref_grounding': {\\n            'en': [('<ref-object>', '<bbox>'), ('The positions of <ref-object> is', '<bbox>'),\\n                   ('Find the positions of <ref-object>', '<bbox>'), ('Where is <ref-object>', '<bbox>'),\\n                   ('Find <ref-object>', '<bbox>'), ('Show me <ref-object>', '<bbox>'),\\n                   ('Detect <ref-object>', '<bbox>'), ('Locate <ref-object>', '<bbox>'),\\n                   ('Tell me the location of <ref-object>', '<bbox>'), ('Give the location of <ref-object>', '<bbox>'),\\n                   ('Provide the bounding box coordinate of <ref-object>', '<bbox>')],\\n            'zh': [('<ref-object>', '<bbox>'), ('<ref-object>的位置在图片中', '<bbox>'), ('<ref-object>在图片中', '<bbox>'),\\n                   ('<ref-object>在', '<bbox>'), ('找到<ref-object>的位置', '<bbox>'), ('<ref-object>在哪里', '<bbox>'),\\n                   ('提供<ref-object>的坐标位置', '<bbox>')]\\n        },\\n        'grounding_caption': {\\n            'en': [\\n                ('<bbox>', '<ref-object>'),\\n                ('The object at position <bbox>', '<ref-object>'),\\n                ('This <bbox> is', '<ref-object>'),\\n                ('What is the object at <bbox>', '<ref-object>'),\\n                ('Describe <bbox>', '<ref-object>'),\\n                ('<bbox> is', '<ref-object>'),\\n                ('The bounding box coordinate <bbox> contains', '<ref-object>'),\\n            ],\\n            'zh': [\\n                ('<bbox>', '<ref-object>'),\\n                ('<bbox>是什么', '<ref-object>'),\\n                ('<bbox>的位置包含', '<ref-object>'),\\n                ('描述<bbox>', '<ref-object>'),\\n                ('<bbox>中是', '<ref-object>'),\\n                ('坐标<bbox>描述了什么', '<ref-object>'),\\n                ('描述<bbox>中的事物', '<ref-object>'),\\n            ]\\n        },\\n    }\\n\\n    standard_tags = {\\n        'image': '<image>',\\n        'audio': '<audio>',\\n        'video': '<video>',\\n    }\\n\\n    media_keys = {\\n        'audio': 'audios',\\n        'image': 'images',\\n        'video': 'videos',\\n    }\\n\\n    def __init__(self,\\n                 media_type: Optional[Literal['image', 'audio', 'video']],\\n                 media_tag=None,\\n                 task_type: Literal['caption_with_grounding', 'ref_grounding', 'grounding_caption', 'ocr',\\n                                    'vqa'] = 'vqa'):\\n        self.media_type = media_type\\n        self.task_type = task_type\\n        self.media_tag = media_tag or '<unused_tag>'\\n\\n    def __call__(self, d: Dict[str, Any], medias: Union[tuple, list]) -> None:\\n        \\\"\\\"\\\"Format the query/response/history with medias\\n\\n        Args:\\n            d: A dict contains history/query/response\\n            medias: A list of medias(one round, multiple medias),\\n                    a single media(one round, one media), or a tuple of media list(multiple rounds)\\n        \\\"\\\"\\\"\\n        if not self.media_type:\\n            return\\n\\n        media_cnt = len(medias) if isinstance(medias, (tuple, list)) else 1 if medias else 0\\n\\n        history = d.get('history') or []\\n        query = d.get('query')\\n        response = d.get('response')\\n        if self.task_type == 'caption_with_grounding':\\n            pass\\n        elif self.task_type in ('ref_grounding', 'grounding_caption'):\\n            lang = np.random.choice(['en', 'zh'], p=[0.8, 0.2])\\n            prompts = self.task_prompts[self.task_type][lang]\\n            query, response = prompts[np.random.choice(range(len(prompts)))]\\n        elif self.task_type == 'ocr':\\n            raise NotImplementedError\\n        else:\\n            pass\\n        standard_tag = self.standard_tags[self.media_type]\\n\\n        all_queries = ''.join([h[0] for h in history]) + query\\n        if self.media_tag in all_queries:\\n            assert all_queries.count(self.media_tag) == media_cnt\\n            for h in history:\\n                h[0] = h[0].replace(self.media_tag, standard_tag)\\n\\n            query = query.replace(self.media_tag, standard_tag)\\n\\n        if 'history' in d:\\n            d['history'] = history\\n        d['query'] = query\\n        d['response'] = response\\n\\n\\nclass MediaCache:\\n\\n    cache_dir = os.path.join(get_cache_dir(), 'media_resources')\\n    lock_dir = os.path.join(get_cache_dir(), 'lockers')\\n\\n    media_type_urls = {\\n        'llava', 'coco', 'sam', 'gqa', 'ocr_vqa', 'textvqa', 'VG_100K', 'VG_100K_2', 'share_textvqa', 'web-celebrity',\\n        'web-landmark', 'wikiart'\\n    }\\n\\n    URL_PREFIX = 'https://www.modelscope.cn/api/v1/datasets/hjh0119/sharegpt4v-images/repo?Revision=master&FilePath='\\n\\n    @staticmethod\\n    def get_url(media_type):\\n        is_ocr_vqa = (media_type == 'ocr_vqa')\\n        extension = 'tar' if is_ocr_vqa else 'zip'\\n        return f'{MediaCache.URL_PREFIX}{media_type}.{extension}'\\n\\n    @staticmethod\\n    def download(media_type_or_url: str, local_alias: Optional[str] = None):\\n        \\\"\\\"\\\"Download and extract a resource from a http link.\\n\\n        Args:\\n            media_type_or_url: `str`, Either belongs to the `media_type_urls` listed in the class field, or a\\n                remote url to download and extract. Be aware that, this media type or url\\n                needs to contain a zip or tar file.\\n            local_alias: `Options[str]`, The local alias name for the `media_type_or_url`. If the first arg is a\\n            media_type listed in this class, local_alias can leave None. else please pass in a name for the url.\\n            The local dir contains the extracted files will be: {cache_dir}/{local_alias}\\n\\n        Returns:\\n            The local dir contains the extracted files.\\n        \\\"\\\"\\\"\\n        from swift.utils import safe_ddp_context\\n        from datasets.utils.filelock import FileLock\\n        file_path = hashlib.md5(media_type_or_url.encode('utf-8')).hexdigest() + '.lock'\\n        file_path = os.path.join(MediaCache.lock_dir, file_path)\\n        os.makedirs(MediaCache.lock_dir, exist_ok=True)\\n        with safe_ddp_context():\\n            with FileLock(file_path):\\n                return MediaCache._safe_download(media_type=media_type_or_url, media_name=local_alias)\\n\\n    @staticmethod\\n    def _safe_download(media_type, media_name=None):\\n        media_name = media_name or media_type\\n        if media_type in MediaCache.media_type_urls:\\n            media_type = MediaCache.get_url(media_type)\\n\\n        from datasets.download.download_manager import DownloadManager, DownloadConfig\\n        final_folder = os.path.join(MediaCache.cache_dir, media_name)\\n        if os.path.exists(final_folder):\\n            return final_folder\\n\\n        logger.info('# #################Resource downloading#################')\\n        logger.info('Downloading necessary resources...')\\n        logger.info(f'Resource package: {media_type}')\\n        logger.info(f'Extracting to local dir: {final_folder}')\\n        logger.info('If the downloading fails or lasts a long time, '\\n                    'you can manually download the resources and extracting to the local dir.')\\n        logger.info('Now begin.')\\n        local_dirs = DownloadManager(download_config=DownloadConfig(\\n            cache_dir=MediaCache.cache_dir)).download_and_extract(media_type)\\n        shutil.move(str(local_dirs), final_folder)\\n        logger.info('# #################Resource downloading finished#################')\\n        return final_folder\\n\\n    @staticmethod\\n    def safe_save(image, file_name, folder, format='JPEG'):\\n        folder = os.path.join(MediaCache.cache_dir, folder)\\n        os.makedirs(folder, exist_ok=True)\\n        file = os.path.join(folder, file_name)\\n        if os.path.exists(file):\\n            return file\\n        image.save(file, format=format)\\n        return file\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport inspect\\nimport math\\nimport os\\nimport sys\\nfrom contextlib import contextmanager, nullcontext\\nfrom functools import partial, update_wrapper, wraps\\nfrom types import MethodType\\nfrom typing import Any, Callable, Dict, List, Literal, NamedTuple, Optional, Tuple, Type, Union\\n\\nimport torch\\nimport torch.nn.functional as F\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom accelerate.utils import find_device\\nfrom modelscope import snapshot_download\\nfrom modelscope.hub.utils.utils import get_cache_dir\\nfrom packaging import version\\nfrom transformers import (AutoConfig, AutoModel, AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig,\\n                          GenerationConfig, GPTQConfig, PretrainedConfig, PreTrainedModel, PreTrainedTokenizerBase)\\nfrom transformers.dynamic_module_utils import get_class_from_dynamic_module\\nfrom transformers.models.auto.tokenization_auto import get_tokenizer_config\\nfrom transformers.utils import is_torch_bf16_gpu_available, strtobool\\nfrom transformers.utils.versions import require_version\\n\\nfrom swift import get_logger\\nfrom swift.utils import get_dist_setting, safe_ddp_context, subprocess_run, use_torchacc\\nfrom swift.utils.module_mapping import get_regex_for_mm_default_lora\\nfrom .template import TemplateType, get_env_args\\nfrom .utils import get_max_model_len, get_rope_scaling, is_unsloth_available, set_rope_scaling, to_device\\n\\nlogger = get_logger()\\n\\n# Model Home: 'https://modelscope.cn/models/{model_id_or_path}'\\nMODEL_MAPPING: Dict[str, Dict[str, Any]] = {}\\n\\n\\nclass ModelType:\\n    # qwen\\n    qwen_1_8b = 'qwen-1_8b'\\n    qwen_1_8b_chat = 'qwen-1_8b-chat'\\n    qwen_1_8b_chat_int4 = 'qwen-1_8b-chat-int4'\\n    qwen_1_8b_chat_int8 = 'qwen-1_8b-chat-int8'\\n    qwen_7b = 'qwen-7b'\\n    qwen_7b_chat = 'qwen-7b-chat'\\n    qwen_7b_chat_int4 = 'qwen-7b-chat-int4'\\n    qwen_7b_chat_int8 = 'qwen-7b-chat-int8'\\n    qwen_14b = 'qwen-14b'\\n    qwen_14b_chat = 'qwen-14b-chat'\\n    qwen_14b_chat_int4 = 'qwen-14b-chat-int4'\\n    qwen_14b_chat_int8 = 'qwen-14b-chat-int8'\\n    qwen_72b = 'qwen-72b'\\n    qwen_72b_chat = 'qwen-72b-chat'\\n    qwen_72b_chat_int4 = 'qwen-72b-chat-int4'\\n    qwen_72b_chat_int8 = 'qwen-72b-chat-int8'\\n    # modelscope_agent\\n    modelscope_agent_7b = 'modelscope-agent-7b'\\n    modelscope_agent_14b = 'modelscope-agent-14b'\\n    # qwen1.5\\n    qwen1half_0_5b = 'qwen1half-0_5b'\\n    qwen1half_1_8b = 'qwen1half-1_8b'\\n    qwen1half_4b = 'qwen1half-4b'\\n    qwen1half_7b = 'qwen1half-7b'\\n    qwen1half_14b = 'qwen1half-14b'\\n    qwen1half_32b = 'qwen1half-32b'\\n    qwen1half_72b = 'qwen1half-72b'\\n    qwen1half_110b = 'qwen1half-110b'\\n    codeqwen1half_7b = 'codeqwen1half-7b'\\n    qwen1half_moe_a2_7b = 'qwen1half-moe-a2_7b'\\n    qwen1half_0_5b_chat = 'qwen1half-0_5b-chat'\\n    qwen1half_1_8b_chat = 'qwen1half-1_8b-chat'\\n    qwen1half_4b_chat = 'qwen1half-4b-chat'\\n    qwen1half_7b_chat = 'qwen1half-7b-chat'\\n    qwen1half_14b_chat = 'qwen1half-14b-chat'\\n    qwen1half_32b_chat = 'qwen1half-32b-chat'\\n    qwen1half_72b_chat = 'qwen1half-72b-chat'\\n    qwen1half_110b_chat = 'qwen1half-110b-chat'\\n    qwen1half_moe_a2_7b_chat = 'qwen1half-moe-a2_7b-chat'\\n    codeqwen1half_7b_chat = 'codeqwen1half-7b-chat'\\n\\n    # qwen1.5 gptq\\n    qwen1half_0_5b_chat_int4 = 'qwen1half-0_5b-chat-int4'\\n    qwen1half_1_8b_chat_int4 = 'qwen1half-1_8b-chat-int4'\\n    qwen1half_4b_chat_int4 = 'qwen1half-4b-chat-int4'\\n    qwen1half_7b_chat_int4 = 'qwen1half-7b-chat-int4'\\n    qwen1half_14b_chat_int4 = 'qwen1half-14b-chat-int4'\\n    qwen1half_32b_chat_int4 = 'qwen1half-32b-chat-int4'\\n    qwen1half_72b_chat_int4 = 'qwen1half-72b-chat-int4'\\n    qwen1half_110b_chat_int4 = 'qwen1half-110b-chat-int4'\\n    qwen1half_0_5b_chat_int8 = 'qwen1half-0_5b-chat-int8'\\n    qwen1half_1_8b_chat_int8 = 'qwen1half-1_8b-chat-int8'\\n    qwen1half_4b_chat_int8 = 'qwen1half-4b-chat-int8'\\n    qwen1half_7b_chat_int8 = 'qwen1half-7b-chat-int8'\\n    qwen1half_14b_chat_int8 = 'qwen1half-14b-chat-int8'\\n    qwen1half_72b_chat_int8 = 'qwen1half-72b-chat-int8'\\n    qwen1half_moe_a2_7b_chat_int4 = 'qwen1half-moe-a2_7b-chat-int4'\\n\\n    # qwen1.5 awq\\n    qwen1half_0_5b_chat_awq = 'qwen1half-0_5b-chat-awq'\\n    qwen1half_1_8b_chat_awq = 'qwen1half-1_8b-chat-awq'\\n    qwen1half_4b_chat_awq = 'qwen1half-4b-chat-awq'\\n    qwen1half_7b_chat_awq = 'qwen1half-7b-chat-awq'\\n    qwen1half_14b_chat_awq = 'qwen1half-14b-chat-awq'\\n    qwen1half_32b_chat_awq = 'qwen1half-32b-chat-awq'\\n    qwen1half_72b_chat_awq = 'qwen1half-72b-chat-awq'\\n    qwen1half_110b_chat_awq = 'qwen1half-110b-chat-awq'\\n    codeqwen1half_7b_chat_awq = 'codeqwen1half-7b-chat-awq'\\n\\n    # qwen2\\n    qwen2_0_5b = 'qwen2-0_5b'\\n    qwen2_0_5b_instruct = 'qwen2-0_5b-instruct'\\n    qwen2_0_5b_instruct_int4 = 'qwen2-0_5b-instruct-int4'\\n    qwen2_0_5b_instruct_int8 = 'qwen2-0_5b-instruct-int8'\\n    qwen2_0_5b_instruct_awq = 'qwen2-0_5b-instruct-awq'\\n    qwen2_1_5b = 'qwen2-1_5b'\\n    qwen2_1_5b_instruct = 'qwen2-1_5b-instruct'\\n    qwen2_1_5b_instruct_int4 = 'qwen2-1_5b-instruct-int4'\\n    qwen2_1_5b_instruct_int8 = 'qwen2-1_5b-instruct-int8'\\n    qwen2_1_5b_instruct_awq = 'qwen2-1_5b-instruct-awq'\\n    qwen2_7b = 'qwen2-7b'\\n    qwen2_7b_instruct = 'qwen2-7b-instruct'\\n    qwen2_7b_instruct_int4 = 'qwen2-7b-instruct-int4'\\n    qwen2_7b_instruct_int8 = 'qwen2-7b-instruct-int8'\\n    qwen2_7b_instruct_awq = 'qwen2-7b-instruct-awq'\\n    qwen2_72b = 'qwen2-72b'\\n    qwen2_72b_instruct = 'qwen2-72b-instruct'\\n    qwen2_72b_instruct_int4 = 'qwen2-72b-instruct-int4'\\n    qwen2_72b_instruct_int8 = 'qwen2-72b-instruct-int8'\\n    qwen2_72b_instruct_awq = 'qwen2-72b-instruct-awq'\\n    qwen2_57b_a14b = 'qwen2-57b-a14b'\\n    qwen2_57b_a14b_instruct = 'qwen2-57b-a14b-instruct'\\n    qwen2_57b_a14b_instruct_int4 = 'qwen2-57b-a14b-instruct-int4'\\n\\n    qwen2_math_1_5b = 'qwen2-math-1_5b'\\n    qwen2_math_1_5b_instruct = 'qwen2-math-1_5b-instruct'\\n    qwen2_math_7b = 'qwen2-math-7b'\\n    qwen2_math_7b_instruct = 'qwen2-math-7b-instruct'\\n    qwen2_math_72b = 'qwen2-math-72b'\\n    qwen2_math_72b_instruct = 'qwen2-math-72b-instruct'\\n\\n    # qwen2.5\\n    qwen2_5_0_5b = 'qwen2_5-0_5b'\\n    qwen2_5_1_5b = 'qwen2_5-1_5b'\\n    qwen2_5_3b = 'qwen2_5-3b'\\n    qwen2_5_7b = 'qwen2_5-7b'\\n    qwen2_5_14b = 'qwen2_5-14b'\\n    qwen2_5_32b = 'qwen2_5-32b'\\n    qwen2_5_72b = 'qwen2_5-72b'\\n    qwen2_5_0_5b_instruct = 'qwen2_5-0_5b-instruct'\\n    qwen2_5_1_5b_instruct = 'qwen2_5-1_5b-instruct'\\n    qwen2_5_3b_instruct = 'qwen2_5-3b-instruct'\\n    qwen2_5_7b_instruct = 'qwen2_5-7b-instruct'\\n    qwen2_5_14b_instruct = 'qwen2_5-14b-instruct'\\n    qwen2_5_32b_instruct = 'qwen2_5-32b-instruct'\\n    qwen2_5_72b_instruct = 'qwen2_5-72b-instruct'\\n    qwen2_5_0_5b_instruct_gptq_int4 = 'qwen2_5-0_5b-instruct-gptq-int4'\\n    qwen2_5_1_5b_instruct_gptq_int4 = 'qwen2_5-1_5b-instruct-gptq-int4'\\n    qwen2_5_3b_instruct_gptq_int4 = 'qwen2_5-3b-instruct-gptq-int4'\\n    qwen2_5_7b_instruct_gptq_int4 = 'qwen2_5-7b-instruct-gptq-int4'\\n    qwen2_5_14b_instruct_gptq_int4 = 'qwen2_5-14b-instruct-gptq-int4'\\n    qwen2_5_32b_instruct_gptq_int4 = 'qwen2_5-32b-instruct-gptq-int4'\\n    qwen2_5_72b_instruct_gptq_int4 = 'qwen2_5-72b-instruct-gptq-int4'\\n    qwen2_5_0_5b_instruct_gptq_int8 = 'qwen2_5-0_5b-instruct-gptq-int8'\\n    qwen2_5_1_5b_instruct_gptq_int8 = 'qwen2_5-1_5b-instruct-gptq-int8'\\n    qwen2_5_3b_instruct_gptq_int8 = 'qwen2_5-3b-instruct-gptq-int8'\\n    qwen2_5_7b_instruct_gptq_int8 = 'qwen2_5-7b-instruct-gptq-int8'\\n    qwen2_5_14b_instruct_gptq_int8 = 'qwen2_5-14b-instruct-gptq-int8'\\n    qwen2_5_32b_instruct_gptq_int8 = 'qwen2_5-32b-instruct-gptq-int8'\\n    qwen2_5_72b_instruct_gptq_int8 = 'qwen2_5-72b-instruct-gptq-int8'\\n    qwen2_5_0_5b_instruct_awq = 'qwen2_5-0_5b-instruct-awq'\\n    qwen2_5_1_5b_instruct_awq = 'qwen2_5-1_5b-instruct-awq'\\n    qwen2_5_3b_instruct_awq = 'qwen2_5-3b-instruct-awq'\\n    qwen2_5_7b_instruct_awq = 'qwen2_5-7b-instruct-awq'\\n    qwen2_5_14b_instruct_awq = 'qwen2_5-14b-instruct-awq'\\n    qwen2_5_32b_instruct_awq = 'qwen2_5-32b-instruct-awq'\\n    qwen2_5_72b_instruct_awq = 'qwen2_5-72b-instruct-awq'\\n    # qwen2.5 math\\n    qwen2_5_math_1_5b = 'qwen2_5-math-1_5b'\\n    qwen2_5_math_7b = 'qwen2_5-math-7b'\\n    qwen2_5_math_72b = 'qwen2_5-math-72b'\\n    qwen2_5_math_1_5b_instruct = 'qwen2_5-math-1_5b-instruct'\\n    qwen2_5_math_7b_instruct = 'qwen2_5-math-7b-instruct'\\n    qwen2_5_math_72b_instruct = 'qwen2_5-math-72b-instruct'\\n    # qwen2.5 coder\\n    qwen2_5_coder_1_5b = 'qwen2_5-coder-1_5b'\\n    qwen2_5_coder_1_5b_instruct = 'qwen2_5-coder-1_5b-instruct'\\n    qwen2_5_coder_7b = 'qwen2_5-coder-7b'\\n    qwen2_5_coder_7b_instruct = 'qwen2_5-coder-7b-instruct'\\n    # qwen-vl\\n    qwen_vl = 'qwen-vl'\\n    qwen_vl_chat = 'qwen-vl-chat'\\n    qwen_vl_chat_int4 = 'qwen-vl-chat-int4'\\n    # qwen-audio\\n    qwen_audio = 'qwen-audio'\\n    qwen_audio_chat = 'qwen-audio-chat'\\n    qwen2_audio_7b = 'qwen2-audio-7b'\\n    qwen2_audio_7b_instruct = 'qwen2-audio-7b-instruct'\\n    qwen2_vl_2b = 'qwen2-vl-2b'\\n    qwen2_vl_2b_instruct = 'qwen2-vl-2b-instruct'\\n    qwen2_vl_2b_instruct_gptq_int4 = 'qwen2-vl-2b-instruct-gptq-int4'\\n    qwen2_vl_2b_instruct_gptq_int8 = 'qwen2-vl-2b-instruct-gptq-int8'\\n    qwen2_vl_2b_instruct_awq = 'qwen2-vl-2b-instruct-awq'\\n    qwen2_vl_7b = 'qwen2-vl-7b'\\n    qwen2_vl_7b_instruct = 'qwen2-vl-7b-instruct'\\n    qwen2_vl_7b_instruct_gptq_int4 = 'qwen2-vl-7b-instruct-gptq-int4'\\n    qwen2_vl_7b_instruct_gptq_int8 = 'qwen2-vl-7b-instruct-gptq-int8'\\n    qwen2_vl_7b_instruct_awq = 'qwen2-vl-7b-instruct-awq'\\n    qwen2_vl_72b = 'qwen2-vl-72b'\\n    qwen2_vl_72b_instruct = 'qwen2-vl-72b-instruct'\\n    qwen2_vl_72b_instruct_gptq_int4 = 'qwen2-vl-72b-instruct-gptq-int4'\\n    qwen2_vl_72b_instruct_gptq_int8 = 'qwen2-vl-72b-instruct-gptq-int8'\\n    qwen2_vl_72b_instruct_awq = 'qwen2-vl-72b-instruct-awq'\\n    # chatglm\\n    chatglm2_6b = 'chatglm2-6b'\\n    chatglm2_6b_32k = 'chatglm2-6b-32k'\\n    chatglm3_6b_base = 'chatglm3-6b-base'\\n    chatglm3_6b = 'chatglm3-6b'\\n    chatglm3_6b_32k = 'chatglm3-6b-32k'\\n    chatglm3_6b_128k = 'chatglm3-6b-128k'\\n    codegeex2_6b = 'codegeex2-6b'\\n    glm4v_9b_chat = 'glm4v-9b-chat'\\n    glm4_9b = 'glm4-9b'\\n    glm4_9b_chat = 'glm4-9b-chat'\\n    glm4_9b_chat_1m = 'glm4-9b-chat-1m'\\n    codegeex4_9b_chat = 'codegeex4-9b-chat'\\n    # llama2\\n    llama2_7b = 'llama2-7b'\\n    llama2_7b_chat = 'llama2-7b-chat'\\n    llama2_13b = 'llama2-13b'\\n    llama2_13b_chat = 'llama2-13b-chat'\\n    llama2_70b = 'llama2-70b'\\n    llama2_70b_chat = 'llama2-70b-chat'\\n    llama2_7b_aqlm_2bit_1x16 = 'llama2-7b-aqlm-2bit-1x16'  # aqlm\\n    # llama3\\n    llama3_8b = 'llama3-8b'\\n    llama3_8b_instruct = 'llama3-8b-instruct'\\n    llama3_8b_instruct_int4 = 'llama3-8b-instruct-int4'\\n    llama3_8b_instruct_int8 = 'llama3-8b-instruct-int8'\\n    llama3_8b_instruct_awq = 'llama3-8b-instruct-awq'\\n    llama3_70b = 'llama3-70b'\\n    llama3_70b_instruct = 'llama3-70b-instruct'\\n    llama3_70b_instruct_int4 = 'llama3-70b-instruct-int4'\\n    llama3_70b_instruct_int8 = 'llama3-70b-instruct-int8'\\n    llama3_70b_instruct_awq = 'llama3-70b-instruct-awq'\\n    # llama3.1\\n    llama3_1_8b = 'llama3_1-8b'\\n    llama3_1_8b_instruct = 'llama3_1-8b-instruct'\\n    llama3_1_8b_instruct_awq = 'llama3_1-8b-instruct-awq'\\n    llama3_1_8b_instruct_gptq_int4 = 'llama3_1-8b-instruct-gptq-int4'\\n    llama3_1_8b_instruct_bnb = 'llama3_1-8b-instruct-bnb'\\n    llama3_1_70b = 'llama3_1-70b'\\n    llama3_1_70b_instruct = 'llama3_1-70b-instruct'\\n    llama3_1_70b_instruct_fp8 = 'llama3_1-70b-instruct-fp8'\\n    llama3_1_70b_instruct_awq = 'llama3_1-70b-instruct-awq'\\n    llama3_1_70b_instruct_gptq_int4 = 'llama3_1-70b-instruct-gptq-int4'\\n    llama3_1_70b_instruct_bnb = 'llama3_1-70b-instruct-bnb'\\n    llama3_1_405b = 'llama3_1-405b'\\n    llama3_1_405b_instruct = 'llama3_1-405b-instruct'\\n    llama3_1_405b_instruct_fp8 = 'llama3_1-405b-instruct-fp8'\\n    llama3_1_405b_instruct_awq = 'llama3_1-405b-instruct-awq'\\n    llama3_1_405b_instruct_gptq_int4 = 'llama3_1-405b-instruct-gptq-int4'\\n    llama3_1_405b_instruct_bnb = 'llama3_1-405b-instruct-bnb'\\n    # llama3.2\\n    llama3_2_1b = 'llama3_2-1b'\\n    llama3_2_1b_instruct = 'llama3_2-1b-instruct'\\n    llama3_2_3b = 'llama3_2-3b'\\n    llama3_2_3b_instruct = 'llama3_2-3b-instruct'\\n    # llama3.2-vision\\n    llama3_2_11b_vision = 'llama3_2-11b-vision'\\n    llama3_2_11b_vision_instruct = 'llama3_2-11b-vision-instruct'\\n    llama3_2_90b_vision = 'llama3_2-90b-vision'\\n    llama3_2_90b_vision_instruct = 'llama3_2-90b-vision-instruct'\\n\\n    # omni\\n    llama3_1_8b_omni = 'llama3_1-8b-omni'\\n    # reflection\\n    reflection_llama_3_1_70b = 'reflection-llama_3_1-70b'\\n    # long writer\\n    longwriter_glm4_9b = 'longwriter-glm4-9b'\\n    longwriter_llama3_1_8b = 'longwriter-llama3_1-8b'\\n    # chinese-llama-alpaca\\n    chinese_llama_2_1_3b = 'chinese-llama-2-1_3b'\\n    chinese_llama_2_7b = 'chinese-llama-2-7b'\\n    chinese_llama_2_7b_16k = 'chinese-llama-2-7b-16k'\\n    chinese_llama_2_7b_64k = 'chinese-llama-2-7b-64k'\\n    chinese_llama_2_13b = 'chinese-llama-2-13b'\\n    chinese_llama_2_13b_16k = 'chinese-llama-2-13b-16k'\\n    chinese_alpaca_2_1_3b = 'chinese-alpaca-2-1_3b'\\n    chinese_alpaca_2_7b = 'chinese-alpaca-2-7b'\\n    chinese_alpaca_2_7b_16k = 'chinese-alpaca-2-7b-16k'\\n    chinese_alpaca_2_7b_64k = 'chinese-alpaca-2-7b-64k'\\n    chinese_alpaca_2_13b = 'chinese-alpaca-2-13b'\\n    chinese_alpaca_2_13b_16k = 'chinese-alpaca-2-13b-16k'\\n    llama_3_chinese_8b = 'llama-3-chinese-8b'\\n    llama_3_chinese_8b_instruct = 'llama-3-chinese-8b-instruct'\\n    # idefics\\n    idefics3_8b_llama3 = 'idefics3-8b-llama3'\\n    # atom\\n    atom_7b = 'atom-7b'\\n    atom_7b_chat = 'atom-7b-chat'\\n    # llava-hf\\n    llava1_5_7b_instruct = 'llava1_5-7b-instruct'\\n    llava1_5_13b_instruct = 'llava1_5-13b-instruct'\\n    llava1_6_mistral_7b_instruct = 'llava1_6-mistral-7b-instruct'\\n    llava1_6_vicuna_7b_instruct = 'llava1_6-vicuna-7b-instruct'\\n    llava1_6_vicuna_13b_instruct = 'llava1_6-vicuna-13b-instruct'\\n    llava1_6_llama3_1_8b_instruct = 'llava1_6-llama3_1-8b-instruct'\\n    llava1_6_yi_34b_instruct = 'llava1_6-yi-34b-instruct'\\n    llama3_llava_next_8b_hf = 'llama3-llava-next-8b-hf'\\n    llava_next_72b_hf = 'llava-next-72b-hf'\\n    llava_next_110b_hf = 'llava-next-110b-hf'\\n\\n    llava_onevision_qwen2_0_5b_ov = 'llava-onevision-qwen2-0_5b-ov'\\n    llava_onevision_qwen2_7b_ov = 'llava-onevision-qwen2-7b-ov'\\n    llava_onevision_qwen2_72b_ov = 'llava-onevision-qwen2-72b-ov'\\n    # llava\\n    llama3_llava_next_8b = 'llama3-llava-next-8b'\\n    llava_next_72b = 'llava-next-72b'\\n    llava_next_110b = 'llava-next-110b'\\n    # llava_next_video-hf\\n    llava_next_video_7b_instruct = 'llava-next-video-7b-instruct'\\n    llava_next_video_7b_32k_instruct = 'llava-next-video-7b-32k-instruct'\\n    llava_next_video_7b_dpo_instruct = 'llava-next-video-7b-dpo-instruct'\\n    llava_next_video_34b_instruct = 'llava-next-video-34b-instruct'\\n    # yi\\n    yi_6b = 'yi-6b'\\n    yi_6b_200k = 'yi-6b-200k'\\n    yi_6b_chat = 'yi-6b-chat'\\n    yi_6b_chat_awq = 'yi-6b-chat-awq'\\n    yi_6b_chat_int8 = 'yi-6b-chat-int8'\\n    yi_9b = 'yi-9b'\\n    yi_9b_200k = 'yi-9b-200k'\\n    yi_34b = 'yi-34b'\\n    yi_34b_200k = 'yi-34b-200k'\\n    yi_34b_chat = 'yi-34b-chat'\\n    yi_34b_chat_awq = 'yi-34b-chat-awq'\\n    yi_34b_chat_int8 = 'yi-34b-chat-int8'\\n    # yi1.5\\n    yi_1_5_6b = 'yi-1_5-6b'\\n    yi_1_5_6b_chat = 'yi-1_5-6b-chat'\\n    yi_1_5_9b = 'yi-1_5-9b'\\n    yi_1_5_9b_chat = 'yi-1_5-9b-chat'\\n    yi_1_5_9b_chat_16k = 'yi-1_5-9b-chat-16k'\\n    yi_1_5_34b = 'yi-1_5-34b'\\n    yi_1_5_34b_chat = 'yi-1_5-34b-chat'\\n    yi_1_5_34b_chat_16k = 'yi-1_5-34b-chat-16k'\\n    yi_1_5_6b_chat_awq_int4 = 'yi-1_5-6b-chat-awq-int4'\\n    yi_1_5_6b_chat_gptq_int4 = 'yi-1_5-6b-chat-gptq-int4'\\n    yi_1_5_9b_chat_awq_int4 = 'yi-1_5-9b-chat-awq-int4'\\n    yi_1_5_9b_chat_gptq_int4 = 'yi-1_5-9b-chat-gptq-int4'\\n    yi_1_5_34b_chat_awq_int4 = 'yi-1_5-34b-chat-awq-int4'\\n    yi_1_5_34b_chat_gptq_int4 = 'yi-1_5-34b-chat-gptq-int4'\\n    # yi-coder\\n    yi_coder_1_5b = 'yi-coder-1_5b'\\n    yi_coder_1_5b_chat = 'yi-coder-1_5b-chat'\\n    yi_coder_9b = 'yi-coder-9b'\\n    yi_coder_9b_chat = 'yi-coder-9b-chat'\\n    # yi-vl\\n    yi_vl_6b_chat = 'yi-vl-6b-chat'\\n    yi_vl_34b_chat = 'yi-vl-34b-chat'\\n    # llava-llama (xtuner)\\n    llava_llama3_8b_v1_1 = 'llava-llama3-8b-v1_1'\\n    # internlm\\n    internlm_7b = 'internlm-7b'\\n    internlm_7b_chat = 'internlm-7b-chat'\\n    internlm_7b_chat_8k = 'internlm-7b-chat-8k'\\n    internlm_20b = 'internlm-20b'\\n    internlm_20b_chat = 'internlm-20b-chat'\\n    # internlm2\\n    internlm2_1_8b = 'internlm2-1_8b'\\n    internlm2_1_8b_sft_chat = 'internlm2-1_8b-sft-chat'\\n    internlm2_1_8b_chat = 'internlm2-1_8b-chat'\\n    internlm2_7b_base = 'internlm2-7b-base'\\n    internlm2_7b = 'internlm2-7b'\\n    internlm2_7b_sft_chat = 'internlm2-7b-sft-chat'\\n    internlm2_7b_chat = 'internlm2-7b-chat'\\n    internlm2_20b_base = 'internlm2-20b-base'\\n    internlm2_20b = 'internlm2-20b'\\n    internlm2_20b_sft_chat = 'internlm2-20b-sft-chat'\\n    internlm2_20b_chat = 'internlm2-20b-chat'\\n    # internlm2.5\\n    internlm2_5_1_8b = 'internlm2_5-1_8b'\\n    internlm2_5_1_8b_chat = 'internlm2_5-1_8b-chat'\\n    internlm2_5_7b = 'internlm2_5-7b'\\n    internlm2_5_7b_chat = 'internlm2_5-7b-chat'\\n    internlm2_5_7b_chat_1m = 'internlm2_5-7b-chat-1m'\\n    internlm2_5_20b = 'internlm2_5-20b'\\n    internlm2_5_20b_chat = 'internlm2_5-20b-chat'\\n    # internlm2-math\\n    internlm2_math_7b = 'internlm2-math-7b'\\n    internlm2_math_7b_chat = 'internlm2-math-7b-chat'\\n    internlm2_math_20b = 'internlm2-math-20b'\\n    internlm2_math_20b_chat = 'internlm2-math-20b-chat'\\n    # internlm-xcomposer2\\n    internlm_xcomposer2_7b_chat = 'internlm-xcomposer2-7b-chat'\\n    internlm_xcomposer2_4khd_7b_chat = 'internlm-xcomposer2-4khd-7b-chat'\\n    internlm_xcomposer2_5_7b_chat = 'internlm-xcomposer2_5-7b-chat'\\n    # internvl\\n    internvl_chat_v1_5 = 'internvl-chat-v1_5'\\n    internvl_chat_v1_5_int8 = 'internvl-chat-v1_5-int8'\\n    mini_internvl_chat_2b_v1_5 = 'mini-internvl-chat-2b-v1_5'\\n    mini_internvl_chat_4b_v1_5 = 'mini-internvl-chat-4b-v1_5'\\n    internvl2_1b = 'internvl2-1b'\\n    internvl2_2b = 'internvl2-2b'\\n    internvl2_4b = 'internvl2-4b'\\n    internvl2_8b = 'internvl2-8b'\\n    internvl2_26b = 'internvl2-26b'\\n    internvl2_40b = 'internvl2-40b'\\n    internvl2_llama3_76b = 'internvl2-llama3-76b'\\n    internvl2_2b_awq = 'internvl2-2b-awq'\\n    internvl2_8b_awq = 'internvl2-8b-awq'\\n    internvl2_26b_awq = 'internvl2-26b-awq'\\n    internvl2_40b_awq = 'internvl2-40b-awq'\\n    internvl2_llama3_76b_awq = 'internvl2-llama3-76b-awq'\\n    # deepseek\\n    deepseek_7b = 'deepseek-7b'\\n    deepseek_7b_chat = 'deepseek-7b-chat'\\n    deepseek_moe_16b = 'deepseek-moe-16b'\\n    deepseek_moe_16b_chat = 'deepseek-moe-16b-chat'\\n    deepseek_67b = 'deepseek-67b'\\n    deepseek_67b_chat = 'deepseek-67b-chat'\\n    # deepseek-coder\\n    deepseek_coder_1_3b = 'deepseek-coder-1_3b'\\n    deepseek_coder_1_3b_instruct = 'deepseek-coder-1_3b-instruct'\\n    deepseek_coder_6_7b = 'deepseek-coder-6_7b'\\n    deepseek_coder_6_7b_instruct = 'deepseek-coder-6_7b-instruct'\\n    deepseek_coder_33b = 'deepseek-coder-33b'\\n    deepseek_coder_33b_instruct = 'deepseek-coder-33b-instruct'\\n    # deepseek2-coder\\n    deepseek_coder_v2_instruct = 'deepseek-coder-v2-instruct'\\n    deepseek_coder_v2_lite_instruct = 'deepseek-coder-v2-lite-instruct'\\n    deepseek_coder_v2 = 'deepseek-coder-v2'\\n    deepseek_coder_v2_lite = 'deepseek-coder-v2-lite'\\n    # deepseek-math\\n    deepseek_math_7b = 'deepseek-math-7b'\\n    deepseek_math_7b_instruct = 'deepseek-math-7b-instruct'\\n    deepseek_math_7b_chat = 'deepseek-math-7b-chat'\\n    # numina-math\\n    numina_math_7b = 'numina-math-7b'\\n    # deepseek-vl\\n    deepseek_vl_1_3b_chat = 'deepseek-vl-1_3b-chat'\\n    deepseek_vl_7b_chat = 'deepseek-vl-7b-chat'\\n    # deepseek-v2\\n    deepseek_v2 = 'deepseek-v2'\\n    deepseek_v2_chat = 'deepseek-v2-chat'\\n    deepseek_v2_lite = 'deepseek-v2-lite'\\n    deepseek_v2_lite_chat = 'deepseek-v2-lite-chat'\\n    # deepseek-v2.5\\n    deepseek_v2_5 = 'deepseek-v2_5'\\n    # gemma\\n    gemma_2b = 'gemma-2b'\\n    gemma_7b = 'gemma-7b'\\n    gemma_2b_instruct = 'gemma-2b-instruct'\\n    gemma_7b_instruct = 'gemma-7b-instruct'\\n    gemma2_2b = 'gemma2-2b'\\n    gemma2_9b = 'gemma2-9b'\\n    gemma2_27b = 'gemma2-27b'\\n    gemma2_2b_instruct = 'gemma2-2b-instruct'\\n    gemma2_9b_instruct = 'gemma2-9b-instruct'\\n    gemma2_27b_instruct = 'gemma2-27b-instruct'\\n    # paligemma\\n    paligemma_3b_pt_224 = 'paligemma-3b-pt-224'\\n    paligemma_3b_pt_448 = 'paligemma-3b-pt-448'\\n    paligemma_3b_pt_896 = 'paligemma-3b-pt-896'\\n    paligemma_3b_mix_224 = 'paligemma-3b-mix-224'\\n    paligemma_3b_mix_448 = 'paligemma-3b-mix-448'\\n    # minicpm\\n    minicpm_1b_sft_chat = 'minicpm-1b-sft-chat'\\n    minicpm_2b_sft_chat = 'minicpm-2b-sft-chat'\\n    minicpm_2b_chat = 'minicpm-2b-chat'\\n    minicpm_2b_128k = 'minicpm-2b-128k'\\n    minicpm_moe_8x2b = 'minicpm-moe-8x2b'\\n    minicpm3_4b = 'minicpm3-4b'\\n    # minicpm-v\\n    minicpm_v_3b_chat = 'minicpm-v-3b-chat'\\n    minicpm_v_v2_chat = 'minicpm-v-v2-chat'\\n    minicpm_v_v2_5_chat = 'minicpm-v-v2_5-chat'\\n    minicpm_v_v2_6_chat = 'minicpm-v-v2_6-chat'\\n    # openbuddy\\n    openbuddy_llama_65b_chat = 'openbuddy-llama-65b-chat'\\n    openbuddy_llama2_13b_chat = 'openbuddy-llama2-13b-chat'\\n    openbuddy_llama2_70b_chat = 'openbuddy-llama2-70b-chat'\\n    openbuddy_llama3_8b_chat = 'openbuddy-llama3-8b-chat'\\n    openbuddy_llama3_70b_chat = 'openbuddy-llama3-70b-chat'\\n    openbuddy_mistral_7b_chat = 'openbuddy-mistral-7b-chat'\\n    openbuddy_zephyr_7b_chat = 'openbuddy-zephyr-7b-chat'\\n    openbuddy_deepseek_67b_chat = 'openbuddy-deepseek-67b-chat'\\n    openbuddy_mixtral_moe_7b_chat = 'openbuddy-mixtral-moe-7b-chat'\\n    openbuddy_llama3_1_8b_chat = 'openbuddy-llama3_1-8b-chat'\\n    # mistral\\n    mistral_7b = 'mistral-7b'\\n    mistral_7b_v2 = 'mistral-7b-v2'\\n    mistral_7b_instruct = 'mistral-7b-instruct'\\n    mistral_7b_instruct_v2 = 'mistral-7b-instruct-v2'\\n    mistral_7b_instruct_v3 = 'mistral-7b-instruct-v3'\\n    mistral_nemo_base_2407 = 'mistral-nemo-base-2407'\\n    mistral_nemo_instruct_2407 = 'mistral-nemo-instruct-2407'\\n    mistral_large_instruct_2407 = 'mistral-large-instruct-2407'\\n    mistral_small_instruct_2409 = 'mistral-small-instruct-2409'\\n    mixtral_moe_7b = 'mixtral-moe-7b'\\n    mixtral_moe_7b_instruct = 'mixtral-moe-7b-instruct'\\n    mixtral_moe_7b_aqlm_2bit_1x16 = 'mixtral-moe-7b-aqlm-2bit-1x16'  # aqlm\\n    mixtral_moe_8x22b_v1 = 'mixtral-moe-8x22b-v1'\\n\\n    pixtral_12b = 'pixtral-12b'\\n    # wizardlm\\n    wizardlm2_7b_awq = 'wizardlm2-7b-awq'\\n    wizardlm2_8x22b = 'wizardlm2-8x22b'\\n    # baichuan\\n    baichuan_7b = 'baichuan-7b'\\n    baichuan_13b = 'baichuan-13b'\\n    baichuan_13b_chat = 'baichuan-13b-chat'\\n    # baichuan2\\n    baichuan2_7b = 'baichuan2-7b'\\n    baichuan2_7b_chat = 'baichuan2-7b-chat'\\n    baichuan2_7b_chat_int4 = 'baichuan2-7b-chat-int4'\\n    baichuan2_13b = 'baichuan2-13b'\\n    baichuan2_13b_chat = 'baichuan2-13b-chat'\\n    baichuan2_13b_chat_int4 = 'baichuan2-13b-chat-int4'\\n    # owl\\n    mplug_owl2_chat = 'mplug-owl2-chat'  # llama\\n    mplug_owl2_1_chat = 'mplug-owl2_1-chat'  # qwen\\n    mplug_owl3_7b_chat = 'mplug-owl3-7b-chat'\\n    # yuan\\n    yuan2_2b_instruct = 'yuan2-2b-instruct'\\n    yuan2_2b_janus_instruct = 'yuan2-2b-janus-instruct'\\n    yuan2_51b_instruct = 'yuan2-51b-instruct'\\n    yuan2_102b_instruct = 'yuan2-102b-instruct'\\n    yuan2_m32 = 'yuan2-m32'\\n    # xverse\\n    xverse_7b = 'xverse-7b'\\n    xverse_7b_chat = 'xverse-7b-chat'\\n    xverse_13b = 'xverse-13b'\\n    xverse_13b_chat = 'xverse-13b-chat'\\n    xverse_65b = 'xverse-65b'\\n    xverse_65b_v2 = 'xverse-65b-v2'\\n    xverse_65b_chat = 'xverse-65b-chat'\\n    xverse_13b_256k = 'xverse-13b-256k'\\n    xverse_moe_a4_2b = 'xverse-moe-a4_2b'\\n    # orion\\n    orion_14b = 'orion-14b'\\n    orion_14b_chat = 'orion-14b-chat'\\n    # vivo\\n    bluelm_7b = 'bluelm-7b'\\n    bluelm_7b_32k = 'bluelm-7b-32k'\\n    bluelm_7b_chat = 'bluelm-7b-chat'\\n    bluelm_7b_chat_32k = 'bluelm-7b-chat-32k'\\n    # ziya\\n    ziya2_13b = 'ziya2-13b'\\n    ziya2_13b_chat = 'ziya2-13b-chat'\\n    # skywork\\n    skywork_13b = 'skywork-13b'\\n    skywork_13b_chat = 'skywork-13b-chat'\\n    # zephyr\\n    zephyr_7b_beta_chat = 'zephyr-7b-beta-chat'\\n    # other\\n    polylm_13b = 'polylm-13b'\\n    seqgpt_560m = 'seqgpt-560m'\\n    sus_34b_chat = 'sus-34b-chat'\\n\\n    # tongyi-finance\\n    tongyi_finance_14b = 'tongyi-finance-14b'\\n    tongyi_finance_14b_chat = 'tongyi-finance-14b-chat'\\n    tongyi_finance_14b_chat_int4 = 'tongyi-finance-14b-chat-int4'\\n    # codefuse\\n    codefuse_codellama_34b_chat = 'codefuse-codellama-34b-chat'\\n    codefuse_codegeex2_6b_chat = 'codefuse-codegeex2-6b-chat'\\n    codefuse_qwen_14b_chat = 'codefuse-qwen-14b-chat'\\n    # phi\\n    phi2_3b = 'phi2-3b'\\n    phi3_4b_4k_instruct = 'phi3-4b-4k-instruct'\\n    phi3_4b_128k_instruct = 'phi3-4b-128k-instruct'\\n    phi3_small_8k_instruct = 'phi3-small-8k-instruct'\\n    phi3_medium_4k_instruct = 'phi3-medium-4k-instruct'\\n    phi3_small_128k_instruct = 'phi3-small-128k-instruct'\\n    phi3_medium_128k_instruct = 'phi3-medium-128k-instruct'\\n\\n    phi3_5_mini_instruct = 'phi3_5-mini-instruct'\\n    phi3_5_moe_instruct = 'phi3_5-moe-instruct'\\n\\n    phi3_vision_128k_instruct = 'phi3-vision-128k-instruct'\\n    phi3_5_vision_instruct = 'phi3_5-vision-instruct'\\n    # cogagent\\n    cogvlm_17b_chat = 'cogvlm-17b-chat'\\n    cogvlm2_19b_chat = 'cogvlm2-19b-chat'  # chinese\\n    cogvlm2_en_19b_chat = 'cogvlm2-en-19b-chat'\\n    cogvlm2_video_13b_chat = 'cogvlm2-video-13b-chat'\\n    cogagent_18b_chat = 'cogagent-18b-chat'\\n    cogagent_18b_instruct = 'cogagent-18b-instruct'\\n    # mamba\\n    mamba_130m = 'mamba-130m'\\n    mamba_370m = 'mamba-370m'\\n    mamba_390m = 'mamba-390m'\\n    mamba_790m = 'mamba-790m'\\n    mamba_1_4b = 'mamba-1.4b'\\n    mamba_2_8b = 'mamba-2.8b'\\n    # teleAI\\n    telechat_7b = 'telechat-7b'\\n    telechat_12b = 'telechat-12b'\\n    telechat_12b_v2 = 'telechat-12b-v2'\\n    telechat_12b_v2_gptq_int4 = 'telechat-12b-v2-gptq-int4'\\n    # grok-1\\n    grok_1 = 'grok-1'\\n    # dbrx\\n    dbrx_instruct = 'dbrx-instruct'\\n    dbrx_base = 'dbrx-base'\\n    # mengzi\\n    mengzi3_13b_base = 'mengzi3-13b-base'\\n    # c4ai\\n    c4ai_command_r_v01 = 'c4ai-command-r-v01'\\n    c4ai_command_r_plus = 'c4ai-command-r-plus'\\n    # codestral\\n    codestral_22b = 'codestral-22b'\\n    # florence\\n    florence_2_base = 'florence-2-base'\\n    florence_2_base_ft = 'florence-2-base-ft'\\n    florence_2_large = 'florence-2-large'\\n    florence_2_large_ft = 'florence-2-large-ft'\\n\\n    got_ocr2 = 'got-ocr2'\\n\\n    @classmethod\\n    def get_model_name_list(cls) -> List[str]:\\n        res = []\\n        for k in cls.__dict__.keys():\\n            if k.startswith('__') or k == 'get_model_name_list':\\n                continue\\n            res.append(cls.__dict__[k])\\n        return res\\n\\n\\nclass LoRATM(NamedTuple):\\n    # default lora target modules for multi-modals\\n    qwen_audio = 'qwen_audio'\\n    qwen_vl = 'qwen_vl'\\n    qwen2_audio = 'qwen2_audio'\\n    qwen2_vl = 'qwen2_vl'\\n    glm4v = 'glm4v'\\n    llava_next_video = 'llava_next_video'\\n    llava_llama = 'llava_llama'\\n    llava = 'llava'\\n    internlm_xcomposer = ['attention.wqkv', 'attention.wo', 'feed_forward.w1', 'feed_forward.w2', 'feed_forward.w3']\\n    internvl = 'internvl'\\n    deepseek_vl = 'deepseek_vl'\\n    minicpm_v = 'minicpm_v'\\n    phi3v = 'phi3v'\\n    cogvlm = 'cogvlm'\\n    florence = 'florence'\\n    idefics3 = 'idefics3'\\n    mplug_owl3 = 'mplug_owl3'\\n    llama3_1_omni = 'llama3_1_omni'\\n    got_ocr2 = 'got_ocr2'\\n    llama3_2_vision = 'llama3_2_vision'\\n    # default lora target modules for nlp llms.\\n    minicpm3 = ['q_a_proj', 'q_b_proj', 'kv_a_proj_with_mqa', 'kv_b_proj']\\n    baichuan = ['W_pack']\\n    chatglm = ['query_key_value']\\n    llama = ['q_proj', 'k_proj', 'v_proj']\\n    qwen = ['c_attn']\\n    polylm = ['c_attn']\\n    bloom = ['query_key_value']\\n    phi = ['Wqkv']\\n    phi3 = ['qkv_proj']\\n    phi3_small = ['query_key_value']  # what the hell???\\n    internlm2 = ['wqkv']\\n    mamba = ['in_proj', 'x_proj', 'embeddings', 'out_proj']\\n    telechat = ['key_value', 'query']\\n    dbrx = ['attn.Wqkv']\\n    mplug_owl2 = [\\n        'q_proj',\\n        'k_proj.multiway.0',\\n        'k_proj.multiway.1',\\n        'v_proj.multiway.0',\\n        'v_proj.multiway.1',\\n    ]\\n    mplug_owl2_1 = [\\n        'c_attn.multiway.0',\\n        'c_attn.multiway.1',\\n    ]\\n    deepseek2 = [\\n        'q_a_proj',\\n        'q_b_proj',\\n        'kv_a_proj_with_mqa',\\n        'kv_b_proj',\\n        'o_proj',\\n    ]\\n    # compat\\n    llama2 = llama\\n\\n\\nGetModelTokenizerFunction = Callable[..., Tuple[Optional[PreTrainedModel], PreTrainedTokenizerBase]]\\n\\n\\ndef register_model(\\n        model_type: str,\\n        model_id_or_path: Optional[str],\\n        lora_target_modules: Optional[Union[List[str], str]] = None,\\n        template: str = TemplateType.default,\\n        get_function: Optional[GetModelTokenizerFunction] = None,\\n        *,\\n        requires: Optional[List[str]] = None,\\n        torch_dtype: Optional[torch.dtype] = None,\\n        hf_model_id: Optional[str] = None,\\n        revision: Optional[str] = None,  # only modelscope\\n        ignore_file_pattern: Optional[List[str]] = None,\\n        function_kwargs: Optional[Dict[str, Any]] = None,\\n        exist_ok: bool = False,\\n        eos_token: Union[str, int, None] = None,\\n        **kwargs) -> Optional[Callable[[GetModelTokenizerFunction], GetModelTokenizerFunction]]:\\n    if not exist_ok and model_type in MODEL_MAPPING:\\n        raise ValueError(f'The `{model_type}` has already been registered in the MODEL_MAPPING.')\\n    if requires is None:\\n        requires = []\\n    if function_kwargs is None:\\n        function_kwargs = {}\\n    if revision is None:\\n        revision = 'master'\\n    model_info = {\\n        'model_id_or_path': model_id_or_path,\\n        'lora_target_modules': lora_target_modules,\\n        'template': template,\\n        'requires': requires,\\n        'torch_dtype': torch_dtype,\\n        'ignore_file_pattern': ignore_file_pattern,\\n        'hf_model_id': hf_model_id,\\n        'revision': revision,\\n        'eos_token': eos_token,\\n        **kwargs\\n    }\\n\\n    if get_function is not None:\\n        if len(function_kwargs) > 0:\\n            get_function = partial(get_function, **function_kwargs)\\n        model_info['get_function'] = get_function\\n        MODEL_MAPPING[model_type] = model_info\\n        return\\n\\n    def _register_model(get_function: GetModelTokenizerFunction) -> GetModelTokenizerFunction:\\n        _old_get_function = get_function\\n        if len(function_kwargs) > 0:\\n            get_function = partial(get_function, **function_kwargs)\\n        model_info['get_function'] = get_function\\n        MODEL_MAPPING[model_type] = model_info\\n        return _old_get_function\\n\\n    return _register_model\\n\\n\\ndef _check_awq_ext() -> None:\\n    try:\\n        from awq.utils.packing_utils import dequantize_gemm\\n        import awq_ext  # with CUDA kernels (AutoAWQ_kernels)\\n    except ImportError as e:\\n        raise ImportError('You are training awq models, remember installing awq_ext by '\\n                          '`git clone https://github.com/casper-hansen/AutoAWQ_kernels '\\n                          '&& cd AutoAWQ_kernels && pip install -e .`') from e\\n\\n\\ndef _check_gptq_model(bits: int, model_config, model_kwargs: Dict[str, Any]) -> None:\\n    assert model_kwargs.get('quantization_config') is None\\n    if bits == 0:\\n        bits = model_config.quantization_config['bits']\\n    if version.parse(transformers.__version__) >= version.parse('4.35'):\\n        model_kwargs['quantization_config'] = GPTQConfig(bits=bits, use_exllama=False)\\n    else:\\n        model_kwargs['quantization_config'] = GPTQConfig(bits=bits, disable_exllama=True)\\n\\n    # fix quantlinear bug\\n    from auto_gptq.nn_modules.qlinear.qlinear_cuda_old import QuantLinear\\n    __old_forward = QuantLinear.forward\\n\\n    def _new_forward(self, x):\\n        if not self.training or not self.autogptq_cuda_available:\\n            return self.__old_forward(x)\\n        # fix sft no grad\\n        self.autogptq_cuda_available = False\\n        res = self.__old_forward(x)\\n        self.autogptq_cuda_available = True\\n        return res\\n\\n    if not hasattr(QuantLinear, '__old_forward'):  # avoid double patching\\n        QuantLinear.__old_forward = __old_forward\\n        QuantLinear.forward = _new_forward\\n\\n\\n@register_model(\\n    ModelType.internlm_20b,\\n    'Shanghai_AI_Laboratory/internlm-20b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm-20b')\\n@register_model(\\n    ModelType.internlm_7b,\\n    'Shanghai_AI_Laboratory/internlm-7b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm-7b')\\n@register_model(\\n    ModelType.bluelm_7b_chat_32k,\\n    'vivo-ai/BlueLM-7B-Chat-32K',\\n    LoRATM.llama,\\n    TemplateType.bluelm,\\n    hf_model_id='vivo-ai/BlueLM-7B-Chat-32K')\\n@register_model(\\n    ModelType.bluelm_7b_chat,\\n    'vivo-ai/BlueLM-7B-Chat',\\n    LoRATM.llama,\\n    TemplateType.bluelm,\\n    hf_model_id='vivo-ai/BlueLM-7B-Chat')\\n@register_model(\\n    ModelType.bluelm_7b_32k,\\n    'vivo-ai/BlueLM-7B-Base-32K',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    hf_model_id='vivo-ai/BlueLM-7B-Base-32K')\\n@register_model(\\n    ModelType.bluelm_7b,\\n    'vivo-ai/BlueLM-7B-Base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    hf_model_id='vivo-ai/BlueLM-7B-Base')\\n@register_model(\\n    ModelType.seqgpt_560m,\\n    'damo/nlp_seqgpt-560m',\\n    LoRATM.bloom,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    hf_model_id='DAMO-NLP/SeqGPT-560M')\\n@register_model(\\n    ModelType.xverse_13b_chat,\\n    'xverse/XVERSE-13B-Chat',\\n    LoRATM.llama,\\n    TemplateType.xverse,\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-13B-Chat')\\n@register_model(\\n    ModelType.xverse_13b,\\n    'xverse/XVERSE-13B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-13B')\\n@register_model(\\n    ModelType.xverse_65b,\\n    'xverse/XVERSE-65B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-65B')\\n@register_model(\\n    ModelType.xverse_65b_v2,\\n    'xverse/XVERSE-65B-2',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-65B-2')\\n@register_model(\\n    ModelType.xverse_65b_chat,\\n    'xverse/XVERSE-65B-Chat',\\n    LoRATM.llama,\\n    TemplateType.xverse,\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-65B-Chat')\\n@register_model(\\n    ModelType.xverse_13b_256k,\\n    'xverse/XVERSE-13B-256K',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    revision='v1.0.0',\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-13B-256K')\\n@register_model(\\n    ModelType.xverse_7b_chat,\\n    'xverse/XVERSE-7B-Chat',\\n    LoRATM.llama,\\n    TemplateType.xverse,\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-7B-Chat')\\n@register_model(\\n    ModelType.xverse_7b,\\n    'xverse/XVERSE-7B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    hf_model_id='xverse/XVERSE-7B')\\n@register_model(\\n    ModelType.xverse_moe_a4_2b,\\n    'xverse/XVERSE-MoE-A4.2B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    tags=['moe'],\\n    hf_model_id='xverse/XVERSE-MoE-A4.2B')\\n@register_model(\\n    ModelType.baichuan_13b_chat,\\n    'baichuan-inc/Baichuan-13B-Chat',\\n    LoRATM.baichuan,\\n    TemplateType.baichuan,\\n    requires=['transformers<4.34'],\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='baichuan-inc/Baichuan-13B-Chat')\\n@register_model(\\n    ModelType.baichuan_7b,\\n    'baichuan-inc/baichuan-7B',\\n    LoRATM.baichuan,\\n    TemplateType.default_generation,\\n    requires=['transformers<4.34'],\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='baichuan-inc/Baichuan-7B')\\n@register_model(\\n    ModelType.c4ai_command_r_v01,\\n    'AI-ModelScope/c4ai-command-r-v01',\\n    LoRATM.llama,\\n    TemplateType.c4ai,\\n    requires=['transformers>=4.39.1'],\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    hf_model_id='CohereForAI/c4ai-command-r-v01')\\n@register_model(\\n    ModelType.c4ai_command_r_plus,\\n    'AI-ModelScope/c4ai-command-r-plus',\\n    LoRATM.llama,\\n    TemplateType.c4ai,\\n    requires=['transformers>4.39'],\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    hf_model_id='CohereForAI/c4ai-command-r-plus')\\ndef get_model_tokenizer_from_repo(model_dir: str,\\n                                  torch_dtype: Optional[torch.dtype],\\n                                  model_kwargs: Dict[str, Any],\\n                                  load_model: bool = True,\\n                                  model_config=None,\\n                                  tokenizer=None,\\n                                  automodel_class=AutoModelForCausalLM,\\n                                  **kwargs):\\n    \\\"\\\"\\\"load from an independent repository\\\"\\\"\\\"\\n    if model_config is None:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    # multimodal\\n    llm_config = None\\n    for k in ['language_config', 'llm_config', 'text_config']:\\n        llm_config = getattr(model_config, k, None)\\n        if llm_config:\\n            break\\n    if llm_config and hasattr(llm_config, 'hidden_size') and not hasattr(model_config, 'hidden_size'):\\n        model_config.hidden_size = llm_config.hidden_size\\n\\n    # quant\\n    is_awq = kwargs.pop('is_awq', False)\\n    is_aqlm = kwargs.pop('is_aqlm', False)\\n    gptq_bits = kwargs.pop('gptq_bits', 0)\\n    if gptq_bits > 0:\\n        is_gptq = True\\n    else:\\n        is_gptq = kwargs.pop('is_gptq', False)\\n    is_training = kwargs.pop('is_training', False)\\n    if is_awq and is_training:\\n        _check_awq_ext()\\n    if is_gptq and is_training:\\n        _check_gptq_model(gptq_bits, model_config, model_kwargs)\\n    context = kwargs.get('context', None)\\n    if is_aqlm and is_training:\\n        require_version('transformers>=4.39')\\n        import aqlm\\n        context = aqlm.optimize_for_training()\\n    if context is None:\\n        context = nullcontext()\\n    if torch_dtype is not None:\\n        model_config.torch_dtype = torch_dtype\\n    if tokenizer is None:\\n        tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)\\n    eos_token = kwargs.get('eos_token')\\n    if isinstance(eos_token, str):\\n        tokenizer.eos_token = eos_token\\n    elif isinstance(eos_token, int):\\n        tokenizer.eos_token_id = eos_token\\n    pad_token = kwargs.get('pad_token')\\n    if pad_token is not None:\\n        tokenizer.pad_token = pad_token\\n    placeholder_tokens = kwargs.get('placeholder_tokens')\\n    if placeholder_tokens is not None:\\n        tokenizer.placeholder_tokens = placeholder_tokens\\n        tokenizer.placeholder_tokens_id = [tokenizer.convert_tokens_to_ids(token) for token in placeholder_tokens]\\n    model = None\\n\\n    rope_scaling = kwargs.pop('rope_scaling', None)\\n    max_position_embeddings = get_max_model_len(model_config, ignore_rope_scaling=True)\\n    if rope_scaling and max_position_embeddings:\\n        max_length = kwargs.get('max_length') or max_position_embeddings\\n        rope_scaling_factor = max(float(math.ceil(max_length / max_position_embeddings)), 1.0)\\n        set_rope_scaling(model_config, {'type': rope_scaling, 'factor': rope_scaling_factor})\\n        logger.info(f'rope_scaling is set to type: {get_rope_scaling(model_config)}')\\n    if load_model:\\n        if kwargs.get('use_unsloth', False):\\n            assert is_unsloth_available(), 'please install unsloth if using `use_unsloth=True`'\\n            if 'qwen' in model_dir:\\n                logger.warn('If using qwen2 models, please install unsloth with '\\n                            '`pip install git+https://github.com/yangjianxin1/unsloth`')\\n            from unsloth import FastLanguageModel\\n            model, tokenizer = FastLanguageModel.from_pretrained(\\n                model_name=model_dir,\\n                max_seq_length=kwargs.get('max_length', None),\\n                dtype=torch_dtype,\\n                load_in_4bit=kwargs.get('load_in_4bit', True),\\n                trust_remote_code=True,\\n            )\\n        else:\\n            logger.info(f'model_kwargs: {model_kwargs}')\\n            with context:\\n                model = automodel_class.from_pretrained(\\n                    model_dir, config=model_config, torch_dtype=torch_dtype, trust_remote_code=True, **model_kwargs)\\n        model.is_gptq = is_gptq\\n        model.is_awq = is_awq\\n        model.is_aqlm = is_aqlm\\n    return model, tokenizer\\n\\n\\ndef get_device_hook(device):\\n\\n    def _device_hook(module, input, output):\\n        return to_device(output, device)\\n\\n    return _device_hook\\n\\n\\ndef _output_device_map_hook(module, input, output):\\n    return output.to(input[0].device)\\n\\n\\n@register_model(\\n    ModelType.pixtral_12b,\\n    'AI-ModelScope/pixtral-12b',\\n    LoRATM.llava,\\n    TemplateType.pixtral,\\n    # torch_dtype=torch.float16,  # Please do not use bf16.\\n    requires=['transformers>=4.45'],\\n    placeholder_tokens=['[IMG]'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='mistral-community/pixtral-12b')\\ndef get_model_tokenizer_pixtral(model_dir: str, *args, **kwargs):\\n    from transformers import AutoProcessor, LlavaForConditionalGeneration\\n    processor = AutoProcessor.from_pretrained(model_dir)\\n    kwargs['automodel_class'] = LlavaForConditionalGeneration\\n    kwargs['tokenizer'] = processor.tokenizer\\n    model, tokenizer = get_model_tokenizer_from_repo(model_dir, *args, **kwargs)\\n    tokenizer.processor = processor\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.cogvlm2_video_13b_chat,\\n    'ZhipuAI/cogvlm2-video-llama3-chat',\\n    LoRATM.cogvlm,\\n    TemplateType.cogvlm2_video,\\n    support_gradient_checkpointing=False,\\n    requires=['decord', 'pytorchvideo', 'transformers>=4.42'],\\n    placeholder_tokens=['<|reserved_special_token_0|>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='THUDM/cogvlm2-video-llama3-chat')\\n@register_model(\\n    ModelType.cogvlm2_en_19b_chat,\\n    'ZhipuAI/cogvlm2-llama3-chat-19B',\\n    LoRATM.cogvlm,\\n    TemplateType.cogvlm,\\n    support_gradient_checkpointing=False,\\n    support_lmdeploy=True,\\n    requires=['transformers<4.42'],\\n    placeholder_tokens=['<|reserved_special_token_0|>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='THUDM/cogvlm2-llama3-chat-19B')\\n@register_model(\\n    ModelType.cogvlm2_19b_chat,\\n    'ZhipuAI/cogvlm2-llama3-chinese-chat-19B',\\n    LoRATM.cogvlm,\\n    TemplateType.cogvlm,\\n    support_gradient_checkpointing=False,\\n    support_lmdeploy=True,\\n    requires=['transformers<4.42'],\\n    placeholder_tokens=['<|reserved_special_token_0|>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='THUDM/cogvlm2-llama3-chinese-chat-19B')\\ndef get_model_tokenizer_cogvlm2(*args, **kwargs):\\n    model, tokenizer = get_model_tokenizer_from_repo(*args, **kwargs)\\n    if model is not None:\\n        # fix device map 4\\n        for layer in model.model.vision.transformer.layers:\\n            layer.mlp.register_forward_hook(_output_device_map_hook)\\n            layer.post_attention_layernorm.register_forward_hook(_output_device_map_hook)\\n\\n        device = next(model.model.vision.linear_proj.parameters()).device\\n        model.model.vision.boi.data = model.model.vision.boi.to(device)\\n        model.model.vision.eoi.data = model.model.vision.eoi.to(device)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.llava_llama3_8b_v1_1,\\n    'AI-ModelScope/llava-llama-3-8b-v1_1-transformers',\\n    LoRATM.llava,\\n    TemplateType.llava_llama_instruct,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.36'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='xtuner/llava-llama-3-8b-v1_1-transformers')\\ndef get_model_tokenizer_llava_llama(model_dir: str,\\n                                    torch_dtype: torch.dtype,\\n                                    model_kwargs: Dict[str, Any],\\n                                    load_model: bool = True,\\n                                    **kwargs):\\n    from transformers import LlavaForConditionalGeneration, LlavaConfig, AutoProcessor\\n\\n    model_config = LlavaConfig.from_pretrained(model_dir)\\n    processor = AutoProcessor.from_pretrained(model_dir)\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(\\n        model_dir,\\n        torch_dtype,\\n        model_kwargs,\\n        load_model,\\n        model_config=model_config,\\n        automodel_class=LlavaForConditionalGeneration,\\n        **kwargs)\\n    tokenizer.processor = processor\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.grok_1,\\n    'colossalai/grok-1-pytorch',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=False,\\n    support_flash_attn=False,\\n    hf_model_id='hpcai-tech/grok-1')\\ndef get_model_tokenizer_grok(model_dir: str,\\n                             torch_dtype: Optional[torch.dtype],\\n                             model_kwargs: Dict[str, Any],\\n                             load_model: bool = True,\\n                             model_config=None,\\n                             tokenizer=None,\\n                             automodel_class=AutoModelForCausalLM,\\n                             **kwargs):\\n    if model_config is None:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    if torch_dtype is not None:\\n        model_config.torch_dtype = torch_dtype\\n    if tokenizer is None:\\n        tokenizer = AutoTokenizer.from_pretrained(\\n            'AI-ModelScope/grok-1-tokenizer', revision='master', trust_remote_code=True)\\n    eos_token = kwargs.get('eos_token')\\n    if eos_token is not None:\\n        tokenizer.eos_token = eos_token\\n    model = None\\n    if load_model:\\n        model = automodel_class.from_pretrained(\\n            model_dir, config=model_config, torch_dtype=torch_dtype, trust_remote_code=True, **model_kwargs)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.mamba_130m,\\n    'AI-ModelScope/mamba-130m-hf',\\n    LoRATM.mamba,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.39.0'],\\n    support_vllm=False,\\n    hf_model_id='state-spaces/mamba-130m-hf')\\n@register_model(\\n    ModelType.mamba_370m,\\n    'AI-ModelScope/mamba-370m-hf',\\n    LoRATM.mamba,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.39.0'],\\n    support_vllm=False,\\n    hf_model_id='state-spaces/mamba-370m-hf')\\n@register_model(\\n    ModelType.mamba_390m,\\n    'AI-ModelScope/mamba-390m-hf',\\n    LoRATM.mamba,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.39.0'],\\n    support_vllm=False,\\n    hf_model_id='state-spaces/mamba-390m-hf')\\n@register_model(\\n    ModelType.mamba_790m,\\n    'AI-ModelScope/mamba-790m-hf',\\n    LoRATM.mamba,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.39.0'],\\n    support_vllm=False,\\n    hf_model_id='state-spaces/mamba-790m-hf')\\n@register_model(\\n    ModelType.mamba_1_4b,\\n    'AI-ModelScope/mamba-1.4b-hf',\\n    LoRATM.mamba,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.39.0'],\\n    support_vllm=False,\\n    hf_model_id='state-spaces/mamba-1.4b-hf')\\n@register_model(\\n    ModelType.mamba_2_8b,\\n    'AI-ModelScope/mamba-2.8b-hf',\\n    LoRATM.mamba,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.39.0'],\\n    support_vllm=False,\\n    hf_model_id='state-spaces/mamba-2.8b-hf')\\ndef get_model_tokenizer_mamba(model_dir: str,\\n                              torch_dtype: Optional[torch.dtype],\\n                              model_kwargs: Dict[str, Any],\\n                              load_model: bool = True,\\n                              **kwargs):\\n    logger.info('[IMPORTANT] Remember installing causal-conv1d>=1.2.0 and mamba-ssm, or you training and inference will'\\n                'be really slow!')\\n    return get_model_tokenizer_from_repo(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.cogvlm_17b_chat,\\n    'ZhipuAI/cogvlm-chat',\\n    LoRATM.cogvlm,\\n    TemplateType.cogvlm,\\n    support_gradient_checkpointing=False,\\n    requires=['transformers<4.42'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='THUDM/cogvlm-chat-hf')\\n@register_model(\\n    ModelType.cogagent_18b_chat,\\n    'ZhipuAI/cogagent-chat',\\n    LoRATM.cogvlm,\\n    TemplateType.cogagent_chat,\\n    support_gradient_checkpointing=False,\\n    requires=['timm'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='THUDM/cogagent-chat-hf')\\n@register_model(\\n    ModelType.cogagent_18b_instruct,\\n    'ZhipuAI/cogagent-vqa',\\n    LoRATM.cogvlm,\\n    TemplateType.cogagent_instruct,\\n    support_gradient_checkpointing=False,\\n    requires=['timm'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='THUDM/cogagent-vqa-hf')\\ndef get_model_tokenizer_cogagent(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 **kwargs):\\n    tokenizer = AutoTokenizer.from_pretrained('AI-ModelScope/vicuna-7b-v1.5', revision='master', trust_remote_code=True)\\n    if load_model:\\n        logger.warning('CogAgent with FusedLayerNorm will cause an training loss of NAN, '\\n                       'to avoid this, please uninstall apex.')\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, tokenizer=tokenizer, **kwargs)\\n    logger.info('Please ignore the unimported warning.')\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.internlm_20b_chat,\\n    'Shanghai_AI_Laboratory/internlm-chat-20b',\\n    LoRATM.llama,\\n    TemplateType.internlm,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm-chat-20b')\\n@register_model(\\n    ModelType.internlm_7b_chat_8k,\\n    'Shanghai_AI_Laboratory/internlm-chat-7b-8k',\\n    LoRATM.llama,\\n    TemplateType.internlm,\\n    support_vllm=True,\\n    support_lmdeploy=True)\\n@register_model(\\n    ModelType.internlm_7b_chat,\\n    'Shanghai_AI_Laboratory/internlm-chat-7b',\\n    LoRATM.llama,\\n    TemplateType.internlm,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm-chat-7b')\\ndef get_model_tokenizer_internlm_chat(model_dir: str,\\n                                      torch_dtype: torch.dtype,\\n                                      model_kwargs: Dict[str, Any],\\n                                      load_model: bool = True,\\n                                      **kwargs):\\n    model, tokenizer = get_model_tokenizer_from_repo(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if getattr(tokenizer.__class__.eos_token_id, 'fset', None) is None:\\n        del tokenizer.__class__.eos_token_id\\n    tokenizer.eos_token = '<eoa>'\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.baichuan_13b,\\n    'baichuan-inc/Baichuan-13B-Base',\\n    LoRATM.baichuan,\\n    TemplateType.default_generation,\\n    requires=['transformers<4.34'],\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='baichuan-inc/Baichuan-13B-Base')\\ndef get_model_tokenizer_baichuan_13b(model_dir: str,\\n                                     torch_dtype: torch.dtype,\\n                                     model_kwargs: Dict[str, Any],\\n                                     load_model: bool = True,\\n                                     **kwargs):\\n    model, tokenizer = get_model_tokenizer_from_repo(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    # baichuan-13b does not implement the `get_input_embeddings` function\\n    # fix gradient_checkpointing bug\\n    try:\\n        model.get_input_embeddings()\\n    except NotImplementedError:\\n        model.__class__.get_input_embeddings = lambda self: self.model.embed_tokens\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.paligemma_3b_pt_224,\\n    'AI-ModelScope/paligemma-3b-pt-224',\\n    LoRATM.llava,\\n    TemplateType.paligemma,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.41'],\\n    placeholder_tokens=['<image>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='google/paligemma-3b-pt-224')\\n@register_model(\\n    ModelType.paligemma_3b_pt_448,\\n    'AI-ModelScope/paligemma-3b-pt-448',\\n    LoRATM.llava,\\n    TemplateType.paligemma,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.41'],\\n    placeholder_tokens=['<image>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='google/paligemma-3b-pt-448')\\n@register_model(\\n    ModelType.paligemma_3b_pt_896,\\n    'AI-ModelScope/paligemma-3b-pt-896',\\n    LoRATM.llava,\\n    TemplateType.paligemma,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.41'],\\n    placeholder_tokens=['<image>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='google/paligemma-3b-pt-896')\\n@register_model(\\n    ModelType.paligemma_3b_mix_224,\\n    'AI-ModelScope/paligemma-3b-mix-224',\\n    LoRATM.llava,\\n    TemplateType.paligemma,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.41'],\\n    placeholder_tokens=['<image>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='google/paligemma-3b-mix-224')\\n@register_model(\\n    ModelType.paligemma_3b_mix_448,\\n    'AI-ModelScope/paligemma-3b-mix-448',\\n    LoRATM.llava,\\n    TemplateType.paligemma,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.41'],\\n    placeholder_tokens=['<image>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='google/paligemma-3b-mix-448')\\ndef get_model_tokenizer_paligemma_vision(model_dir: str,\\n                                         torch_dtype: torch.dtype,\\n                                         model_kwargs: Dict[str, Any],\\n                                         load_model: bool = True,\\n                                         **kwargs):\\n    from transformers import AutoProcessor, PaliGemmaForConditionalGeneration\\n    processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, automodel_class=PaliGemmaForConditionalGeneration, **kwargs)\\n    tokenizer.processor = processor\\n    return model, tokenizer\\n\\n\\ndef _clone_hook(module, input, output):\\n    if module.training:\\n        return output.requires_grad_(True).clone()\\n    else:\\n        return output\\n\\n\\n@register_model(\\n    ModelType.phi3_vision_128k_instruct,\\n    'LLM-Research/Phi-3-vision-128k-instruct',\\n    LoRATM.phi3v,\\n    TemplateType.phi3_vl,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.36'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='microsoft/Phi-3-vision-128k-instruct')\\n@register_model(\\n    ModelType.phi3_5_vision_instruct,\\n    'LLM-Research/Phi-3.5-vision-instruct',\\n    LoRATM.phi3v,\\n    TemplateType.phi3_vl,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.36'],\\n    tags=['multi-modal', 'vision'],\\n    function_kwargs={'num_crops': 4},\\n    hf_model_id='microsoft/Phi-3.5-vision-instruct')\\ndef get_model_tokenizer_phi3_vision(model_dir: str,\\n                                    torch_dtype: torch.dtype,\\n                                    model_kwargs: Dict[str, Any],\\n                                    load_model: bool = True,\\n                                    **kwargs):\\n    processor_kwargs = {}\\n    if 'num_crops' in kwargs:\\n        processor_kwargs['num_crops'] = get_env_args('num_crops', int, kwargs['num_crops'])\\n    from transformers import AutoProcessor\\n    processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True, **processor_kwargs)\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    tokenizer.processor = processor\\n\\n    if load_model:\\n        model.model.vision_embed_tokens.wte.register_forward_hook(_clone_hook)\\n\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.baichuan2_13b_chat,\\n    'baichuan-inc/Baichuan2-13B-Chat',\\n    LoRATM.baichuan,\\n    TemplateType.baichuan,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='baichuan-inc/Baichuan2-13B-Chat')\\n@register_model(\\n    ModelType.baichuan2_13b,\\n    'baichuan-inc/Baichuan2-13B-Base',\\n    LoRATM.baichuan,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='baichuan-inc/Baichuan2-13B-Base')\\ndef get_model_tokenizer_baichuan2_13b(model_dir: str,\\n                                      torch_dtype: torch.dtype,\\n                                      model_kwargs: Dict[str, Any],\\n                                      load_model: bool = True,\\n                                      **kwargs):\\n    # patch: baichuan2_13b configuration_baichuan.py bug\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    gradient_checkpointing = model_config.gradient_checkpointing\\n    if isinstance(gradient_checkpointing, (tuple, list)):\\n        model_config.gradient_checkpointing = gradient_checkpointing[0]\\n    return get_model_tokenizer_baichuan2(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n\\ndef patch_baichuan2_lm_head_forward(self, hidden_states: torch.Tensor) -> torch.Tensor:\\n    # patch: baichuan2 lm_head (fp32 bug)\\n    if self.training:\\n        norm_weight = F.normalize(self.weight).to(self.weight.dtype)\\n    elif self.first_flag:\\n        self.first_flag = False\\n        self.weight.data = F.normalize(self.weight).to(self.weight.dtype)\\n        norm_weight = self.weight\\n    else:\\n        norm_weight = self.weight\\n    return F.linear(hidden_states, norm_weight)\\n\\n\\n@register_model(\\n    ModelType.baichuan2_7b_chat,\\n    'baichuan-inc/Baichuan2-7B-Chat',\\n    LoRATM.baichuan,\\n    TemplateType.baichuan,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='baichuan-inc/Baichuan2-7B-Chat')\\n@register_model(\\n    ModelType.baichuan2_7b,\\n    'baichuan-inc/Baichuan2-7B-Base',\\n    LoRATM.baichuan,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='baichuan-inc/Baichuan2-7B-Base')\\ndef get_model_tokenizer_baichuan2(model_dir: str,\\n                                  torch_dtype: torch.dtype,\\n                                  model_kwargs: Dict[str, Any],\\n                                  load_model: bool = True,\\n                                  model_config=None,\\n                                  **kwargs):\\n    if model_config is None:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    if not hasattr(model_config, 'z_loss_weight'):\\n        model_config.z_loss_weight = 0\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n    model_ori = model\\n    if model is not None:\\n        if not hasattr(model, 'lm_head'):  # fix awq\\n            model = model.model\\n        new_forward = MethodType(patch_baichuan2_lm_head_forward, model.lm_head)\\n        if hasattr(model, '_old_forward'):  # device_map\\n            model.lm_head._old_forward = new_forward\\n        else:\\n            model.lm_head.forward = new_forward\\n    return model_ori, tokenizer\\n\\n\\n@register_model(\\n    ModelType.baichuan2_13b_chat_int4,\\n    'baichuan-inc/Baichuan2-13B-Chat-4bits',\\n    LoRATM.baichuan,\\n    TemplateType.baichuan,\\n    function_kwargs={'get_baichuan2_function': get_model_tokenizer_baichuan2_13b},\\n    torch_dtype=torch.bfloat16,\\n    requires=['bitsandbytes<0.41.2', 'accelerate<0.26'],\\n    hf_model_id='baichuan-inc/Baichuan2-13B-Chat-4bits')\\n@register_model(\\n    ModelType.baichuan2_7b_chat_int4,\\n    'baichuan-inc/Baichuan2-7B-Chat-4bits',\\n    LoRATM.baichuan,\\n    TemplateType.baichuan,\\n    torch_dtype=torch.bfloat16,\\n    requires=['bitsandbytes<0.41.2', 'accelerate<0.26'],\\n    hf_model_id='baichuan-inc/Baichuan2-7B-Chat-4bits')\\ndef get_model_tokenizer_baichuan2_int4(model_dir: str,\\n                                       torch_dtype: torch.dtype,\\n                                       model_kwargs: Dict[str, Any],\\n                                       load_model: bool = True,\\n                                       **kwargs):\\n    logger.info('use `model_config.quantization_config`, ignore bnb arguments')\\n    model_kwargs.pop('quantization_config', None)\\n\\n    # fix device_map bug\\n    import accelerate\\n    _old_infer_auto_device_map = accelerate.infer_auto_device_map\\n    device_map = model_kwargs.get('device_map', None)\\n    if device_map != 'auto':\\n        accelerate.infer_auto_device_map = lambda *args, **kwargs: device_map\\n    get_baichuan2_function = kwargs.pop('get_baichuan2_function', get_model_tokenizer_baichuan2)\\n    model, tokenizer = get_baichuan2_function(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if device_map != 'auto':\\n        accelerate.infer_auto_device_map = _old_infer_auto_device_map\\n    if model is not None:\\n        model.config.quantization_config = BitsAndBytesConfig(**model.config.quantization_config)\\n        model.train()\\n        model._is_quantized_training_enabled = True\\n        model.is_loaded_in_4bit = True\\n    return model, tokenizer\\n\\n\\ndef remove_property(tokenizer_cls: Type[PreTrainedTokenizerBase], tokenizer_config: Dict[str, Any]) -> None:\\n    for k, v in tokenizer_cls.__dict__.items():\\n        if k.endswith('_token') and isinstance(v, property) and k in tokenizer_config:\\n            setattr(tokenizer_cls, k, tokenizer_config[k])\\n\\n\\n@register_model(\\n    ModelType.codefuse_codegeex2_6b_chat,\\n    'codefuse-ai/CodeFuse-CodeGeeX2-6B',\\n    LoRATM.chatglm,\\n    TemplateType.codefuse,\\n    requires=['transformers<4.34'],\\n    support_vllm=True,\\n    tags=['coding'],\\n    hf_model_id='codefuse-ai/CodeFuse-CodeGeeX2-6B')\\n@register_model(\\n    ModelType.chatglm3_6b_32k,\\n    'ZhipuAI/chatglm3-6b-32k',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm3,\\n    support_vllm=True,\\n    requires=['transformers<4.42'],\\n    hf_model_id='THUDM/chatglm3-6b-32k')\\n@register_model(\\n    ModelType.chatglm3_6b_128k,\\n    'ZhipuAI/chatglm3-6b-128k',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm3,\\n    support_vllm=True,\\n    requires=['transformers<4.42'],\\n    hf_model_id='THUDM/chatglm3-6b-128k')\\n@register_model(\\n    ModelType.chatglm3_6b,\\n    'ZhipuAI/chatglm3-6b',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm3,\\n    support_vllm=True,\\n    requires=['transformers<4.42'],\\n    hf_model_id='THUDM/chatglm3-6b')\\n@register_model(\\n    ModelType.chatglm3_6b_base,\\n    'ZhipuAI/chatglm3-6b-base',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm_generation,\\n    support_vllm=True,\\n    requires=['transformers<4.42'],\\n    hf_model_id='THUDM/chatglm3-6b-base')\\n@register_model(\\n    ModelType.chatglm2_6b_32k,\\n    'ZhipuAI/chatglm2-6b-32k',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm2,\\n    support_vllm=True,\\n    requires=['transformers<4.42'],\\n    hf_model_id='THUDM/chatglm2-6b-32k')\\n@register_model(\\n    ModelType.chatglm2_6b,\\n    'ZhipuAI/chatglm2-6b',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm2,\\n    support_vllm=True,\\n    requires=['transformers<4.42'],\\n    hf_model_id='THUDM/chatglm2-6b')\\n@register_model(\\n    ModelType.codegeex2_6b,\\n    'ZhipuAI/codegeex2-6b',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm_generation,\\n    requires=['transformers<4.34'],\\n    support_vllm=True,\\n    tags=['coding'],\\n    hf_model_id='THUDM/codegeex2-6b')\\ndef get_model_tokenizer_chatglm(model_dir: str,\\n                                torch_dtype: torch.dtype,\\n                                model_kwargs: Dict[str, Any],\\n                                load_model: bool = True,\\n                                **kwargs):\\n    if model_kwargs.get('quantization_config') is not None:\\n        model_kwargs['quantization_config'].llm_int8_skip_modules = ['output_layer']\\n    # fix transformers>=4.34 bug\\n    if version.parse(transformers.__version__) >= version.parse('4.34'):\\n        tokenizer_config = get_tokenizer_config(model_dir)\\n        class_ref = tokenizer_config['auto_map']['AutoTokenizer'][0]\\n        tokenizer_cls: Type[PreTrainedTokenizerBase] = get_class_from_dynamic_module(class_ref, model_dir)\\n        tokenizer_cls._auto_class = 'AutoTokenizer'\\n        remove_property(tokenizer_cls, tokenizer_config)\\n        kwargs['tokenizer'] = tokenizer_cls.from_pretrained(model_dir, trust_remote_code=True)\\n    model, tokenizer = get_model_tokenizer_from_repo(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if model is not None:\\n        from torch.nn import CrossEntropyLoss\\n        __old_forward = CrossEntropyLoss.forward\\n\\n        def cross_entropy_forward(self, inputs: torch.Tensor, target: torch.Tensor) -> torch.Tensor:\\n            target = target.to(device=inputs.device)\\n            return __old_forward(self, inputs, target)\\n\\n        CrossEntropyLoss.forward = cross_entropy_forward\\n\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.codegeex4_9b_chat,\\n    'ZhipuAI/codegeex4-all-9b',\\n    LoRATM.chatglm,\\n    TemplateType.codegeex4,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    requires=['transformers<4.42'],\\n    hf_model_id='THUDM/codegeex4-all-9b')\\n@register_model(\\n    ModelType.glm4_9b,\\n    'ZhipuAI/glm-4-9b',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm_generation,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.42'],\\n    hf_model_id='THUDM/glm-4-9b')\\n@register_model(\\n    ModelType.glm4_9b_chat,\\n    'ZhipuAI/glm-4-9b-chat',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm4,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.42'],\\n    hf_model_id='THUDM/glm-4-9b-chat')\\n@register_model(\\n    ModelType.glm4_9b_chat_1m,\\n    'ZhipuAI/glm-4-9b-chat-1m',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm4,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.42'],\\n    hf_model_id='THUDM/glm-4-9b-chat-1m')\\ndef get_model_tokenizer_glm4(model_dir: str,\\n                             torch_dtype: torch.dtype,\\n                             model_kwargs: Dict[str, Any],\\n                             load_model: bool = True,\\n                             **kwargs):\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', None)\\n    if use_flash_attn:\\n        model_config._attn_implementation = 'flash_attention_2'\\n    elif use_flash_attn is False:\\n        model_config._attn_implementation = 'eager'\\n    return get_model_tokenizer_chatglm(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.longwriter_glm4_9b,\\n    'ZhipuAI/LongWriter-glm4-9b',\\n    LoRATM.chatglm,\\n    TemplateType.chatglm4,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.42'],\\n    hf_model_id='THUDM/LongWriter-glm4-9b')\\ndef get_model_tokenizer_longwriter_glm4(*args, **kwargs):\\n    model, tokenizer = get_model_tokenizer_glm4(*args, **kwargs)\\n    for k in tokenizer.special_tokens.keys():\\n        tokenizer.add_tokens(k)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.glm4v_9b_chat,\\n    'ZhipuAI/glm-4v-9b',\\n    LoRATM.glm4v,\\n    TemplateType.glm4v,\\n    eos_token='<|endoftext|>',\\n    requires=['transformers>=4.42'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='THUDM/glm-4v-9b')\\ndef get_model_tokenizer_glm4v(model_dir: str,\\n                              torch_dtype: torch.dtype,\\n                              model_kwargs: Dict[str, Any],\\n                              load_model: bool = True,\\n                              **kwargs):\\n    model, tokenizer = get_model_tokenizer_glm4(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    # fix merge-lora\\n    tokenizer.init_kwargs['image_size'] = 1120\\n    if load_model:\\n        # fix device_map 4\\n        n_gpu = torch.cuda.device_count()\\n        local_world_size = get_dist_setting()[3]\\n        if n_gpu // local_world_size >= 4:\\n            for layer in model.transformer.vision.transformer.layers:\\n                layer.mlp.register_forward_hook(_output_device_map_hook)\\n                layer.post_attention_layernorm.register_forward_hook(_output_device_map_hook)\\n            device = next(model.transformer.vision.linear_proj.parameters()).device\\n            model.transformer.vision.boi.data = model.transformer.vision.boi.to(device)\\n            model.transformer.vision.eoi.data = model.transformer.vision.eoi.to(device)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.gemma2_2b,\\n    'LLM-Research/gemma-2-2b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.42'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2-2b')\\n@register_model(\\n    ModelType.gemma2_9b,\\n    'LLM-Research/gemma-2-9b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.42'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2-9b')\\n@register_model(\\n    ModelType.gemma2_27b,\\n    'LLM-Research/gemma-2-27b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.42'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2-27b')\\n@register_model(\\n    ModelType.gemma2_2b_instruct,\\n    'LLM-Research/gemma-2-2b-it',\\n    LoRATM.llama,\\n    TemplateType.gemma,\\n    requires=['transformers>=4.42'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2-2b-it')\\n@register_model(\\n    ModelType.gemma2_9b_instruct,\\n    'LLM-Research/gemma-2-9b-it',\\n    LoRATM.llama,\\n    TemplateType.gemma,\\n    requires=['transformers>=4.42'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2-9b-it')\\n@register_model(\\n    ModelType.gemma2_27b_instruct,\\n    'LLM-Research/gemma-2-27b-it',\\n    LoRATM.llama,\\n    TemplateType.gemma,\\n    requires=['transformers>=4.42'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2-27b-it')\\n@register_model(\\n    ModelType.qwen2_57b_a14b,\\n    'qwen/Qwen2-57B-A14B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.40'],\\n    hf_model_id='Qwen/Qwen2-57B-A14B')\\n@register_model(\\n    ModelType.qwen2_0_5b,\\n    'qwen/Qwen2-0.5B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-0.5B')\\n@register_model(\\n    ModelType.qwen2_1_5b,\\n    'qwen/Qwen2-1.5B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-1.5B')\\n@register_model(\\n    ModelType.qwen2_7b,\\n    'qwen/Qwen2-7B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-7B')\\n@register_model(\\n    ModelType.qwen2_72b,\\n    'qwen/Qwen2-72B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-72B')\\n@register_model(\\n    ModelType.minicpm_2b_sft_chat,\\n    'OpenBMB/MiniCPM-2B-sft-fp32',\\n    LoRATM.llama,\\n    TemplateType.minicpm,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='openbmb/MiniCPM-2B-sft-fp32')\\n@register_model(\\n    ModelType.minicpm_2b_chat,\\n    'OpenBMB/MiniCPM-2B-dpo-fp32',\\n    LoRATM.llama,\\n    TemplateType.minicpm,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='openbmb/MiniCPM-2B-dpo-fp32')\\n@register_model(\\n    ModelType.minicpm_1b_sft_chat,\\n    'OpenBMB/MiniCPM-1B-sft-bf16',\\n    LoRATM.llama,\\n    TemplateType.minicpm,\\n    requires=['transformers>=4.36.0'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='openbmb/MiniCPM-1B-sft-bf16')\\n@register_model(\\n    ModelType.minicpm_2b_128k,\\n    'OpenBMB/MiniCPM-2B-128k',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    requires=['transformers>=4.36.0'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='openbmb/MiniCPM-2B-128k')\\n@register_model(\\n    ModelType.minicpm3_4b,\\n    'OpenBMB/MiniCPM3-4B',\\n    LoRATM.minicpm3,\\n    TemplateType.chatml,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    # support_vllm=True,\\n    hf_model_id='openbmb/MiniCPM3-4B')\\n@register_model(\\n    ModelType.phi3_4b_128k_instruct,\\n    'LLM-Research/Phi-3-mini-128k-instruct',\\n    LoRATM.phi3,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='microsoft/Phi-3-mini-128k-instruct')\\n@register_model(\\n    ModelType.phi3_medium_4k_instruct,\\n    'LLM-Research/Phi-3-medium-4k-instruct',\\n    LoRATM.phi3,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='microsoft/Phi-3-medium-4k-instruct')\\n@register_model(\\n    ModelType.phi3_medium_128k_instruct,\\n    'LLM-Research/Phi-3-medium-128k-instruct',\\n    LoRATM.phi3,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='microsoft/Phi-3-medium-128k-instruct')\\n@register_model(\\n    ModelType.phi3_4b_4k_instruct,\\n    'LLM-Research/Phi-3-mini-4k-instruct',\\n    LoRATM.phi3,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='microsoft/Phi-3-mini-4k-instruct')\\n@register_model(\\n    ModelType.phi3_5_moe_instruct,\\n    'LLM-Research/Phi-3.5-MoE-instruct',\\n    LoRATM.llama,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='microsoft/Phi-3.5-MoE-instruct')\\n@register_model(\\n    ModelType.phi3_5_mini_instruct,\\n    'LLM-Research/Phi-3.5-mini-instruct',\\n    LoRATM.phi3,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='microsoft/Phi-3.5-mini-instruct')\\n@register_model(\\n    ModelType.wizardlm2_8x22b,\\n    'AI-ModelScope/WizardLM-2-8x22B',\\n    LoRATM.llama,\\n    TemplateType.wizardlm2,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='alpindale/WizardLM-2-8x22B')\\n@register_model(\\n    ModelType.wizardlm2_7b_awq,\\n    'AI-ModelScope/WizardLM-2-7B-AWQ',\\n    LoRATM.llama,\\n    TemplateType.wizardlm2_awq,\\n    requires=['transformers>=4.34'],\\n    torch_dtype=torch.float16,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'is_awq': True},\\n    hf_model_id='MaziyarPanahi/WizardLM-2-7B-AWQ')\\n@register_model(\\n    ModelType.gemma_2b,\\n    'AI-ModelScope/gemma-2b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    ignore_file_pattern=[r'.+\\\\.gguf$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2b')\\n@register_model(\\n    ModelType.gemma_7b,\\n    'AI-ModelScope/gemma-7b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    ignore_file_pattern=[r'.+\\\\.gguf$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-7b')\\n@register_model(\\n    ModelType.gemma_2b_instruct,\\n    'AI-ModelScope/gemma-2b-it',\\n    LoRATM.llama,\\n    TemplateType.gemma,\\n    eos_token='<eos>',\\n    requires=['transformers>=4.38'],\\n    ignore_file_pattern=[r'.+\\\\.gguf$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-2b-it')\\n@register_model(\\n    ModelType.gemma_7b_instruct,\\n    'AI-ModelScope/gemma-7b-it',\\n    LoRATM.llama,\\n    TemplateType.gemma,\\n    eos_token='<eos>',\\n    requires=['transformers>=4.38'],\\n    ignore_file_pattern=[r'.+\\\\.gguf$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='google/gemma-7b-it')\\n@register_model(\\n    ModelType.deepseek_math_7b_instruct,\\n    'deepseek-ai/deepseek-math-7b-instruct',\\n    LoRATM.llama,\\n    TemplateType.deepseek,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['math'],\\n    hf_model_id='deepseek-ai/deepseek-math-7b-instruct')\\n@register_model(\\n    ModelType.numina_math_7b,\\n    'AI-ModelScope/NuminaMath-7B-TIR',\\n    LoRATM.llama,\\n    TemplateType.numina_math,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['math'],\\n    hf_model_id='AI-MO/NuminaMath-7B-TIR')\\n@register_model(\\n    ModelType.deepseek_math_7b_chat,\\n    'deepseek-ai/deepseek-math-7b-rl',\\n    LoRATM.llama,\\n    TemplateType.deepseek,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['math'],\\n    hf_model_id='deepseek-ai/deepseek-math-7b-rl')\\n@register_model(\\n    ModelType.deepseek_math_7b,\\n    'deepseek-ai/deepseek-math-7b-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['math'],\\n    hf_model_id='deepseek-ai/deepseek-math-7b-base')\\n@register_model(\\n    ModelType.qwen1half_0_5b,\\n    'qwen/Qwen1.5-0.5B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-0.5B')\\n@register_model(\\n    ModelType.qwen1half_1_8b,\\n    'qwen/Qwen1.5-1.8B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-1.8B')\\n@register_model(\\n    ModelType.qwen1half_4b,\\n    'qwen/Qwen1.5-4B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-4B')\\n@register_model(\\n    ModelType.qwen1half_7b,\\n    'qwen/Qwen1.5-7B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-7B')\\n@register_model(\\n    ModelType.qwen1half_14b,\\n    'qwen/Qwen1.5-14B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-14B')\\n@register_model(\\n    ModelType.qwen1half_32b,\\n    'qwen/Qwen1.5-32B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-32B')\\n@register_model(\\n    ModelType.qwen1half_72b,\\n    'qwen/Qwen1.5-72B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-72B')\\n@register_model(\\n    ModelType.qwen1half_110b,\\n    'qwen/Qwen1.5-110B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-110B')\\n@register_model(\\n    ModelType.codeqwen1half_7b,\\n    'qwen/CodeQwen1.5-7B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/CodeQwen1.5-7B')\\n@register_model(\\n    ModelType.qwen1half_moe_a2_7b,\\n    'qwen/Qwen1.5-MoE-A2.7B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.40'],\\n    hf_model_id='Qwen/Qwen1.5-MoE-A2.7B')\\n@register_model(\\n    ModelType.deepseek_coder_1_3b,\\n    'deepseek-ai/deepseek-coder-1.3b-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='deepseek-ai/deepseek-coder-1.3b-base')\\n@register_model(\\n    ModelType.deepseek_coder_6_7b,\\n    'deepseek-ai/deepseek-coder-6.7b-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='deepseek-ai/deepseek-coder-6.7b-base')\\n@register_model(\\n    ModelType.deepseek_coder_33b,\\n    'deepseek-ai/deepseek-coder-33b-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='deepseek-ai/deepseek-coder-33b-base')\\n@register_model(\\n    ModelType.deepseek_coder_1_3b_instruct,\\n    'deepseek-ai/deepseek-coder-1.3b-instruct',\\n    LoRATM.llama,\\n    TemplateType.deepseek_coder,\\n    eos_token='<|EOT|>',\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='deepseek-ai/deepseek-coder-1.3b-instruct')\\n@register_model(\\n    ModelType.deepseek_coder_6_7b_instruct,\\n    'deepseek-ai/deepseek-coder-6.7b-instruct',\\n    LoRATM.llama,\\n    TemplateType.deepseek_coder,\\n    eos_token='<|EOT|>',\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='deepseek-ai/deepseek-coder-6.7b-instruct')\\n@register_model(\\n    ModelType.deepseek_coder_33b_instruct,\\n    'deepseek-ai/deepseek-coder-33b-instruct',\\n    LoRATM.llama,\\n    TemplateType.deepseek_coder,\\n    eos_token='<|EOT|>',\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='deepseek-ai/deepseek-coder-33b-instruct')\\n@register_model(\\n    ModelType.openbuddy_deepseek_67b_chat,\\n    'OpenBuddy/openbuddy-deepseek-67b-v15.2',\\n    LoRATM.llama,\\n    TemplateType.openbuddy,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-deepseek-67b-v15.2')\\n@register_model(\\n    ModelType.deepseek_67b_chat,\\n    'deepseek-ai/deepseek-llm-67b-chat',\\n    LoRATM.llama,\\n    TemplateType.deepseek,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='deepseek-ai/deepseek-llm-67b-chat')\\n@register_model(\\n    ModelType.deepseek_67b,\\n    'deepseek-ai/deepseek-llm-67b-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='deepseek-ai/deepseek-llm-67b-base')\\n@register_model(\\n    ModelType.deepseek_7b_chat,\\n    'deepseek-ai/deepseek-llm-7b-chat',\\n    LoRATM.llama,\\n    TemplateType.deepseek,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='deepseek-ai/deepseek-llm-7b-chat')\\n@register_model(\\n    ModelType.deepseek_7b,\\n    'deepseek-ai/deepseek-llm-7b-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='deepseek-ai/deepseek-llm-7b-base')\\n@register_model(\\n    ModelType.sus_34b_chat,\\n    'SUSTC/SUS-Chat-34B',\\n    LoRATM.llama,\\n    TemplateType.sus,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='SUSTech/SUS-Chat-34B')\\n@register_model(\\n    ModelType.openbuddy_zephyr_7b_chat,\\n    'OpenBuddy/openbuddy-zephyr-7b-v14.1',\\n    LoRATM.llama,\\n    TemplateType.openbuddy,\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-zephyr-7b-v14.1')\\n@register_model(\\n    ModelType.zephyr_7b_beta_chat,\\n    'modelscope/zephyr-7b-beta',\\n    LoRATM.llama,\\n    TemplateType.zephyr,\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='HuggingFaceH4/zephyr-7b-beta')\\n@register_model(\\n    ModelType.yi_coder_1_5b,\\n    '01ai/Yi-Coder-1.5B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-Coder-1.5B')\\n@register_model(\\n    ModelType.yi_coder_9b,\\n    '01ai/Yi-Coder-9B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-Coder-9B')\\n@register_model(\\n    ModelType.yi_coder_1_5b_chat,\\n    '01ai/Yi-Coder-1.5B-Chat',\\n    LoRATM.llama,\\n    TemplateType.yi_coder,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-Coder-1.5B-Chat')\\n@register_model(\\n    ModelType.yi_coder_9b_chat,\\n    '01ai/Yi-Coder-9B-Chat',\\n    LoRATM.llama,\\n    TemplateType.yi_coder,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-Coder-9B-Chat')\\n@register_model(\\n    ModelType.yi_6b_chat,\\n    '01ai/Yi-6B-Chat',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    eos_token='<|im_end|>',\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-6B-Chat')\\n@register_model(\\n    ModelType.yi_6b_chat_awq,\\n    '01ai/Yi-6B-Chat-4bits',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    eos_token='<|im_end|>',\\n    requires=['autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-6B-Chat-4bits')\\n@register_model(\\n    ModelType.yi_6b_chat_int8,\\n    '01ai/Yi-6B-Chat-8bits',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    eos_token='<|im_end|>',\\n    requires=['auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='01-ai/Yi-6B-Chat-8bits')\\n@register_model(\\n    ModelType.yi_34b_chat,\\n    '01ai/Yi-34B-Chat',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    eos_token='<|im_end|>',\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-34B-Chat')\\n@register_model(\\n    ModelType.yi_34b_chat_awq,\\n    '01ai/Yi-34B-Chat-4bits',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    eos_token='<|im_end|>',\\n    requires=['autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-34B-Chat-4bits')\\n@register_model(\\n    ModelType.yi_34b_chat_int8,\\n    '01ai/Yi-34B-Chat-8bits',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    eos_token='<|im_end|>',\\n    requires=['auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='01-ai/Yi-34B-Chat-8bits')\\n@register_model(\\n    ModelType.yi_34b_200k,\\n    '01ai/Yi-34B-200K',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-34B-200K')\\n@register_model(\\n    ModelType.yi_34b,\\n    '01ai/Yi-34B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-34B')\\n@register_model(\\n    ModelType.yi_6b_200k,\\n    '01ai/Yi-6B-200K',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-6B-200K')\\n@register_model(\\n    ModelType.yi_9b,\\n    '01ai/Yi-9B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-9B')\\n@register_model(\\n    ModelType.yi_9b_200k,\\n    '01ai/Yi-9B-200K',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-9B-200K')\\n@register_model(\\n    ModelType.yi_6b,\\n    '01ai/Yi-6B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-6B')\\n@register_model(\\n    ModelType.ziya2_13b_chat,\\n    'Fengshenbang/Ziya2-13B-Chat',\\n    LoRATM.llama,\\n    TemplateType.ziya,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='IDEA-CCNL/Ziya2-13B-Chat')\\n@register_model(\\n    ModelType.ziya2_13b,\\n    'Fengshenbang/Ziya2-13B-Base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='IDEA-CCNL/Ziya2-13B-Base')\\n@register_model(\\n    ModelType.openbuddy_mixtral_moe_7b_chat,\\n    'OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k',\\n    LoRATM.llama,\\n    TemplateType.openbuddy,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k')\\n@register_model(\\n    ModelType.openbuddy_mistral_7b_chat,\\n    'OpenBuddy/openbuddy-mistral-7b-v17.1-32k',\\n    LoRATM.llama,\\n    TemplateType.openbuddy,\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-mistral-7b-v17.1-32k')\\n@register_model(\\n    ModelType.openbuddy_llama2_70b_chat,\\n    'OpenBuddy/openbuddy-llama2-70b-v10.1-bf16',\\n    LoRATM.llama,\\n    TemplateType.openbuddy,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-llama2-70b-v10.1-bf16')\\n@register_model(\\n    ModelType.openbuddy_llama_65b_chat,\\n    'OpenBuddy/openbuddy-llama-65b-v8-bf16',\\n    LoRATM.llama,\\n    TemplateType.openbuddy,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-llama-65b-v8-bf16')\\n@register_model(\\n    ModelType.openbuddy_llama3_70b_chat,\\n    'OpenBuddy/openbuddy-llama3-70b-v21.1-8k',\\n    LoRATM.llama,\\n    TemplateType.openbuddy2,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-llama3-70b-v21.1-8k')\\n@register_model(\\n    ModelType.openbuddy_llama3_8b_chat,\\n    'OpenBuddy/openbuddy-llama3-8b-v21.1-8k',\\n    LoRATM.llama,\\n    TemplateType.openbuddy2,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-llama3-8b-v21.1-8k')\\n@register_model(\\n    ModelType.openbuddy_llama2_13b_chat,\\n    'OpenBuddy/openbuddy-llama2-13b-v8.1-fp16',\\n    LoRATM.llama,\\n    TemplateType.openbuddy,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='OpenBuddy/openbuddy-llama2-13b-v8.1-fp16')\\n@register_model(\\n    ModelType.mistral_7b_instruct,\\n    'AI-ModelScope/Mistral-7B-Instruct-v0.1',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='mistralai/Mistral-7B-Instruct-v0.1')\\n@register_model(\\n    ModelType.mistral_7b_instruct_v2,\\n    'AI-ModelScope/Mistral-7B-Instruct-v0.2',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='mistralai/Mistral-7B-Instruct-v0.2')\\n@register_model(\\n    ModelType.mistral_7b_instruct_v3,\\n    'LLM-Research/Mistral-7B-Instruct-v0.3',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    ignore_file_pattern=['consolidated.safetensors'],\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='mistralai/Mistral-7B-Instruct-v0.3')\\n@register_model(\\n    ModelType.mistral_7b,\\n    'AI-ModelScope/Mistral-7B-v0.1',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='mistralai/Mistral-7B-v0.1')\\n@register_model(\\n    ModelType.codestral_22b,\\n    'swift/Codestral-22B-v0.1',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.34'],\\n    ignore_file_pattern=['consolidated.safetensors'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='mistralai/Codestral-22B-v0.1')\\n@register_model(\\n    ModelType.mistral_7b_v2,\\n    'AI-ModelScope/Mistral-7B-v0.2-hf',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.34'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='alpindale/Mistral-7B-v0.2-hf')\\n@register_model(\\n    ModelType.mixtral_moe_7b,\\n    'AI-ModelScope/Mixtral-8x7B-v0.1',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.36'],\\n    ignore_file_pattern=[r'.+\\\\.pt$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='mistralai/Mixtral-8x7B-v0.1')\\n@register_model(\\n    ModelType.mixtral_moe_7b_instruct,\\n    'AI-ModelScope/Mixtral-8x7B-Instruct-v0.1',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    requires=['transformers>=4.36'],\\n    ignore_file_pattern=[r'.+\\\\.pt$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='mistralai/Mixtral-8x7B-Instruct-v0.1')\\n@register_model(\\n    ModelType.mixtral_moe_8x22b_v1,\\n    'AI-ModelScope/Mixtral-8x22B-v0.1',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='mistral-community/Mixtral-8x22B-v0.1')\\n@register_model(\\n    ModelType.mistral_large_instruct_2407,\\n    'LLM-Research/Mistral-Large-Instruct-2407',\\n    LoRATM.llama,\\n    TemplateType.mistral_nemo,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=['^consolidated'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='mistralai/Mistral-Large-Instruct-2407')\\n@register_model(\\n    ModelType.mistral_small_instruct_2409,\\n    'AI-ModelScope/Mistral-Small-Instruct-2409',\\n    LoRATM.llama,\\n    TemplateType.mistral_nemo,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=['^consolidated'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='mistralai/Mistral-Small-Instruct-2409')\\n@register_model(\\n    ModelType.mistral_nemo_instruct_2407,\\n    'AI-ModelScope/Mistral-Nemo-Instruct-2407',\\n    LoRATM.llama,\\n    TemplateType.mistral_nemo,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=['^consolidated'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='mistralai/Mistral-Nemo-Instruct-2407')\\n@register_model(\\n    ModelType.mistral_nemo_base_2407,\\n    'AI-ModelScope/Mistral-Nemo-Base-2407',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.43'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='mistralai/Mistral-Nemo-Base-2407')\\n@register_model(\\n    ModelType.dbrx_base,\\n    'AI-ModelScope/dbrx-base',\\n    LoRATM.dbrx,\\n    TemplateType.dbrx,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='databricks/dbrx-base')\\n@register_model(\\n    ModelType.dbrx_instruct,\\n    'AI-ModelScope/dbrx-instruct',\\n    LoRATM.dbrx,\\n    TemplateType.dbrx,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='databricks/dbrx-instruct')\\ndef get_model_tokenizer_with_flash_attn(model_dir: str,\\n                                        torch_dtype: torch.dtype,\\n                                        model_kwargs: Dict[str, Any],\\n                                        load_model: bool = True,\\n                                        model_config=None,\\n                                        **kwargs):\\n    if model_config is None:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', None)\\n    config_list = [model_config]\\n    for k in ['language_config', 'llm_config', 'text_config']:\\n        llm_config = getattr(model_config, k, None)\\n        if llm_config:\\n            config_list.append(llm_config)\\n            break\\n    for config in config_list:\\n        if version.parse(transformers.__version__) >= version.parse('4.36'):\\n            if use_flash_attn:\\n                config._attn_implementation = 'flash_attention_2'\\n            elif use_flash_attn is False:\\n                config._attn_implementation = 'eager'\\n        else:\\n            config._flash_attn_2_enabled = use_flash_attn\\n    return get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.mplug_owl3_7b_chat,\\n    'iic/mPLUG-Owl3-7B-240728',\\n    LoRATM.mplug_owl3,\\n    TemplateType.mplug_owl3,\\n    requires=['transformers>=4.36', 'icecream'],  # decord\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='mPLUG/mPLUG-Owl3-7B-240728')\\ndef get_model_tokenizer_mplug_owl3(model_dir: str,\\n                                   torch_dtype: torch.dtype,\\n                                   model_kwargs: Dict[str, Any],\\n                                   load_model: bool = True,\\n                                   **kwargs):\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    processor = model.init_processor(tokenizer)\\n    tokenizer.processor = processor\\n    func_list = ['generate', 'forward']\\n    _use_submodel_func(model, 'language_model', func_list)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.yi_1_5_6b,\\n    '01ai/Yi-1.5-6B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-6B')\\n@register_model(\\n    ModelType.yi_1_5_6b_chat,\\n    '01ai/Yi-1.5-6B-Chat',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-6B-Chat')\\n@register_model(\\n    ModelType.yi_1_5_6b_chat_awq_int4,\\n    'AI-ModelScope/Yi-1.5-6B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    requires=['autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='modelscope/Yi-1.5-6B-Chat-AWQ')\\n@register_model(\\n    ModelType.yi_1_5_6b_chat_gptq_int4,\\n    'AI-ModelScope/Yi-1.5-6B-Chat-GPTQ',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    requires=['auto_gptq>=0.5'],\\n    function_kwargs={'gptq_bits': 4},\\n    torch_dtype=torch.float16,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='modelscope/Yi-1.5-6B-Chat-GPTQ')\\n@register_model(\\n    ModelType.yi_1_5_9b_chat_awq_int4,\\n    'AI-ModelScope/Yi-1.5-9B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    requires=['autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='modelscope/Yi-1.5-9B-Chat-AWQ')\\n@register_model(\\n    ModelType.yi_1_5_9b_chat_gptq_int4,\\n    'AI-ModelScope/Yi-1.5-9B-Chat-GPTQ',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    requires=['auto_gptq>=0.5'],\\n    function_kwargs={'gptq_bits': 4},\\n    torch_dtype=torch.float16,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='modelscope/Yi-1.5-9B-Chat-GPTQ')\\n@register_model(\\n    ModelType.yi_1_5_34b_chat_awq_int4,\\n    'AI-ModelScope/Yi-1.5-34B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    requires=['autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='modelscope/Yi-1.5-34B-Chat-AWQ')\\n@register_model(\\n    ModelType.yi_1_5_34b_chat_gptq_int4,\\n    'AI-ModelScope/Yi-1.5-34B-Chat-GPTQ',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    requires=['auto_gptq>=0.5'],\\n    function_kwargs={'gptq_bits': 4},\\n    torch_dtype=torch.float16,\\n    support_flash_attn=True,\\n    hf_model_id='modelscope/Yi-1.5-34B-Chat-GPTQ',\\n    support_vllm=True)\\n@register_model(\\n    ModelType.yi_1_5_9b,\\n    '01ai/Yi-1.5-9B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-9B')\\n@register_model(\\n    ModelType.yi_1_5_9b_chat,\\n    '01ai/Yi-1.5-9B-Chat',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-9B-Chat')\\n@register_model(\\n    ModelType.yi_1_5_9b_chat_16k,\\n    '01ai/Yi-1.5-9B-Chat-16K',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-9B-Chat-16K')\\n@register_model(\\n    ModelType.yi_1_5_34b,\\n    '01ai/Yi-1.5-34B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-34B')\\n@register_model(\\n    ModelType.yi_1_5_34b_chat,\\n    '01ai/Yi-1.5-34B-Chat',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-34B-Chat')\\n@register_model(\\n    ModelType.yi_1_5_34b_chat_16k,\\n    '01ai/Yi-1.5-34B-Chat-16K',\\n    LoRATM.llama,\\n    TemplateType.chatml,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='01-ai/Yi-1.5-34B-Chat-16K')\\ndef get_model_tokenizer_yi1_5(model_dir, *args, **kwargs):\\n    tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False)\\n    return get_model_tokenizer_with_flash_attn(model_dir, *args, tokenizer=tokenizer, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.florence_2_base,\\n    'AI-ModelScope/Florence-2-base',\\n    LoRATM.florence,\\n    TemplateType.florence,\\n    support_flash_attn=True,\\n    hf_model_id='microsoft/Florence-2-base',\\n    tags=['multi-modal', 'vision'])\\n@register_model(\\n    ModelType.florence_2_base_ft,\\n    'AI-ModelScope/Florence-2-base-ft',\\n    LoRATM.florence,\\n    TemplateType.florence,\\n    support_flash_attn=True,\\n    hf_model_id='microsoft/Florence-2-base-ft',\\n    tags=['multi-modal', 'vision'])\\n@register_model(\\n    ModelType.florence_2_large,\\n    'AI-ModelScope/Florence-2-large',\\n    LoRATM.florence,\\n    TemplateType.florence,\\n    support_flash_attn=True,\\n    hf_model_id='microsoft/Florence-2-large',\\n    tags=['multi-modal', 'vision'])\\n@register_model(\\n    ModelType.florence_2_large_ft,\\n    'AI-ModelScope/Florence-2-large-ft',\\n    LoRATM.florence,\\n    TemplateType.florence,\\n    support_flash_attn=True,\\n    hf_model_id='microsoft/Florence-2-large-ft',\\n    tags=['multi-modal', 'vision'])\\ndef get_model_tokenizer_florence(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 model_config=None,\\n                                 **kwargs):\\n    from transformers import AutoProcessor\\n    processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)\\n    with ignore_check_imports():\\n        model, tokenizer = get_model_tokenizer_with_flash_attn(\\n            model_dir, torch_dtype, model_kwargs, load_model, tokenizer=processor.tokenizer, **kwargs)\\n\\n    tokenizer.processor = processor\\n    # model.vision_tower.enable_checkpoint = True\\n    _use_submodel_func(model, 'language_model', ['generate', 'forward'])\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.phi3_small_8k_instruct,\\n    'LLM-Research/Phi-3-small-8k-instruct',\\n    LoRATM.phi3_small,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_gradient_checkpointing=False,\\n    support_vllm=True,\\n    hf_model_id='microsoft/Phi-3-small-8k-instruct')\\n@register_model(\\n    ModelType.phi3_small_128k_instruct,\\n    'LLM-Research/Phi-3-small-128k-instruct',\\n    LoRATM.phi3_small,\\n    TemplateType.phi3,\\n    requires=['transformers>=4.36'],\\n    support_flash_attn=True,\\n    support_gradient_checkpointing=False,\\n    support_vllm=True,\\n    hf_model_id='microsoft/Phi-3-small-128k-instruct')\\ndef get_model_tokenizer_phi3_small(model_dir: str,\\n                                   torch_dtype: torch.dtype,\\n                                   model_kwargs: Dict[str, Any],\\n                                   load_model: bool = True,\\n                                   model_config=None,\\n                                   **kwargs):\\n    if model_config is None:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if version.parse(transformers.__version__) >= version.parse('4.36'):\\n        if use_flash_attn:\\n            model_config._attn_implementation = 'flash_attention_2'\\n    else:\\n        model_config._flash_attn_2_enabled = use_flash_attn\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n    def rotary_emb(self, query_states, key_states, **kwargs):\\n        q_type = query_states.dtype\\n        k_type = key_states.dtype\\n        query_states, key_states = self.rotory_emb_origin(query_states, key_states, **kwargs)\\n        query_states = query_states.to(q_type)\\n        key_states = key_states.to(k_type)\\n        return query_states, key_states\\n\\n    for i in range(32):\\n        re = model.model.layers[i].self_attn.rotary_emb\\n        re.rotory_emb_origin = re.forward\\n        re.forward = MethodType(rotary_emb, re)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.qwen2_math_1_5b_instruct,\\n    'qwen/Qwen2-Math-1.5B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-Math-1.5B-Instruct')\\n@register_model(\\n    ModelType.qwen2_math_1_5b,\\n    'qwen/Qwen2-Math-1.5B',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-Math-1.5B')\\n@register_model(\\n    ModelType.qwen2_math_7b_instruct,\\n    'qwen/Qwen2-Math-7B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-Math-7B-Instruct')\\n@register_model(\\n    ModelType.qwen2_math_7b,\\n    'qwen/Qwen2-Math-7B',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-Math-7B')\\n@register_model(\\n    ModelType.qwen2_math_72b_instruct,\\n    'qwen/Qwen2-Math-72B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-Math-72B-Instruct')\\n@register_model(\\n    ModelType.qwen2_math_72b,\\n    'qwen/Qwen2-Math-72B',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-Math-72B')\\n@register_model(\\n    ModelType.qwen2_57b_a14b_instruct_int4,\\n    'qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['auto_gptq>=0.5', 'transformers>=4.40'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    hf_model_id='Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen2_57b_a14b_instruct,\\n    'qwen/Qwen2-57B-A14B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.40'],\\n    hf_model_id='Qwen/Qwen2-57B-A14B-Instruct')\\n@register_model(\\n    ModelType.qwen2_0_5b_instruct_int4,\\n    'qwen/Qwen2-0.5B-Instruct-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 4},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-0.5B-Instruct-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen2_0_5b_instruct_int8,\\n    'qwen/Qwen2-0.5B-Instruct-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 8},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-0.5B-Instruct-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen2_1_5b_instruct_int4,\\n    'qwen/Qwen2-1.5B-Instruct-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 4},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-1.5B-Instruct-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen2_1_5b_instruct_int8,\\n    'qwen/Qwen2-1.5B-Instruct-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 8},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-1_5B-Instruct-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen2_7b_instruct_int4,\\n    'qwen/Qwen2-7B-Instruct-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 4},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-7B-Instruct-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen2_7b_instruct_int8,\\n    'qwen/Qwen2-7B-Instruct-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 8},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-7B-Instruct-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen2_72b_instruct_int4,\\n    'qwen/Qwen2-72B-Instruct-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 4},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-72B-Instruct-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen2_72b_instruct_int8,\\n    'qwen/Qwen2-72B-Instruct-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    function_kwargs={'gptq_bits': 8},\\n    torch_dtype=torch.float16,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-72B-Instruct-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen2_0_5b_instruct_awq,\\n    'qwen/Qwen2-0.5B-Instruct-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=False,\\n    function_kwargs={'is_awq': True},\\n    torch_dtype=torch.float16,\\n    requires=['transformers>=4.37', 'autoawq'],\\n    hf_model_id='Qwen/Qwen2-0.5B-Instruct-AWQ')\\n@register_model(\\n    ModelType.qwen2_1_5b_instruct_awq,\\n    'qwen/Qwen2-1.5B-Instruct-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    torch_dtype=torch.float16,\\n    requires=['transformers>=4.37', 'autoawq'],\\n    hf_model_id='Qwen/Qwen2-1.5B-Instruct-AWQ')\\n@register_model(\\n    ModelType.qwen2_7b_instruct_awq,\\n    'qwen/Qwen2-7B-Instruct-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    torch_dtype=torch.float16,\\n    requires=['transformers>=4.37', 'autoawq'],\\n    hf_model_id='Qwen/Qwen2-7B-Instruct-AWQ')\\n@register_model(\\n    ModelType.qwen2_72b_instruct_awq,\\n    'qwen/Qwen2-72B-Instruct-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    torch_dtype=torch.float16,\\n    requires=['transformers>=4.37', 'autoawq'],\\n    hf_model_id='Qwen/Qwen2-72B-Instruct-AWQ')\\n@register_model(\\n    ModelType.qwen2_0_5b_instruct,\\n    'qwen/Qwen2-0.5B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-0.5B-Instruct')\\n@register_model(\\n    ModelType.qwen2_1_5b_instruct,\\n    'qwen/Qwen2-1.5B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-1.5B-Instruct')\\n@register_model(\\n    ModelType.qwen2_7b_instruct,\\n    'qwen/Qwen2-7B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-7B-Instruct')\\n@register_model(\\n    ModelType.qwen2_72b_instruct,\\n    'qwen/Qwen2-72B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen2-72B-Instruct')\\n@register_model(\\n    ModelType.qwen1half_0_5b_chat_awq,\\n    'qwen/Qwen1.5-0.5B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=False,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-0.5B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_1_8b_chat_awq,\\n    'qwen/Qwen1.5-1.8B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-1.8B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_4b_chat_awq,\\n    'qwen/Qwen1.5-4B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-4B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_7b_chat_awq,\\n    'qwen/Qwen1.5-7B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-7B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_14b_chat_awq,\\n    'qwen/Qwen1.5-14B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-14B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_32b_chat_awq,\\n    'qwen/Qwen1.5-32B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-32B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_72b_chat_awq,\\n    'qwen/Qwen1.5-72B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-72B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_110b_chat_awq,\\n    'qwen/Qwen1.5-110B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/Qwen1.5-110B-Chat-AWQ')\\n@register_model(\\n    ModelType.codeqwen1half_7b_chat_awq,\\n    'qwen/CodeQwen1.5-7B-Chat-AWQ',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    function_kwargs={'is_awq': True},\\n    requires=['transformers>=4.37', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    hf_model_id='Qwen/CodeQwen1.5-7B-Chat-AWQ')\\n@register_model(\\n    ModelType.qwen1half_0_5b_chat,\\n    'qwen/Qwen1.5-0.5B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-0.5B-Chat')\\n@register_model(\\n    ModelType.qwen1half_1_8b_chat,\\n    'qwen/Qwen1.5-1.8B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-1.8B-Chat')\\n@register_model(\\n    ModelType.qwen1half_4b_chat,\\n    'qwen/Qwen1.5-4B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-4B-Chat')\\n@register_model(\\n    ModelType.qwen1half_7b_chat,\\n    'qwen/Qwen1.5-7B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-7B-Chat')\\n@register_model(\\n    ModelType.qwen1half_14b_chat,\\n    'qwen/Qwen1.5-14B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-14B-Chat')\\n@register_model(\\n    ModelType.qwen1half_32b_chat,\\n    'qwen/Qwen1.5-32B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-32B-Chat')\\n@register_model(\\n    ModelType.qwen1half_72b_chat,\\n    'qwen/Qwen1.5-72B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    support_megatron=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-72B-Chat')\\n@register_model(\\n    ModelType.qwen1half_110b_chat,\\n    'qwen/Qwen1.5-110B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/Qwen1.5-110B-Chat')\\n@register_model(\\n    ModelType.qwen1half_moe_a2_7b_chat,\\n    'qwen/Qwen1.5-MoE-A2.7B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.40'],\\n    tags=['moe'],\\n    hf_model_id='Qwen/Qwen1.5-MoE-A2.7B-Chat')\\n@register_model(\\n    ModelType.codeqwen1half_7b_chat,\\n    'qwen/CodeQwen1.5-7B-Chat',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.37'],\\n    hf_model_id='Qwen/CodeQwen1.5-7B-Chat')\\ndef get_model_tokenizer_qwen2_chat(model_dir: str,\\n                                   torch_dtype: torch.dtype,\\n                                   model_kwargs: Dict[str, Any],\\n                                   load_model: bool = True,\\n                                   **kwargs):\\n    kwargs['eos_token'] = '<|im_end|>'\\n    return get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n\\n\\nfor model_size in ['0.5B', '1.5B', '3B', '7B', '14B', '32B', '72B']:\\n    model_size_lower = model_size.lower().replace('.', '_')\\n    register_model(\\n        f'qwen2_5-{model_size_lower}',\\n        f'qwen/Qwen2.5-{model_size}',\\n        LoRATM.llama,\\n        TemplateType.default_generation,\\n        get_model_tokenizer_with_flash_attn,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        support_lmdeploy=True,\\n        requires=['transformers>=4.37'],\\n        hf_model_id=f'Qwen/Qwen2.5-{model_size}')\\n    register_model(\\n        f'qwen2_5-{model_size_lower}-instruct',\\n        f'qwen/Qwen2.5-{model_size}-Instruct',\\n        LoRATM.llama,\\n        TemplateType.qwen2_5,\\n        get_model_tokenizer_qwen2_chat,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        support_lmdeploy=True,\\n        requires=['transformers>=4.37'],\\n        hf_model_id=f'Qwen/Qwen2.5-{model_size}-Instruct')\\n    for quant_bits in [4, 8]:\\n        quant_type = f'GPTQ-Int{quant_bits}'\\n        quant_type_lower = quant_type.lower()\\n        register_model(\\n            f'qwen2_5-{model_size_lower}-instruct-{quant_type_lower}',\\n            f'qwen/Qwen2.5-{model_size}-Instruct-{quant_type}',\\n            LoRATM.llama,\\n            TemplateType.qwen2_5,\\n            get_model_tokenizer_qwen2_chat,\\n            support_flash_attn=True,\\n            support_vllm=True,\\n            function_kwargs={'gptq_bits': quant_bits},\\n            torch_dtype=torch.float16,\\n            requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n            hf_model_id=f'Qwen/Qwen2.5-{model_size}-Instruct-{quant_type}')\\n\\n    register_model(\\n        f'qwen2_5-{model_size_lower}-instruct-awq',\\n        f'qwen/Qwen2.5-{model_size}-Instruct-AWQ',\\n        LoRATM.llama,\\n        TemplateType.qwen2_5,\\n        get_model_tokenizer_qwen2_chat,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        function_kwargs={'is_awq': True},\\n        torch_dtype=torch.float16,\\n        requires=['transformers>=4.37', 'autoawq'],\\n        hf_model_id=f'Qwen/Qwen2.5-{model_size}-Instruct-AWQ')\\n\\nfor model_size in ['1.5B', '7B', '72B']:\\n    model_size_lower = model_size.lower().replace('.', '_')\\n    register_model(\\n        f'qwen2_5-math-{model_size_lower}',\\n        f'qwen/Qwen2.5-Math-{model_size}',\\n        LoRATM.llama,\\n        TemplateType.default_generation,\\n        get_model_tokenizer_with_flash_attn,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        support_lmdeploy=True,\\n        requires=['transformers>=4.37'],\\n        hf_model_id=f'Qwen/Qwen2.5-Math-{model_size}')\\n    register_model(\\n        f'qwen2_5-math-{model_size_lower}-instruct',\\n        f'qwen/Qwen2.5-Math-{model_size}-Instruct',\\n        LoRATM.llama,\\n        TemplateType.qwen2_5,\\n        get_model_tokenizer_qwen2_chat,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        support_lmdeploy=True,\\n        requires=['transformers>=4.37'],\\n        hf_model_id=f'Qwen/Qwen2.5-Math-{model_size}-Instruct')\\n\\nfor model_size in ['1.5B', '7B']:\\n    model_size_lower = model_size.lower().replace('.', '_')\\n    register_model(\\n        f'qwen2_5-coder-{model_size_lower}',\\n        f'qwen/Qwen2.5-Coder-{model_size}',\\n        LoRATM.llama,\\n        TemplateType.default_generation,\\n        get_model_tokenizer_with_flash_attn,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        support_lmdeploy=True,\\n        requires=['transformers>=4.37'],\\n        hf_model_id=f'Qwen/Qwen2.5-Coder-{model_size}')\\n    register_model(\\n        f'qwen2_5-coder-{model_size_lower}-instruct',\\n        f'qwen/Qwen2.5-Coder-{model_size}-Instruct',\\n        LoRATM.llama,\\n        TemplateType.qwen2_5,\\n        get_model_tokenizer_qwen2_chat,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        support_lmdeploy=True,\\n        requires=['transformers>=4.37'],\\n        hf_model_id=f'Qwen/Qwen2.5-Coder-{model_size}-Instruct')\\n\\n\\n@register_model(\\n    ModelType.qwen2_audio_7b_instruct,\\n    'qwen/Qwen2-Audio-7B-Instruct',\\n    LoRATM.qwen2_audio,\\n    TemplateType.qwen2_audio,\\n    support_flash_attn=True,\\n    requires=['librosa', 'transformers>=4.45'],\\n    tags=['multi-modal', 'audio'],\\n    hf_model_id='Qwen/Qwen2-Audio-7B-Instruct')\\n@register_model(\\n    ModelType.qwen2_audio_7b,\\n    'qwen/Qwen2-Audio-7B',\\n    LoRATM.qwen2_audio,\\n    TemplateType.qwen2_audio_generation,\\n    support_flash_attn=True,\\n    requires=['librosa', 'transformers>=4.45'],\\n    eos_token='<|endoftext|>',\\n    tags=['multi-modal', 'audio'],\\n    hf_model_id='Qwen/Qwen2-Audio-7B')\\ndef get_model_tokenizer_qwen2_audio(model_dir: str,\\n                                    torch_dtype: torch.dtype,\\n                                    model_kwargs: Dict[str, Any],\\n                                    load_model: bool = True,\\n                                    **kwargs):\\n    from transformers import Qwen2AudioForConditionalGeneration, AutoProcessor\\n    processor = AutoProcessor.from_pretrained(model_dir)\\n    kwargs['automodel_class'] = Qwen2AudioForConditionalGeneration\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    tokenizer.processor = processor\\n    return model, tokenizer\\n\\n\\ndef get_model_tokenizer_qwen2_vl(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 **kwargs):\\n    try:\\n        from torchvision.io import video\\n        if not hasattr(video, '_patching'):\\n            # not read audio\\n            video._patching = True\\n            _old_read_from_stream = video._read_from_stream\\n\\n            def _read_from_stream(container: 'av.container.Container', start_offset: float, end_offset: float,\\n                                  pts_unit: str, stream: 'av.stream.Stream', *args, **kwargs) -> List['av.frame.Frame']:\\n                if stream.type == 'video':\\n                    return _old_read_from_stream(container, start_offset, end_offset, pts_unit, stream, *args, **kwargs)\\n                return []\\n\\n            video._read_from_stream = _read_from_stream\\n    except Exception:\\n        pass\\n\\n    from transformers import Qwen2VLForConditionalGeneration, AutoProcessor\\n    processor = AutoProcessor.from_pretrained(model_dir)\\n    kwargs['automodel_class'] = Qwen2VLForConditionalGeneration\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    tokenizer.processor = processor\\n    if model is not None:\\n        model.model.embed_tokens.register_forward_hook(_clone_hook)\\n        model.model.embed_tokens.register_forward_hook(_output_device_map_hook)\\n    return model, tokenizer\\n\\n\\nfor model_size in ['2B', '7B', '72B']:\\n    model_size_lower = model_size.lower().replace('.', '_')\\n\\n    register_model(\\n        f'qwen2-vl-{model_size_lower}',\\n        f'qwen/Qwen2-VL-{model_size}',\\n        LoRATM.qwen2_vl,\\n        TemplateType.qwen2_vl_generation,\\n        get_model_tokenizer_qwen2_vl,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        placeholder_tokens=['<|image_pad|>', '<|video_pad|>'],\\n        requires=['transformers>=4.45.dev.0', 'qwen_vl_utils'],\\n        tags=['multi-modal', 'vision', 'video'],\\n        hf_model_id=f'Qwen/Qwen2-VL-{model_size}')\\n    register_model(\\n        f'qwen2-vl-{model_size_lower}-instruct',\\n        f'qwen/Qwen2-VL-{model_size}-Instruct',\\n        LoRATM.qwen2_vl,\\n        TemplateType.qwen2_vl,\\n        get_model_tokenizer_qwen2_vl,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        placeholder_tokens=['<|image_pad|>', '<|video_pad|>'],\\n        requires=['transformers>=4.45.dev.0', 'qwen_vl_utils'],  # 'pyav'\\n        tags=['multi-modal', 'vision', 'video'],\\n        hf_model_id=f'Qwen/Qwen2-VL-{model_size}-Instruct')\\n    for quant_bits in [4, 8]:\\n        quant_type = f'GPTQ-Int{quant_bits}'\\n        quant_type_lower = quant_type.lower()\\n        register_model(\\n            f'qwen2-vl-{model_size_lower}-instruct-{quant_type_lower}',\\n            f'qwen/Qwen2-VL-{model_size}-Instruct-{quant_type}',\\n            LoRATM.qwen2_vl,\\n            TemplateType.qwen2_vl,\\n            get_model_tokenizer_qwen2_vl,\\n            support_flash_attn=True,\\n            support_vllm=True,\\n            placeholder_tokens=['<|image_pad|>', '<|video_pad|>'],\\n            requires=['transformers>=4.45.dev.0', 'qwen_vl_utils', 'auto_gptq>=0.5'],\\n            tags=['multi-modal', 'vision', 'video'],\\n            function_kwargs={'gptq_bits': quant_bits},\\n            torch_dtype=torch.float16,\\n            hf_model_id=f'Qwen/Qwen2-VL-{model_size}-Instruct-{quant_type}')\\n\\n    register_model(\\n        f'qwen2-vl-{model_size_lower}-instruct-awq',\\n        f'qwen/Qwen2-VL-{model_size}-Instruct-AWQ',\\n        LoRATM.qwen2_vl,\\n        TemplateType.qwen2_vl,\\n        get_model_tokenizer_qwen2_vl,\\n        support_flash_attn=True,\\n        support_vllm=True,\\n        placeholder_tokens=['<|image_pad|>', '<|video_pad|>'],\\n        requires=['transformers>=4.45.dev.0', 'qwen_vl_utils', 'autoawq'],\\n        tags=['multi-modal', 'vision', 'video'],\\n        function_kwargs={'is_awq': True},\\n        torch_dtype=torch.float16,\\n        hf_model_id=f'Qwen/Qwen2-VL-{model_size}-Instruct-AWQ')\\n\\n\\n@register_model(\\n    ModelType.qwen1half_0_5b_chat_int4,\\n    'qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_0_5b_chat_int8,\\n    'qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-0.5B-Chat-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen1half_1_8b_chat_int4,\\n    'qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_1_8b_chat_int8,\\n    'qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen1half_4b_chat_int4,\\n    'qwen/Qwen1.5-4B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-4B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_4b_chat_int8,\\n    'qwen/Qwen1.5-4B-Chat-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-4B-Chat-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen1half_7b_chat_int4,\\n    'qwen/Qwen1.5-7B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-7B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_7b_chat_int8,\\n    'qwen/Qwen1.5-7B-Chat-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-7B-Chat-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen1half_14b_chat_int4,\\n    'qwen/Qwen1.5-14B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-14B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_14b_chat_int8,\\n    'qwen/Qwen1.5-14B-Chat-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-14B-Chat-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen1half_32b_chat_int4,\\n    'qwen/Qwen1.5-32B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-32B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_72b_chat_int4,\\n    'qwen/Qwen1.5-72B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-72B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_110b_chat_int4,\\n    'qwen/Qwen1.5-110B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-110B-Chat-GPTQ-Int4')\\n@register_model(\\n    ModelType.qwen1half_72b_chat_int8,\\n    'qwen/Qwen1.5-72B-Chat-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.37'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen1.5-72B-Chat-GPTQ-Int8')\\n@register_model(\\n    ModelType.qwen1half_moe_a2_7b_chat_int4,\\n    'qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5', 'transformers>=4.40'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    tags=['moe'],\\n    hf_model_id='Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4')\\ndef get_model_tokenizer_qwen2_intx(model_dir: str,\\n                                   torch_dtype: torch.dtype,\\n                                   model_kwargs: Dict[str, Any],\\n                                   load_model: bool = True,\\n                                   **kwargs):\\n    kwargs['get_qwen_function'] = get_model_tokenizer_qwen2_chat\\n    return get_model_tokenizer_qwen_intx(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.internlm2_5_1_8b,\\n    'Shanghai_AI_Laboratory/internlm2_5-1_8b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2_5-1_8b')\\n@register_model(\\n    ModelType.internlm2_5_1_8b_chat,\\n    'Shanghai_AI_Laboratory/internlm2_5-1_8b-chat',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2_5-1_8b-chat')\\n@register_model(\\n    ModelType.internlm2_5_7b,\\n    'Shanghai_AI_Laboratory/internlm2_5-7b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2_5-7b')\\n@register_model(\\n    ModelType.internlm2_5_7b_chat,\\n    'Shanghai_AI_Laboratory/internlm2_5-7b-chat',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2_5-7b-chat')\\n@register_model(\\n    ModelType.internlm2_5_7b_chat_1m,\\n    'Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2_5-7b-chat-1m')\\n@register_model(\\n    ModelType.internlm2_5_20b,\\n    'Shanghai_AI_Laboratory/internlm2_5-20b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2_5-20b')\\n@register_model(\\n    ModelType.internlm2_5_20b_chat,\\n    'Shanghai_AI_Laboratory/internlm2_5-20b-chat',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2_5-20b-chat')\\n@register_model(\\n    ModelType.internlm2_1_8b,\\n    'Shanghai_AI_Laboratory/internlm2-1_8b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-1_8b')\\n@register_model(\\n    ModelType.internlm2_1_8b_sft_chat,\\n    'Shanghai_AI_Laboratory/internlm2-chat-1_8b-sft',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-chat-1_8b-sft')\\n@register_model(\\n    ModelType.internlm2_1_8b_chat,\\n    'Shanghai_AI_Laboratory/internlm2-chat-1_8b',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-chat-1_8b')\\n@register_model(\\n    ModelType.internlm2_math_7b,\\n    'Shanghai_AI_Laboratory/internlm2-math-base-7b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['math'],\\n    hf_model_id='internlm/internlm2-math-base-7b')\\n@register_model(\\n    ModelType.internlm2_math_20b,\\n    'Shanghai_AI_Laboratory/internlm2-math-base-20b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['math'],\\n    hf_model_id='internlm/internlm2-math-base-20b')\\n@register_model(\\n    ModelType.internlm2_math_7b_chat,\\n    'Shanghai_AI_Laboratory/internlm2-math-7b',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['math'],\\n    hf_model_id='internlm/internlm2-math-7b')\\n@register_model(\\n    ModelType.internlm2_math_20b_chat,\\n    'Shanghai_AI_Laboratory/internlm2-math-20b',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['math'],\\n    hf_model_id='internlm/internlm2-math-20b')\\n@register_model(\\n    ModelType.internlm2_7b_sft_chat,\\n    'Shanghai_AI_Laboratory/internlm2-chat-7b-sft',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-chat-7b-sft')\\n@register_model(\\n    ModelType.internlm2_7b_chat,\\n    'Shanghai_AI_Laboratory/internlm2-chat-7b',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-chat-7b')\\n@register_model(\\n    ModelType.internlm2_20b_sft_chat,\\n    'Shanghai_AI_Laboratory/internlm2-chat-20b-sft',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-chat-20b-sft')\\n@register_model(\\n    ModelType.internlm2_20b_chat,\\n    'Shanghai_AI_Laboratory/internlm2-chat-20b',\\n    LoRATM.internlm2,\\n    TemplateType.internlm2,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-chat-20b')\\n@register_model(\\n    ModelType.internlm2_7b,\\n    'Shanghai_AI_Laboratory/internlm2-7b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-7b')\\n@register_model(\\n    ModelType.internlm2_7b_base,\\n    'Shanghai_AI_Laboratory/internlm2-base-7b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-base-7b')\\n@register_model(\\n    ModelType.internlm2_20b,\\n    'Shanghai_AI_Laboratory/internlm2-20b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-20b')\\n@register_model(\\n    ModelType.internlm2_20b_base,\\n    'Shanghai_AI_Laboratory/internlm2-base-20b',\\n    LoRATM.internlm2,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='internlm/internlm2-base-20b')\\ndef get_model_tokenizer_internlm2(model_dir: str,\\n                                  torch_dtype: torch.dtype,\\n                                  model_kwargs: Dict[str, Any],\\n                                  load_model: bool = True,\\n                                  model_config=None,\\n                                  **kwargs):\\n    if model_config is None:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if use_flash_attn:\\n        model_config.attn_implementation = 'flash_attention_2'\\n\\n    eos_token = kwargs.pop('eos_token', None)\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n    if eos_token is not None:\\n        if getattr(tokenizer.__class__.eos_token_id, 'fset', None) is None:\\n            del tokenizer.__class__.eos_token_id\\n        tokenizer.eos_token = eos_token\\n\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.deepseek_coder_v2,\\n    'deepseek-ai/DeepSeek-Coder-V2-Base',\\n    LoRATM.deepseek2,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['coding', 'moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-Coder-V2-Base')\\n@register_model(\\n    ModelType.deepseek_coder_v2_lite,\\n    'deepseek-ai/DeepSeek-Coder-V2-Lite-Base',\\n    LoRATM.deepseek2,\\n    TemplateType.default_generation,\\n    tags=['coding', 'moe'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-Coder-V2-Lite-Base')\\n@register_model(\\n    ModelType.deepseek_coder_v2_instruct,\\n    'deepseek-ai/DeepSeek-Coder-V2-Instruct',\\n    LoRATM.deepseek2,\\n    TemplateType.deepseek2,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['coding', 'moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-Coder-V2-Instruct')\\n@register_model(\\n    ModelType.deepseek_coder_v2_lite_instruct,\\n    'deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct',\\n    LoRATM.deepseek2,\\n    TemplateType.deepseek2,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['coding', 'moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct')\\n@register_model(\\n    ModelType.deepseek_v2_lite,\\n    'deepseek-ai/DeepSeek-V2-Lite',\\n    LoRATM.deepseek2,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-V2-Lite')\\n@register_model(\\n    ModelType.deepseek_v2_lite_chat,\\n    'deepseek-ai/DeepSeek-V2-Lite-Chat',\\n    LoRATM.deepseek2,\\n    TemplateType.deepseek2,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-V2-Lite-Chat')\\n@register_model(\\n    ModelType.deepseek_v2,\\n    'deepseek-ai/DeepSeek-V2',\\n    LoRATM.deepseek2,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-V2')\\n@register_model(\\n    ModelType.deepseek_v2_chat,\\n    'deepseek-ai/DeepSeek-V2-Chat',\\n    LoRATM.deepseek2,\\n    TemplateType.deepseek2,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-V2-Chat')\\n@register_model(\\n    ModelType.deepseek_v2_5,\\n    'deepseek-ai/DeepSeek-V2.5',\\n    LoRATM.deepseek2,\\n    TemplateType.deepseek2_5,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    requires=['transformers>=4.39.3'],\\n    hf_model_id='deepseek-ai/DeepSeek-V2.5')\\ndef get_model_tokenizer_deepseek2(model_dir: str,\\n                                  torch_dtype: torch.dtype,\\n                                  model_kwargs: Dict[str, Any],\\n                                  load_model: bool = True,\\n                                  **kwargs):\\n    model, tokenizer = get_model_tokenizer_deepseek_moe(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if model is not None:\\n        model.generation_config.pad_token_id = model.generation_config.eos_token_id\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.internvl_chat_v1_5,\\n    'AI-ModelScope/InternVL-Chat-V1-5',\\n    LoRATM.internvl,\\n    TemplateType.internvl,\\n    requires=['transformers>=4.35', 'timm'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='OpenGVLab/InternVL-Chat-V1-5')\\n@register_model(\\n    ModelType.internvl_chat_v1_5_int8,\\n    'AI-ModelScope/InternVL-Chat-V1-5-int8',\\n    LoRATM.internvl,\\n    TemplateType.internvl,\\n    requires=['transformers>=4.35', 'timm'],\\n    support_flash_attn=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='OpenGVLab/InternVL-Chat-V1-5-int8')\\n@register_model(\\n    ModelType.mini_internvl_chat_2b_v1_5,\\n    'OpenGVLab/Mini-InternVL-Chat-2B-V1-5',\\n    LoRATM.internvl,\\n    TemplateType.internvl,\\n    requires=['transformers>=4.35', 'timm'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='OpenGVLab/Mini-InternVL-Chat-2B-V1-5')\\n@register_model(\\n    ModelType.mini_internvl_chat_4b_v1_5,\\n    'OpenGVLab/Mini-InternVL-Chat-4B-V1-5',\\n    LoRATM.internvl,\\n    TemplateType.internvl_phi3,\\n    requires=['transformers>=4.35,<4.42', 'timm'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    eos_token='<|end|>',\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='OpenGVLab/Mini-InternVL-Chat-4B-V1-5')\\n@register_model(\\n    ModelType.internvl2_1b,\\n    'OpenGVLab/InternVL2-1B',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-1B')\\n@register_model(\\n    ModelType.internvl2_2b,\\n    'OpenGVLab/InternVL2-2B',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-2B')\\n@register_model(\\n    ModelType.internvl2_4b,\\n    'OpenGVLab/InternVL2-4B',\\n    LoRATM.internvl,\\n    TemplateType.internvl2_phi3,\\n    requires=['transformers>=4.36,<4.42', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    eos_token='<|end|>',\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-4B')\\n@register_model(\\n    ModelType.internvl2_8b,\\n    'OpenGVLab/InternVL2-8B',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-8B')\\n@register_model(\\n    ModelType.internvl2_26b,\\n    'OpenGVLab/InternVL2-26B',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-26B')\\n@register_model(\\n    ModelType.internvl2_40b,\\n    'OpenGVLab/InternVL2-40B',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-40B')\\n@register_model(\\n    ModelType.internvl2_llama3_76b,\\n    'OpenGVLab/InternVL2-Llama3-76B',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-Llama3-76B')\\n@register_model(\\n    ModelType.internvl2_2b_awq,\\n    'OpenGVLab/InternVL2-2B-AWQ',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-2B-AWQ')\\n@register_model(\\n    ModelType.internvl2_8b_awq,\\n    'OpenGVLab/InternVL2-8B-AWQ',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-8B-AWQ')\\n@register_model(\\n    ModelType.internvl2_26b_awq,\\n    'OpenGVLab/InternVL2-26B-AWQ',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-26B-AWQ')\\n@register_model(\\n    ModelType.internvl2_40b_awq,\\n    'OpenGVLab/InternVL2-40B-AWQ',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-40B-AWQ')\\n@register_model(\\n    ModelType.internvl2_llama3_76b_awq,\\n    'OpenGVLab/InternVL2-Llama3-76B-AWQ',\\n    LoRATM.internvl,\\n    TemplateType.internvl2,\\n    requires=['transformers>=4.36', 'timm'],\\n    ignore_file_pattern=[r'.+\\\\.zip$'],\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    support_vllm=True,\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    placeholder_tokens=['<IMG_CONTEXT>'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='OpenGVLab/InternVL2-Llama3-76B-AWQ')\\ndef get_model_tokenizer_internvl(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 **kwargs):\\n    tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False)\\n    if kwargs.get('eos_token') is None and tokenizer.eos_token != '<|im_end|>':\\n        try:\\n            del tokenizer.__class__.eos_token_id\\n        except AttributeError:\\n            pass\\n        tokenizer.eos_token = '<|im_end|>'\\n\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if hasattr(model_config.llm_config, 'attn_implementation'):\\n        attr = 'attn_implementation'\\n    else:\\n        attr = '_attn_implementation'\\n    if use_flash_attn:\\n        setattr(model_config.llm_config, attr, 'flash_attention_2')\\n    else:\\n        setattr(model_config.llm_config, attr, 'eager')\\n        setattr(model_config.llm_config, f'{attr}_internal', None)\\n\\n    model_quant_config = getattr(model_config, 'quantization_config', None)\\n\\n    use_bnb = False\\n    if model_quant_config is not None:\\n        use_bnb = model_quant_config.get('quant_method', None) == 'bitsandbytes'\\n    quantization_config = model_kwargs.get('quantization_config', None)\\n    if isinstance(quantization_config, BitsAndBytesConfig):\\n        use_bnb = True\\n\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, tokenizer=tokenizer, model_config=model_config, **kwargs)\\n\\n    if use_bnb and kwargs.get('is_training'):\\n        # patch: bnb backward shape mismatch bug\\n        if model is not None and model.language_model is not None:\\n            model.language_model.output.state.force_no_igemmlt = True\\n\\n    if model is not None:\\n        func_list = ['generate', 'get_input_embeddings', 'gradient_checkpointing_enable', 'forward']\\n        _use_submodel_func(model, 'language_model', func_list)\\n        embedding = model.language_model.get_input_embeddings()\\n        embedding.register_forward_hook(_clone_hook)\\n\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.internlm_xcomposer2_5_7b_chat,\\n    'Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b',\\n    LoRATM.internlm_xcomposer,\\n    TemplateType.internlm_xcomposer2_5,\\n    eos_token='<|im_end|>',\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    # requires=['decord'],\\n    tags=['multi-modal', 'vision'],\\n    function_kwargs={'version': 'v2.5'},\\n    hf_model_id='internlm/internlm-xcomposer2d5-7b')\\n@register_model(\\n    ModelType.internlm_xcomposer2_7b_chat,\\n    'Shanghai_AI_Laboratory/internlm-xcomposer2-7b',\\n    LoRATM.internlm_xcomposer,\\n    TemplateType.internlm_xcomposer2,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    eos_token='[UNUSED_TOKEN_145]',\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='internlm/internlm-xcomposer2-7b')\\n@register_model(\\n    ModelType.internlm_xcomposer2_4khd_7b_chat,\\n    'Shanghai_AI_Laboratory/internlm-xcomposer2-4khd-7b',\\n    LoRATM.internlm_xcomposer,\\n    TemplateType.internlm_xcomposer2_4khd,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    eos_token='<|im_end|>',\\n    function_kwargs={'version': 'v2-4khd'},\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='internlm/internlm-xcomposer2-4khd-7b')\\ndef get_model_tokenizer_internlm_xcomposer2(model_dir: str,\\n                                            torch_dtype: torch.dtype,\\n                                            model_kwargs: Dict[str, Any],\\n                                            load_model: bool = True,\\n                                            **kwargs):\\n    version = kwargs.pop('version', 'v2')\\n    model_config = None\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if version == 'v2-4khd':\\n        from transformers import CLIPVisionModel\\n\\n        def load_model(self):\\n            self.vision_tower_name = snapshot_download('AI-ModelScope/clip-vit-large-patch14-336')\\n            self.vision_tower = CLIPVisionModel.from_pretrained(self.vision_tower_name)\\n            self.vision_tower.requires_grad_(False)\\n            self.is_loaded = True\\n\\n        CLIPVisionTower = get_class_from_dynamic_module('build_mlp.CLIPVisionTower', model_dir)\\n        CLIPVisionTower.load_model = load_model\\n    elif version == 'v2':\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n        model_config._flash_attn_2_enabled = use_flash_attn\\n\\n    model, tokenizer = get_model_tokenizer_internlm2(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n    if model is not None:\\n        if version == 'v2' and use_flash_attn:\\n            # fix AttributeError: no attribute 'attention_dropout'\\n            model.model.layers[0].attention.__class__.attention_dropout = 0.\\n\\n        if version == 'v2.5':\\n\\n            def _output_device_map_hook2(module, input, output):\\n                output = (output[0].to(input[1].device), output[1])\\n                return output\\n\\n            model.vit.register_forward_hook(_output_device_map_hook2)\\n            model.vision_proj.register_forward_hook(_output_device_map_hook)\\n\\n    return model, tokenizer\\n\\n\\ndef git_clone_github(github_url: str,\\n                     local_repo_name: Optional[str] = None,\\n                     branch: Optional[str] = None,\\n                     commit_hash: Optional[str] = None) -> str:\\n    git_cache_dir = os.path.join(get_cache_dir(), '_github')\\n    os.makedirs(git_cache_dir, exist_ok=True)\\n    if local_repo_name is None:\\n        github_url = github_url.rstrip('/')\\n        local_repo_name = github_url.rsplit('/', 1)[1]\\n    local_repo_path = os.path.join(git_cache_dir, local_repo_name)\\n    with safe_ddp_context():\\n        if not os.path.exists(local_repo_path):\\n            if not github_url.endswith('.git'):\\n                github_url = f'{github_url}.git'\\n            command = ['git', '-C', git_cache_dir, 'clone', github_url, local_repo_name]\\n            command_str = f\\\"git -C '{git_cache_dir}' clone '{github_url}' {local_repo_name}\\\"\\n            if branch is not None:\\n                command += ['--branch', branch]\\n                command_str += f' --branch {branch}'\\n            logger.info(f'Run the command: `{command_str}`')\\n            subprocess_run(command)\\n\\n            if commit_hash is not None:\\n                git_cache_path = os.path.join(git_cache_dir, local_repo_name)\\n                command = ['git', '-C', git_cache_path, 'reset', '--hard', commit_hash]\\n                command_str = f\\\"git -C '{git_cache_path}' reset '--hard' {commit_hash}\\\"\\n                logger.info(f'Run the command: `{command_str}`')\\n                subprocess_run(command)\\n\\n        logger.info(f'local_repo_path: {local_repo_path}')\\n    return local_repo_path\\n\\n\\ndef _use_submodel_func(model, submodel_name: str, func_list: List[str]) -> None:\\n    submodel = getattr(model, submodel_name)\\n\\n    def _get_new_func(func_name: str):\\n        _old_func = getattr(submodel.__class__, func_name)\\n\\n        @wraps(_old_func)\\n        def _new_func(self, *args, **kwargs):\\n            res = _old_func(submodel, *args, **kwargs)\\n            if func_name == 'forward':\\n                device = find_device(args)\\n                if device is None:\\n                    device = find_device(kwargs)\\n                res.logits = to_device(res.logits, device)\\n                res.loss = to_device(res.loss, device)\\n            return res\\n\\n        return _new_func\\n\\n    for key in func_list:\\n        setattr(model, key, MethodType(_get_new_func(key), model))\\n        if key == 'generate' and model.device != submodel.device:\\n            submodel.__class__.device = model.device\\n        if key == 'forward' and 'generate' in func_list:\\n            setattr(submodel, key, MethodType(_get_new_func(key), submodel))  # fix device_map\\n\\n\\n@register_model(\\n    ModelType.deepseek_vl_7b_chat,\\n    'deepseek-ai/deepseek-vl-7b-chat',\\n    LoRATM.deepseek_vl,\\n    TemplateType.deepseek_vl,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    tags=['multi-modal', 'vision'],\\n    placeholder_tokens=['<image_placeholder>'],\\n    hf_model_id='deepseek-ai/deepseek-vl-7b-chat')\\n@register_model(\\n    ModelType.deepseek_vl_1_3b_chat,\\n    'deepseek-ai/deepseek-vl-1.3b-chat',\\n    LoRATM.deepseek_vl,\\n    TemplateType.deepseek_vl,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    tags=['multi-modal', 'vision'],\\n    placeholder_tokens=['<image_placeholder>'],\\n    hf_model_id='deepseek-ai/deepseek-vl-1.3b-chat')\\ndef get_model_tokenizer_deepseek_vl(model_dir: str,\\n                                    torch_dtype: torch.dtype,\\n                                    model_kwargs: Dict[str, Any],\\n                                    load_model: bool = True,\\n                                    **kwargs):\\n    # compat with python==3.10\\n    if sys.version_info.minor >= 10:\\n        import collections\\n        import collections.abc\\n        for type_name in collections.abc.__all__:\\n            setattr(collections, type_name, getattr(collections.abc, type_name))\\n    if 'local_repo_path' in kwargs:\\n        local_repo_path = kwargs['local_repo_path']\\n    else:\\n        local_repo_path = git_clone_github('https://github.com/deepseek-ai/DeepSeek-VL')\\n    sys.path.append(os.path.join(local_repo_path))\\n    from deepseek_vl.models import VLChatProcessor, MultiModalityCausalLM\\n    processor = VLChatProcessor.from_pretrained(model_dir)\\n    tokenizer = processor.tokenizer\\n    # flash_attn\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    if version.parse(transformers.__version__) >= version.parse('4.36'):\\n        if use_flash_attn:\\n            model_config.language_config._attn_implementation = 'flash_attention_2'\\n    else:\\n        model_config.language_config._flash_attn_2_enabled = use_flash_attn\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, tokenizer=tokenizer, **kwargs)\\n    tokenizer.processor = processor\\n    if load_model:\\n        model.language_model.model.embed_tokens.register_forward_hook(_clone_hook)\\n        model.language_model.model.embed_tokens.register_forward_hook(_output_device_map_hook)\\n        func_list = ['generate', 'get_input_embeddings', 'gradient_checkpointing_enable', 'forward']\\n        _use_submodel_func(model, 'language_model', func_list)\\n        model.generation_config = model.language_model.generation_config\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.openbuddy_llama3_1_8b_chat,\\n    'OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k',\\n    LoRATM.llama,\\n    TemplateType.openbuddy2,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    hf_model_id='OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k')\\n@register_model(\\n    ModelType.llama3_1_405b_instruct_bnb,\\n    'LLM-Research/Meta-Llama-3.1-405B-Instruct-BNB-NF4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43', 'bitsandbytes'],\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4')\\n@register_model(\\n    ModelType.llama3_1_405b_instruct_gptq_int4,\\n    'LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43', 'auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4')\\n@register_model(\\n    ModelType.llama3_1_405b_instruct_awq,\\n    'LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4')\\n@register_model(\\n    ModelType.llama3_1_405b_instruct_fp8,\\n    'LLM-Research/Meta-Llama-3.1-405B-Instruct-FP8',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-405B-Instruct-FP8')\\n@register_model(\\n    ModelType.llama3_1_405b_instruct,\\n    'LLM-Research/Meta-Llama-3.1-405B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-405B-Instruct')\\n@register_model(\\n    ModelType.llama3_1_405b,\\n    'LLM-Research/Meta-Llama-3.1-405B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-405B')\\n@register_model(\\n    ModelType.llama3_1_70b_instruct_bnb,\\n    'LLM-Research/Meta-Llama-3.1-70B-Instruct-bnb-4bit',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43', 'bitsandbytes'],\\n    hf_model_id='unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit')\\n@register_model(\\n    ModelType.reflection_llama_3_1_70b,\\n    'LLM-Research/Reflection-Llama-3.1-70B',\\n    LoRATM.llama,\\n    TemplateType.reflection,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43'],\\n    hf_model_id='mattshumer/Reflection-Llama-3.1-70B')\\n@register_model(\\n    ModelType.llama3_1_70b_instruct_gptq_int4,\\n    'LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43', 'auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4')\\n@register_model(\\n    ModelType.llama3_1_70b_instruct_awq,\\n    'LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4')\\n@register_model(\\n    ModelType.llama3_1_70b_instruct_fp8,\\n    'LLM-Research/Meta-Llama-3.1-70B-Instruct-FP8',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-70B-Instruct-FP8')\\n@register_model(\\n    ModelType.llama3_1_70b_instruct,\\n    'LLM-Research/Meta-Llama-3.1-70B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-70B-Instruct')\\n@register_model(\\n    ModelType.llama3_1_70b,\\n    'LLM-Research/Meta-Llama-3.1-70B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-70B')\\n@register_model(\\n    ModelType.llama3_1_8b_instruct_bnb,\\n    'LLM-Research/Meta-Llama-3.1-8B-Instruct-BNB-NF4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43', 'bitsandbytes'],\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-8B-Instruct-BNB-NF4')\\n@register_model(\\n    ModelType.llama3_1_8b_instruct_gptq_int4,\\n    'LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43', 'auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4')\\n@register_model(\\n    ModelType.llama3_1_8b_instruct_awq,\\n    'LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.43', 'autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    hf_model_id='hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4')\\n@register_model(\\n    ModelType.llama3_1_8b_instruct,\\n    'LLM-Research/Meta-Llama-3.1-8B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-8B-Instruct')\\n@register_model(\\n    ModelType.llama3_1_8b,\\n    'LLM-Research/Meta-Llama-3.1-8B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    hf_model_id='meta-llama/Meta-Llama-3.1-8B')\\n@register_model(\\n    ModelType.llama3_70b_instruct_awq,\\n    'swift/Meta-Llama-3-70B-Instruct-AWQ',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    requires=['autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='study-hjt/Meta-Llama-3-70B-Instruct-AWQ')\\n@register_model(\\n    ModelType.llama3_70b_instruct_int8,\\n    'swift/Meta-Llama-3-70b-Instruct-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    requires=['auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int8')\\n@register_model(\\n    ModelType.llama3_70b_instruct_int4,\\n    'swift/Meta-Llama-3-70B-Instruct-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    requires=['auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int4')\\n@register_model(\\n    ModelType.llama3_8b_instruct_awq,\\n    'swift/Meta-Llama-3-8B-Instruct-AWQ',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    requires=['autoawq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'is_awq': True},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='study-hjt/Meta-Llama-3-8B-Instruct-AWQ')\\n@register_model(\\n    ModelType.llama3_8b_instruct_int8,\\n    'swift/Meta-Llama-3-8B-Instruct-GPTQ-Int8',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    requires=['auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int8')\\n@register_model(\\n    ModelType.llama3_8b_instruct_int4,\\n    'swift/Meta-Llama-3-8B-Instruct-GPTQ-Int4',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    requires=['auto_gptq'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int4')\\n@register_model(\\n    ModelType.llama3_70b_instruct,\\n    'LLM-Research/Meta-Llama-3-70B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Meta-Llama-3-70B-Instruct')\\n@register_model(\\n    ModelType.llama3_70b,\\n    'LLM-Research/Meta-Llama-3-70B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Meta-Llama-3-70B')\\n@register_model(\\n    ModelType.llama3_8b_instruct,\\n    'LLM-Research/Meta-Llama-3-8B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Meta-Llama-3-8B-Instruct')\\n@register_model(\\n    ModelType.llama3_8b,\\n    'LLM-Research/Meta-Llama-3-8B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Meta-Llama-3-8B')\\n@register_model(\\n    ModelType.llama_3_chinese_8b,\\n    'ChineseAlpacaGroup/llama-3-chinese-8b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/llama-3-chinese-8b')\\n@register_model(\\n    ModelType.llama_3_chinese_8b_instruct,\\n    'ChineseAlpacaGroup/llama-3-chinese-8b-instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/llama-3-chinese-8b-instruct')\\n@register_model(\\n    ModelType.llama2_7b_aqlm_2bit_1x16,\\n    'AI-ModelScope/Llama-2-7b-AQLM-2Bit-1x16-hf',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    ignore_file_pattern=[r'.+\\\\.bin$'],\\n    support_flash_attn=True,\\n    requires=['transformers>=4.38', 'aqlm', 'torch>=2.2.0'],\\n    support_vllm=False,\\n    function_kwargs={'is_aqlm': True},\\n    hf_model_id='ISTA-DASLab/Llama-2-7b-AQLM-2Bit-1x16-hf')\\n@register_model(\\n    ModelType.mixtral_moe_7b_aqlm_2bit_1x16,\\n    'AI-ModelScope/Mixtral-8x7b-AQLM-2Bit-1x16-hf',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    requires=['transformers>=4.38', 'aqlm', 'torch>=2.2.0'],\\n    support_flash_attn=True,\\n    support_vllm=False,\\n    tags=['moe'],\\n    function_kwargs={'is_aqlm': True},\\n    hf_model_id='ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf')\\n@register_model(\\n    ModelType.llama2_7b,\\n    'modelscope/Llama-2-7b-ms',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    ignore_file_pattern=[r'.+\\\\.bin$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Llama-2-7b-hf')\\n@register_model(\\n    ModelType.llama2_13b,\\n    'modelscope/Llama-2-13b-ms',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    ignore_file_pattern=[r'.+\\\\.bin$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Llama-2-13b-hf')\\n@register_model(\\n    ModelType.llama2_70b,\\n    'modelscope/Llama-2-70b-ms',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    ignore_file_pattern=[r'.+\\\\.bin$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Llama-2-70b-hf')\\n@register_model(\\n    ModelType.llama2_7b_chat,\\n    'modelscope/Llama-2-7b-chat-ms',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    ignore_file_pattern=[r'.+\\\\.bin$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Llama-2-7b-chat-hf')\\n@register_model(\\n    ModelType.llama2_13b_chat,\\n    'modelscope/Llama-2-13b-chat-ms',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    ignore_file_pattern=[r'.+\\\\.bin$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Llama-2-13b-chat-hf')\\n@register_model(\\n    ModelType.llama2_70b_chat,\\n    'modelscope/Llama-2-70b-chat-ms',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    ignore_file_pattern=[r'.+\\\\.bin$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='meta-llama/Llama-2-70b-chat-hf')\\n@register_model(\\n    ModelType.chinese_llama_2_1_3b,\\n    'AI-ModelScope/chinese-llama-2-1.3b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-llama-2-1.3b')\\n@register_model(\\n    ModelType.chinese_llama_2_7b,\\n    'AI-ModelScope/chinese-llama-2-7b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-llama-2-7b')\\n@register_model(\\n    ModelType.chinese_llama_2_7b_16k,\\n    'AI-ModelScope/chinese-llama-2-7b-16k',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-llama-2-7b-16k')\\n@register_model(\\n    ModelType.chinese_llama_2_7b_64k,\\n    'AI-ModelScope/chinese-llama-2-7b-64k',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-llama-2-7b-64k')\\n@register_model(\\n    ModelType.chinese_llama_2_13b,\\n    'AI-ModelScope/chinese-llama-2-13b',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-llama-2-13b')\\n@register_model(\\n    ModelType.chinese_llama_2_13b_16k,\\n    'AI-ModelScope/chinese-llama-2-13b-16k',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-llama-2-13b-16k')\\n@register_model(\\n    ModelType.chinese_alpaca_2_1_3b,\\n    'AI-ModelScope/chinese-alpaca-2-1.3b',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-alpaca-2-1.3b')\\n@register_model(\\n    ModelType.chinese_alpaca_2_7b,\\n    'AI-ModelScope/chinese-alpaca-2-7b',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-alpaca-2-7b')\\n@register_model(\\n    ModelType.chinese_alpaca_2_7b_16k,\\n    'AI-ModelScope/chinese-alpaca-2-7b-16k',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-alpaca-2-7b-16k')\\n@register_model(\\n    ModelType.chinese_alpaca_2_7b_64k,\\n    'AI-ModelScope/chinese-alpaca-2-7b-64k',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-alpaca-2-7b-64k')\\n@register_model(\\n    ModelType.chinese_alpaca_2_13b,\\n    'AI-ModelScope/chinese-alpaca-2-13b',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-alpaca-2-13b')\\n@register_model(\\n    ModelType.chinese_alpaca_2_13b_16k,\\n    'AI-ModelScope/chinese-alpaca-2-13b-16k',\\n    LoRATM.llama,\\n    TemplateType.llama,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    support_lmdeploy=True,\\n    hf_model_id='hfl/chinese-alpaca-2-13b-16k')\\n@register_model(\\n    ModelType.atom_7b,\\n    'FlagAlpha/Atom-7B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='FlagAlpha/Atom-7B')\\n@register_model(\\n    ModelType.atom_7b_chat,\\n    'FlagAlpha/Atom-7B-Chat',\\n    LoRATM.llama,\\n    TemplateType.atom,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='FlagAlpha/Atom-7B-Chat')\\n@register_model(\\n    ModelType.mengzi3_13b_base,\\n    'langboat/Mengzi3-13B-Base',\\n    LoRATM.llama,\\n    TemplateType.mengzi,\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    hf_model_id='Langboat/Mengzi3-13B-Base')\\n@register_model(\\n    ModelType.longwriter_llama3_1_8b,\\n    'ZhipuAI/LongWriter-llama3.1-8b',\\n    LoRATM.llama,\\n    TemplateType.longwriter_llama3,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.43'],\\n    hf_model_id='THUDM/LongWriter-llama3.1-8b')\\n@register_model(\\n    ModelType.llama3_2_1b,\\n    'LLM-Research/Llama-3.2-1B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.45'],\\n    hf_model_id='meta-llama/Llama-3.2-1B')\\n@register_model(\\n    ModelType.llama3_2_3b,\\n    'LLM-Research/Llama-3.2-3B',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.45'],\\n    hf_model_id='meta-llama/Llama-3.2-3B')\\n@register_model(\\n    ModelType.llama3_2_1b_instruct,\\n    'LLM-Research/Llama-3.2-1B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3_2,\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.45'],\\n    hf_model_id='meta-llama/Llama-3.2-1B-Instruct')\\n@register_model(\\n    ModelType.llama3_2_3b_instruct,\\n    'LLM-Research/Llama-3.2-3B-Instruct',\\n    LoRATM.llama,\\n    TemplateType.llama3_2,\\n    ignore_file_pattern=[r'.+\\\\.pth$'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    requires=['transformers>=4.45'],\\n    hf_model_id='meta-llama/Llama-3.2-3B-Instruct')\\ndef get_model_tokenizer_llama2(model_dir: str,\\n                               torch_dtype: torch.dtype,\\n                               model_kwargs: Dict[str, Any],\\n                               load_model: bool = True,\\n                               **kwargs):\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    model_config.pretraining_tp = 1\\n    return get_model_tokenizer_with_flash_attn(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.polylm_13b,\\n    'damo/nlp_polylm_13b_text_generation',\\n    LoRATM.polylm,\\n    TemplateType.default_generation,\\n    hf_model_id='DAMO-NLP-MT/polylm-13b')\\ndef get_model_tokenizer_polylm(model_dir: str,\\n                               torch_dtype: torch.dtype,\\n                               model_kwargs: Dict[str, Any],\\n                               load_model: bool = True,\\n                               **kwargs):\\n    tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False, legacy=True)\\n    return get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, tokenizer=tokenizer, **kwargs)\\n\\n\\ndtype_mapping = {torch.float16: 'fp16', torch.bfloat16: 'bf16', torch.float32: 'fp32'}\\n\\n\\ndef get_model_tokenizer_qwen(model_dir: str,\\n                             torch_dtype: torch.dtype,\\n                             model_kwargs: Dict[str, Any],\\n                             load_model: bool = True,\\n                             model_config=None,\\n                             **kwargs):\\n    if model_config is None:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    if torch_dtype is not None:\\n        k_true = dtype_mapping[torch_dtype]\\n        for k in dtype_mapping.values():\\n            v = False\\n            if k == k_true:\\n                v = True\\n            setattr(model_config, k, v)\\n\\n    if model_kwargs.get('quantization_config') is None or not isinstance(model_kwargs['quantization_config'],\\n                                                                         BitsAndBytesConfig):\\n        # not (quantization + bnb)\\n        torch_dtype = None\\n    use_flash_attn = kwargs.pop('use_flash_attn', None)\\n    if use_flash_attn is None:\\n        use_flash_attn = 'auto'\\n    model_config.use_flash_attn = use_flash_attn\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n    try:\\n        # fix mp+ddp bug\\n        model.transformer.registered_causal_mask = model.transformer.registered_causal_mask.cuda()\\n        logger.info('registered_causal_mask to cuda')\\n    except AttributeError:\\n        pass\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.modelscope_agent_7b,\\n    'iic/ModelScope-Agent-7B',\\n    LoRATM.qwen,\\n    TemplateType.modelscope_agent,\\n    support_flash_attn=True,\\n    support_vllm=False)\\n@register_model(\\n    ModelType.modelscope_agent_14b,\\n    'iic/ModelScope-Agent-14B',\\n    LoRATM.qwen,\\n    TemplateType.modelscope_agent,\\n    support_flash_attn=True,\\n    support_vllm=False)\\n@register_model(\\n    ModelType.codefuse_qwen_14b_chat,\\n    'codefuse-ai/CodeFuse-QWen-14B',\\n    LoRATM.qwen,\\n    TemplateType.codefuse,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='codefuse-ai/CodeFuse-QWen-14B')\\n@register_model(\\n    ModelType.qwen_1_8b,\\n    'qwen/Qwen-1_8B',\\n    LoRATM.qwen,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-1_8B')\\n@register_model(\\n    ModelType.qwen_72b,\\n    'qwen/Qwen-72B',\\n    LoRATM.qwen,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-72B')\\n@register_model(\\n    ModelType.tongyi_finance_14b,\\n    'TongyiFinance/Tongyi-Finance-14B',\\n    LoRATM.qwen,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['financial'])\\n@register_model(\\n    ModelType.qwen_14b,\\n    'qwen/Qwen-14B',\\n    LoRATM.qwen,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-14B')\\n@register_model(\\n    ModelType.qwen_7b,\\n    'qwen/Qwen-7B',\\n    LoRATM.qwen,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-7B')\\ndef get_model_tokenizer_qwen_base(*args, **kwargs):\\n    model, tokenizer = get_model_tokenizer_qwen(*args, **kwargs)\\n    tokenizer.eos_token_id = tokenizer.eod_id\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.qwen_1_8b_chat,\\n    'qwen/Qwen-1_8B-Chat',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-1_8B-Chat')\\n@register_model(\\n    ModelType.qwen_72b_chat,\\n    'qwen/Qwen-72B-Chat',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-72B-Chat')\\n@register_model(\\n    ModelType.tongyi_finance_14b_chat,\\n    'TongyiFinance/Tongyi-Finance-14B-Chat',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['financial'],\\n    hf_model_id='jxy/Tongyi-Finance-14B-Chat')\\n@register_model(\\n    ModelType.qwen_14b_chat,\\n    'qwen/Qwen-14B-Chat',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-14B-Chat')\\n@register_model(\\n    ModelType.qwen_7b_chat,\\n    'qwen/Qwen-7B-Chat',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    hf_model_id='Qwen/Qwen-7B-Chat')\\ndef get_model_tokenizer_qwen_chat(*args, **kwargs):\\n    model, tokenizer = get_model_tokenizer_qwen(*args, **kwargs)\\n    tokenizer.eos_token_id = tokenizer.im_end_id\\n    return model, tokenizer\\n\\n\\ndef _qwen_vl_visual_block_forward(\\n    self,\\n    q_x: torch.Tensor,\\n    k_x: Optional[torch.Tensor] = None,\\n    v_x: Optional[torch.Tensor] = None,\\n    attn_mask: Optional[torch.Tensor] = None,\\n):\\n    k_x = self.ln_1_kv(k_x) if hasattr(self, 'ln_1_kv') and k_x is not None else None\\n    v_x = self.ln_1_kv(v_x) if hasattr(self, 'ln_1_kv') and v_x is not None else None\\n\\n    x = q_x + self.attention(q_x=self.ln_1(q_x), k_x=k_x, v_x=v_x, attn_mask=attn_mask)\\n    z = self.mlp(self.ln_2(x))\\n    x = x.to(z.device) + z  # FIX\\n    return x\\n\\n\\ndef fix_qwen_inplace_bug(model) -> None:\\n    # qwen-vl, qwen-audio\\n    first_drop = model.transformer.drop\\n    if first_drop.p == 0.:\\n        # fix in-place operation bug\\n        first_drop.register_forward_hook(_clone_hook)\\n\\n\\ndef _qwen_vl_audio_decode(self, *args, skip_special_tokens=False, **kwargs) -> str:\\n    if skip_special_tokens:\\n        token_ids = kwargs['token_ids']\\n        while len(token_ids) > 0 and token_ids[-1] in {151645, 151643}:\\n            token_ids.pop()\\n        return self._old_decode(*args, skip_special_tokens=False, **kwargs)\\n    else:\\n        return self._old_decode(*args, skip_special_tokens=False, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.qwen_vl_chat,\\n    'qwen/Qwen-VL-Chat',\\n    LoRATM.qwen_vl,\\n    TemplateType.qwen_vl,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='Qwen/Qwen-VL-Chat')\\n@register_model(\\n    ModelType.qwen_vl,\\n    'qwen/Qwen-VL',\\n    LoRATM.qwen_vl,\\n    TemplateType.qwen_vl_generation,\\n    function_kwargs={'get_qwen_function': get_model_tokenizer_qwen_base},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='Qwen/Qwen-VL')\\ndef get_model_tokenizer_qwen_vl(model_dir: str,\\n                                torch_dtype: torch.dtype,\\n                                model_kwargs: Dict[str, Any],\\n                                load_model: bool = True,\\n                                **kwargs):\\n    if (model_kwargs.get('quantization_config') is not None\\n            and isinstance(model_kwargs['quantization_config'], BitsAndBytesConfig)):\\n        # https://github.com/pytorch/pytorch/issues/58969\\n        model_kwargs['quantization_config'].llm_int8_skip_modules = ['lm_head', 'attn_pool.attn']\\n        _TransformerBlock = get_class_from_dynamic_module('visual.TransformerBlock', model_dir)\\n\\n        def _get_cast_dtype(self) -> torch.dtype:\\n            return self.resblocks[0].ln_1.weight.dtype\\n\\n        _TransformerBlock.__old_get_cast_dtype = _TransformerBlock.get_cast_dtype\\n        _TransformerBlock.get_cast_dtype = _get_cast_dtype\\n\\n    get_qwen_function = kwargs.pop('get_qwen_function', get_model_tokenizer_qwen_chat)\\n    tokenizer_config = get_tokenizer_config(model_dir)\\n    class_ref = tokenizer_config['auto_map']['AutoTokenizer'][0]\\n    tokenizer_cls: Type[PreTrainedTokenizerBase] = get_class_from_dynamic_module(class_ref, model_dir)\\n    tokenizer_cls._auto_class = 'AutoTokenizer'\\n    tokenizer_cls.IMAGE_ST = ()  # fix no attr `self.IMAGE_ST` bug\\n    tokenizer_cls._old_decode = tokenizer_cls._decode\\n    tokenizer_cls._decode = _qwen_vl_audio_decode\\n    # fix device_map is 4\\n    n_gpu = torch.cuda.device_count()\\n    local_world_size = get_dist_setting()[3]\\n    if n_gpu // local_world_size >= 4:\\n        visual_block_cls = get_class_from_dynamic_module('visual.VisualAttentionBlock', model_dir)\\n        visual_block_cls.__old_forward = visual_block_cls.forward\\n        visual_block_cls.forward = _qwen_vl_visual_block_forward\\n\\n    kwargs['tokenizer'] = tokenizer_cls.from_pretrained(model_dir, trust_remote_code=True)\\n    model, tokenizer = get_qwen_function(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if model is not None:\\n        fix_qwen_inplace_bug(model)\\n        # fix device_map is 4\\n        if n_gpu // local_world_size >= 4:\\n            model.transformer.visual.proj.data = model.transformer.visual.proj.to(\\n                model.transformer.visual.ln_post.bias.device)\\n        # fix images cuda:1 bug\\n        model.transformer.visual.register_forward_hook(get_device_hook(0))\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.qwen_audio_chat,\\n    'qwen/Qwen-Audio-Chat',\\n    LoRATM.qwen_audio,\\n    TemplateType.qwen_audio,\\n    support_flash_attn=True,\\n    function_kwargs={'get_qwen_function': get_model_tokenizer_qwen_chat},\\n    tags=['multi-modal', 'audio'],\\n    hf_model_id='Qwen/Qwen-Audio-Chat')\\n@register_model(\\n    ModelType.qwen_audio,\\n    'qwen/Qwen-Audio',\\n    LoRATM.qwen_audio,\\n    TemplateType.qwen_audio_generation,\\n    support_flash_attn=True,\\n    function_kwargs={'get_qwen_function': get_model_tokenizer_qwen_base},\\n    tags=['multi-modal', 'audio'],\\n    hf_model_id='Qwen/Qwen-Audio')\\ndef get_model_tokenizer_qwen_audio(model_dir: str,\\n                                   torch_dtype: torch.dtype,\\n                                   model_kwargs: Dict[str, Any],\\n                                   load_model: bool = True,\\n                                   **kwargs):\\n    get_qwen_function = kwargs.pop('get_qwen_function')\\n    tokenizer_config = get_tokenizer_config(model_dir)\\n    class_ref = tokenizer_config['auto_map']['AutoTokenizer'][0]\\n    tokenizer_cls: Type[PreTrainedTokenizerBase] = get_class_from_dynamic_module(class_ref, model_dir)\\n    tokenizer_cls._auto_class = 'AutoTokenizer'\\n    tokenizer_cls.AUDIO_ST = ()  # fix no attr `self.AUDIO_ST` bug\\n    tokenizer_cls._old_decode = tokenizer_cls._decode\\n    tokenizer_cls._decode = _qwen_vl_audio_decode\\n    kwargs['tokenizer'] = tokenizer_cls.from_pretrained(model_dir, trust_remote_code=True)\\n    model, tokenizer = get_qwen_function(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if model is not None:\\n        fix_qwen_inplace_bug(model)\\n\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.qwen_1_8b_chat_int8,\\n    'qwen/Qwen-1_8B-Chat-Int8',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-1_8B-Chat-Int8')\\n@register_model(\\n    ModelType.qwen_1_8b_chat_int4,\\n    'qwen/Qwen-1_8B-Chat-Int4',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-1_8B-Chat-Int4')\\n@register_model(\\n    ModelType.qwen_72b_chat_int8,\\n    'qwen/Qwen-72B-Chat-Int8',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-72B-Chat-Int8')\\n@register_model(\\n    ModelType.qwen_72b_chat_int4,\\n    'qwen/Qwen-72B-Chat-Int4',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-72B-Chat-Int4')\\n@register_model(\\n    ModelType.tongyi_finance_14b_chat_int4,\\n    'TongyiFinance/Tongyi-Finance-14B-Chat-Int4',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['financial'],\\n    hf_model_id='jxy/Tongyi-Finance-14B-Chat-Int4')\\n@register_model(\\n    ModelType.qwen_vl_chat_int4,\\n    'qwen/Qwen-VL-Chat-Int4',\\n    LoRATM.qwen_vl,\\n    TemplateType.qwen_vl,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={\\n        'get_qwen_function': get_model_tokenizer_qwen_vl,\\n        'gptq_bits': 4\\n    },\\n    support_vllm=True,\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='Qwen/Qwen-VL-Chat-Int4')\\n@register_model(\\n    ModelType.qwen_14b_chat_int8,\\n    'qwen/Qwen-14B-Chat-Int8',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-14B-Chat-Int8')\\n@register_model(\\n    ModelType.qwen_7b_chat_int8,\\n    'qwen/Qwen-7B-Chat-Int8',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 8},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-7B-Chat-Int8')\\n@register_model(\\n    ModelType.qwen_14b_chat_int4,\\n    'qwen/Qwen-14B-Chat-Int4',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-14B-Chat-Int4')\\n@register_model(\\n    ModelType.qwen_7b_chat_int4,\\n    'qwen/Qwen-7B-Chat-Int4',\\n    LoRATM.qwen,\\n    TemplateType.qwen,\\n    requires=['auto_gptq>=0.5'],\\n    torch_dtype=torch.float16,\\n    function_kwargs={'gptq_bits': 4},\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    hf_model_id='Qwen/Qwen-7B-Chat-Int4')\\ndef get_model_tokenizer_qwen_intx(model_dir: str,\\n                                  torch_dtype: torch.dtype,\\n                                  model_kwargs: Dict[str, Any],\\n                                  load_model: bool = True,\\n                                  **kwargs):\\n    get_qwen_function = kwargs.pop('get_qwen_function', get_model_tokenizer_qwen_chat)\\n    model, tokenizer = get_qwen_function(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    return model, tokenizer\\n\\n\\nregister_model(\\n    ModelType.skywork_13b,\\n    'skywork/Skywork-13B-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    get_model_tokenizer_from_repo,\\n    hf_model_id='Skywork/Skywork-13B-base')\\n\\n\\n@register_model(ModelType.skywork_13b_chat, 'skywork/Skywork-13B-chat', LoRATM.llama, TemplateType.skywork)\\ndef get_skywork_model_tokenizer(model_dir: str,\\n                                torch_dtype: torch.dtype,\\n                                model_kwargs: Dict[str, Any],\\n                                load_model: bool = True,\\n                                **kwargs):\\n    model, tokenizer = get_model_tokenizer_from_repo(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    tokenizer.add_tokens('[USER]')\\n    tokenizer.add_tokens('[BOT]')\\n    tokenizer.add_tokens('[SEP]')\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.codefuse_codellama_34b_chat,\\n    'codefuse-ai/CodeFuse-CodeLlama-34B',\\n    LoRATM.llama,\\n    TemplateType.codefuse_codellama,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_lmdeploy=True,\\n    tags=['coding'],\\n    hf_model_id='codefuse-ai/CodeFuse-CodeLlama-34B')\\ndef get_model_tokenizer_codellama(model_dir: str,\\n                                  torch_dtype: torch.dtype,\\n                                  model_kwargs: Dict[str, Any],\\n                                  load_model: bool = True,\\n                                  **kwargs):\\n    tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False, legacy=False)\\n    return get_model_tokenizer_with_flash_attn(\\n        model_dir, torch_dtype, model_kwargs, load_model, tokenizer=tokenizer, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.phi2_3b,\\n    'AI-ModelScope/phi-2',\\n    LoRATM.phi,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    support_gradient_checkpointing=False,\\n    tags=['coding'],\\n    hf_model_id='microsoft/phi-2')\\n@register_model(\\n    ModelType.telechat_12b,\\n    'TeleAI/TeleChat-12B',\\n    LoRATM.telechat,\\n    TemplateType.telechat,\\n    support_flash_attn=True,\\n    hf_model_id='Tele-AI/TeleChat-12B')\\n@register_model(\\n    ModelType.telechat_12b_v2,\\n    'TeleAI/TeleChat-12B-v2',\\n    LoRATM.telechat,\\n    TemplateType.telechat_v2,\\n    eos_token=2,\\n    support_flash_attn=True,\\n    hf_model_id='Tele-AI/TeleChat-12B-v2')\\n@register_model(\\n    ModelType.telechat_12b_v2_gptq_int4,\\n    'swift/TeleChat-12B-V2-GPTQ-Int4',\\n    LoRATM.telechat,\\n    TemplateType.telechat_v2,\\n    eos_token=2,\\n    requires=['auto_gptq>=0.5'],\\n    support_flash_attn=True,\\n    function_kwargs={'gptq_bits': 4})\\ndef get_model_tokenizer_phi(model_dir: str,\\n                            torch_dtype: torch.dtype,\\n                            model_kwargs: Dict[str, Any],\\n                            load_model: bool = True,\\n                            **kwargs):\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    model_config.flash_attn = use_flash_attn\\n    return get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.telechat_7b,\\n    'TeleAI/TeleChat-7B',\\n    LoRATM.telechat,\\n    TemplateType.telechat,\\n    support_flash_attn=True,\\n    hf_model_id='Tele-AI/telechat-7B')\\ndef get_model_tokenizer_telechat(model_dir: str,\\n                                 torch_dtype: torch.dtype,\\n                                 model_kwargs: Dict[str, Any],\\n                                 load_model: bool = True,\\n                                 **kwargs):\\n    if torch_dtype == torch.bfloat16:\\n        logger.info('telechat-7b does not support the bf16 dtype; the dtype is converted to fp16.')\\n        torch_dtype = torch.float16\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attn = kwargs.pop('use_flash_attn', False)\\n    model_config.flash_attn = use_flash_attn\\n    return get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.deepseek_moe_16b_chat,\\n    'deepseek-ai/deepseek-moe-16b-chat',\\n    LoRATM.llama,\\n    TemplateType.deepseek,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='deepseek-ai/deepseek-moe-16b-chat')\\n@register_model(\\n    ModelType.deepseek_moe_16b,\\n    'deepseek-ai/deepseek-moe-16b-base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='deepseek-ai/deepseek-moe-16b-base')\\n@register_model(\\n    ModelType.minicpm_moe_8x2b,\\n    'OpenBMB/MiniCPM-MoE-8x2B',\\n    LoRATM.llama,\\n    TemplateType.minicpm,\\n    requires=['transformers>=4.36.0'],\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    tags=['moe'],\\n    hf_model_id='openbmb/MiniCPM-MoE-8x2B')\\ndef get_model_tokenizer_deepseek_moe(model_dir: str,\\n                                     torch_dtype: torch.dtype,\\n                                     model_kwargs: Dict[str, Any],\\n                                     load_model: bool = True,\\n                                     **kwargs):\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if model is not None:\\n        # fix dtype bug\\n        mlp_cls = model.model.layers[1].mlp.__class__\\n\\n        def _dtype_hook(module, input, output):\\n            return output.to(input[0].dtype)\\n\\n        for module in model.modules():\\n            if isinstance(module, mlp_cls):\\n                module.register_forward_hook(_dtype_hook)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.yuan2_2b_instruct,\\n    'YuanLLM/Yuan2.0-2B-hf',\\n    LoRATM.llama,\\n    TemplateType.yuan,\\n    support_flash_attn=True,\\n    hf_model_id='IEITYuan/Yuan2-2B-hf')\\n@register_model(\\n    ModelType.yuan2_51b_instruct,\\n    'YuanLLM/Yuan2.0-51B-hf',\\n    LoRATM.llama,\\n    TemplateType.yuan,\\n    support_flash_attn=True,\\n    hf_model_id='IEITYuan/Yuan2-51B-hf')\\n@register_model(\\n    ModelType.yuan2_102b_instruct,\\n    'YuanLLM/Yuan2.0-102B-hf',\\n    LoRATM.llama,\\n    TemplateType.yuan,\\n    support_flash_attn=True,\\n    hf_model_id='IEITYuan/Yuan2-102B-hf')\\n@register_model(\\n    ModelType.yuan2_2b_janus_instruct,\\n    'YuanLLM/Yuan2-2B-Janus-hf',\\n    LoRATM.llama,\\n    TemplateType.yuan,\\n    support_flash_attn=True,\\n    hf_model_id='IEITYuan/Yuan2-2B-Janus-hf')\\n@register_model(\\n    ModelType.yuan2_m32,\\n    'YuanLLM/Yuan2-M32-hf',\\n    LoRATM.llama,\\n    TemplateType.yuan,\\n    tags=['moe'],\\n    support_flash_attn=True,\\n    hf_model_id='IEITYuan/Yuan2-M32-hf')\\ndef get_model_tokenizer_yuan(model_dir: str,\\n                             torch_dtype: torch.dtype,\\n                             model_kwargs: Dict[str, Any],\\n                             load_model: bool = True,\\n                             **kwargs):\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    use_flash_attention = kwargs.pop('use_flash_attn', False)\\n    model_config.use_flash_attention = use_flash_attention\\n    tokenizer = AutoTokenizer.from_pretrained(\\n        model_dir, add_eos_token=False, add_bos_token=False, eos_token='<eod>', legacy=True)\\n    addi_tokens = [\\n        '<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>', '<commit_before>',\\n        '<commit_msg>', '<commit_after>', '<jupyter_start>', '<jupyter_text>', '<jupyter_code>', '<jupyter_output>',\\n        '<empty_output>'\\n    ]\\n    tokenizer.add_tokens(addi_tokens, special_tokens=True)\\n    model, tokenizer = get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, tokenizer=tokenizer, **kwargs)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.orion_14b,\\n    'OrionStarAI/Orion-14B-Base',\\n    LoRATM.llama,\\n    TemplateType.default_generation,\\n    support_flash_attn=True,\\n    hf_model_id='OrionStarAI/Orion-14B-Base')\\n@register_model(\\n    ModelType.orion_14b_chat,\\n    'OrionStarAI/Orion-14B-Chat',\\n    LoRATM.llama,\\n    TemplateType.orion,\\n    support_flash_attn=True,\\n    ignore_file_pattern=[r'.+\\\\.gguf$'],\\n    hf_model_id='OrionStarAI/Orion-14B-Chat')\\ndef get_model_tokenizer_orion(model_dir: str,\\n                              torch_dtype: torch.dtype,\\n                              model_kwargs: Dict[str, Any],\\n                              load_model: bool = True,\\n                              **kwargs):\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    model_config._flash_attn_2_enabled = kwargs.pop('use_flash_attn', False)\\n    return get_model_tokenizer_from_repo(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.yi_vl_34b_chat,\\n    '01ai/Yi-VL-34B',\\n    LoRATM.llava_llama,\\n    TemplateType.yi_vl,\\n    support_flash_attn=True,\\n    requires=['transformers>=4.34'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='01-ai/Yi-VL-34B')\\n@register_model(\\n    ModelType.yi_vl_6b_chat,\\n    '01ai/Yi-VL-6B',\\n    LoRATM.llava_llama,\\n    TemplateType.yi_vl,\\n    support_flash_attn=True,\\n    requires=['transformers>=4.34'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='01-ai/Yi-VL-6B')\\ndef get_model_tokenizer_yi_vl(model_dir: str,\\n                              torch_dtype: torch.dtype,\\n                              model_kwargs: Dict[str, Any],\\n                              load_model: bool = True,\\n                              **kwargs):\\n    if 'local_repo_path' in kwargs:\\n        local_repo_path = kwargs['local_repo_path']\\n    else:\\n        local_repo_path = git_clone_github('https://github.com/01-ai/Yi')\\n    sys.path.append(os.path.join(local_repo_path, 'VL'))\\n    from llava.model import LlavaLlamaForCausalLM, LlavaConfig\\n    from llava.model.constants import key_info\\n\\n    model_config = LlavaConfig.from_pretrained(model_dir)\\n    mm_vision_tower = model_config.mm_vision_tower\\n    model_config.mm_vision_tower = os.path.join(model_dir, *mm_vision_tower.rsplit('/', maxsplit=2)[-2:])\\n    model_config.attention_dropout = 0.\\n    key_info['model_path'] = model_dir\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(\\n        model_dir,\\n        torch_dtype,\\n        model_kwargs,\\n        load_model,\\n        model_config=model_config,\\n        automodel_class=LlavaLlamaForCausalLM,\\n        **kwargs)\\n    if model is not None:\\n        logger.info('Please ignore the above warning.')\\n        logger.info('Loading the parameters of vision_tower...')\\n        model.resize_token_embeddings(len(tokenizer))\\n        vision_tower = model.get_vision_tower()\\n        vision_tower.load_model()\\n        vision_tower.to(device=model.device, dtype=torch_dtype)\\n        if not hasattr(model.config, 'max_sequence_length'):\\n            model.config.max_sequence_length = 2048\\n    return model, tokenizer\\n\\n\\ndef _patch_minicpm_v_device_map(model) -> None:\\n    if not hasattr(model, 'hf_device_map') or len(model.hf_device_map.values()) == 1:\\n        return\\n\\n    device = list(model.hf_device_map.values())[0]\\n    if hasattr(model, 'get_vision_embedding') and not hasattr(model, '_old_get_vision_embedding'):\\n        # minicpm-v-v2-chat; avoid double patching\\n        _old_get_vision_embedding = model.__class__.get_vision_embedding\\n\\n        def _get_vision_embedding(self, pixel_values):\\n            if len(pixel_values) == 0:\\n                return _old_get_vision_embedding(self, pixel_values)\\n            output = _old_get_vision_embedding(self, pixel_values)\\n            return output.to(device=device)\\n\\n        model.__class__._old_get_vision_embedding = _old_get_vision_embedding\\n        model.__class__.get_vision_embedding = _get_vision_embedding\\n\\n    if hasattr(model, 'resampler'):  # minicpm-v-v2_5-chat\\n        model.resampler.register_forward_hook(get_device_hook(device))\\n\\n\\n@register_model(\\n    ModelType.minicpm_v_3b_chat,\\n    'OpenBMB/MiniCPM-V',\\n    LoRATM.minicpm_v,\\n    TemplateType.minicpm_v,\\n    support_flash_attn=True,\\n    requires=['timm', 'transformers<4.42'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='openbmb/MiniCPM-V')\\n@register_model(\\n    ModelType.minicpm_v_v2_chat,\\n    'OpenBMB/MiniCPM-V-2',\\n    LoRATM.minicpm_v,\\n    TemplateType.minicpm_v,\\n    support_flash_attn=True,\\n    requires=['timm', 'transformers<4.42'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='openbmb/MiniCPM-V-2')\\ndef get_model_tokenizer_minicpm_v(model_dir: str,\\n                                  torch_dtype: torch.dtype,\\n                                  model_kwargs: Dict[str, Any],\\n                                  load_model: bool = True,\\n                                  **kwargs):\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if load_model:\\n        model.resampler.to(torch_dtype)  # fix float32\\n        _patch_minicpm_v_device_map(model)\\n        func_list = ['generate', 'get_input_embeddings', 'forward']\\n        _use_submodel_func(model, 'llm', func_list)\\n    return model, tokenizer\\n\\n\\n@contextmanager\\ndef ignore_check_imports():\\n    import transformers.dynamic_module_utils as td\\n\\n    @wraps(td.check_imports)\\n    def _check_imports(filename) -> List[str]:\\n        return td.get_relative_imports(filename)\\n\\n    td._old_check_imports = td.check_imports\\n    td.check_imports = _check_imports\\n    yield\\n    td.check_imports = td._old_check_imports\\n\\n\\n@register_model(\\n    ModelType.minicpm_v_v2_6_chat,\\n    'OpenBMB/MiniCPM-V-2_6',\\n    LoRATM.minicpm_v,\\n    TemplateType.minicpm_v_v2_6,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['timm', 'transformers>=4.36'],  # 'decord'\\n    placeholder_tokens=['<unk>'],\\n    function_kwargs={'version': 'v2.6'},\\n    tags=['multi-modal', 'vision', 'video'],\\n    hf_model_id='openbmb/MiniCPM-V-2_6')\\n@register_model(\\n    ModelType.minicpm_v_v2_5_chat,\\n    'OpenBMB/MiniCPM-Llama3-V-2_5',\\n    LoRATM.minicpm_v,\\n    TemplateType.minicpm_v_v2_5,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['timm', 'transformers>=4.36'],\\n    placeholder_tokens=['<unk>'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='openbmb/MiniCPM-Llama3-V-2_5')\\ndef get_model_tokenizer_minicpm_v_2_x(model_dir: str,\\n                                      torch_dtype: torch.dtype,\\n                                      model_kwargs: Dict[str, Any],\\n                                      load_model: bool = True,\\n                                      **kwargs):\\n    from transformers import AutoProcessor\\n    processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)\\n    version = kwargs.get('version', 'v2.5')\\n    if load_model and version == 'v2.6':\\n        with ignore_check_imports():\\n            model_cls = get_class_from_dynamic_module('modeling_navit_siglip.SiglipVisionTransformer', model_dir)\\n            model_cls._no_split_modules = []\\n    model, tokenizer = get_model_tokenizer_minicpm_v(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    tokenizer.processor = processor\\n    if load_model:\\n        embedding = model.get_input_embeddings()\\n        embedding.register_forward_hook(_clone_hook)\\n\\n    return model, tokenizer\\n\\n\\ndef _patch_llava(model):\\n    if hasattr(model, '__old_generate'):\\n        return\\n    generate = model.generate\\n    model.__old_generate = generate\\n\\n    @wraps(generate)\\n    def _new_generate(inputs=None, *args, **kwargs):\\n        input_ids = kwargs.pop('input_ids', None)\\n        if inputs is None and input_ids is not None:\\n            inputs = input_ids\\n        return generate(inputs, *args, **kwargs)\\n\\n    model.generate = _new_generate\\n\\n\\ndef get_model_tokenizer_llava_hf(model_dir: str, *args, **kwargs):\\n    from transformers import AutoProcessor\\n    processor = AutoProcessor.from_pretrained(model_dir)\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, *args, **kwargs)\\n    tokenizer.processor = processor\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.llama3_2_11b_vision,\\n    'LLM-Research/Llama-3.2-11B-Vision',\\n    LoRATM.llama3_2_vision,\\n    TemplateType.llama3_2_vision_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    ignore_file_pattern=['*.pth'],\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='meta-llama/Llama-3.2-11B-Vision')\\n@register_model(\\n    ModelType.llama3_2_11b_vision_instruct,\\n    'LLM-Research/Llama-3.2-11B-Vision-Instruct',\\n    LoRATM.llama3_2_vision,\\n    TemplateType.llama3_2_vision,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    ignore_file_pattern=['*.pth'],\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='meta-llama/Llama-3.2-11B-Vision-Instruct')\\n@register_model(\\n    ModelType.llama3_2_90b_vision,\\n    'LLM-Research/Llama-3.2-90B-Vision',\\n    LoRATM.llama3_2_vision,\\n    TemplateType.llama3_2_vision_generation,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    ignore_file_pattern=['*.pth'],\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='meta-llama/Llama-3.2-90B-Vision')\\n@register_model(\\n    ModelType.llama3_2_90b_vision_instruct,\\n    'LLM-Research/Llama-3.2-90B-Vision-Instruct',\\n    LoRATM.llama3_2_vision,\\n    TemplateType.llama3_2_vision,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    ignore_file_pattern=['*.pth'],\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='meta-llama/Llama-3.2-90B-Vision-Instruct')\\ndef get_model_tokenizer_llama3_2_vision(*args, **kwargs):\\n    from transformers import MllamaForConditionalGeneration\\n    kwargs['automodel_class'] = MllamaForConditionalGeneration\\n    return get_model_tokenizer_llava_hf(*args, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.llava1_5_13b_instruct,\\n    'swift/llava-1.5-13b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava1_5,\\n    eos_token='</s>',\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.36'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-1.5-13b-hf')\\n@register_model(\\n    ModelType.llava1_5_7b_instruct,\\n    'swift/llava-1.5-7b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava1_5,\\n    eos_token='</s>',\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.36'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-1.5-7b-hf')\\ndef get_model_tokenizer_llava_1_5(*args, **kwargs):\\n    from transformers import LlavaForConditionalGeneration\\n    kwargs['automodel_class'] = LlavaForConditionalGeneration\\n    return get_model_tokenizer_llava_hf(*args, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.llava_onevision_qwen2_0_5b_ov,\\n    'AI-ModelScope/llava-onevision-qwen2-0.5b-ov-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_onevision_qwen,\\n    support_flash_attn=True,\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    ignore_file_pattern=['onnx'],\\n    placeholder_tokens=['<image>'],\\n    hf_model_id='llava-hf/llava-onevision-qwen2-0.5b-ov-hf')\\n@register_model(\\n    ModelType.llava_onevision_qwen2_7b_ov,\\n    'AI-ModelScope/llava-onevision-qwen2-7b-ov-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_onevision_qwen,\\n    support_flash_attn=True,\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    placeholder_tokens=['<image>'],\\n    hf_model_id='llava-hf/llava-onevision-qwen2-7b-ov-hf')\\n@register_model(\\n    ModelType.llava_onevision_qwen2_72b_ov,\\n    'AI-ModelScope/llava-onevision-qwen2-72b-ov-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_onevision_qwen,\\n    support_flash_attn=True,\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision', 'video'],\\n    placeholder_tokens=['<image>'],\\n    hf_model_id='llava-hf/llava-onevision-qwen2-72b-ov-hf')\\ndef get_model_tokenizer_llava_onevision(*args, **kwargs):\\n    from transformers import LlavaOnevisionForConditionalGeneration\\n    kwargs['automodel_class'] = LlavaOnevisionForConditionalGeneration\\n    return get_model_tokenizer_llava_hf(*args, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.llava_next_72b_hf,\\n    'AI-ModelScope/llava-next-72b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_qwen_hf,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.39'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-next-72b-hf')\\n@register_model(\\n    ModelType.llava_next_110b_hf,\\n    'AI-ModelScope/llava-next-110b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_qwen_hf,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.39'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-next-110b-hf')\\n@register_model(\\n    ModelType.llama3_llava_next_8b_hf,\\n    'swift/llama3-llava-next-8b-hf',\\n    LoRATM.llava,\\n    TemplateType.llama3_llava_next_hf,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.39'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llama3-llava-next-8b-hf')\\n@register_model(\\n    ModelType.llava1_6_vicuna_7b_instruct,\\n    'swift/llava-v1.6-vicuna-7b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_vicuna,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.39'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-v1.6-vicuna-7b-hf')\\n@register_model(\\n    ModelType.llava1_6_vicuna_13b_instruct,\\n    'swift/llava-v1.6-vicuna-13b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_vicuna,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.39'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-v1.6-vicuna-13b-hf')\\n@register_model(\\n    ModelType.llava1_6_mistral_7b_instruct,\\n    'swift/llava-v1.6-mistral-7b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_mistral,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.39'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-v1.6-mistral-7b-hf')\\n@register_model(\\n    ModelType.llava1_6_llama3_1_8b_instruct,\\n    'DaozeZhang/llava-llama3.1-8b',\\n    LoRATM.llava,\\n    TemplateType.llava_next_llama3,\\n    support_flash_attn=True,\\n    support_vllm=False,\\n    requires=['transformers>=4.41'],\\n    tags=['multi-modal', 'vision'])\\ndef get_model_tokenizer_llava_next(*args, **kwargs):\\n    from transformers import LlavaNextForConditionalGeneration\\n    kwargs['automodel_class'] = LlavaNextForConditionalGeneration\\n    return get_model_tokenizer_llava_hf(*args, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.llava1_6_yi_34b_instruct,\\n    'swift/llava-v1.6-34b-hf',\\n    LoRATM.llava,\\n    TemplateType.llava_yi,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    eos_token='<|im_end|>',\\n    requires=['transformers>=4.39'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='llava-hf/llava-v1.6-34b-hf')\\ndef get_model_tokenizer_llava_next_yi(*args, **kwargs):\\n    model, tokenizer = get_model_tokenizer_llava_next(*args, **kwargs)\\n    if model is not None:\\n        model.config.image_token_index = 64003\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.llava_next_video_7b_dpo_instruct,\\n    'swift/LLaVA-NeXT-Video-7B-DPO-hf',\\n    LoRATM.llava_next_video,\\n    TemplateType.llava_next_video,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.42', 'av'],\\n    tags=['multi-modal', 'video'],\\n    hf_model_id='llava-hf/LLaVA-NeXT-Video-7B-DPO-hf')\\n@register_model(\\n    ModelType.llava_next_video_7b_32k_instruct,\\n    'swift/LLaVA-NeXT-Video-7B-32K-hf',\\n    LoRATM.llava_next_video,\\n    TemplateType.llava_next_video,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.42', 'av'],\\n    tags=['multi-modal', 'video'],\\n    hf_model_id='llava-hf/LLaVA-NeXT-Video-7B-32K-hf')\\n@register_model(\\n    ModelType.llava_next_video_7b_instruct,\\n    'swift/LLaVA-NeXT-Video-7B-hf',\\n    LoRATM.llava_next_video,\\n    TemplateType.llava_next_video,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.42', 'av'],\\n    tags=['multi-modal', 'video'],\\n    hf_model_id='llava-hf/LLaVA-NeXT-Video-7B-hf')\\ndef get_model_tokenizer_llava_next_video(*args, **kwargs):\\n    from transformers import LlavaNextVideoForConditionalGeneration\\n    kwargs['automodel_class'] = LlavaNextVideoForConditionalGeneration\\n    return get_model_tokenizer_llava_hf(*args, **kwargs)\\n\\n\\n@register_model(\\n    ModelType.llava_next_video_34b_instruct,\\n    'swift/LLaVA-NeXT-Video-34B-hf',\\n    LoRATM.llava_next_video,\\n    TemplateType.llava_next_video_yi,\\n    support_flash_attn=True,\\n    support_vllm=True,\\n    requires=['transformers>=4.42', 'av'],\\n    tags=['multi-modal', 'video'],\\n    hf_model_id='llava-hf/LLaVA-NeXT-Video-34B-hf')\\ndef get_model_tokenizer_llava_next_video_yi(*args, **kwargs):\\n    model, tokenizer = get_model_tokenizer_llava_next_video(*args, **kwargs)\\n    if model is not None:\\n        model.config.video_token_index = 64003\\n        model.config.image_token_index = 64004\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.llama3_llava_next_8b,\\n    'AI-Modelscope/llama3-llava-next-8b',\\n    LoRATM.llava_llama,\\n    TemplateType.llama3_llava_next,\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'vision'],\\n    function_kwargs={'llm_model_type': 'next_llama'},\\n    hf_model_id='lmms-lab/llama3-llava-next-8b')\\n@register_model(\\n    ModelType.llava_next_72b,\\n    'AI-Modelscope/llava-next-72b',\\n    LoRATM.llava,\\n    TemplateType.llava_qwen,\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'vision'],\\n    function_kwargs={'llm_model_type': 'next_qwen'},\\n    hf_model_id='lmms-lab/llava-next-72b')\\n@register_model(\\n    ModelType.llava_next_110b,\\n    'AI-Modelscope/llava-next-110b',\\n    LoRATM.llava,\\n    TemplateType.llava_qwen,\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'vision'],\\n    function_kwargs={'llm_model_type': 'next_qwen'},\\n    hf_model_id='lmms-lab/llava-next-110b')\\ndef get_model_tokenizer_llava(model_dir: str,\\n                              torch_dtype: torch.dtype,\\n                              model_kwargs: Dict[str, Any],\\n                              load_model: bool = True,\\n                              **kwargs):\\n    llm_model_type = kwargs.pop('llm_model_type')\\n    if 'local_repo_path' in kwargs:\\n        local_repo_path = kwargs['local_repo_path']\\n    elif 'next' in llm_model_type:\\n        repo_path = 'https://github.com/LLaVA-VL/LLaVA-NeXT'\\n        local_repo_path = git_clone_github(repo_path)\\n    else:\\n        repo_path = 'https://github.com/haotian-liu/LLaVA'\\n        local_repo_path = git_clone_github(repo_path)\\n    sys.path.append(os.path.join(local_repo_path))\\n\\n    if llm_model_type == 'mistral':\\n        from llava.model import LlavaMistralForCausalLM, LlavaMistralConfig\\n        model_config = LlavaMistralConfig.from_pretrained(model_dir)\\n        automodel_class = LlavaMistralForCausalLM\\n    elif 'llama' in llm_model_type:  # llama\\n        from llava.model import LlavaLlamaForCausalLM, LlavaConfig\\n        if not hasattr(LlavaLlamaForCausalLM, '__old_forward'):  # Avoid double patching\\n            forward = LlavaLlamaForCausalLM.forward\\n            LlavaLlamaForCausalLM.__old_forward = forward\\n\\n            @wraps(forward)\\n            def _new_forward(*args, **kwargs):\\n                kwargs.pop('cache_position', None)\\n                return forward(*args, **kwargs)\\n\\n            LlavaLlamaForCausalLM.forward = _new_forward\\n        model_config = LlavaConfig.from_pretrained(model_dir)\\n        automodel_class = LlavaLlamaForCausalLM\\n    else:  # qwen\\n        from llava.model import LlavaQwenForCausalLM\\n        automodel_class = LlavaQwenForCausalLM\\n        model_config = AutoConfig.from_pretrained(model_dir)\\n\\n    model_config.mm_vision_tower = snapshot_download('AI-ModelScope/clip-vit-large-patch14-336')\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(\\n        model_dir,\\n        torch_dtype,\\n        model_kwargs,\\n        load_model,\\n        model_config=model_config,\\n        automodel_class=automodel_class,\\n        **kwargs)\\n\\n    if model is not None:\\n        model.resize_token_embeddings(len(tokenizer))\\n        vision_tower = model.get_vision_tower()\\n        device_map = str(model_kwargs.get('device_map', str(model.device)))\\n        if not vision_tower.is_loaded:\\n            vision_tower.load_model(device_map=device_map)\\n        if not hasattr(model.config, 'max_sequence_length'):\\n            model.config.max_sequence_length = 2048\\n        _patch_llava(model)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.idefics3_8b_llama3,\\n    'AI-ModelScope/Idefics3-8B-Llama3',\\n    LoRATM.idefics3,\\n    TemplateType.idefics3,\\n    support_flash_attn=True,\\n    placeholder_tokens=['<image>'],\\n    requires=['transformers>=4.45'],\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='HuggingFaceM4/Idefics3-8B-Llama3')\\ndef get_model_tokenizer_idefics(model_dir: str, *args, **kwargs):\\n    from transformers import AutoProcessor, AutoModelForVision2Seq\\n    processor = AutoProcessor.from_pretrained(model_dir)\\n    kwargs['automodel_class'] = AutoModelForVision2Seq\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, *args, **kwargs)\\n    tokenizer.processor = processor\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.mplug_owl2_chat,\\n    'iic/mPLUG-Owl2',\\n    LoRATM.mplug_owl2,\\n    TemplateType.mplug_owl2,\\n    requires=['transformers<4.35', 'icecream'],\\n    eos_token='</s>',\\n    function_kwargs={'get_model_tokenizer_function': get_model_tokenizer_with_flash_attn},\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='MAGAer13/mplug-owl2-llama2-7b')\\n@register_model(\\n    ModelType.mplug_owl2_1_chat,\\n    'iic/mPLUG-Owl2.1',\\n    LoRATM.mplug_owl2_1,\\n    TemplateType.mplug_owl2,\\n    requires=['transformers<4.35', 'icecream'],\\n    eos_token='<|endoftext|>',\\n    function_kwargs={\\n        'vocab_size': 151851,\\n        'get_model_tokenizer_function': get_model_tokenizer_qwen\\n    },\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'vision'],\\n    hf_model_id='Mizukiluke/mplug_owl_2_1')\\ndef get_model_tokenizer_mplug_owl2(model_dir: str,\\n                                   torch_dtype: torch.dtype,\\n                                   model_kwargs: Dict[str, Any],\\n                                   load_model: bool = True,\\n                                   **kwargs):\\n    if 'local_repo_path' in kwargs:\\n        local_repo_path = kwargs['local_repo_path']\\n    else:\\n        local_repo_path = git_clone_github('https://github.com/X-PLUG/mPLUG-Owl')\\n    local_repo_path = os.path.join(local_repo_path, 'mPLUG-Owl2')\\n    sys.path.append(os.path.join(local_repo_path))\\n\\n    # register\\n    # https://github.com/X-PLUG/mPLUG-Owl/blob/main/mPLUG-Owl2/mplug_owl2/model/modeling_mplug_owl2.py#L447\\n    from mplug_owl2 import MPLUGOwl2LlamaForCausalLM\\n    from transformers.models.clip.image_processing_clip import CLIPImageProcessor\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    vocab_size = kwargs.pop('vocab_size', None)\\n    if vocab_size is not None:\\n        model_config.vocab_size = vocab_size\\n    get_model_tokenizer_function = kwargs.pop('get_model_tokenizer_function')\\n    model, tokenizer = get_model_tokenizer_function(\\n        model_dir, torch_dtype, model_kwargs, load_model, model_config=model_config, **kwargs)\\n    logger.info('Please ignore the unimported warning.')\\n    processor = CLIPImageProcessor.from_pretrained(model_dir)\\n    tokenizer.processor = processor\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.llama3_1_8b_omni,\\n    'ICTNLP/Llama-3.1-8B-Omni',\\n    LoRATM.llama3_1_omni,\\n    TemplateType.llama3_1_omni,\\n    requires=['whisper', 'openai-whisper'],\\n    support_flash_attn=True,\\n    tags=['multi-modal', 'audio'],\\n    hf_model_id='ICTNLP/Llama-3.1-8B-Omni')\\ndef get_model_tokenizer_omnli(model_dir: str,\\n                              torch_dtype: torch.dtype,\\n                              model_kwargs: Dict[str, Any],\\n                              load_model: bool = True,\\n                              **kwargs):\\n    if 'local_repo_path' in kwargs:\\n        local_repo_path = kwargs['local_repo_path']\\n    else:\\n        local_repo_path = git_clone_github('https://github.com/ictnlp/LLaMA-Omni')\\n    local_repo_path = os.path.join(local_repo_path, 'LLaMA-Omni')\\n    sys.path.append(os.path.join(local_repo_path))\\n    from omni_speech.model import OmniSpeech2SLlamaForCausalLM, OmniSpeechLlamaForCausalLM\\n    import whisper\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n    model_config.speech_encoder = os.path.join(model_dir, 'large-v3.pt')\\n    if not os.path.exists(model_config.speech_encoder):\\n        whisper.load_model('large-v3', download_root=model_dir)\\n    kwargs['automodel_class'] = OmniSpeech2SLlamaForCausalLM\\n    kwargs['model_config'] = model_config\\n    for key in ['forward', 'generate']:\\n        try:\\n            delattr(OmniSpeech2SLlamaForCausalLM, key)\\n            delattr(OmniSpeechLlamaForCausalLM, key)\\n        except AttributeError:\\n            pass\\n    # not support device_map='auto'\\n    device_map = model_kwargs['device_map']\\n    model_kwargs['device_map'] = None\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    if model:\\n        model.to('cuda:0' if device_map == 'auto' else device_map)\\n    return model, tokenizer\\n\\n\\n@register_model(\\n    ModelType.got_ocr2,\\n    'stepfun-ai/GOT-OCR2_0',\\n    LoRATM.got_ocr2,\\n    TemplateType.got_ocr2,\\n    support_flash_attn=True,\\n    placeholder_tokens=['<imgpad>'],\\n    eos_token='<|im_end|>',\\n    tags=['multi-modal', 'audio'],\\n    hf_model_id='stepfun-ai/GOT-OCR2_0')\\ndef get_model_tokenizer_got_ocr2(*args, **kwargs):\\n    kwargs['automodel_class'] = AutoModel\\n    model, tokenizer = get_model_tokenizer_with_flash_attn(*args, **kwargs)\\n    return model, tokenizer\\n\\n\\ndef fix_transformers_upgrade(module: PreTrainedModel) -> None:\\n    # from 4.35, transformers changes its arguments of _set_gradient_checkpointing\\n    if version.parse(transformers.__version__) >= version.parse('4.35'):\\n        if isinstance(module, PreTrainedModel) and hasattr(module, '_set_gradient_checkpointing') \\\\\\n                and 'value' in inspect.signature(module._set_gradient_checkpointing).parameters.keys():\\n            module._set_gradient_checkpointing = MethodType(PreTrainedModel._set_gradient_checkpointing, module)\\n\\n\\ndef fix_gradient_checkpointing_warning(is_moe: bool = False) -> None:\\n    torch_version = version.parse(torch.__version__)\\n    if torch_version < version.parse('2'):\\n        return\\n    elif torch_version < version.parse('2.1'):\\n        # fix https://github.com/Dao-AILab/flash-attention/issues/341\\n        _use_reentrant = True\\n    else:\\n        _use_reentrant = is_moe\\n    _old_checkpoint = torch.utils.checkpoint.checkpoint\\n    if not hasattr(torch.utils.checkpoint, '_old_checkpoint'):  # avoid double patching\\n\\n        torch.utils.checkpoint._old_checkpoint = _old_checkpoint\\n        torch.utils.checkpoint.checkpoint = update_wrapper(\\n            lambda *args, use_reentrant=_use_reentrant, **kwargs: _old_checkpoint(\\n                *args, use_reentrant=use_reentrant, **kwargs),\\n            _old_checkpoint)\\n    try:\\n        import transformers.modeling_utils\\n        if hasattr(transformers.modeling_utils, 'checkpoint'):\\n            transformers.modeling_utils.checkpoint = (lambda *args, use_reentrant=_use_reentrant, **kwargs:\\n                                                      _old_checkpoint(*args, use_reentrant=use_reentrant, **kwargs))\\n    except ImportError:\\n        pass\\n\\n\\ndef safe_snapshot_download(model_type: str,\\n                           model_id_or_path: Optional[str] = None,\\n                           revision: Optional[str] = None,\\n                           download_model: bool = True,\\n                           **kwargs) -> str:\\n    # Perform snapshot_download (ms or hf) based on model_type and model_id_or_path.\\n    model_info = MODEL_MAPPING[model_type]\\n    use_hf = strtobool(os.environ.get('USE_HF', 'False'))\\n    if model_id_or_path is None:\\n        model_dir = kwargs.pop('model_dir', None)  # compat with swift<1.7\\n        if model_dir is not None:\\n            model_id_or_path = model_dir\\n        else:\\n            model_id_or_path = model_info['hf_model_id' if use_hf else 'model_id_or_path']\\n\\n    with safe_ddp_context():\\n        if model_id_or_path is not None and not os.path.exists(model_id_or_path):\\n            if model_id_or_path.startswith('/'):\\n                raise ValueError(f\\\"path: '{model_id_or_path}' not found\\\")\\n            ignore_file_pattern = model_info['ignore_file_pattern']\\n            if download_model is False:\\n                if ignore_file_pattern is None:\\n                    ignore_file_pattern = []\\n                if use_hf:\\n                    ignore_file_pattern += ['*.bin', '*.safetensors']\\n                else:\\n                    ignore_file_pattern += [r'.+\\\\.bin$', r'.+\\\\.safetensors$']\\n            if use_hf:\\n                if revision is None or revision == 'master':\\n                    revision = 'main'\\n                logger.info(f'Downloading the model from HuggingFace Hub, model_id: {model_id_or_path}')\\n                use_hf_transfer = strtobool(os.environ.get('USE_HF_TRANSFER', 'False'))\\n                if use_hf_transfer:\\n                    import huggingface_hub._snapshot_download as hf_s\\n                    hf_s.HF_HUB_ENABLE_HF_TRANSFER = True\\n                from huggingface_hub import snapshot_download as hf_snapshot_download\\n                model_dir = hf_snapshot_download(\\n                    model_id_or_path, repo_type='model', revision=revision, ignore_patterns=ignore_file_pattern)\\n            else:\\n                if revision is None:\\n                    revision = model_info['revision']\\n                logger.info(f'Downloading the model from ModelScope Hub, model_id: {model_id_or_path}')\\n                model_dir = snapshot_download(model_id_or_path, revision, ignore_file_pattern=ignore_file_pattern)\\n        else:\\n            model_dir = model_id_or_path\\n        logger.info(f'Loading the model using model_dir: {model_dir}')\\n\\n    model_dir = os.path.expanduser(model_dir)\\n    assert os.path.isdir(model_dir), f'model_dir: {model_dir}'\\n    return model_dir\\n\\n\\ndef get_torch_dtype(model_dir: str) -> torch.dtype:\\n    model_config = PretrainedConfig.get_config_dict(model_dir)[0]\\n    torch_dtype = model_config.get('torch_dtype', None)\\n    if isinstance(torch_dtype, str):\\n        torch_dtype = eval(f'torch.{torch_dtype}')\\n    if torch_dtype in {torch.float32, None}:\\n        torch_dtype = torch.bfloat16 if is_torch_bf16_gpu_available() else torch.float16\\n    return torch_dtype\\n\\n\\ndef get_model_tokenizer(model_type: str,\\n                        torch_dtype: Optional[torch.dtype] = None,\\n                        model_kwargs: Optional[Dict[str, Any]] = None,\\n                        load_model: bool = True,\\n                        *,\\n                        model_id_or_path: Optional[str] = None,\\n                        revision: Optional[str] = None,\\n                        quant_method: Literal['gptq', 'awq', 'aqlm', None] = None,\\n                        **kwargs) -> Tuple[Optional[PreTrainedModel], PreTrainedTokenizerBase]:\\n    \\\"\\\"\\\"\\n    torch_dtype: If you use None, it will retrieve the torch_dtype from the config.json file.\\n        However, if torch.float32 is retrieved, torch.float16 will be used.\\n    \\\"\\\"\\\"\\n    model_dir = kwargs.pop('model_dir', None)  # compat with swift<1.7\\n    download_model = kwargs.pop('download_model', load_model)\\n    model_dir = safe_snapshot_download(\\n        model_type, model_id_or_path, revision=revision, download_model=download_model, model_dir=model_dir)\\n\\n    model_info = MODEL_MAPPING[model_type]\\n    requires = model_info['requires']\\n    for require in requires:\\n        require_version(require)\\n    get_function = model_info['get_function']\\n    if model_kwargs is None:\\n        model_kwargs = {}\\n\\n    if load_model:\\n        if 'device_map' not in model_kwargs and not use_torchacc():\\n            model_kwargs['device_map'] = 'auto'\\n        for k in ['gptq', 'awq', 'aqlm']:\\n            if quant_method == k:\\n                kwargs[f'is_{k}'] = True\\n                break\\n        if model_info.get('torch_dtype') is not None:\\n            model_torch_dtype = model_info['torch_dtype']\\n            if torch_dtype is None:\\n                torch_dtype = model_torch_dtype\\n                logger.info(f'Setting torch_dtype: {torch_dtype}')\\n            else:\\n                assert torch_dtype == model_torch_dtype, f'please use `{model_torch_dtype}`'\\n        else:\\n            if torch_dtype is None:\\n                torch_dtype = get_torch_dtype(model_dir)\\n                logger.info(f'Setting torch_dtype: {torch_dtype}')\\n                quantization_config = model_kwargs.get('quantization_config')\\n                if (isinstance(quantization_config, BitsAndBytesConfig)\\n                        and quantization_config.bnb_4bit_compute_dtype is None):\\n                    quantization_config.bnb_4bit_compute_dtype = torch_dtype\\n                    logger.info(f'Setting quantization_config.bnb_4bit_compute_dtype: {torch_dtype}')\\n\\n    kwargs['eos_token'] = model_info['eos_token']\\n    pad_token = model_info.get('pad_token')\\n    if pad_token is not None:\\n        kwargs['pad_token'] = pad_token\\n    placeholder_tokens = model_info.get('placeholder_tokens')\\n    if placeholder_tokens is not None:\\n        kwargs['placeholder_tokens'] = placeholder_tokens\\n    if 'is_training' not in kwargs:\\n        kwargs['is_training'] = False\\n    model, tokenizer = get_function(model_dir, torch_dtype, model_kwargs, load_model, **kwargs)\\n    is_multimodal = 'multi-modal' in model_info.get('tags', [])\\n    if model is not None:\\n        model.max_model_len = get_max_model_len(model.config)\\n        logger.info(f'model.max_model_len: {model.max_model_len}')\\n        model.model_type = model_type\\n        model.model_dir = model_dir\\n        model.is_multimodal = is_multimodal\\n        fix_transformers_upgrade(model)\\n\\n    is_moe = '-moe' in model_type or 'moe' in model_info.get('tags', [])\\n    fix_gradient_checkpointing_warning(is_moe)\\n    tokenizer.model_type = model_type\\n    tokenizer.model_dir = model_dir\\n    tokenizer.is_multimodal = is_multimodal\\n    assert tokenizer.eos_token is not None, 'tokenizer.eos_token has not been set.'\\n    if tokenizer.pad_token is None:\\n        tokenizer.pad_token = tokenizer.eos_token\\n    if model is not None and model_dir is not None:\\n        generation_config_path = os.path.join(model_dir, 'generation_config.json')\\n        generation_config = getattr(model, 'generation_config', None)\\n        if os.path.isfile(generation_config_path) and generation_config is None:\\n            model.generation_config = GenerationConfig.from_pretrained(model_dir)\\n        generation_config = getattr(model, 'generation_config', None)\\n        # fix llama2 bug\\n        if (generation_config is not None and 0 < generation_config.temperature < 1\\n                and generation_config.do_sample is False):\\n            model.generation_config.do_sample = True\\n            logger.warning('Setting model.generation_config.do_sample: True')\\n    return model, tokenizer\\n\\n\\ndef get_additional_saved_files(model_type: str) -> List[str]:\\n    files_mapping = {\\n        'qwen-vl': ['SimSun.ttf'],\\n        'qwen-audio': ['mel_filters.npz'],\\n        'yi-vl': ['vit'],\\n        'minicpm-v-v2_6-chat': ['modeling_navit_siglip.py']\\n    }\\n    for key, files_list in files_mapping.items():\\n        if key in model_type:\\n            return files_list\\n    return []\\n\\n\\ndef get_default_template_type(model_type: str) -> Optional[str]:\\n    return MODEL_MAPPING[model_type].get('template')\\n\\n\\ndef get_default_lora_target_modules(model_type: str) -> Union[List[str], str, None]:\\n    res = MODEL_MAPPING[model_type].get('lora_target_modules')\\n    if isinstance(res, str):\\n        res = get_regex_for_mm_default_lora(res)\\n    return res\\n\\n\\nimport base64\\nimport hashlib\\nimport os\\nimport re\\nfrom copy import deepcopy\\nfrom io import BytesIO\\nfrom typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Tuple, Union\\n\\nimport aiohttp\\nimport json\\nimport requests\\nfrom dacite import from_dict\\nfrom requests.exceptions import HTTPError\\n\\nfrom .protocol import (ChatCompletionResponse, ChatCompletionStreamResponse, CompletionResponse,\\n                       CompletionStreamResponse, ModelList, XRequestConfig)\\nfrom .template import History\\nfrom .utils import Messages, history_to_messages\\n\\n\\ndef _get_request_kwargs(api_key: Optional[str] = None) -> Dict[str, Any]:\\n    timeout = float(os.getenv('TIMEOUT', '300'))\\n    request_kwargs = {}\\n    if timeout > 0:\\n        request_kwargs['timeout'] = timeout\\n    if api_key is not None:\\n        request_kwargs['headers'] = {'Authorization': f'Bearer {api_key}'}\\n    return request_kwargs\\n\\n\\ndef get_model_list_client(host: str = '127.0.0.1', port: str = '8000', api_key: str = 'EMPTY', **kwargs) -> ModelList:\\n    url = kwargs.pop('url', None)\\n    if url is None:\\n        url = f'http://{host}:{port}/v1'\\n    url = url.rstrip('/')\\n    url = f'{url}/models'\\n    resp_obj = requests.get(url, **_get_request_kwargs(api_key)).json()\\n    return from_dict(ModelList, resp_obj)\\n\\n\\nasync def get_model_list_client_async(host: str = '127.0.0.1',\\n                                      port: str = '8000',\\n                                      api_key: str = 'EMPTY',\\n                                      **kwargs) -> ModelList:\\n    url = kwargs.pop('url', None)\\n    if url is None:\\n        url = f'http://{host}:{port}/v1'\\n    url = url.rstrip('/')\\n    url = f'{url}/models'\\n    async with aiohttp.ClientSession() as session:\\n        async with session.get(url, **_get_request_kwargs(api_key)) as resp:\\n            resp_obj = await resp.json()\\n    return from_dict(ModelList, resp_obj)\\n\\n\\ndef _parse_stream_data(data: bytes) -> Optional[str]:\\n    data = data.decode(encoding='utf-8')\\n    data = data.strip()\\n    if len(data) == 0:\\n        return\\n    assert data.startswith('data:'), f'data: {data}'\\n    return data[5:].strip()\\n\\n\\ndef _to_base64(img_path: Union[str, 'PIL.Image.Image', bytes]) -> str:\\n    if isinstance(img_path, str) and not os.path.isfile(img_path):\\n        # base64\\n        return img_path\\n    if isinstance(img_path, str):\\n        # local_path\\n        with open(img_path, 'rb') as f:\\n            _bytes = f.read()\\n    elif not isinstance(img_path, bytes):  # PIL.Image.Image\\n        bytes_io = BytesIO()\\n        img_path.save(bytes_io, format='png')\\n        _bytes = bytes_io.getvalue()\\n    else:\\n        _bytes = img_path\\n    img_base64: str = base64.b64encode(_bytes).decode('utf-8')\\n    return img_base64\\n\\n\\ndef _encode_prompt(prompt: str) -> str:\\n    pattern = r'<(?:img|audio|video)>(.+?)</(?:img|audio|video)>'\\n    match_iter = re.finditer(pattern, prompt)\\n    new_prompt = ''\\n    idx = 0\\n    for m in match_iter:\\n        span = m.span(1)\\n        path = m.group(1)\\n        img_base64 = _to_base64(path)\\n        new_prompt += prompt[idx:span[0]] + img_base64\\n        idx = span[1]\\n    new_prompt += prompt[idx:]\\n    return new_prompt\\n\\n\\ndef _from_base64(img_base64: Union[str, 'PIL.Image.Image'], tmp_dir: str = 'tmp') -> str:\\n    from PIL import Image\\n    if not isinstance(img_base64, str):  # PIL.Image.Image\\n        img_base64 = _to_base64(img_base64)\\n    if os.path.isfile(img_base64) or img_base64.startswith('http'):\\n        return img_base64\\n    sha256_hash = hashlib.sha256(img_base64.encode('utf-8')).hexdigest()\\n    img_path = os.path.join(tmp_dir, f'{sha256_hash}.png')\\n    image = Image.open(BytesIO(base64.b64decode(img_base64)))\\n    if not os.path.exists(img_path):\\n        image.save(img_path)\\n    return img_path\\n\\n\\ndef _decode_prompt(prompt: str, tmp_dir: str = 'tmp') -> str:\\n    pattern = r'<(?:img|audio|video)>(.+?)</(?:img|audio|video)>'\\n    match_iter = re.finditer(pattern, prompt)\\n    new_content = ''\\n    idx = 0\\n    for m in match_iter:\\n        span = m.span(1)\\n        img_base64 = m.group(1)\\n        img_path = _from_base64(img_base64, tmp_dir)\\n        new_content += prompt[idx:span[0]] + img_path\\n        idx = span[1]\\n    new_content += prompt[idx:]\\n    return new_content\\n\\n\\ndef convert_to_base64(*,\\n                      messages: Optional[Messages] = None,\\n                      prompt: Optional[str] = None,\\n                      images: Optional[List[str]] = None) -> Dict[str, Any]:\\n    \\\"\\\"\\\"local_path -> base64\\\"\\\"\\\"\\n    res = {}\\n    if messages is not None:\\n        res_messages = []\\n        for m in messages:\\n            m_new = deepcopy(m)\\n            m_new['content'] = _encode_prompt(m_new['content'])\\n            res_messages.append(m_new)\\n        res['messages'] = res_messages\\n    if prompt is not None:\\n        prompt = _encode_prompt(prompt)\\n        res['prompt'] = prompt\\n    if images is not None:\\n        res_images = []\\n        for image in images:\\n            res_images.append(_to_base64(image))\\n        res['images'] = res_images\\n    return res\\n\\n\\ndef decode_base64(*,\\n                  messages: Optional[Messages] = None,\\n                  prompt: Optional[str] = None,\\n                  images: Optional[List[str]] = None,\\n                  tmp_dir: str = 'tmp') -> Dict[str, Any]:\\n    # base64 -> local_path\\n    os.makedirs(tmp_dir, exist_ok=True)\\n    res = {}\\n    if messages is not None:\\n        res_messages = []\\n        for m in messages:\\n            m_new = deepcopy(m)\\n            m_new['content'] = _decode_prompt(m_new['content'], tmp_dir)\\n            res_messages.append(m_new)\\n        res['messages'] = res_messages\\n    if prompt is not None:\\n        prompt = _decode_prompt(prompt, tmp_dir)\\n        res['prompt'] = prompt\\n    if images is not None:\\n        res_images = []\\n        for image in images:\\n            image = _from_base64(image, tmp_dir)\\n            res_images.append(image)\\n        res['images'] = res_images\\n    return res\\n\\n\\ndef compat_openai(messages: Messages, request) -> None:\\n    for message in messages:\\n        content = message['content']\\n        if isinstance(content, list):\\n            text = ''\\n            for line in content:\\n                _type = line['type']\\n                value = line[_type]\\n                if _type == 'text':\\n                    text += value\\n                elif _type in {'image_url', 'audio_url', 'video_url'}:\\n                    value = value['url']\\n                    if value.startswith('data:'):\\n                        match_ = re.match(r'data:(.+?);base64,(.+)', value)\\n                        assert match_ is not None\\n                        value = match_.group(2)\\n                    if _type == 'image_url':\\n                        text += '<image>'\\n                        request.images.append(value)\\n                    elif _type == 'audio_url':\\n                        text += '<audio>'\\n                        request.audios.append(value)\\n                    else:\\n                        text += '<video>'\\n                        request.videos.append(value)\\n                else:\\n                    raise ValueError(f'line: {line}')\\n            message['content'] = text\\n\\n\\ndef _pre_inference_client(model_type: str,\\n                          query: str,\\n                          history: Optional[History] = None,\\n                          system: Optional[str] = None,\\n                          images: Optional[List[str]] = None,\\n                          tools: Optional[List[Dict[str, Union[str, Dict]]]] = None,\\n                          tool_choice: Optional[Union[str, Dict]] = 'auto',\\n                          *,\\n                          model_list: Optional[ModelList] = None,\\n                          is_chat_request: Optional[bool] = None,\\n                          is_multimodal: Optional[bool] = None,\\n                          request_config: Optional[XRequestConfig] = None,\\n                          host: str = '127.0.0.1',\\n                          port: str = '8000',\\n                          **kwargs) -> Tuple[str, Dict[str, Any], bool]:\\n    if model_list is not None:\\n        for model in model_list.data:\\n            if model_type == model.id:\\n                if is_chat_request is None:\\n                    is_chat_request = model.is_chat\\n                if is_multimodal is None:\\n                    is_multimodal = model.is_multimodal\\n                break\\n        else:\\n            raise ValueError(f'model_type: {model_type}, model_list: {[model.id for model in model_list.data]}')\\n    assert is_chat_request is not None and is_multimodal is not None\\n    data = {}\\n    request_config_origin = XRequestConfig()\\n    for k, v in request_config.__dict__.items():\\n        v_origin = getattr(request_config_origin, k)\\n        if v != v_origin:\\n            data[k] = v\\n    url = kwargs.pop('url', None)\\n    if url is None:\\n        url = f'http://{host}:{port}/v1'\\n    url = url.rstrip('/')\\n    if is_chat_request:\\n        messages = history_to_messages(history, query, system, kwargs.get('roles'))\\n        if is_multimodal:\\n            messages = convert_to_base64(messages=messages)['messages']\\n        data['messages'] = messages\\n        url = f'{url}/chat/completions'\\n    else:\\n        assert system is None and history is None, (\\n            'The chat template for text generation does not support system and history.')\\n        if is_multimodal:\\n            query = convert_to_base64(prompt=query)['prompt']\\n        data['prompt'] = query\\n        url = f'{url}/completions'\\n    data['model'] = model_type\\n    for media_key, medias in zip(['images', 'audios', 'videos'], [images, kwargs.get('audios'), kwargs.get('videos')]):\\n        if medias:\\n            medias = convert_to_base64(images=medias)['images']\\n            data[media_key] = medias\\n    if tools:\\n        data['tools'] = tools\\n    if tool_choice and tool_choice != 'auto':\\n        data['tool_choice'] = tool_choice\\n    return url, data, is_chat_request\\n\\n\\ndef inference_client(\\n    model_type: str,\\n    query: str,\\n    history: Optional[History] = None,\\n    system: Optional[str] = None,\\n    images: Optional[List[str]] = None,\\n    tools: Optional[List[Dict[str, Union[str, Dict]]]] = None,\\n    tool_choice: Optional[Union[str, Dict]] = 'auto',\\n    *,\\n    is_chat_request: Optional[bool] = None,\\n    is_multimodal: Optional[bool] = None,\\n    request_config: Optional[XRequestConfig] = None,\\n    host: str = '127.0.0.1',\\n    port: str = '8000',\\n    api_key: str = 'EMPTY',\\n    **kwargs\\n) -> Union[ChatCompletionResponse, CompletionResponse, Iterator[ChatCompletionStreamResponse],\\n           Iterator[CompletionStreamResponse]]:\\n    if request_config is None:\\n        request_config = XRequestConfig()\\n    model_list = None\\n    is_chat_request = is_chat_request or kwargs.get('is_chat')\\n    if is_chat_request is None or is_multimodal is None:\\n        model_list = get_model_list_client(host, port, api_key=api_key, **kwargs)\\n\\n    url, data, is_chat_request = _pre_inference_client(\\n        model_type,\\n        query,\\n        history,\\n        system,\\n        images,\\n        tools,\\n        tool_choice,\\n        model_list=model_list,\\n        is_chat_request=is_chat_request,\\n        is_multimodal=is_multimodal,\\n        request_config=request_config,\\n        host=host,\\n        port=port,\\n        **kwargs)\\n\\n    if request_config.stream:\\n        if is_chat_request:\\n            ret_cls = ChatCompletionStreamResponse\\n        else:\\n            ret_cls = CompletionStreamResponse\\n        resp = requests.post(url, json=data, stream=True, **_get_request_kwargs(api_key))\\n\\n        def _gen_stream() -> Union[Iterator[ChatCompletionStreamResponse], Iterator[CompletionStreamResponse]]:\\n            for data in resp.iter_lines():\\n                data = _parse_stream_data(data)\\n                if data == '[DONE]':\\n                    break\\n                if data is not None:\\n                    resp_obj = json.loads(data)\\n                    if resp_obj['object'] == 'error':\\n                        raise HTTPError(resp_obj['message'])\\n                    yield from_dict(ret_cls, resp_obj)\\n\\n        return _gen_stream()\\n    else:\\n        resp_obj = requests.post(url, json=data, **_get_request_kwargs(api_key)).json()\\n        if is_chat_request:\\n            ret_cls = ChatCompletionResponse\\n        else:\\n            ret_cls = CompletionResponse\\n        if resp_obj['object'] == 'error':\\n            raise HTTPError(resp_obj['message'])\\n        return from_dict(ret_cls, resp_obj)\\n\\n\\nasync def inference_client_async(\\n    model_type: str,\\n    query: str,\\n    history: Optional[History] = None,\\n    system: Optional[str] = None,\\n    images: Optional[List[str]] = None,\\n    tools: Optional[List[Dict[str, Union[str, Dict]]]] = None,\\n    tool_choice: Optional[Union[str, Dict]] = 'auto',\\n    *,\\n    is_chat_request: Optional[bool] = None,\\n    is_multimodal: Optional[bool] = None,\\n    request_config: Optional[XRequestConfig] = None,\\n    host: str = '127.0.0.1',\\n    port: str = '8000',\\n    api_key: str = 'EMPTY',\\n    **kwargs\\n) -> Union[ChatCompletionResponse, CompletionResponse, AsyncIterator[ChatCompletionStreamResponse],\\n           AsyncIterator[CompletionStreamResponse]]:\\n    if request_config is None:\\n        request_config = XRequestConfig()\\n    model_list = None\\n    is_chat_request = is_chat_request or kwargs.get('is_chat')\\n    if is_chat_request is None or is_multimodal is None:\\n        model_list = await get_model_list_client_async(host, port, api_key=api_key, **kwargs)\\n\\n    url, data, is_chat_request = _pre_inference_client(\\n        model_type,\\n        query,\\n        history,\\n        system,\\n        images,\\n        tools,\\n        tool_choice,\\n        model_list=model_list,\\n        is_chat_request=is_chat_request,\\n        is_multimodal=is_multimodal,\\n        request_config=request_config,\\n        host=host,\\n        port=port,\\n        **kwargs)\\n\\n    if request_config.stream:\\n        if is_chat_request:\\n            ret_cls = ChatCompletionStreamResponse\\n        else:\\n            ret_cls = CompletionStreamResponse\\n\\n        async def _gen_stream(\\n        ) -> Union[AsyncIterator[ChatCompletionStreamResponse], AsyncIterator[CompletionStreamResponse]]:\\n            async with aiohttp.ClientSession() as session:\\n                async with session.post(url, json=data, **_get_request_kwargs(api_key)) as resp:\\n                    async for _data in resp.content:\\n                        _data = _parse_stream_data(_data)\\n                        if _data == '[DONE]':\\n                            break\\n                        if _data is not None:\\n                            resp_obj = json.loads(_data)\\n                            if resp_obj['object'] == 'error':\\n                                raise HTTPError(resp_obj['message'])\\n                            yield from_dict(ret_cls, resp_obj)\\n\\n        return _gen_stream()\\n    else:\\n        if is_chat_request:\\n            ret_cls = ChatCompletionResponse\\n        else:\\n            ret_cls = CompletionResponse\\n        async with aiohttp.ClientSession() as session:\\n            async with session.post(url, json=data, **_get_request_kwargs(api_key)) as resp:\\n                resp_obj = await resp.json()\\n                if resp_obj['object'] == 'error':\\n                    raise HTTPError(resp_obj['message'])\\n                return from_dict(ret_cls, resp_obj)\\n\\n\\nimport concurrent.futures\\nimport inspect\\nimport os\\nimport time\\nfrom contextlib import contextmanager\\nfrom copy import deepcopy\\nfrom functools import wraps\\nfrom typing import Any, Dict, Iterator, List, Optional, Tuple, Union\\n\\nimport torch\\nimport vllm\\nfrom packaging import version\\nfrom tqdm import tqdm\\nfrom transformers import AutoTokenizer, GenerationConfig, PreTrainedTokenizerBase\\nfrom vllm import AsyncEngineArgs, AsyncLLMEngine, EngineArgs, LLMEngine, SamplingParams\\n\\nfrom swift.utils import get_logger\\nfrom .argument import InferArguments\\nfrom .model import get_model_tokenizer\\nfrom .template import Template, get_template\\n\\ntry:\\n    from vllm.lora.request import LoRARequest\\nexcept ImportError:\\n    pass\\n\\nlogger = get_logger()\\n\\n\\n@contextmanager\\ndef _patch_auto_tokenizer(tokenizer):\\n    _old_from_pretrained = AutoTokenizer.from_pretrained\\n\\n    @wraps(_old_from_pretrained)\\n    def _from_pretrained(self, *args, **kwargs):\\n        return tokenizer\\n\\n    AutoTokenizer.from_pretrained = _from_pretrained\\n    yield\\n    AutoTokenizer.from_pretrained = _old_from_pretrained\\n\\n\\ndef get_vllm_engine(\\n        model_type: str,\\n        torch_dtype: Optional[torch.dtype] = None,\\n        *,\\n        model_id_or_path: Optional[str] = None,\\n        revision: Optional[str] = None,\\n        gpu_memory_utilization: float = 0.9,\\n        tensor_parallel_size: int = 1,\\n        max_num_seqs: int = 256,\\n        max_model_len: Optional[int] = None,\\n        disable_custom_all_reduce: bool = True,  # Default values different from vllm\\n        enforce_eager: bool = False,\\n        limit_mm_per_prompt: Optional[Dict[str, Any]] = None,\\n        engine_kwargs: Optional[Dict[str, Any]] = None,\\n        use_async: bool = False,\\n        # lora\\n        enable_lora: bool = False,\\n        max_loras: int = 1,\\n        max_lora_rank: int = 16,\\n        **kwargs) -> LLMEngine:\\n    model_dir = kwargs.pop('model_dir', None)  # compat with swift<1.7\\n    tokenizer = get_model_tokenizer(\\n        model_type,\\n        load_model=False,\\n        model_id_or_path=model_id_or_path,\\n        model_dir=model_dir,\\n        revision=revision,\\n        download_model=True)[1]\\n    model_dir = tokenizer.model_dir\\n\\n    if engine_kwargs is None:\\n        engine_kwargs = {}\\n    dtype_mapping = {torch.float16: 'float16', torch.bfloat16: 'bfloat16', torch.float32: 'float32', None: 'auto'}\\n    dtype = dtype_mapping[torch_dtype]\\n    disable_log_stats = engine_kwargs.pop('disable_log_stats', True)\\n\\n    if use_async:\\n        engine_args_cls = AsyncEngineArgs\\n        llm_engine_cls = AsyncLLMEngine\\n        engine_kwargs['disable_log_requests'] = True\\n    else:\\n        engine_args_cls = EngineArgs\\n        llm_engine_cls = LLMEngine\\n\\n    parameters = inspect.signature(engine_args_cls.__init__).parameters\\n    if 'enable_lora' in parameters and enable_lora:\\n        engine_kwargs['enable_lora'] = enable_lora\\n        engine_kwargs['max_loras'] = max_loras\\n        engine_kwargs['max_lora_rank'] = max_lora_rank\\n    else:\\n        assert not enable_lora, 'The current version of VLLM does not support `enable_lora`. Please upgrade VLLM.'\\n\\n    if 'limit_mm_per_prompt' in parameters and limit_mm_per_prompt:\\n        engine_kwargs['limit_mm_per_prompt'] = limit_mm_per_prompt\\n    else:\\n        assert not limit_mm_per_prompt, (\\n            'The current version of VLLM does not support `limit_mm_per_prompt`. Please upgrade VLLM.')\\n\\n    engine_args = engine_args_cls(\\n        model=model_dir,\\n        trust_remote_code=True,\\n        dtype=dtype,\\n        gpu_memory_utilization=gpu_memory_utilization,\\n        tensor_parallel_size=tensor_parallel_size,\\n        max_num_seqs=max_num_seqs,\\n        max_model_len=max_model_len,\\n        disable_log_stats=disable_log_stats,\\n        disable_custom_all_reduce=disable_custom_all_reduce,\\n        enforce_eager=enforce_eager,\\n        **engine_kwargs)\\n    try:\\n        from vllm.model_executor.parallel_utils.parallel_state import destroy_model_parallel\\n        destroy_model_parallel()\\n    except ImportError:\\n        pass\\n    # fix HTTPError bug (use model_dir)\\n    os.environ.pop('VLLM_USE_MODELSCOPE', None)\\n    if version.parse(vllm.__version__) >= version.parse('0.5.1'):\\n        os.environ['VLLM_WORKER_MULTIPROC_METHOD'] = 'spawn'\\n    with _patch_auto_tokenizer(tokenizer):\\n        llm_engine = llm_engine_cls.from_engine_args(engine_args)\\n    llm_engine.engine_args = engine_args\\n    llm_engine.model_dir = model_dir\\n    llm_engine.model_type = model_type\\n\\n    if use_async:\\n        _engine = llm_engine.engine\\n    else:\\n        _engine = llm_engine\\n    model_config = _engine.model_config\\n    llm_engine.model_config = model_config\\n    llm_engine.dtype = model_config.dtype  # compat with pt\\n    llm_engine.max_model_len = model_config.max_model_len\\n    llm_engine.is_multimodal = tokenizer.is_multimodal\\n    # compatible with vllm==0.3.*\\n    if version.parse(vllm.__version__) >= version.parse('0.3'):\\n        assert isinstance(_engine.tokenizer.tokenizer, PreTrainedTokenizerBase)\\n        _engine.tokenizer.tokenizer = tokenizer\\n\\n        # fix vllm==0.4 bug (very slow)\\n        if version.parse(vllm.__version__) >= version.parse('0.4'):\\n            _tokenizer_len = len(tokenizer)\\n            __old_len__ = tokenizer.__class__.__len__\\n\\n            def __len__(self) -> int:\\n                if self is tokenizer:\\n                    return _tokenizer_len\\n                else:\\n                    return __old_len__(self)\\n\\n            tokenizer.__class__.__len__ = __len__\\n\\n    else:\\n        assert isinstance(_engine.tokenizer, PreTrainedTokenizerBase)\\n        _engine.tokenizer = tokenizer\\n\\n    llm_engine.hf_tokenizer = tokenizer\\n    generation_config_path = os.path.join(model_dir, 'generation_config.json')\\n    if os.path.isfile(generation_config_path):\\n        generation_config = GenerationConfig.from_pretrained(model_dir)\\n        kwargs = generation_config.to_dict()\\n        max_new_tokens = kwargs.get('max_new_tokens')\\n        if max_new_tokens is not None:\\n            kwargs['max_tokens'] = max_new_tokens\\n        if version.parse(vllm.__version__) < version.parse('0.5.5'):\\n            parameters = inspect.signature(VllmGenerationConfig.__init__).parameters\\n        else:\\n            parameters = VllmGenerationConfig.__annotations__\\n        for k, v in kwargs.copy().items():\\n            if k not in parameters or v is None:\\n                kwargs.pop(k)\\n        llm_engine.generation_config = VllmGenerationConfig(**kwargs)\\n    else:\\n        llm_engine.generation_config = VllmGenerationConfig()\\n    return llm_engine\\n\\n\\nclass _VllmGenerationConfigMixin:\\n\\n    def __setattr__(self, key: str, value: str) -> None:\\n        if key == 'max_new_tokens':\\n            self.max_tokens = value\\n        elif key == 'do_sample' and hasattr(self, '_temperature'):\\n            assert value in {True, False}\\n            super().__setattr__('temperature', self._temperature if value else 0)\\n        elif key == 'max_length':\\n            raise ValueError('`max_length` is not supported, please use `max_new_tokens` for setting.')\\n        else:\\n            if key == 'temperature':\\n                self._temperature = value\\n            super().__setattr__(key, value)\\n\\n\\nif version.parse(vllm.__version__) < version.parse('0.5.5'):\\n\\n    class VllmGenerationConfig(_VllmGenerationConfigMixin, SamplingParams):\\n\\n        def __init__(\\n            self,\\n            max_tokens: int = 64,  # max_tokens\\n            temperature: float = 1.,\\n            top_k: int = 50,  # -1: all\\n            top_p: float = 1.,\\n            repetition_penalty: float = 1.,\\n            num_beams: int = 1,\\n            *,\\n            n: int = 1,\\n            logprobs: Optional[int] = None,\\n            seed: Optional[int] = None,\\n            length_penalty: float = 1.,\\n            stop: Optional[List[str]] = None,\\n            skip_special_tokens: bool = False,\\n            **kwargs,\\n        ) -> None:\\n            # compat\\n            max_new_tokens = kwargs.pop('max_new_tokens', None)\\n            if max_new_tokens is not None:\\n                max_tokens = max_new_tokens\\n            if num_beams > 1:\\n                top_k = -1\\n                top_p = 1\\n                temperature = 0\\n                logger.warning('The output of num_beams in vllm may not be consistent with '\\n                               'the output of num_beams in transformers.')\\n            if top_k == 0:\\n                top_k = -1\\n            if stop is None:\\n                stop = []\\n            kwargs['max_tokens'] = max_tokens\\n            kwargs['temperature'] = temperature\\n            kwargs['top_k'] = top_k\\n            kwargs['top_p'] = top_p\\n            kwargs['repetition_penalty'] = repetition_penalty\\n            if num_beams > 1:\\n                best_of = kwargs.get('best_of')\\n                assert 'use_beam_search' not in kwargs and best_of is None\\n                kwargs['use_beam_search'] = True\\n                kwargs['best_of'] = num_beams\\n            kwargs['n'] = n\\n            kwargs['logprobs'] = logprobs\\n            kwargs['seed'] = seed\\n            kwargs['length_penalty'] = length_penalty\\n            kwargs['stop'] = stop\\n            kwargs['skip_special_tokens'] = skip_special_tokens\\n            parameters = inspect.signature(SamplingParams.__init__).parameters\\n            for k in kwargs.copy().keys():\\n                if k not in parameters:\\n                    logger.info(f'The VLLM version is too old and does not support the parameter: {k}.')\\n                    kwargs.pop(k)\\n            self._temperature = temperature\\n            super().__init__(**kwargs)\\n\\nelse:\\n\\n    class VllmGenerationConfig(_VllmGenerationConfigMixin, SamplingParams):\\n        max_tokens: int = 64\\n        temperature: float = 1.\\n        top_k: int = 50  # -1: all\\n        top_p: float = 1.\\n        repetition_penalty: float = 1.\\n        num_beams: int = 1\\n        n: int = 1\\n        logprobs: Optional[int] = None\\n        seed: Optional[int] = None\\n        length_penalty: float = 1.\\n        stop: Optional[List[str]] = None\\n        skip_special_tokens: bool = False\\n\\n        def __post_init__(self):\\n            if self.num_beams > 1:\\n                self.top_k = -1\\n                self.top_p = 1\\n                self.temperature = 0\\n                logger.warning('The output of num_beams in vllm may not be consistent with '\\n                               'the output of num_beams in transformers.')\\n                assert self.best_of is None\\n                self.use_beam_search = True\\n                self.best_of = self.num_beams\\n            if self.top_k == 0:\\n                self.top_k = -1\\n            if self.stop is None:\\n                self.stop = []\\n            self._temperature = self.temperature\\n            super().__post_init__()\\n\\n\\ndef add_vllm_request(llm_engine: Union[LLMEngine, AsyncLLMEngine], inputs: Dict[str, Any], *, request_id: str,\\n                     generation_config: VllmGenerationConfig, **kwargs):\\n    input_ids = inputs['input_ids']\\n    if version.parse(vllm.__version__) >= version.parse('0.4.3'):\\n        llm_inputs = {'prompt_token_ids': input_ids}\\n        mm_data = {}\\n        for key in ['images', 'audios', 'videos']:\\n            meida_data = inputs.get(key) or []\\n            if meida_data:\\n                if version.parse(vllm.__version__) < version.parse('0.6'):\\n                    assert len(meida_data) == 1, (\\n                        f'The current version of vllm only supports single {key}. Please upgrade to vllm >= 0.6.0')\\n                    mm_data = {key.rstrip('s'): meida_data[0]}\\n                else:\\n                    mm_data = {key.rstrip('s'): meida_data[0] if len(meida_data) == 1 else meida_data}\\n        if mm_data:\\n            llm_inputs['multi_modal_data'] = mm_data\\n        if llm_engine.__class__.__name__ == 'LLMEngine':\\n            result_generator = llm_engine.add_request(request_id, llm_inputs, generation_config, **kwargs)\\n        else:\\n            result_generator = llm_engine.generate(llm_inputs, generation_config, request_id, **kwargs)\\n    else:\\n        if llm_engine.__class__.__name__ == 'LLMEngine':\\n            result_generator = llm_engine.add_request(request_id, None, generation_config, input_ids, **kwargs)\\n        else:\\n            result_generator = llm_engine.generate(None, generation_config, request_id, input_ids, **kwargs)\\n    return result_generator\\n\\n\\ndef _prepare_vllm_request(llm_engine: LLMEngine,\\n                          template: Template,\\n                          request_list: List[Dict[str, Any]],\\n                          *,\\n                          generation_config: VllmGenerationConfig,\\n                          generation_info: Dict[str, Any],\\n                          lora_request: Optional['LoRARequest'] = None,\\n                          use_tqdm: bool = False,\\n                          **kwargs) -> Tuple[List[Optional[Dict[str, Any]]], List[Tuple[bool, int]]]:\\n    for key in ['num_prompt_tokens', 'num_generated_tokens', 'num_samples']:\\n        if key not in generation_info:\\n            generation_info[key] = 0\\n\\n    template.model = llm_engine\\n    tokenizer = template.tokenizer\\n    if tokenizer.eos_token is not None and tokenizer.eos_token not in generation_config.stop:\\n        generation_config.stop.append(tokenizer.eos_token)\\n    if isinstance(template.suffix[-1], str) and template.suffix[-1] not in generation_config.stop:\\n        generation_config.stop.append(template.suffix[-1])\\n    if isinstance(template.suffix[-1], list):\\n        token_str = tokenizer.decode(template.suffix[-1])\\n        if token_str not in generation_config.stop:\\n            generation_config.stop.append(token_str)\\n\\n    parameters = inspect.signature(llm_engine.add_request).parameters\\n    add_request_kwargs = {}\\n    if 'lora_request' in parameters:\\n        add_request_kwargs['lora_request'] = lora_request\\n    else:\\n        assert lora_request is None, (\\n            'The current version of VLLM does not support `lora_request`. Please upgrade VLLM.')\\n\\n    resp_list: List[Optional[Dict[str, Any]]] = [None] * len(request_list)\\n    agent_state = []\\n    is_multimodal = getattr(llm_engine, 'is_multimodal', False)\\n    max_workers = os.cpu_count()\\n    if not is_multimodal:\\n        use_tqdm = False\\n        max_workers = 1\\n\\n    prog_bar = tqdm(request_list, dynamic_ncols=True, disable=not use_tqdm)\\n\\n    def _prepare_inputs(request: Dict[str, Any]) -> Dict[str, Any]:\\n        history = request.get('history') or []\\n        # agent support\\n        is_observation = history[-1][-1].endswith('Observation:') if history and history[-1][-1] else False\\n        act_length = None\\n        if is_observation:\\n            history[-1][-1] = history[-1][-1] + request['query']\\n            act_length = len(history[-1][-1])\\n            request['query'] = None\\n        agent_state.append((is_observation, act_length))\\n        request['history'] = history\\n\\n        inputs = template.encode(request)[0]\\n        prog_bar.update()\\n        return inputs\\n\\n    with template.vllm_context(), concurrent.futures.ThreadPoolExecutor(\\n            max_workers=min(max_workers, len(request_list))) as executor:\\n        futures = [executor.submit(_prepare_inputs, request) for request in request_list]\\n        concurrent.futures.wait(futures)\\n        inputs_list = [future.result() for future in futures]\\n    prog_bar.close()\\n\\n    for i, (inputs, request) in enumerate(zip(inputs_list, request_list)):\\n        truncation_strategy = kwargs.pop('truncation_strategy', 'delete')\\n        if len(inputs) == 0 and truncation_strategy == 'delete':\\n            # input_ids exceeds `max_length`. Please increase the value of `max_length`.\\n            resp_list[i] = {'response': '', 'history': request['history']}\\n            continue\\n        generation_info['num_prompt_tokens'] += len(inputs['input_ids'])\\n        generation_info['num_samples'] += 1\\n        add_vllm_request(\\n            llm_engine, inputs, request_id=str(i), generation_config=generation_config, **add_request_kwargs)\\n    return resp_list, agent_state\\n\\n\\n@torch.inference_mode()\\ndef inference_stream_vllm(\\n        llm_engine: LLMEngine,\\n        template: Template,\\n        request_list: List[Dict[str, Any]],\\n        *,\\n        generation_config: Optional[VllmGenerationConfig] = None,\\n        generation_info: Optional[Dict[str, Any]] = None,\\n        lora_request: Optional['LoRARequest'] = None,\\n        use_tqdm: bool = False,\\n        flush_steps: Optional[int] = None,  # Ensuring efficiency\\n        **kwargs) -> Iterator[List[Dict[str, Any]]]:\\n    \\\"\\\"\\\"\\n    request_list: e.g. [{'query': 'hello!'}].\\n        The keys that can be included are: 'query', 'history', 'system', 'images'.\\n    generation_config: Priority: generation_config > model.generation_config.\\n    return: e.g. [{'response': 'hi!', 'history': [('hello!', 'hi!')]}].\\n        The keys to be included will be: 'response', 'history'.\\n    \\\"\\\"\\\"\\n    if len(request_list) == 0:\\n        return\\n    start_runtime = time.perf_counter()\\n    if generation_config is None:\\n        generation_config = getattr(llm_engine, 'generation_config', None) or VllmGenerationConfig()\\n    assert isinstance(generation_config, VllmGenerationConfig)\\n    request_list = deepcopy(request_list)\\n    generation_config = deepcopy(generation_config)\\n    if generation_info is None:\\n        generation_info = {}\\n    else:\\n        generation_info.clear()\\n\\n    resp_list, agent_state = _prepare_vllm_request(\\n        llm_engine,\\n        template,\\n        request_list,\\n        generation_config=generation_config,\\n        generation_info=generation_info,\\n        lora_request=lora_request,\\n        use_tqdm=use_tqdm,\\n        **kwargs)\\n\\n    if generation_config.use_beam_search:\\n        error_msg = 'Streaming generation does not support beam search.'\\n        raise ValueError(error_msg)\\n\\n    n_finished = 0\\n    n_steps = 0\\n    if flush_steps is None:\\n        flush_steps = min(10, generation_info['num_samples'])\\n    print_idx_list = [[0] for _ in range(len(request_list))]\\n    num_generated_tokens = [0] * len(request_list)\\n    prog_bar = tqdm(total=generation_info['num_samples'], dynamic_ncols=True, disable=not use_tqdm)\\n    while llm_engine.has_unfinished_requests():\\n        is_flush = False\\n        n_steps += 1\\n        step_outputs = llm_engine.step()\\n        for output in step_outputs:\\n            if not output.finished and n_steps % flush_steps != 0:\\n                continue\\n            is_flush = True\\n            i = int(output.request_id)\\n            request = request_list[i]\\n            generate_ids = output.outputs[0].token_ids\\n            logprobs = output.outputs[0].logprobs\\n            safe_response = template.generate_ids_to_response(\\n                generate_ids, output.finished, print_idx=print_idx_list[i])\\n            query = request['query']\\n            history = request['history']\\n            if resp_list[i] is None and not agent_state[i][0]:\\n                history.append(None)\\n            if not agent_state[i][0]:\\n                history[-1] = [query, safe_response]\\n            else:\\n                history[-1][-1] = history[-1][-1][:agent_state[i][1]] + safe_response\\n\\n            n_gen_tokens = sum(len(_output.token_ids) for _output in output.outputs)\\n            generation_info['num_generated_tokens'] += n_gen_tokens - num_generated_tokens[i]\\n            num_generated_tokens[i] = n_gen_tokens\\n\\n            resp_list[i] = {'response': safe_response, 'history': history}\\n            if logprobs is not None:\\n                resp_list[i]['logprobs'] = logprobs\\n            if output.finished:\\n                n_finished += 1\\n                prog_bar.update()\\n        if not is_flush:\\n            continue\\n        runtime = time.perf_counter() - start_runtime\\n        generation_info['runtime'] = runtime\\n        generation_info['samples/s'] = n_finished / runtime\\n        generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n        yield resp_list\\n    prog_bar.close()\\n\\n\\n@torch.inference_mode()\\ndef inference_vllm(llm_engine: LLMEngine,\\n                   template: Template,\\n                   request_list: List[Dict[str, Any]],\\n                   *,\\n                   generation_config: Optional[VllmGenerationConfig] = None,\\n                   generation_info: Optional[Dict[str, Any]] = None,\\n                   max_batch_size: Optional[int] = None,\\n                   lora_request: Optional['LoRARequest'] = None,\\n                   use_tqdm: bool = False,\\n                   verbose: bool = False,\\n                   prompt_prefix: str = '[PROMPT]',\\n                   output_prefix: str = '[OUTPUT]',\\n                   **kwargs) -> List[Dict[str, Any]]:\\n    \\\"\\\"\\\"\\n    request_list: e.g. [{'query': 'hello!'}].\\n        The keys that can be included are: 'query', 'history', 'system', 'images'.\\n    generation_config: Priority: generation_config > model.generation_config.\\n    return: e.g. [{'response': 'hi!', 'history': [('hello!', 'hi!')]}].\\n        The keys to be included will be: 'response', 'history'.\\n    \\\"\\\"\\\"\\n    if len(request_list) == 0:\\n        return []\\n    runtime = time.perf_counter()\\n\\n    is_multimodal = getattr(llm_engine, 'is_multimodal', False)\\n    if is_multimodal and max_batch_size is None:\\n        max_batch_size = 512\\n\\n    _inner_call = kwargs.get('_inner_call', False)\\n    if generation_info is None:\\n        generation_info = {}\\n    elif not _inner_call:\\n        generation_info.clear()\\n    if max_batch_size is not None and len(request_list) > max_batch_size:\\n        i = 0\\n        resp_list = []\\n        kwargs['_inner_call'] = True\\n        while i < len(request_list):\\n            resp_list += inference_vllm(\\n                llm_engine,\\n                template,\\n                request_list[i:i + max_batch_size],\\n                generation_config=generation_config,\\n                generation_info=generation_info,\\n                max_batch_size=max_batch_size,\\n                lora_request=lora_request,\\n                use_tqdm=use_tqdm,\\n                verbose=verbose,\\n                prompt_prefix=prompt_prefix,\\n                output_prefix=output_prefix,\\n                **kwargs)\\n            i += max_batch_size\\n        runtime = time.perf_counter() - runtime\\n        generation_info['runtime'] = runtime\\n        generation_info['samples/s'] = generation_info['num_samples'] / runtime\\n        generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n        return resp_list\\n\\n    if generation_config is None:\\n        generation_config = getattr(llm_engine, 'generation_config', None) or VllmGenerationConfig()\\n    assert isinstance(generation_config, VllmGenerationConfig)\\n    request_list = deepcopy(request_list)\\n    generation_config = deepcopy(generation_config)\\n\\n    old_num_samples = generation_info.get('num_samples', 0)\\n    resp_list, agent_state = _prepare_vllm_request(\\n        llm_engine,\\n        template,\\n        request_list,\\n        generation_config=generation_config,\\n        generation_info=generation_info,\\n        lora_request=lora_request,\\n        use_tqdm=use_tqdm,\\n        **kwargs)\\n\\n    tokenizer = template.tokenizer\\n    if use_tqdm:\\n        assert verbose is False\\n    prog_bar = tqdm(total=generation_info['num_samples'] - old_num_samples, dynamic_ncols=True, disable=not use_tqdm)\\n    outputs = []\\n    while llm_engine.has_unfinished_requests():\\n        step_outputs = llm_engine.step()\\n        for output in step_outputs:\\n            if output.finished:\\n                outputs.append(output)\\n                prog_bar.update()\\n    prog_bar.close()\\n\\n    for output in outputs:\\n        i = int(output.request_id)\\n        request = request_list[i]\\n        generate_ids = output.outputs[0].token_ids\\n        logprobs = output.outputs[0].logprobs\\n        response = template.generate_ids_to_response(generate_ids)\\n        query = request['query']\\n        history = request['history']\\n        if not agent_state[i][0]:\\n            history.append([query, response])\\n        else:\\n            history[-1][-1] = history[-1][-1] + response\\n\\n        generation_info['num_generated_tokens'] += sum(len(_output.token_ids) for _output in output.outputs)\\n        resp_list[i] = {'response': response, 'history': history}\\n        if logprobs is not None:\\n            resp_list[i]['logprobs'] = logprobs\\n        if verbose:\\n            print(f'{prompt_prefix}{tokenizer.decode(output.prompt_token_ids, False)}{output_prefix}', end='')\\n            print(tokenizer.decode(output.outputs[0].token_ids, False))\\n    runtime = time.perf_counter() - runtime\\n    generation_info['runtime'] = runtime\\n    generation_info['samples/s'] = generation_info['num_samples'] / runtime\\n    generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n    return resp_list\\n\\n\\ndef prepare_vllm_engine_template(args: InferArguments, use_async: bool = False) -> Tuple[LLMEngine, Template]:\\n    logger.info(f'device_count: {torch.cuda.device_count()}')\\n\\n    assert not (args.sft_type == 'lora' and not args.vllm_enable_lora), 'you need to merge lora'\\n    # Loading Model and Tokenizer\\n    model_id_or_path = None\\n    if args.sft_type == 'full' and args.ckpt_dir is not None:\\n        model_id_or_path = args.ckpt_dir\\n    elif args.model_id_or_path is not None:\\n        model_id_or_path = args.model_id_or_path\\n    llm_engine = get_vllm_engine(\\n        args.model_type,\\n        args.torch_dtype,\\n        gpu_memory_utilization=args.gpu_memory_utilization,\\n        tensor_parallel_size=args.tensor_parallel_size,\\n        max_num_seqs=args.max_num_seqs,\\n        max_model_len=args.max_model_len,\\n        disable_custom_all_reduce=args.disable_custom_all_reduce,\\n        enforce_eager=args.enforce_eager,\\n        limit_mm_per_prompt=args.limit_mm_per_prompt,\\n        use_async=use_async,\\n        model_id_or_path=model_id_or_path,\\n        enable_lora=args.vllm_enable_lora,\\n        max_loras=max(len(args.lora_modules), 1),\\n        max_lora_rank=args.vllm_max_lora_rank)\\n    setattr(llm_engine.generation_config, 'max_tokens', args.max_new_tokens)\\n    for k in ['temperature', 'do_sample', 'top_k', 'top_p', 'repetition_penalty']:\\n        val = getattr(args, k, None)\\n        if val is not None:\\n            setattr(llm_engine.generation_config, k, val)\\n    logger.info(f'llm_engine.generation_config: {llm_engine.generation_config}')\\n\\n    tokenizer = llm_engine.hf_tokenizer\\n    template: Template = get_template(\\n        args.template_type,\\n        tokenizer,\\n        args.system,\\n        args.max_length,\\n        args.truncation_strategy,\\n        model=llm_engine,\\n        tools_prompt=args.tools_prompt)\\n    args.system = template.default_system\\n    logger.info(f'system: {args.system}')\\n    return llm_engine, template\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from huggingface/transformers.\\nimport heapq\\nimport importlib.util\\nimport os\\nimport shutil\\nimport time\\nfrom copy import deepcopy\\nfrom functools import partial, wraps\\nfrom queue import Empty, Queue\\nfrom tempfile import TemporaryDirectory\\nfrom threading import Thread\\nfrom types import MethodType\\nfrom typing import Any, Callable, Dict, Iterator, List, Mapping, Optional, Sequence, Set, Tuple, Union\\n\\nimport accelerate\\nimport multiprocess\\nimport numpy as np\\nimport requests\\nimport torch\\nimport torch.distributed as dist\\nimport torch.nn as nn\\nimport torch.utils.checkpoint\\nimport transformers\\nfrom datasets import Dataset as HfDataset\\nfrom datasets import IterableDataset as HfIterableDataset\\nfrom modelscope.utils.config_ds import MS_CACHE_HOME\\nfrom torch.nn import Linear, Module\\nfrom torch.nn.parallel import DistributedDataParallel as DDP\\nfrom torch.utils.data import Dataset, IterableDataset\\nfrom tqdm.auto import tqdm\\nfrom transformers import (GenerationConfig, PretrainedConfig, PreTrainedModel, PreTrainedTokenizerBase,\\n                          StoppingCriteriaList, TextStreamer, trainer)\\nfrom transformers.generation.streamers import BaseStreamer\\nfrom transformers.utils import is_torch_npu_available\\n\\nfrom swift.hub import ModelScopeConfig\\nfrom swift.utils import get_dist_setting, get_logger, is_ddp_plus_mp, stat_array, upper_bound, use_torchacc\\nfrom swift.utils.module_mapping import MODEL_KEYS_MAPPING, MultiModelKeys\\nfrom .template import History, StopWords, StopWordsCriteria, Template\\n\\nDATASET_TYPE = Union[HfDataset, HfIterableDataset]\\n\\nlogger = get_logger()\\n\\nos.environ['TOKENIZERS_PARALLELISM'] = 'true'\\n\\n\\ndef download_files(url: str, local_path: str, cookies) -> None:\\n    resp = requests.get(url, cookies=cookies, stream=True)\\n    with open(local_path, 'wb') as f:\\n        for data in tqdm(resp.iter_lines()):\\n            f.write(data)\\n\\n\\ndef download_dataset(model_id: str, files: List[str], force_download: bool = False) -> str:\\n    assert isinstance(files, list)\\n    url = f'http://www.modelscope.cn/api/v1/datasets/{model_id}/repo?Revision=master&FilePath={{fpath}}'\\n    cache_dir = os.path.join(MS_CACHE_HOME, 'datasets', model_id, 'master')\\n    local_dir = os.path.join(cache_dir, 'raw')\\n    tmp_dir = os.path.join(cache_dir, 'tmp')\\n    os.makedirs(local_dir, exist_ok=True)\\n    os.makedirs(tmp_dir, exist_ok=True)\\n    cookies = ModelScopeConfig.get_cookies()\\n    with TemporaryDirectory(dir=tmp_dir) as temp_dir:\\n        for remote_fpath in files:\\n            url = url.format(fpath=remote_fpath)\\n            temp_fpath = os.path.join(temp_dir, remote_fpath)\\n            local_fpath = os.path.join(local_dir, remote_fpath)\\n            if not force_download and os.path.exists(local_fpath):\\n                continue\\n            download_files(url, temp_fpath, cookies)\\n            shutil.copy2(temp_fpath, local_fpath)\\n\\n    return local_dir\\n\\n\\ndef _get_max_memory(device_ids: List[int]) -> Dict[Union[int, str], int]:\\n    \\\"\\\"\\\"add feat in accelerate to support DDP + MP\\\"\\\"\\\"\\n    import psutil\\n    # Make sure CUDA is initialized on each GPU to have the right memory info.\\n    for i in device_ids:\\n        _ = torch.tensor([0], device=i)\\n\\n    device_ids_set = set(device_ids)\\n    max_memory = {}\\n    for i in range(torch.cuda.device_count()):\\n        max_memory[i] = 0\\n        if i in device_ids_set:\\n            max_memory[i] = torch.cuda.mem_get_info(i)[0]\\n    max_memory['cpu'] = psutil.virtual_memory().available\\n    return max_memory\\n\\n\\ndef _sync_max_memory(max_memory: Dict[Union[int, str], int]) -> Dict[Union[int, str], int]:\\n    \\\"\\\"\\\"Make sure that the model structure of MP(device_map) is the same, when using DDP.\\\"\\\"\\\"\\n    max_memory_list = [v for k, v in max_memory.items() if (v > 0 and k != 'cpu')]\\n    _, local_rank, world_size, _ = get_dist_setting()\\n    src_tensor = torch.tensor(max_memory_list).to(local_rank)\\n    tgt_tensor_list = [torch.zeros_like(src_tensor) for _ in range(world_size)]\\n    dist.all_gather(tgt_tensor_list, src_tensor)\\n    tgt_tensor = torch.stack(tgt_tensor_list, dim=0)\\n    new_max_memory_iter = iter(tgt_tensor.min(dim=0)[0].tolist())\\n    new_max_memory = {}\\n    for k, v in max_memory.items():\\n        new_max_memory[k] = v\\n        if v > 0 and k != 'cpu':\\n            new_max_memory[k] = next(new_max_memory_iter)\\n    return new_max_memory\\n\\n\\ndef fetch_one(element: Union[Tuple, List, Set, Dict, Any]) -> Any:\\n    if isinstance(element, (tuple, set, list)):\\n        for ele in element:\\n            out = fetch_one(ele)\\n            if out:\\n                return out\\n    elif isinstance(element, dict):\\n        return fetch_one(list(element.values()))\\n    else:\\n        return element\\n\\n\\nclass LLMDataset(Dataset):\\n\\n    def __init__(self, data: List[Dict[str, Any]]) -> None:\\n        self.data = data\\n\\n    def __getitem__(self, idx: Union[int, str]) -> Dict[str, Any]:\\n        if isinstance(idx, int):\\n            data = self.data[idx]\\n            return data\\n        elif isinstance(idx, str):\\n            return [d[idx] for d in self.data]\\n        else:\\n            raise ValueError(f'idx: {idx}')\\n\\n    def select(self, idx_list: List[int]) -> 'LLMDataset':\\n        data = [self.data[i] for i in idx_list]\\n        return self.__class__(data)\\n\\n    def __len__(self) -> int:\\n        return len(self.data)\\n\\n\\n# Code borrowed from trl\\nclass ConstantLengthDataset(IterableDataset):\\n\\n    def __init__(\\n        self,\\n        template: 'Template',\\n        dataset,\\n        seq_length=1024,\\n        num_of_sequences=1024,\\n        chars_per_token=3.6,\\n        append_concat_token=True,\\n        add_special_tokens=True,\\n    ):\\n        self.template = template\\n\\n        self.concat_token_id = self.template.tokenizer.eos_token_id\\n        self.dataset = dataset\\n        self.seq_length = seq_length\\n        self.max_buffer_size = seq_length * chars_per_token * num_of_sequences\\n        self.append_concat_token = append_concat_token\\n        self.add_special_tokens = add_special_tokens\\n\\n    @staticmethod\\n    def get_packed_dataset(template: 'Template',\\n                           dataset,\\n                           seq_length=1024,\\n                           num_of_sequences=2048,\\n                           chars_per_token=3.6,\\n                           append_concat_token=True,\\n                           add_special_tokens=True,\\n                           lazy_tokenize=False):\\n        constant_length_iterator = ConstantLengthDataset(template, dataset, seq_length, num_of_sequences,\\n                                                         chars_per_token, append_concat_token, add_special_tokens)\\n\\n        if lazy_tokenize:\\n            return constant_length_iterator\\n\\n        dataset_list = []\\n        for item in constant_length_iterator:\\n            dataset_list.append(item)\\n        return HfDataset.from_list(dataset_list)\\n\\n    def __len__(self):\\n        return len(self.dataset)\\n\\n    def calculate_matched_group(self, sequences: Dict[str, List[int]]):\\n        # https://arxiv.org/pdf/2404.10830\\n        import binpacking\\n        binpacked = binpacking.to_constant_volume(sequences, self.seq_length, weight_pos=1)\\n        packed_sequence = []\\n        for sequence in binpacked:\\n            packed = {}\\n            position_id_lengths = [len(s[0]['input_ids']) for s in sequence]\\n            for key in sequence[0][0].keys():\\n                packed[key] = np.concatenate([s[0][key] for s in sequence])\\n            packed_sequence.append(packed)\\n            packed['position_ids'] = np.concatenate([list(range(pil)) for pil in position_id_lengths])\\n        return packed_sequence\\n\\n    def __iter__(self):\\n        iterator = iter(self.dataset)\\n        more_examples = True\\n        while more_examples:\\n            buffer, buffer_len = [], 0\\n            while True:\\n                if buffer_len >= self.max_buffer_size:\\n                    break\\n                try:\\n                    example = next(iterator)\\n                    lens = sum([len(value) if value else 0 for value in example.values()])\\n                    buffer.append(next(iterator))\\n                    buffer_len += lens\\n                except StopIteration:\\n                    more_examples = False\\n                    break\\n\\n            sequences = []\\n            for example in buffer:\\n                input, _ = self.template.encode(example)\\n                if not input:\\n                    continue\\n                sequences.append((input, len(input['input_ids'])))\\n\\n            packed_sequences = self.calculate_matched_group(sequences)\\n            for sequence in packed_sequences:\\n                yield sequence\\n\\n\\nclass LazyLLMDataset(Dataset):\\n\\n    def __init__(self,\\n                 dataset: HfDataset,\\n                 encode_func: Callable[[Dict[str, Any]], Union[Tuple[Dict[str, Any], Dict[str, Any]], Dict[str, Any]]],\\n                 *,\\n                 try_fetch_time: int = 20) -> None:\\n        self.dataset = dataset\\n        self.encode_func = encode_func\\n        self.try_fetch_time = min(try_fetch_time, len(self.dataset))\\n        assert self.try_fetch_time >= 1\\n\\n    def __getitem__(self, idx: int) -> Dict[str, Any]:\\n        res = self._try_fetch(idx)\\n        if res is not None:\\n            return res\\n        raise ValueError('Please check if the max_length is appropriate.')\\n\\n    def _try_fetch(self, first_idx: int) -> Optional[Dict[str, Any]]:\\n        idx = np.random.permutation(len(self))[:self.try_fetch_time - 1]\\n        for i in [first_idx] + idx.tolist():\\n            data = self.dataset[i]\\n            try:\\n                res = self.encode_func(data)\\n                if isinstance(res, (tuple, list)) and len(res) == 2:\\n                    res = res[0]\\n            except Exception as e:\\n                logger.error(f'Error occurs in lazy tokenize: {e}')\\n                continue\\n            if len(res) > 0:\\n                return res\\n\\n    def __len__(self) -> int:\\n        return len(self.dataset)\\n\\n\\nMapFunc = Callable[[Dict[str, Any]], Tuple[Dict[str, Any], Dict[str, Any]]]\\n\\n\\ndef _single_map(d: Dict[str, Any], map_func: MapFunc) -> Optional[Dict[str, Any]]:\\n    d = map_func(d)[0]\\n    if len(d) == 0:\\n        return None\\n    return d\\n\\n\\ndef _map_mp_single(subset: HfDataset, map_func: MapFunc, queue: Queue, start_idx: int):\\n    for i, d in enumerate(subset, start=start_idx):\\n        queue.put((i, map_func(d)))  # idx, result\\n\\n\\ndef _map_mp_i(dataset: HfDataset, map_func: MapFunc, num_proc: int) -> Iterator[Tuple[int, Dict[str, Any]]]:\\n    with multiprocess.Pool(num_proc) as pool, multiprocess.Manager() as manager:\\n        queue = manager.Queue()\\n        async_results = []\\n        split_idx = np.linspace(0, len(dataset), num_proc + 1, dtype=np.int32)\\n        for i in range(num_proc):\\n            subset = dataset.select(range(split_idx[i], split_idx[i + 1]))\\n            async_results.append(pool.apply_async(_map_mp_single, args=(subset, map_func, queue, split_idx[i])))\\n        while True:\\n            try:\\n                yield queue.get(timeout=0.05)\\n            except Empty:\\n                if all(async_result.ready() for async_result in async_results) and queue.empty():\\n                    break\\n\\n\\ndef _map_mp(dataset: HfDataset, map_func: MapFunc, num_proc: int) -> List[Dict[str, Any]]:\\n    # Solving the unordered problem\\n    data = [None] * len(dataset)\\n    num_proc = min(num_proc, len(dataset))\\n    for d in tqdm(_map_mp_i(dataset, map_func, num_proc), total=len(dataset), desc=f'Map (num_proc={num_proc})'):\\n        data[d[0]] = d[1]\\n    return data\\n\\n\\ndef dataset_map(dataset: DATASET_TYPE,\\n                map_func: MapFunc,\\n                num_proc: int = 1,\\n                streaming: bool = False) -> Optional[Union[LLMDataset, DATASET_TYPE]]:\\n    if streaming:\\n        return LLMIterableDataset(dataset.map(map_func))  # num_proc is not supported for IterableDataset\\n\\n    single_map = partial(_single_map, map_func=map_func)\\n    if num_proc == 1:\\n        data = []\\n        for d in tqdm(dataset, desc='Map'):\\n            d = single_map(d)\\n            data.append(d)\\n    else:\\n        assert num_proc > 1\\n        data = _map_mp(dataset, single_map, num_proc)\\n    data = [d for d in data if d is not None]\\n    if len(data) == 0:\\n        logger.warning('len(dataset): 0')\\n        return None\\n    return LLMDataset(data)\\n\\n\\ndef _get_token_len(llm_dataset):\\n    token_len = []\\n    if isinstance(llm_dataset, HfDataset):  # compat hf_dataset\\n        input_ids = llm_dataset['input_ids']\\n        for ii in input_ids:\\n            token_len.append(len(ii))\\n    else:\\n        for d in llm_dataset:  # LLMDataset\\n            _len = 0\\n            for k, v in d.items():\\n                if k == 'input_ids' or k.endswith('_input_ids'):  # sft, rlhf\\n                    _len += len(v)\\n            token_len.append(_len)\\n    return token_len\\n\\n\\ndef stat_dataset(llm_dataset: Dataset) -> str:\\n    \\\"\\\"\\\"Statistical analysis was performed on the dataset\\\"\\\"\\\"\\n    token_len = _get_token_len(llm_dataset)\\n    _, stat_str = stat_array(token_len)\\n    logger.info(f'Dataset Token Length: {stat_str}')\\n    return stat_str\\n\\n\\ndef safe_tokenizer_decode(tokenizer: PreTrainedTokenizerBase, input_ids: List[int], **tokenizer_kwargs) -> str:\\n\\n    def _is_special(token: int) -> bool:\\n        if token < 0:\\n            return True\\n        if hasattr(tokenizer, 'placeholder_tokens'):\\n            return token in tokenizer.placeholder_tokens_id\\n        return False\\n\\n    if isinstance(input_ids, torch.Tensor):\\n        input_ids = input_ids.tolist()\\n    if len(input_ids) == 0:\\n        return ''\\n    result_str = ''\\n    for i in range(len(input_ids)):\\n        if i == 0:\\n            if _is_special(input_ids[i]):\\n                s = 0\\n            else:\\n                e = 0\\n            continue\\n        if _is_special(input_ids[i]) and not _is_special(input_ids[i - 1]):\\n            s = i\\n            result_str += tokenizer.decode(input_ids[e:s], **tokenizer_kwargs)\\n        if not _is_special(input_ids[i]) and _is_special(input_ids[i - 1]):\\n            e = i\\n            result_str += f'[{input_ids[i - 1]} * {e - s}]'\\n    if _is_special(input_ids[i]):\\n        result_str += f'[{input_ids[i]} * {len(input_ids) - s}]'\\n    else:\\n        result_str += tokenizer.decode(input_ids[e:], **tokenizer_kwargs)\\n    return result_str\\n\\n\\ndef print_example(example: Dict[str, Any],\\n                  tokenizer: PreTrainedTokenizerBase,\\n                  tokenizer_kwargs: Optional[Dict[str, Any]] = None) -> None:\\n    if tokenizer_kwargs is None:\\n        tokenizer_kwargs = {}\\n    for key in ['input', 'chosen_input', 'rejected_input', 'labels', 'chosen_labels', 'rejected_labels']:\\n        val = example.get(key)  # fix val is a tensor\\n        if val is None:\\n            val = example.get(f'{key}_ids')\\n        if val is not None:\\n            key_upper = key.upper()\\n            logger.info(f'[{key_upper}_IDS] {val}')\\n            val_str = safe_tokenizer_decode(tokenizer, val, **tokenizer_kwargs)\\n            logger.info(f'[{key_upper}] {val_str}')\\n\\n\\ndef _find_layers(model: Module, module_cls: type) -> List[str]:\\n    module_names = set()\\n    for name, module in model.named_modules():\\n        if isinstance(module, module_cls):\\n            module_name = '.'.join(name.split('.')[-2:])\\n            module_names.add(module_name)\\n    return list(module_names)\\n\\n\\ndef find_ln(model: Module) -> List[str]:\\n    # find_layer_norm\\n    module_names = set()\\n    for name, module in model.named_modules():\\n        module_cls_name = module.__class__.__name__.lower()\\n        if isinstance(module, torch.nn.LayerNorm) or 'rmsnorm' in module_cls_name:\\n            module_name = '.'.join(name.split('.')[-1:])\\n            module_names.add(module_name)\\n    return list(module_names)\\n\\n\\ndef _find_module_list(vision_tower) -> Optional[nn.ModuleList]:\\n    module_lists = []\\n    for m in vision_tower.modules():\\n        if hasattr(m, 'gradient_checkpointing'):\\n            return\\n        if isinstance(m, nn.ModuleList) and len(m) >= 10:\\n            module_lists.append(m)\\n    if module_lists:\\n        return max(module_lists, key=lambda x: len(x))\\n\\n\\ndef _add_gradient_checkpointing(module_list):\\n\\n    def _new_forward(self, *args, **kwargs):\\n        layer_ret = torch.utils.checkpoint.checkpoint(self.__old_forward, *args, **kwargs)\\n        return layer_ret\\n\\n    for module in module_list:\\n        if hasattr(module, '_old_forward'):  # device_map\\n            __old_forward = module._old_forward\\n            module._old_forward = MethodType(_new_forward, module)\\n        else:\\n            __old_forward = module.forward\\n            module.forward = MethodType(_new_forward, module)\\n        module.__old_forward = __old_forward\\n\\n\\ndef deep_getattr(model, attr: str):\\n    attrs = attr.split('.')\\n    for a in attrs:\\n        model = getattr(model, a)\\n    return model\\n\\n\\ndef get_mllm_arch(model_type: str) -> MultiModelKeys:\\n    from .model import MODEL_MAPPING\\n    model_info = MODEL_MAPPING[model_type]\\n    lora_target_modules = model_info.get('lora_target_modules')  # model_group\\n    if not isinstance(lora_target_modules, str):\\n        return None\\n    return MODEL_KEYS_MAPPING[lora_target_modules]\\n\\n\\ndef dynamic_vit_gradient_checkpointing(model, model_type: str) -> None:\\n    mllm_arch = get_mllm_arch(model_type)\\n    if mllm_arch is None:\\n        return\\n    for vision_tower_name in mllm_arch.vision_tower:\\n        vision_tower = deep_getattr(model, vision_tower_name)\\n        module_list = _find_module_list(vision_tower)\\n        if module_list is None:\\n            continue\\n        _add_gradient_checkpointing(module_list)\\n        logger.info(f'Automatically add gradient_checkpointing to {vision_tower.__class__}.')\\n\\n\\ndef find_embedding(model: Module) -> List[str]:\\n    return _find_layers(model, torch.nn.Embedding)\\n\\n\\ndef is_quant_model(model_type: Optional[str] = None, model=None) -> bool:\\n    # Check if the model is gptq, awq, aqlm model. Do not check for other quantization situations such as bnb.\\n    if model_type is not None:\\n        for k in ['int4', 'int8', 'awq', 'aqlm']:\\n            if k in model_type:\\n                return True\\n    if model is not None:\\n        for k in ['gptq', 'awq', 'aqlm']:\\n            if getattr(model, f'is_{k}', None):\\n                return True\\n    return False\\n\\n\\ndef find_all_linears(model: Module, quantization_bit: int, model_type: str, quant_method: str) -> List[str]:\\n    \\\"\\\"\\\"ref: https://github.com/artidoro/qlora\\\"\\\"\\\"\\n    head_module_name = 'lm_head'\\n    if model_type in MODEL_KEYS_MAPPING:\\n        output = MODEL_KEYS_MAPPING[model_type].output\\n        idx = output.rfind('.')\\n        head_module_name = output[idx + 1:]\\n    if quant_method == 'bnb':\\n        if quantization_bit == 4:\\n            from bitsandbytes.nn import Linear4bit\\n            linear_cls = [Linear4bit]\\n        elif quantization_bit == 8:\\n            from bitsandbytes.nn import Linear8bitLt\\n            linear_cls = [Linear8bitLt]\\n    elif quant_method == 'hqq':\\n        from hqq.core.quantize import HQQLinear\\n        linear_cls = [HQQLinear]\\n    elif quant_method == 'eetq':\\n        from eetq import EetqLinear\\n        linear_cls = [EetqLinear]\\n    else:\\n        linear_cls = [Linear]\\n    if 'int4' in model_type or 'int8' in model_type:\\n        from peft.utils import get_auto_gptq_quant_linear, get_quantization_config\\n        gptq_quantization_config = get_quantization_config(model, 'gptq')\\n        AutoGPTQQuantLinear = get_auto_gptq_quant_linear(gptq_quantization_config)\\n        if AutoGPTQQuantLinear is None:\\n            from bitsandbytes.nn import Linear4bit\\n            linear_cls = [Linear4bit]\\n        else:\\n            linear_cls = [AutoGPTQQuantLinear]\\n    if 'awq' in model_type:\\n        from awq.modules.linear import WQLinear_GEMM\\n        linear_cls.append(WQLinear_GEMM)\\n    if 'aqlm' in model_type:\\n        from aqlm import QuantizedLinear\\n        linear_cls.append(QuantizedLinear)\\n\\n    # The content of target_module_names cannot exist in inner_nodes.\\n    # O(n^2logn), n represents the number of nodes, n<1000.\\n    inner_nodes = set()\\n    for name, module in model.named_modules():\\n        if not isinstance(module, tuple(linear_cls)):\\n            inner_nodes.add(name)\\n    target_module_names = set()\\n    for name, module in model.named_modules():\\n        if isinstance(module, tuple(linear_cls)) and head_module_name not in name:\\n            module_name_list = name.split('.')\\n            module_name = module_name_list.pop()\\n            for inner_node in inner_nodes:\\n                while inner_node.endswith(module_name):\\n                    module_name = f'{module_name_list.pop()}.{module_name}'\\n            target_module_names.add(module_name)\\n    return list(target_module_names)\\n\\n\\ndef sort_by_max_length(llm_dataset: LLMDataset, num_dataset: int) -> LLMDataset:\\n    logger.info('sort by max length...')\\n    token_len = _get_token_len(llm_dataset)\\n    idx = heapq.nlargest(num_dataset, range(len(token_len)), key=lambda i: token_len[i])\\n    return llm_dataset.select(idx)\\n\\n\\ndef to_device(inputs: Any, device: torch.device) -> Any:\\n    if callable(getattr(inputs, 'to', None)):\\n        return inputs.to(device=device)\\n\\n    if isinstance(inputs, Mapping):\\n        res = {}\\n        for k, v in inputs.items():\\n            res[k] = to_device(v, device)\\n    elif isinstance(inputs, Sequence) and not isinstance(inputs, str):\\n        res = []\\n        for b in inputs:\\n            res.append(to_device(b, device))\\n    else:\\n        res = inputs\\n    return res\\n\\n\\nclass TokenListIteratorStreamer(BaseStreamer):\\n\\n    def __init__(self, timeout: Optional[float] = None):\\n        self.token_queue = Queue()  # Queue[int]\\n        self.stop_signal = None\\n        self.timeout = timeout\\n\\n    def put(self, value: torch.Tensor) -> None:\\n        if value.ndim > 1:\\n            value = value[0]\\n        value = value.tolist()\\n        self.token_queue.put(value)\\n\\n    def end(self) -> None:\\n        self.token_queue.put(self.stop_signal)\\n\\n    def __iter__(self):\\n        return self\\n\\n    def __next__(self) -> List[int]:\\n        value = self.token_queue.get(timeout=self.timeout)\\n        if value == self.stop_signal:\\n            raise StopIteration()\\n        else:\\n            return value\\n\\n\\ndef _prepare_inputs(model: PreTrainedModel,\\n                    template: Template,\\n                    query: str,\\n                    history: History,\\n                    system: Optional[str] = None,\\n                    images: Optional[List[str]] = None,\\n                    *,\\n                    generation_config: GenerationConfig,\\n                    generation_info: Dict[str, Any],\\n                    stop_words: Optional[StopWords] = None,\\n                    adapter_names: Optional[List[str]] = None,\\n                    **kwargs) -> Tuple[Dict[str, Any], Dict[str, Any], int, Dict[str, Any]]:\\n    if stop_words is None:\\n        stop_words = []\\n\\n    example = {\\n        'query': query,\\n        'history': history,\\n        'system': system,\\n        'images': images or [],  # for vl. str.\\n        'audios': kwargs.pop('audios', None) or [],\\n        'videos': kwargs.pop('videos', None) or [],\\n        'tools': kwargs.pop('tools', None),\\n        'objects': kwargs.pop('objects', None),\\n    }\\n    template.model = model\\n    inputs, tokenizer_kwargs = template.encode(example)\\n\\n    truncation_strategy = kwargs.pop('truncation_strategy', 'delete')\\n    if len(inputs) == 0 and truncation_strategy == 'delete':\\n        # input_ids exceeds `max_length`. Please increase the value of `max_length`.\\n        return {}, tokenizer_kwargs, 0, example\\n\\n    inputs.pop('labels', None)\\n    tokenizer = template.tokenizer\\n    device = next(model.parameters()).device\\n    if 'input_ids' in inputs:  # 1d\\n        input_ids = torch.tensor(inputs['input_ids'])[None]\\n        inputs['input_ids'] = input_ids\\n        token_len = input_ids.shape[1]\\n    if 'inputs_embeds' in inputs:  # 2d\\n        inputs_embeds = inputs['inputs_embeds'][None]\\n        inputs['inputs_embeds'] = inputs_embeds\\n        token_len = inputs_embeds.shape[1]\\n\\n    inputs['attention_mask'] = torch.ones(token_len, dtype=torch.int64)[None]\\n    if 'token_type_ids' in inputs:\\n        inputs['token_type_ids'] = torch.tensor(inputs['token_type_ids'])[None]\\n    model.eval()\\n    if not generation_config.do_sample:\\n        generation_config.temperature = 1.\\n        generation_config.top_p = 1.\\n        generation_config.top_k = 50\\n    if tokenizer.eos_token_id is not None:\\n        generation_config.eos_token_id = tokenizer.eos_token_id\\n    if tokenizer.pad_token_id is not None:\\n        generation_config.pad_token_id = tokenizer.pad_token_id\\n    if tokenizer.bos_token_id is not None:\\n        generation_config.bos_token_id = tokenizer.bos_token_id\\n    if generation_config.max_new_tokens is not None:\\n        generation_config.max_length = 20  # fix max_length, max_new_tokens warning\\n        max_length = get_max_model_len(model.config)\\n        if max_length and token_len + generation_config.max_new_tokens > max_length:\\n            generation_config.max_new_tokens = max_length - token_len\\n            if generation_config.max_new_tokens <= 0:\\n                raise AssertionError(f'Current sentence length exceeds the model max_length: {max_length}')\\n    if template.suffix[-1] not in stop_words:\\n        stop_words.append(template.suffix[-1])\\n    inputs = to_device(inputs, device)\\n    if 'inputs_embeds' in inputs:\\n        inputs.pop('input_ids', None)\\n    if adapter_names is not None:\\n        inputs['adapter_names'] = adapter_names\\n\\n    stopping_criteria = StoppingCriteriaList([StopWordsCriteria(tokenizer, stop_words, **tokenizer_kwargs)])\\n    inputs['stopping_criteria'] = stopping_criteria\\n    generation_info['num_prompt_tokens'] = token_len\\n    return inputs, tokenizer_kwargs, token_len, example\\n\\n\\n@torch.inference_mode()\\ndef inference_stream(model: PreTrainedModel,\\n                     template: Template,\\n                     query: str,\\n                     history: Optional[History] = None,\\n                     system: Optional[str] = None,\\n                     images: Optional[List[str]] = None,\\n                     *,\\n                     generation_config: Optional[GenerationConfig] = None,\\n                     stop_words: Optional[StopWords] = None,\\n                     generation_info: Optional[Dict[str, Any]] = None,\\n                     adapter_names: Optional[List[str]] = None,\\n                     **kwargs) -> Iterator[Union[Tuple[str, History], Dict[str, Any]]]:\\n    \\\"\\\"\\\"\\n    generation_config: Priority: generation_config > model.generation_config.\\n    \\\"\\\"\\\"\\n    start_runtime = time.perf_counter()\\n    if history is None:\\n        history = []\\n    else:\\n        history = deepcopy(history)\\n    if generation_config is None:\\n        generation_config = getattr(model, 'generation_config')\\n    generation_config = deepcopy(generation_config)\\n    if generation_info is None:\\n        generation_info = {}\\n    else:\\n        generation_info.clear()\\n    inputs, tokenizer_kwargs, token_len, example = _prepare_inputs(\\n        model,\\n        template,\\n        query,\\n        history,\\n        system,\\n        images,\\n        generation_config=generation_config,\\n        generation_info=generation_info,\\n        stop_words=stop_words,\\n        adapter_names=adapter_names,\\n        **kwargs)\\n    if len(inputs) == 0:\\n        return '', history\\n\\n    # agent support\\n    is_observation = history[-1][-1].endswith('Observation:') if history and history[-1][-1] else False\\n    if is_observation:\\n        history[-1][-1] = history[-1][-1] + query\\n        act_length = len(history[-1][-1])\\n        query = None\\n\\n    if generation_config.num_beams != 1:\\n        error_msg = 'Streaming generation does not support beam search.'\\n        raise ValueError(error_msg)\\n\\n    streamer = TokenListIteratorStreamer()\\n    return_dict = generation_config.return_dict_in_generate\\n    generation_kwargs = {'streamer': streamer, 'generation_config': generation_config, **inputs}\\n    result_queue = Queue()\\n\\n    def _model_generate(*args, **kwargs):\\n        if is_torch_npu_available():\\n            torch.npu.set_device(model.device)\\n        res = model.generate(*args, **kwargs)\\n        result_queue.put(res)\\n        return res\\n\\n    thread = Thread(target=_model_generate, kwargs=generation_kwargs)\\n    thread.start()\\n    raw_generate_ids, generate_ids = [], []\\n\\n    if not is_observation:\\n        history.append(None)  # dummy\\n\\n    print_idx = [0]\\n    first_num_space = [-1]\\n\\n    is_finished = False\\n    while not is_finished:\\n        try:\\n            token_list = next(streamer)\\n            raw_generate_ids += token_list\\n        except StopIteration:\\n            is_finished = True\\n        res = {}\\n        generate_ids = template.get_generate_ids(torch.tensor(raw_generate_ids)[None], token_len)\\n        if return_dict and is_finished:\\n            thread.join()\\n            res = dict(result_queue.get())\\n            res['sequences'] = generate_ids\\n        generation_info['num_generated_tokens'] = len(generate_ids)\\n        response = template.generate_ids_to_response(\\n            generate_ids,\\n            is_finished,\\n            tokenizer_kwargs=tokenizer_kwargs,\\n            print_idx=print_idx,\\n            first_num_space=first_num_space)\\n        if not is_observation:\\n            history[-1] = [query, response]\\n        else:\\n            history[-1][-1] = history[-1][-1][:act_length] + response\\n\\n        runtime = time.perf_counter() - start_runtime\\n        generation_info['runtime'] = runtime\\n        generation_info['samples/s'] = 1 / runtime\\n        generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n        if return_dict:\\n            res.update({'response': response, 'history': history})\\n            yield res\\n        else:\\n            yield response, history\\n\\n\\n@torch.inference_mode()\\ndef inference(model: PreTrainedModel,\\n              template: Template,\\n              query: str,\\n              history: Optional[History] = None,\\n              system: Optional[str] = None,\\n              images: Optional[List[str]] = None,\\n              *,\\n              generation_config: Optional[GenerationConfig] = None,\\n              stop_words: Optional[StopWords] = None,\\n              generation_info: Optional[Dict[str, Any]] = None,\\n              stream: bool = False,\\n              verbose: bool = False,\\n              adapter_names: Optional[List[str]] = None,\\n              prompt_prefix: str = '[PROMPT]',\\n              output_prefix: str = '[OUTPUT]',\\n              **kwargs) -> Union[Tuple[str, History], Dict[str, Any]]:\\n    \\\"\\\"\\\"\\n    generation_config: Priority: generation_config > model.generation_config.\\n    \\\"\\\"\\\"\\n    runtime = time.perf_counter()\\n    if history is None:\\n        history = []\\n    else:\\n        history = deepcopy(history)\\n    if generation_config is None:\\n        generation_config = getattr(model, 'generation_config')\\n    generation_config = deepcopy(generation_config)\\n    if generation_info is None:\\n        generation_info = {}\\n    else:\\n        generation_info.clear()\\n    inputs, tokenizer_kwargs, token_len, example = _prepare_inputs(\\n        model,\\n        template,\\n        query,\\n        history,\\n        system,\\n        images,\\n        generation_config=generation_config,\\n        generation_info=generation_info,\\n        stop_words=stop_words,\\n        adapter_names=adapter_names,\\n        **kwargs)\\n    if len(inputs) == 0:\\n        return '', history\\n\\n    # agent support\\n    is_observation = history[-1][-1].endswith('Observation:') if history and history[-1][-1] else False\\n    if is_observation:\\n        history[-1][-1] = history[-1][-1] + query\\n        query = None\\n\\n    if stream and not verbose:\\n        logger.warning('Please set verbose to True to support TextStreamer, or use `inference_stream.`')\\n        stream = False\\n    streamer = None\\n    tokenizer = template.tokenizer\\n    if stream:\\n        streamer = TextStreamer(tokenizer, skip_prompt=True)\\n    if verbose:\\n        if 'input_ids' in inputs:\\n            input_ids = inputs['input_ids']\\n            print(\\n                f'{prompt_prefix}{safe_tokenizer_decode(tokenizer, input_ids[0], **tokenizer_kwargs)}{output_prefix}',\\n                end='')\\n        else:\\n            print(f'[QUERY]{query}\\\\n{output_prefix}', end='')\\n\\n    return_dict = generation_config.return_dict_in_generate\\n    generate_ids = model.generate(streamer=streamer, generation_config=generation_config, **inputs)\\n    if return_dict:\\n        res = dict(generate_ids)\\n        generate_ids = generate_ids['sequences']\\n    generate_ids = template.get_generate_ids(generate_ids, token_len)\\n    generation_info['num_generated_tokens'] = len(generate_ids)\\n    if verbose and stream is False:\\n        response = tokenizer.decode(generate_ids, **tokenizer_kwargs)\\n        print(response)\\n    response = template.generate_ids_to_response(generate_ids, tokenizer_kwargs=tokenizer_kwargs)\\n    response = template.post_process_generate_response(response=response, example=example)\\n    if not is_observation:\\n        history.append([query, response])\\n    else:\\n        history[-1][-1] = history[-1][-1] + response\\n    runtime = time.perf_counter() - runtime\\n    generation_info['runtime'] = runtime\\n    generation_info['samples/s'] = 1 / runtime\\n    generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n    if return_dict:\\n        res['sequences'] = generate_ids\\n        res.update({'response': response, 'history': history})\\n        return res\\n    else:\\n        return response, history\\n\\n\\ndef limit_history_length(template: Template, query: str, history: Optional[History],\\n                         max_length: Optional[int]) -> Tuple[History, History]:\\n    \\\"\\\"\\\"binary search\\\"\\\"\\\"\\n    if history is None:\\n        history = []\\n    if max_length is None:\\n        return [], history\\n\\n    def compute_token_length(history_length: int) -> int:\\n        assert history_length != 0\\n        example = {'query': query, 'history': history[-history_length:]}\\n        input_ids = template.encode(example)[0]['input_ids']\\n        return len(input_ids)\\n\\n    history_length = upper_bound(0, len(history), lambda mid: compute_token_length(mid) <= max_length)\\n    old_history = history[:len(history) - history_length]\\n    history = history[len(history) - history_length:]\\n    return old_history, history\\n\\n\\nMessages = List[Dict[str, Union[str, List[Dict]]]]\\n\\n\\ndef history_to_messages(history: Optional[History],\\n                        query: Optional[str] = None,\\n                        system: Optional[str] = None,\\n                        roles: Optional[List[List[str]]] = None) -> Messages:\\n    if history is None:\\n        history = []\\n    messages = []\\n    if not roles:\\n        roles = [['user', 'assistant']] * (len(history) + 1)\\n    assert len(roles) == len(history) + 1\\n    if system is not None:\\n        messages.append({'role': 'system', 'content': system})\\n    for role, h in zip(roles, history):\\n        assert isinstance(h, (list, tuple))\\n        messages.append({'role': role[0], 'content': h[0]})\\n        messages.append({'role': role[1], 'content': h[1]})\\n    if query is not None:\\n        messages.append({'role': roles[-1][0], 'content': query})\\n    return messages\\n\\n\\ndef messages_to_history(messages: Messages) -> Dict[str, Any]:\\n    system = None\\n    if messages[0]['role'] == 'system':\\n        system = messages[0]['content']\\n        messages = messages[1::]\\n    history = []\\n    history_roles = []\\n    for q, r in zip(messages[::2], messages[1::2]):\\n        history.append([q['content'], r['content']])\\n        history_roles.append([q['role'], r['role']])\\n    query = None\\n    query_role = None\\n    if len(messages) % 2 == 1:\\n        query = messages[-1]['content']\\n        query_role = messages[-1]['role']\\n    return {\\n        'history': history,\\n        'history_roles': history_roles,\\n        'query': query,\\n        'query_role': query_role,\\n        'system': system,\\n    }\\n\\n\\ndef messages_join_observation(messages: Messages):\\n    \\\"\\\"\\\"\\n        Joins observations from 'tool' message into the 'assistant' response.\\n\\n        Example:\\n        ---------\\n        Original messages:\\n        messages = [\\n            {'role': 'user', 'content': \\\"What's the weather today in Hangzhou?\\\"},\\n            {'role': 'assistant', 'content': 'Action: get_weather\\\\nAction Input:\\\\\\n                  [{\\\"location\\\": \\\"Hangzhou\\\"}]\\\\nObservations:'},\\n            {'role': 'tool', 'content': 'It is 26 degrees Celsius and sunny in Hangzhou today.'}\\n        ]\\n\\n        Transformed messages:\\n        messages = [\\n            {'role': 'user', 'content': \\\"What's the weather today in Hangzhou?\\\"},\\n            {'role': 'assistant', 'content': 'Action: get_weather\\\\nAction Input:\\\\\\n                  [{\\\"location\\\": \\\"Hangzhou\\\"}]\\\\nObservations: It is 26 degrees Celsius and sunny in Hangzhou today.'}\\n        ]\\n        \\\"\\\"\\\"\\n\\n    if len(messages) >= 2 and messages[-2]['role'] == 'assistant' and messages[-2]['content'] and messages[-2][\\n            'content'].endswith('Observation:'):\\n        assert messages[-1]['role'] == 'tool'\\n        observations = messages[-1]['content']\\n        messages.pop(-1)\\n        messages[-1]['content'] += observations\\n    return\\n\\n\\ndef set_generation_config(model: Module, generation_config: GenerationConfig) -> None:\\n    old_generation_config = getattr(model, 'generation_config', None)\\n    old_generation_priority_config = ['no_repeat_ngram_size', 'num_beams']\\n    if old_generation_config is not None:\\n        for k, old_v in old_generation_config.__dict__.items():\\n            if k.startswith('_'):\\n                continue\\n            v = getattr(generation_config, k, None)\\n            if k in old_generation_priority_config or old_v is not None and v is None:\\n                setattr(generation_config, k, old_v)\\n    model.generation_config = generation_config\\n\\n\\ndef is_vllm_available():\\n    return importlib.util.find_spec('vllm') is not None\\n\\n\\ndef is_lmdeploy_available():\\n    return importlib.util.find_spec('lmdeploy') is not None\\n\\n\\ndef is_liger_available():\\n    return importlib.util.find_spec('liger_kernel') is not None\\n\\n\\ndef is_xtuner_available():\\n    return importlib.util.find_spec('xtuner') is not None\\n\\n\\ndef is_megatron_available():\\n    return importlib.util.find_spec('megatron') is not None\\n\\n\\ndef is_unsloth_available() -> bool:\\n    return importlib.util.find_spec('unsloth') is not None\\n\\n\\ndef is_pyreft_available() -> bool:\\n    return importlib.util.find_spec('pyreft') is not None\\n\\n\\ndef get_time_info(log_history: List[Dict[str, Any]], n_train_samples: Optional[int]) -> Optional[Dict[str, Any]]:\\n    time_info = None\\n    try:\\n        last_log_history = log_history[-1]\\n        train_runtime = last_log_history['train_runtime']\\n        train_samples_per_second = n_train_samples / train_runtime\\n        time_info = {\\n            'train_runtime': train_runtime,\\n            'n_train_samples': n_train_samples,\\n            'train_samples_per_second': train_samples_per_second,\\n        }\\n    except Exception:\\n        pass\\n    return time_info\\n\\n\\nclass LLMIterableDataset(HfIterableDataset):\\n\\n    def __init__(self, dataset: HfIterableDataset, max_retries=10):\\n        super().__init__(\\n            dataset._ex_iterable,\\n            dataset._info,\\n            dataset._split,\\n            dataset._formatting,\\n            dataset._shuffling,\\n            dataset._distributed,\\n            dataset._token_per_repo_id,\\n        )\\n        self.dataset = dataset\\n        self.max_retries = max_retries\\n        from .dataset import standard_keys\\n        dataset._ex_iterable.remove_columns = standard_keys & next(iter(dataset)).keys()\\n\\n    def __iter__(self):\\n        iterator = iter(self.dataset)\\n        while True:\\n            retries = 0\\n            while retries < self.max_retries:\\n                try:\\n                    value = next(iterator)\\n                    if value:\\n                        yield value\\n                        break\\n                    else:\\n                        raise ValueError\\n                except StopIteration:\\n                    iterator = iter(self.dataset)\\n                    break\\n                except Exception as e:\\n                    retries += 1\\n                    if retries >= self.max_retries:\\n                        raise e\\n\\n\\ndef get_max_model_len(config: PretrainedConfig, ignore_rope_scaling=False) -> Optional[int]:\\n    INF = int(1e9)\\n    max_model_len = INF\\n    for k in ['language_config', 'llm_config', 'text_config']:\\n        llm_config = getattr(config, k, None)\\n        if llm_config is not None:\\n            config = llm_config\\n            break\\n\\n    possible_keys = [\\n        'seq_length',  # qwen, chatglm\\n        'max_position_embeddings',  # qwen1.5, llama2\\n        'n_positions',  # polylm, phi-2\\n        'model_max_length',  # baichuan2\\n        # others\\n        'seq_len',\\n        'max_seq_len',\\n        'max_sequence_length',\\n        'max_seq_length',\\n    ]\\n    for key in possible_keys:\\n        max_len_key = getattr(config, key, None)\\n        if max_len_key is not None:\\n            max_model_len = min(max_model_len, max_len_key)\\n    if max_model_len == INF:\\n        max_model_len = None\\n\\n    if (not ignore_rope_scaling and max_model_len and getattr(config, 'rope_scaling', None)\\n            and config.rope_scaling.get('factor')):\\n        max_model_len = max(int(max_model_len * config.rope_scaling.get('factor')), max_model_len)\\n    return max_model_len\\n\\n\\ndef set_rope_scaling(config: PretrainedConfig, rope_scaling: Dict[str, Any]):\\n    for k in ['language_config', 'llm_config', 'text_config']:\\n        llm_config = getattr(config, k, None)\\n        if llm_config is not None:\\n            config = llm_config\\n            break\\n\\n    if getattr(config, 'rope_scaling', None):\\n        rope_scaling['factor'] = max(config.rope_scaling.get('factor', -1), rope_scaling['factor'])\\n        rope_scaling = {**config.rope_scaling, **rope_scaling}\\n    config.rope_scaling = rope_scaling\\n\\n\\ndef get_rope_scaling(config: PretrainedConfig):\\n    for k in ['language_config', 'llm_config', 'text_config']:\\n        llm_config = getattr(config, k, None)\\n        if llm_config is not None:\\n            config = llm_config\\n            break\\n\\n    return getattr(config, 'rope_scaling')\\n\\n\\nif is_ddp_plus_mp():\\n    from accelerate.utils.modeling import get_balanced_memory, infer_auto_device_map\\n\\n    @wraps(infer_auto_device_map)\\n    def _infer_auto_device_map_patch(model: Module,\\n                                     max_memory: Optional[Dict[Union[int, str], Union[int, str]]] = None,\\n                                     **kwargs) -> Dict[str, Union[int, str, torch.device]]:\\n        \\\"\\\"\\\"The auxiliary function for supports DDP+MP. Monkey Patching.\\n        add feat in accelerate to support DDP + MP\\\"\\\"\\\"\\n        verbose = kwargs.pop('verbose', False)\\n        n_gpu = torch.cuda.device_count()\\n        _, local_rank, _, local_world_size = get_dist_setting()\\n        device_ids = list(range(local_rank, n_gpu, local_world_size))\\n        max_memory = _get_max_memory(device_ids)\\n        max_memory = _sync_max_memory(max_memory)\\n        max_memory = get_balanced_memory(model, max_memory, low_zero=False, **kwargs)\\n        max_memory = {k: v for k, v in max_memory.items() if v > 0}\\n        return infer_auto_device_map(model, max_memory, verbose=verbose, **kwargs)\\n\\n    _old_ddp_init = DDP.__init__\\n    accelerate.accelerator.torch.nn.parallel.DistributedDataParallel.__init__ = (\\n        lambda self, model, device_ids, output_device, *args, **kwargs: _old_ddp_init(self, model, *args, **kwargs))\\n    transformers.modeling_utils.get_balanced_memory = lambda *args, **kwargs: None\\n    transformers.modeling_utils.infer_auto_device_map = _infer_auto_device_map_patch\\n\\nif is_ddp_plus_mp() or use_torchacc():\\n    _old_accelerator_init = trainer.Accelerator.__init__\\n    trainer.Accelerator.__init__ = (lambda self, device_placement=False, *args, **kwargs: _old_accelerator_init(\\n        self, device_placement=device_placement, *args, **kwargs))\\n    trainer.Accelerator.verify_device_map = lambda *args, **kwargs: False\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport ast\\nimport itertools\\nimport os\\nimport re\\nfrom copy import deepcopy\\nfrom functools import partial\\nfrom typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Union\\n\\nimport datasets.fingerprint\\nimport json\\nimport numpy as np\\nfrom datasets import Dataset as HfDataset\\nfrom datasets import IterableDataset as HfIterableDataset\\nfrom datasets import concatenate_datasets, interleave_datasets\\nfrom datasets import load_dataset as load_hf_dataset\\nfrom numpy.random import RandomState\\nfrom pandas import DataFrame\\nfrom tqdm.auto import tqdm\\nfrom transformers.utils import strtobool\\n\\nfrom swift.utils import get_logger, get_seed, is_dist, is_local_master, safe_ddp_context\\nfrom swift.utils.torch_utils import _find_local_mac\\nfrom .media import MediaCache, MediaTag\\nfrom .preprocess import (AlpacaPreprocessor, ClsPreprocessor, ComposePreprocessor, ConversationsPreprocessor,\\n                         ListPreprocessor, PreprocessFunc, RenameColumnsPreprocessor, SmartPreprocessor,\\n                         TextGenerationPreprocessor, preprocess_sharegpt)\\nfrom .utils import download_dataset\\n\\ndataset_enable_cache = strtobool(os.environ.get('DATASET_ENABLE_CACHE', 'False'))\\n\\nDATASET_TYPE = Union[HfDataset, HfIterableDataset]\\n\\n\\ndef _update_fingerprint_mac(*args, **kwargs):\\n    mac = _find_local_mac().replace(':', '')\\n    fp = datasets.fingerprint._update_fingerprint(*args, **kwargs)\\n    fp += '-' + mac\\n    if len(fp) > 64:\\n        fp = fp[:64]\\n    return fp\\n\\n\\ndatasets.fingerprint._update_fingerprint = datasets.fingerprint.update_fingerprint\\ndatasets.fingerprint.update_fingerprint = _update_fingerprint_mac\\ndatasets.arrow_dataset.update_fingerprint = _update_fingerprint_mac\\n\\n\\ndef patch_num_proc(func_name: str):\\n    _origin_func_name = f'_origin_{func_name}'\\n    _old_func = getattr(HfDataset, func_name)\\n\\n    def new_func(self, *args, **kwargs):\\n        if 'num_proc' not in kwargs:\\n            num_proc = os.environ.get('DATASET_MAP_NPROC')\\n            if num_proc:\\n                kwargs['num_proc'] = int(num_proc)\\n        return _old_func(self, *args, **kwargs)\\n\\n    setattr(HfDataset, _origin_func_name, _old_func)\\n    setattr(HfDataset, func_name, new_func)\\n\\n\\nfor func_name in ['map', 'filter']:\\n    patch_num_proc(func_name)\\n\\nstandard_keys = {\\n    'query', 'query_role', 'response', 'rejected_response', 'system', 'history', 'history_roles', 'images', 'objects',\\n    'videos', 'audios', 'tools', 'label'\\n}\\n\\n\\ndef _remove_useless_columns(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    k_list = []\\n    if isinstance(dataset, HfIterableDataset) and dataset.features is None:\\n        features = next(iter(dataset)).keys()\\n    else:\\n        features = dataset.features.keys()\\n\\n    for k in features:\\n        if k in standard_keys:\\n            k_list.append(k)\\n    dataset = dataset.select_columns(k_list)\\n    return dataset\\n\\n\\nSubsetSplit = Union[str, Tuple[str, str], List[str]]\\nDATASET_MAPPING: Dict[str, Dict[str, Any]] = {}\\n\\nlogger = get_logger()\\n\\n\\nclass DatasetName:\\n    # general\\n    ms_bench = 'ms-bench'  # used for mixed training\\n    alpaca_en = 'alpaca-en'\\n    alpaca_zh = 'alpaca-zh'\\n    multi_alpaca = 'multi-alpaca'\\n    instinwild = 'instinwild'\\n    cot_en = 'cot-en'\\n    cot_zh = 'cot-zh'\\n    instruct_en = 'instruct-en'\\n    firefly_zh = 'firefly-zh'\\n    gpt4all_en = 'gpt4all-en'\\n    sharegpt = 'sharegpt'\\n    tulu_v2_sft_mixture = 'tulu-v2-sft-mixture'\\n    wikipedia_zh = 'wikipedia-zh'\\n    open_orca = 'open-orca'\\n    sharegpt_gpt4 = 'sharegpt-gpt4'\\n    deepctrl_sft = 'deepctrl-sft'\\n    coig_cqia = 'coig-cqia'\\n    ruozhiba = 'ruozhiba'\\n    long_alpaca_12k = 'long-alpaca-12k'\\n    lmsys_chat_1m = 'lmsys-chat-1m'\\n    # agent\\n    ms_agent = 'ms-agent'\\n    ms_agent_for_agentfabric = 'ms-agent-for-agentfabric'\\n    ms_agent_multirole = 'ms-agent-multirole'\\n    toolbench_for_alpha_umi = 'toolbench-for-alpha-umi'\\n    damo_agent_zh = 'damo-agent-zh'\\n    damo_agent_zh_mini = 'damo-agent-zh-mini'\\n    agent_instruct_all_en = 'agent-instruct-all-en'\\n    msagent_pro = 'msagent-pro'\\n    toolbench = 'toolbench'\\n\\n    # coding\\n    code_alpaca_en = 'code-alpaca-en'\\n    leetcode_python_en = 'leetcode-python-en'\\n    codefuse_python_en = 'codefuse-python-en'\\n    codefuse_evol_instruction_zh = 'codefuse-evol-instruction-zh'\\n    # medical\\n    medical_en = 'medical-en'\\n    medical_zh = 'medical-zh'\\n    disc_med_sft_zh = 'disc-med-sft-zh'\\n    # law\\n    lawyer_llama_zh = 'lawyer-llama-zh'\\n    tigerbot_law_zh = 'tigerbot-law-zh'\\n    disc_law_sft_zh = 'disc-law-sft-zh'\\n    # math\\n    blossom_math_zh = 'blossom-math-zh'\\n    school_math_zh = 'school-math-zh'\\n    open_platypus_en = 'open-platypus-en'\\n    # sql\\n    text2sql_en = 'text2sql-en'\\n    sql_create_context_en = 'sql-create-context-en'\\n    synthetic_text_to_sql = 'synthetic-text-to-sql'\\n    # text-generation\\n    advertise_gen_zh = 'advertise-gen-zh'\\n    dureader_robust_zh = 'dureader-robust-zh'\\n    # classification\\n    cmnli_zh = 'cmnli-zh'\\n    jd_sentiment_zh = 'jd-sentiment-zh'\\n    hc3_zh = 'hc3-zh'\\n    hc3_en = 'hc3-en'\\n    dolly_15k = 'dolly-15k'\\n    zhihu_kol = 'zhihu-kol'\\n    zhihu_kol_filtered = 'zhihu-kol-filtered'\\n    # other\\n    finance_en = 'finance-en'\\n    poetry_zh = 'poetry-zh'\\n    webnovel_zh = 'webnovel-zh'\\n    generated_chat_zh = 'generated-chat-zh'\\n    self_cognition = 'self-cognition'\\n    swift_mix = 'swift-mix'\\n\\n    # example dataset for specific model\\n    cls_fudan_news_zh = 'cls-fudan-news-zh'  # seqgpt-560m\\n    ner_java_zh = 'ner-jave-zh'  # seqgpt-560m\\n\\n    # multi-modal\\n    # <img></img>\\n    coco_en = 'coco-en'\\n    coco_en_mini = 'coco-en-mini'\\n    # images\\n    coco_en_2 = 'coco-en-2'\\n    coco_en_2_mini = 'coco-en-2-mini'\\n    capcha_images = 'capcha-images'\\n    latex_ocr_print = 'latex-ocr-print'\\n    latex_ocr_handwrite = 'latex-ocr-handwrite'\\n    # for qwen-audio\\n    aishell1_zh = 'aishell1-zh'\\n    aishell1_zh_mini = 'aishell1-zh-mini'\\n    # for video\\n    video_chatgpt = 'video-chatgpt'\\n\\n    # rlhf\\n    hh_rlhf = 'hh-rlhf'\\n    hh_rlhf_cn = 'hh-rlhf-cn'\\n    orpo_dpo_mix_40k = 'orpo-dpo-mix-40k'\\n    stack_exchange_paired = 'stack-exchange-paired'\\n    shareai_llama3_dpo_zh_en_emoji = 'shareai-llama3-dpo-zh-en-emoji'\\n    ultrafeedback_kto = 'ultrafeedback-kto'\\n\\n    # visual rlhf\\n    rlaif_v = 'rlaif-v'\\n\\n    # for awq\\n    pileval = 'pileval'\\n\\n    mantis_instruct = 'mantis-instruct'\\n    llava_data_instruct = 'llava-data-instruct'\\n    midefics = 'midefics'\\n    gqa = 'gqa'\\n    text_caps = 'text-caps'\\n    refcoco_unofficial_caption = 'refcoco-unofficial-caption'\\n    refcoco_unofficial_grounding = 'refcoco-unofficial-grounding'\\n    refcocog_unofficial_caption = 'refcocog-unofficial-caption'\\n    refcocog_unofficial_grounding = 'refcocog-unofficial-grounding'\\n    a_okvqa = 'a-okvqa'\\n    okvqa = 'okvqa'\\n    ocr_vqa = 'ocr-vqa'\\n    grit = 'grit'\\n    llava_instruct_mix = 'llava-instruct-mix'\\n    lnqa = 'lnqa'\\n    science_qa = 'science-qa'\\n    guanaco = 'guanaco'\\n    mind2web = 'mind2web'\\n    sharegpt_4o_image = 'sharegpt-4o-image'\\n    pixelprose = 'pixelprose'\\n\\n    m3it = 'm3it'\\n    # additional images\\n    sharegpt4v = 'sharegpt4v'\\n\\n    llava_instruct_150k = 'llava-instruct-150k'\\n    llava_pretrain = 'llava-pretrain'\\n\\n    sa1b_dense_caption = 'sa1b-dense-caption'\\n    sa1b_paired_caption = 'sa1b-paired-caption'\\n\\n    @classmethod\\n    def get_dataset_name_list(cls) -> List[str]:\\n        res = []\\n        for k in cls.__dict__.keys():\\n            if k.startswith('__') or k == 'get_dataset_name_list':\\n                continue\\n            res.append(cls.__dict__[k])\\n        return res\\n\\n\\ndef register_dataset(dataset_name: str,\\n                     dataset_id_or_path: Optional[str] = None,\\n                     subsets: Optional[List[str]] = None,\\n                     preprocess_func: Optional[PreprocessFunc] = None,\\n                     get_function: Optional[Callable] = None,\\n                     *,\\n                     split: Optional[List[str]] = None,\\n                     hf_dataset_id: Optional[str] = None,\\n                     function_kwargs: Optional[Dict[str, Any]] = None,\\n                     exist_ok: bool = False,\\n                     is_local: bool = False,\\n                     **kwargs) -> Optional[Callable]:\\n    if preprocess_func is None:\\n        preprocess_func = SmartPreprocessor()\\n    if not exist_ok and dataset_name in DATASET_MAPPING:\\n        raise ValueError(f'The `{dataset_name}` has already been registered in the DATASET_MAPPING.')\\n    if subsets is None:\\n        subsets = []\\n    if split is None:\\n        split = ['train']\\n    if function_kwargs is None:\\n        function_kwargs = {}\\n\\n    dataset_info = {\\n        'dataset_id_or_path': dataset_id_or_path,\\n        'subsets': subsets,\\n        'preprocess_func': preprocess_func,\\n        'split': split,\\n        'hf_dataset_id': hf_dataset_id,\\n        'is_local': is_local,\\n        **kwargs\\n    }\\n    if get_function is not None:\\n        if len(function_kwargs) > 0:\\n            get_function = partial(get_function, **function_kwargs)\\n        dataset_info['get_function'] = get_function\\n        DATASET_MAPPING[dataset_name] = dataset_info\\n        return\\n\\n    def _register_dataset(get_function: Callable) -> Callable:\\n        _old_get_function = get_function\\n        if len(function_kwargs) > 0:\\n            get_function = partial(get_function, **function_kwargs)\\n        dataset_info['get_function'] = get_function\\n        DATASET_MAPPING[dataset_name] = dataset_info\\n        return _old_get_function\\n\\n    return _register_dataset\\n\\n\\ndef register_local_dataset(\\n        dataset_name: str,\\n        dataset_path: Optional[List[str]] = None,\\n        # Convert relative path to absolute path\\n        base_dir: Optional[str] = None,\\n        **kwargs) -> None:\\n    if dataset_path is None:\\n        dataset_path = []\\n    elif isinstance(dataset_path, str):\\n        dataset_path = [dataset_path]\\n    assert len(dataset_path) > 0\\n    if base_dir is not None:\\n        for i, path in enumerate(dataset_path):\\n            if not os.path.isabs(path):\\n                dataset_path[i] = os.path.join(base_dir, dataset_path[i])\\n\\n    register_dataset(\\n        dataset_name, get_function=get_local_dataset, split=dataset_path, exist_ok=True, is_local=True, **kwargs)\\n\\n\\ndef register_dataset_info(dataset_name: str, d_info: Dict[str, Any], **kwargs) -> None:\\n    if 'columns' in d_info:\\n        preprocess_func = RenameColumnsPreprocessor(d_info['columns'])\\n        d_info.pop('columns')\\n        d_info['preprocess_func'] = preprocess_func\\n    elif 'conversations' in d_info:\\n        preprocess_func = ConversationsPreprocessor(**d_info['conversations'])\\n        d_info.pop('conversations')\\n        d_info['preprocess_func'] = preprocess_func\\n\\n    if 'dataset_path' in d_info:\\n        base_dir = kwargs.pop('base_dir', None)\\n        register_local_dataset(dataset_name, d_info.pop('dataset_path', None), base_dir, **d_info)\\n        return\\n\\n    assert 'dataset_id' in d_info or 'hf_dataset_id' in d_info\\n\\n    dataset_id = d_info.pop('dataset_id', None)\\n    subsets = d_info.pop('subsets', None)\\n    preprocess_func = d_info.pop('preprocess_func', None)\\n    register_dataset(dataset_name, dataset_id, subsets, preprocess_func, get_dataset_from_repo, **d_info, exist_ok=True)\\n\\n\\ndef load_ms_dataset(dataset_id: str,\\n                    subset_split_list: Optional[List[SubsetSplit]],\\n                    use_hf: bool = False,\\n                    streaming: bool = False,\\n                    revision: Optional[str] = None) -> Optional[DATASET_TYPE]:\\n    if subset_split_list is None or len(subset_split_list) == 0:\\n        return None\\n    dataset_list = []\\n    for subset_split in subset_split_list:\\n        if isinstance(subset_split, str):\\n            subset_split = ('default', subset_split)\\n        assert len(subset_split) == 2\\n        subset_name, split = subset_split\\n        if use_hf:\\n            try:\\n                dataset = load_hf_dataset(\\n                    dataset_id, name=subset_name, split=split, streaming=streaming, revision=revision)\\n            except ValueError as e:\\n                logger.error(f'Dataset {dataset_id} load failed: subset_name={subset_name},'\\n                             f'split={split} with error: {e}')\\n                continue\\n            except Exception:\\n                raise\\n        else:\\n            from modelscope import MsDataset\\n            if is_dist() and not is_local_master():\\n                force_redownload = False\\n            else:\\n                force_redownload = strtobool(os.environ.get('FORCE_REDOWNLOAD', 'False'))\\n            download_mode = 'force_redownload' if force_redownload else 'reuse_dataset_if_exists'\\n            with safe_ddp_context():\\n                for i in range(5):\\n                    try:\\n                        dataset = MsDataset.load(\\n                            dataset_id,\\n                            subset_name=subset_name,\\n                            split=split,\\n                            version=revision or 'master',\\n                            download_mode=download_mode,\\n                            use_streaming=streaming)\\n                    except Exception as e:\\n                        logger.error(f'Dataset {dataset_id} load failed: subset_name={subset_name},'\\n                                     f'split={split} with error: {e}')\\n                    else:\\n                        break\\n                else:\\n                    continue\\n            if streaming and hasattr(dataset, '_hf_ds'):\\n                dataset = dataset._hf_ds\\n                if not isinstance(dataset, HfIterableDataset):\\n                    dataset = dataset.to_iterable_dataset()\\n            if hasattr(dataset, 'to_hf_dataset'):\\n                dataset = dataset.to_hf_dataset()\\n        dataset_list.append(dataset)\\n    if len(dataset_list) == 1:\\n        return dataset_list[0]\\n    if not streaming:\\n        return concatenate_datasets(dataset_list)\\n    else:\\n        return interleave_datasets(dataset_list)\\n\\n\\ndef sample_dataset(dataset: HfDataset, dataset_sample: int, random_state: Optional[RandomState] = None) -> HfDataset:\\n    if dataset_sample in {None, -1, len(dataset)}:\\n        return dataset\\n    if random_state is None:\\n        random_state = RandomState()\\n\\n    idx_repeat = np.tile(range(len(dataset)), dataset_sample // len(dataset))\\n    idx_random = random_state.permutation(len(dataset))[:dataset_sample % len(dataset)]\\n    idx = np.concatenate([idx_repeat, idx_random])\\n    dataset = dataset.select(idx)\\n    return dataset\\n\\n\\ndef _post_preprocess(\\n    train_dataset: DATASET_TYPE,\\n    dataset_sample: int,\\n    random_state: Optional[RandomState] = None,\\n    preprocess_func: Optional[PreprocessFunc] = None,\\n    dataset_test_ratio: float = 0.,\\n    remove_useless_columns: bool = True,\\n    **kwargs,\\n) -> Tuple[DATASET_TYPE, Optional[DATASET_TYPE]]:\\n    assert train_dataset is not None\\n    streaming = kwargs.get('streaming', False)\\n    if not streaming:\\n        if dataset_sample == -1:\\n            dataset_sample = len(train_dataset)\\n        assert 0 <= dataset_test_ratio <= 1\\n        if dataset_test_ratio == 1:\\n            train_dataset, val_dataset = None, train_dataset\\n            val_sample = dataset_sample\\n            assert val_sample <= len(\\n                val_dataset), f'dataset_sample: {dataset_sample}, len(val_dataset): {len(val_dataset)}'\\n            val_dataset = sample_dataset(val_dataset, val_sample, random_state)\\n        else:\\n            if dataset_test_ratio == 0:\\n                train_sample = dataset_sample\\n                val_dataset = None\\n            else:\\n                # Avoid having a high train_sample causing a high val_sample.\\n                _train_len = min(len(train_dataset), dataset_sample)\\n                val_sample = max(int(_train_len * dataset_test_ratio), 1)\\n                train_sample = dataset_sample - val_sample\\n                assert isinstance(val_sample, int)\\n                train_dataset, val_dataset = train_dataset.train_test_split(\\n                    test_size=val_sample, seed=get_seed(random_state),\\n                    load_from_cache_file=dataset_enable_cache).values()\\n\\n            assert train_sample > 0\\n            train_dataset = sample_dataset(train_dataset, train_sample, random_state)\\n    else:\\n        val_dataset = None\\n        if dataset_test_ratio == 1:\\n            train_dataset, val_dataset = None, train_dataset\\n        else:\\n            streaming_val_size = kwargs.get('streaming_val_size', 0)\\n            streaming_buffer_size = kwargs.get('streaming_buffer_size', 16384)\\n            if streaming_val_size > 0:\\n                train_dataset = train_dataset.shuffle(seed=get_seed(random_state), buffer_size=streaming_buffer_size)\\n                val_dataset = train_dataset.take(int(streaming_val_size))\\n                train_dataset = train_dataset.skip(int(streaming_val_size))\\n\\n    res = []\\n    for dataset in [train_dataset, val_dataset]:\\n        if dataset is not None and preprocess_func is not None:\\n            dataset = preprocess_func(dataset)\\n        if dataset is not None and (streaming or len(dataset) > 0) and remove_useless_columns:\\n            dataset = _remove_useless_columns(dataset)\\n        res.append(dataset)\\n    return tuple(res)\\n\\n\\ndef get_dataset_from_repo(dataset_id: str,\\n                          subsets: Optional[List[str]],\\n                          preprocess_func: PreprocessFunc,\\n                          split: List[str],\\n                          dataset_sample: int = -1,\\n                          *,\\n                          random_state: Optional[RandomState] = None,\\n                          dataset_test_ratio: float = 0.,\\n                          remove_useless_columns: bool = True,\\n                          use_hf: bool = False,\\n                          **kwargs) -> Tuple[DATASET_TYPE, Optional[DATASET_TYPE]]:\\n    streaming = kwargs.get('streaming', False)\\n    if subsets is None:\\n        subsets = []\\n    assert len(split) > 0\\n    if len(subsets) == 0:\\n        subset_split_list = split\\n    else:\\n        subset_split_list = list(itertools.product(subsets, split))\\n\\n    dataset = load_ms_dataset(\\n        dataset_id, subset_split_list, use_hf, streaming=streaming, revision=kwargs.get('revision'))\\n\\n    return _post_preprocess(dataset, dataset_sample, random_state, preprocess_func, dataset_test_ratio,\\n                            remove_useless_columns, **kwargs)\\n\\n\\ndef _concat_inst_inp_alpaca_zh(inst: str, inp: str) -> str:\\n    if inp.startswith('输入：'):\\n        inp = inp[3:]\\n    return f'{inst}\\\\n{inp}'\\n\\n\\nregister_dataset(\\n    DatasetName.alpaca_zh,\\n    'AI-ModelScope/alpaca-gpt4-data-zh',\\n    None,\\n    AlpacaPreprocessor(concat_inst_inp=_concat_inst_inp_alpaca_zh),\\n    get_dataset_from_repo,\\n    tags=['chat', 'general', '🔥'],\\n    hf_dataset_id='llm-wizard/alpaca-gpt4-data-zh')\\n\\n\\ndef preprocess_sharegpt_4o_images(dataset: DATASET_TYPE):\\n    url = 'https://www.modelscope.cn/api/v1/datasets/AI-ModelScope/ShareGPT-4o/repo?Revision=master&FilePath=images.zip'\\n    local_dir = MediaCache.download(url, 'sharegpt_4o_images')\\n    prefix_path = os.path.join(local_dir, 'mnt', 'petrelfs', 'wangwenhai', 'workspace_cef', '4o', 'image')\\n\\n    def preprocess_row(row):\\n        image = row['image']\\n        if not image:\\n            return {'image': []}\\n        image = os.path.join(prefix_path, image)\\n        if not os.path.exists(image):\\n            return {'image': [], 'conversations': []}\\n        return {'image': [image]}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    dataset = dataset.map(preprocess_row, **kwargs).filter(lambda row: row['conversations'])\\n    return ConversationsPreprocessor(\\n        user_role='human', assistant_role='gpt', media_type='image', error_strategy='delete')(\\n            dataset)\\n\\n\\nregister_dataset(\\n    DatasetName.sharegpt_4o_image,\\n    'AI-ModelScope/ShareGPT-4o', ['image_caption'],\\n    preprocess_sharegpt_4o_images,\\n    get_dataset_from_repo,\\n    split=['images'],\\n    tags=['vqa', 'multi-modal'],\\n    hf_dataset_id='OpenGVLab/ShareGPT-4o')\\n\\n\\ndef preprocess_sa1b_paired_caption(dataset: DATASET_TYPE):\\n\\n    prompt = ['图片中展示了什么', '讲述一下图片中内容', '告诉我里面有什么', '图片内容是啥']\\n\\n    def preprocess_row(row):\\n        response = row['global_caption']\\n        query = np.random.choice(prompt)\\n        return {\\n            'query': query,\\n            'response': response,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs).rename_column('opensource_url', 'images')\\n\\n\\nregister_dataset(\\n    DatasetName.sa1b_paired_caption,\\n    'Tongyi-DataEngine/SA1B-Paired-Captions-Images',\\n    None,\\n    preprocess_sa1b_paired_caption,\\n    get_dataset_from_repo,\\n    split=['train'],\\n    huge_dataset=True,\\n    tags=['zh', 'multi-modal', 'vqa'])\\n\\n\\ndef preprocess_sa1b_dense_caption(dataset: DATASET_TYPE):\\n\\n    prompt = ['图片中展示了什么', '讲述一下图片中内容', '告诉我里面有什么', '图片内容是啥']\\n\\n    def preprocess_row(row):\\n        response = ast.literal_eval(row['cap_seg'])\\n        response = response.get('global_caption')\\n        query = np.random.choice(prompt)\\n        return {\\n            'query': query,\\n            'response': response,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs).filter(lambda row: row.get('response')).rename_column('url', 'images')\\n\\n\\nregister_dataset(\\n    DatasetName.sa1b_dense_caption,\\n    'Tongyi-DataEngine/SA1B-Dense-Caption',\\n    None,\\n    preprocess_sa1b_dense_caption,\\n    get_dataset_from_repo,\\n    split=['train'],\\n    huge_dataset=True,\\n    tags=['zh', 'multi-modal', 'vqa'])\\n\\n\\ndef _preprocess_vision_dataset(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    from datasets import Image\\n    prompt = 'please describe the image.'\\n    image_key = 'image'\\n    response_key = 'caption'\\n    dataset = dataset.cast_column('image', Image(decode=False))\\n    query_format = f'<img>{{image_path}}</img>{prompt}'\\n\\n    def _process(d):\\n        if '&&' in d[response_key]:\\n            d[response_key] = d[response_key].split('&&')[0]\\n\\n        return {'query': query_format.format(image_path=d[image_key]['path']), 'response': d[response_key]}\\n\\n    return dataset.map(_process)\\n\\n\\ndef preprocess_mantis_image(dataset, subset):\\n    url = f'https://www.modelscope.cn/api/v1/datasets/swift/Mantis-Instruct/repo?Revision=master&FilePath={subset}/train_images.zip'  # noqa\\n    local_dir = MediaCache.download(url, f'mantis_{subset}')\\n\\n    def preprocess_row(row):\\n        images = [os.path.join(local_dir, p['path']) for p in row['images']]\\n        if all([os.path.exists(d) for d in images]):\\n            return {'images': images}\\n        else:\\n            return {'images': []}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs).filter(lambda row: row['images'])\\n\\n\\ndef get_mantis_dataset(dataset_id: str,\\n                       subsets: Optional[List[str]],\\n                       preprocess_func: PreprocessFunc,\\n                       split: List[str],\\n                       dataset_sample: int = -1,\\n                       *,\\n                       random_state: Optional[RandomState] = None,\\n                       dataset_test_ratio: float = 0.,\\n                       remove_useless_columns: bool = True,\\n                       use_hf: bool = False,\\n                       **kwargs) -> Tuple[HfDataset, Optional[HfDataset]]:\\n    streaming = kwargs.get('streaming', False)\\n    if subsets is None:\\n        subsets = []\\n    assert len(split) > 0\\n    if len(subsets) == 0:\\n        subset_split_list = split\\n    else:\\n        subset_split_list = list(itertools.product(subsets, split))\\n    all_datasets = []\\n    for subset in subset_split_list:\\n        dataset = load_ms_dataset(dataset_id, [subset], use_hf, streaming=streaming)\\n        dataset = preprocess_mantis_image(dataset, subset=subset[0])\\n        all_datasets.append(dataset)\\n        break\\n    if len(all_datasets) > 1:\\n        dataset = concatenate_datasets(all_datasets) if not streaming else interleave_datasets(all_datasets)\\n    else:\\n        dataset = all_datasets[0]\\n    return _post_preprocess(dataset, dataset_sample, random_state, preprocess_func, dataset_test_ratio,\\n                            remove_useless_columns, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.mantis_instruct,\\n    'swift/Mantis-Instruct', [\\n        'birds-to-words', 'chartqa', 'coinstruct', 'contrastive_caption', 'docvqa', 'dreamsim', 'dvqa', 'iconqa',\\n        'imagecode', 'llava_665k_multi', 'lrv_multi', 'multi_vqa', 'nextqa', 'nlvr2', 'spot-the-diff', 'star',\\n        'visual_story_telling'\\n    ],\\n    ConversationsPreprocessor(\\n        user_role='user',\\n        assistant_role='assistant',\\n        conversations_key='conversation',\\n        from_key='role',\\n        value_key='content',\\n        media_type='image',\\n        media_key='images',\\n        error_strategy='delete'),\\n    get_mantis_dataset,\\n    split=['train'],\\n    tags=['chat', 'multi-modal', 'vision', 'quality'],\\n    hf_dataset_id='TIGER-Lab/Mantis-Instruct')\\n\\n\\ndef preprocess_llava_data(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n\\n    all_folders = {}\\n    for media_type in ['coco', 'gqa', 'ocr_vqa', 'textvqa', 'VG_100K', 'VG_100K_2']:\\n        all_folders[media_type] = MediaCache.download(media_type)\\n\\n    def preprocess_image(example, all_folders):\\n        if not example['images']:\\n            return {}\\n        images = [p['path'] for p in example['images']]\\n        new_images = []\\n        for image in images:\\n            if 'coco/' in image:\\n                image = os.path.join(all_folders['coco'], image.replace('coco/', ''))\\n            elif 'gqa/' in image:\\n                image = os.path.join(all_folders['gqa'], image.replace('gqa/', ''))\\n            elif 'ocr_vqa/' in image:\\n                image = os.path.join(all_folders['ocr_vqa'], image)\\n            elif 'textvqa/' in image:\\n                image = os.path.join(all_folders['textvqa'], image.replace('textvqa/', ''))\\n            elif 'VG_100K/' in image:\\n                image = os.path.join(all_folders['VG_100K'], image.replace('vg/', ''))\\n            elif 'VG_100K_2/' in image:\\n                image = os.path.join(all_folders['VG_100K_2'], image.replace('vg/', ''))\\n            new_images.append(image)\\n        if all(os.path.exists(image) for image in new_images):\\n            example['images'] = new_images\\n        else:\\n            example['images'] = []\\n        return example\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    dataset = dataset.map(partial(preprocess_image, all_folders=all_folders),\\n                          **kwargs).filter(lambda row: row['images'])\\n    return ConversationsPreprocessor(\\n        user_role='user',\\n        assistant_role='assistant',\\n        conversations_key='conversation',\\n        from_key='role',\\n        value_key='content',\\n        media_type='image',\\n        media_key='images')(\\n            dataset)\\n\\n\\nregister_dataset(\\n    DatasetName.llava_data_instruct,\\n    'swift/llava-data', ['llava_instruct'],\\n    preprocess_llava_data,\\n    get_dataset_from_repo,\\n    split=['train'],\\n    tags=['sft', 'multi-modal', 'quality'],\\n    hf_dataset_id='TIGER-Lab/llava-data')\\n\\nregister_dataset(\\n    DatasetName.coco_en,\\n    'modelscope/coco_2014_caption', ['coco_2014_caption'],\\n    _preprocess_vision_dataset,\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['chat', 'multi-modal', 'vision'],\\n    is_main=False)\\n\\nregister_dataset(\\n    DatasetName.coco_en_mini,\\n    'modelscope/coco_2014_caption', ['coco_2014_caption'],\\n    _preprocess_vision_dataset,\\n    get_dataset_from_repo,\\n    split=['validation'],\\n    tags=['chat', 'multi-modal', 'vision', '🔥'],\\n    is_main=False)\\n\\n\\ndef _preprocess_vision_dataset2(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    from datasets import Image\\n    query = 'please describe the image.'\\n    image_key = 'image'\\n    response_key = 'caption'\\n    dataset = dataset.cast_column('image', Image(decode=False))\\n\\n    def _process(d):\\n        images = [d[image_key]['path']]\\n        if '&&' in d[response_key]:\\n            d[response_key] = d[response_key].split('&&')[0]\\n        response = d[response_key]\\n        return {'query': query, 'response': response, 'images': images}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(_process, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.coco_en_2,\\n    'modelscope/coco_2014_caption', ['coco_2014_caption'],\\n    _preprocess_vision_dataset2,\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['chat', 'multi-modal', 'vision'],\\n    is_main=False)\\n\\nregister_dataset(\\n    DatasetName.coco_en_2_mini,\\n    'modelscope/coco_2014_caption', ['coco_2014_caption'],\\n    _preprocess_vision_dataset2,\\n    get_dataset_from_repo,\\n    split=['validation'],\\n    tags=['chat', 'multi-modal', 'vision', '🔥'],\\n    is_main=False)\\n\\n\\ndef _preprocess_pixelprose(dataset: DATASET_TYPE):\\n\\n    caption_prompt = [\\n        'Give the description of this image.', 'Describe this picture', 'What is the proper title of this image?'\\n    ]\\n\\n    def preprocess(row):\\n        vlm_caption = row['vlm_caption']\\n        if vlm_caption.startswith('This image displays:'):\\n            vlm_caption = vlm_caption[len('This image displays:'):].strip()\\n        return {\\n            'response': vlm_caption,\\n            'images': row['url'],\\n            'query': np.random.choice(caption_prompt),\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.pixelprose,\\n    'swift/pixelprose',\\n    None,\\n    _preprocess_pixelprose,\\n    get_dataset_from_repo,\\n    split=['train', 'cc12m', 'commonpool', 'redcaps'],\\n    hf_dataset_id='tomg-group-umd/pixelprose',\\n    tags=['caption', 'multi-modal', 'vision'],\\n    huge_dataset=True,\\n    is_main=False)\\n\\n\\ndef _preprocess_aishell1_dataset(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    prompt = '语音转文本'\\n    audio_key = 'Audio:FILE'\\n    response_key = 'Text:LABEL'\\n    query_format = f'<audio>{{audio_path}}</audio>{prompt}'\\n\\n    def _process(d):\\n        return {'query': query_format.format(audio_path=d[audio_key]), 'response': d[response_key].replace(' ', '')}\\n\\n    return dataset.map(_process)\\n\\n\\nregister_dataset(\\n    DatasetName.aishell1_zh,\\n    'speech_asr/speech_asr_aishell1_trainsets',\\n    None,\\n    _preprocess_aishell1_dataset,\\n    get_dataset_from_repo,\\n    split=['train', 'validation', 'test'],\\n    tags=['chat', 'multi-modal', 'audio'])\\n\\nregister_dataset(\\n    DatasetName.aishell1_zh_mini,\\n    'speech_asr/speech_asr_aishell1_trainsets',\\n    None,\\n    _preprocess_aishell1_dataset,\\n    get_dataset_from_repo,\\n    split=['validation', 'test'],\\n    tags=['chat', 'multi-modal', 'audio', '🔥'],\\n    is_main=False)\\n\\n\\ndef _preprocess_video_chatgpt(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    url = 'https://modelscope.cn/datasets/swift/VideoChatGPT/resolve/master/videos.zip'\\n    local_dir = MediaCache.download(url, 'video_chatgpt')\\n    local_dir = os.path.join(local_dir, 'Test_Videos')\\n    # only `.mp4`\\n    mp4_set = [file[:-4] for file in os.listdir(local_dir) if file.endswith('mp4')]\\n\\n    def _process(d):\\n        if d['video_name'] not in mp4_set:\\n            return {'query': None, 'response': None, 'videos': None}\\n        return {\\n            'query': d['question'] or d['question_1'] or d['question_2'],\\n            'response': d['answer'],\\n            'videos': [os.path.join(local_dir, f\\\"{d['video_name']}.mp4\\\")]\\n        }\\n\\n    return dataset.map(_process).filter(lambda row: row['query'] is not None)\\n\\n\\nregister_dataset(\\n    DatasetName.video_chatgpt,\\n    'swift/VideoChatGPT', ['Generic', 'Temporal', 'Consistency'],\\n    _preprocess_video_chatgpt,\\n    get_dataset_from_repo,\\n    split=['test'],\\n    hf_dataset_id='lmms-lab/VideoChatGPT',\\n    tags=['chat', 'multi-modal', 'video', '🔥'])\\n\\n\\ndef _repair_agent_conversations(conversations: str, use_mini: bool) -> Optional[List[Dict[str, str]]]:\\n    if use_mini:\\n        pattern = r'\\\\d\\\\. {\\\"plugin_name\\\": \\\"(.+?)\\\"'\\n    else:\\n        pattern = r'\\\\d\\\\. {\\\"(?:plugin_)?name\\\": \\\"(.+?)\\\"'\\n\\n    idx = conversations.find(r\\\"'from': 'user\\\")\\n    if idx == -1:\\n        return\\n    # remove dirty data\\n    find_list = re.findall(pattern, conversations[:idx])\\n    if len(set(find_list)) <= 1:\\n        return\\n    if isinstance(conversations, str):\\n        conversations = ast.literal_eval(conversations)\\n    if len(conversations) == 1:\\n        return\\n    return conversations\\n\\n\\ndef _repair_ms_bench(conversations: str) -> Optional[List[Dict[str, str]]]:\\n    if isinstance(conversations, str):\\n        conversations = ast.literal_eval(conversations)\\n    default_system = 'You are a helpful assistant.'\\n    conversations: List[Dict[str, str]]\\n    if conversations[0]['from'] == 'system' and conversations[0]['value'] == default_system:\\n        conversations.pop(0)\\n    # skip MOSS\\n    for c in conversations:\\n        value = c['value'].lower()\\n        if 'moss' in value or 'human:' in value or 'assistant:' in value or 'user:' in value:\\n            return\\n    return conversations\\n\\n\\ndef long_alpaca_preprocessor(dataset: DATASET_TYPE):\\n\\n    def map_row(row):\\n        response = row['response']\\n        if response and response.startswith('Answer:'):\\n            response = response[len('Answer:') + 1:].strip()\\n            row['response'] = response\\n        return response\\n\\n    dataset = AlpacaPreprocessor()(dataset)\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(map_row, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.long_alpaca_12k,\\n    'AI-ModelScope/LongAlpaca-12k',\\n    None,\\n    long_alpaca_preprocessor,\\n    get_dataset_from_repo,\\n    tags=['longlora', 'QA'],\\n    hf_dataset_id='Yukang/LongAlpaca-12k')\\n\\n\\ndef _preprocess_ruozhiba(dataset: DATASET_TYPE):\\n\\n    def map_row(row):\\n        title = row['title'] if row.get('title', None) is not None else row['content']\\n        abs = row['abs'] if 'abs' in row else None\\n        if abs and abs != title:\\n            title = title + '，' + abs\\n\\n        pattern = r'\\\\d+[\\\\.,\\\\s,\\\\、](.+)'\\n        match = re.search(pattern, title)\\n        if match:\\n            title = match.group(1)\\n        return {'response': title}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(map_row, **kwargs).filter(lambda row: row['response'])\\n\\n\\nregister_dataset(\\n    DatasetName.ruozhiba,\\n    'AI-ModelScope/ruozhiba', ['post-annual', 'title-good', 'title-norm'],\\n    _preprocess_ruozhiba,\\n    get_dataset_from_repo,\\n    tags=['pretrain', '🔥'])\\n\\nregister_dataset(\\n    DatasetName.ms_bench,\\n    'iic/ms_bench',\\n    None,\\n    ConversationsPreprocessor(repair_conversations=_repair_ms_bench, error_strategy='delete'),\\n    get_dataset_from_repo,\\n    tags=['chat', 'general', 'multi-round', '🔥'])\\n\\nregister_dataset(\\n    DatasetName.damo_agent_zh_mini,\\n    'damo/MSAgent-Bench',\\n    None,\\n    ConversationsPreprocessor(\\n        repair_conversations=partial(_repair_agent_conversations, use_mini=True), error_strategy='delete'),\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['chat', 'agent', 'multi-round'],\\n    is_main=False)\\nregister_dataset(\\n    DatasetName.damo_agent_zh,\\n    'damo/MSAgent-Bench',\\n    None,\\n    ConversationsPreprocessor(\\n        repair_conversations=partial(_repair_agent_conversations, use_mini=False), error_strategy='delete'),\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['chat', 'agent', 'multi-round'])\\n\\nadvertise_gen_prompt = \\\"\\\"\\\"Task: Generating advertisements based on keywords.\\nKeywords: {query}\\nAdvertisements:\\\"\\\"\\\"\\nregister_dataset(\\n    DatasetName.advertise_gen_zh,\\n    'lvjianjin/AdvertiseGen',\\n    None,\\n    TextGenerationPreprocessor(advertise_gen_prompt, 'content', 'summary'),\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['text-generation', '🔥'],\\n    hf_dataset_id='shibing624/AdvertiseGen')\\n\\n_firefly_kind_list = [\\n    'ProseGeneration', 'MRC', 'JinYongGeneration', 'TextCorrection', 'ClassicalChinese', 'BELLE', 'StoryGeneration',\\n    'Couplet', 'Cot', 'Dictionary', 'Translation', 'Program', 'SentimentAnalyze', 'OpenQA', 'AncientPoem',\\n    'TextMatching', 'NLI', 'Summary', 'KeywordRecognition', 'ProductDesc', 'LyricGeneration', 'Composition',\\n    'MusicComment', 'NER'\\n]\\n\\n\\ndef _preprocess_firefly(dataset: DATASET_TYPE, kind_list: List[str]) -> DATASET_TYPE:\\n    kind_set = set(kind_list)\\n\\n    def _process(d):\\n        if d['kind'] not in kind_set:\\n            return {'query': None, 'response': None}\\n        return {'query': d['input'], 'response': d['target']}\\n\\n    return dataset.map(_process).filter(lambda row: row['query'])\\n\\n\\n@register_dataset(\\n    DatasetName.firefly_zh,\\n    'AI-ModelScope/firefly-train-1.1M',\\n    None,\\n    _preprocess_firefly,\\n    tags=['chat', 'general'],\\n    hf_dataset_id='YeungNLP/firefly-train-1.1M',\\n    function_kwargs={'kind_list': _firefly_kind_list})\\ndef get_firefly_zh_dataset(dataset_id: str, _, preprocess_func: PreprocessFunc, *args, **kwargs) -> HfDataset:\\n    kind_list = kwargs['kind_list']\\n    file = 'firefly-train-1.1M.jsonl'\\n    dataset_dir = download_dataset(dataset_id, [file])\\n    fpath = os.path.join(dataset_dir, file)\\n    with open(fpath, 'r', encoding='utf-8') as f:\\n        text = f.read()\\n        text = text.replace('}{', '},{')\\n        text = f'[{text}]'\\n        dataset = json.loads(text)\\n    return preprocess_func(dataset, kind_list)\\n\\n\\nregister_dataset(\\n    DatasetName.cmnli_zh,\\n    'modelscope/clue', ['cmnli'],\\n    ClsPreprocessor(['neutral', 'entailment', 'contradiction'], 'Natural Language Inference', True),\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['text-generation', 'classification'],\\n    hf_dataset_id='clue')\\n\\nregister_dataset(\\n    DatasetName.jd_sentiment_zh,\\n    'DAMO_NLP/jd',\\n    None,\\n    ClsPreprocessor(['negative', 'positive'], 'Sentiment Classification', False),\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['text-generation', 'classification', '🔥'])\\n\\n\\ndef _preprocess_dureader_robust(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    prompt = \\\"\\\"\\\"Task: Question Generation\\nContext: {context}\\nAnswer: {answer}\\nQuestion:\\\"\\\"\\\"\\n\\n    def _process(d):\\n        answer, context = d['text1'].split('[SEP]')\\n        return {'query': prompt.format(context=context, answer=answer), 'response': d['text2']}\\n\\n    return dataset.map(_process)\\n\\n\\nregister_dataset(\\n    DatasetName.dureader_robust_zh,\\n    'modelscope/DuReader_robust-QG',\\n    None,\\n    _preprocess_dureader_robust,\\n    get_dataset_from_repo,\\n    split=['train', 'validation', 'test'],\\n    tags=['text-generation', '🔥'])\\n\\n\\ndef process_hh_rlhf(dataset: DATASET_TYPE):\\n\\n    def reorganize_row(row):\\n        import re\\n        chosen = row['chosen'].strip()\\n        rejected = row['rejected'].strip()\\n        parts_chosen = [s.strip() for s in re.split('\\\\n\\\\nHuman:|\\\\n\\\\nAssistant:|\\\\n\\\\nHum:', chosen)]\\n        parts_rejected = [s.strip() for s in re.split('\\\\n\\\\nHuman:|\\\\n\\\\nAssistant:|\\\\n\\\\nHum:', rejected)]\\n        if parts_chosen[0].startswith('Human:'):\\n            assert parts_rejected[0].startswith('Human:')\\n            parts_chosen[0] = parts_chosen[0][6:].strip()\\n            parts_rejected[0] = parts_rejected[0][6:].strip()\\n        history = []\\n        idx, s1, s2 = None, None, None\\n        for idx, (s1, s2) in enumerate(zip(parts_chosen, parts_rejected)):\\n            if s1 == s2:\\n                if idx % 2 == 0:\\n                    history.append([s1, None])\\n                else:\\n                    history[-1][-1] = s1\\n            else:\\n                break\\n\\n        if idx % 2 == 0:\\n            return {\\n                'query': None,\\n                'response': None,\\n                'rejected_response': None,\\n                'history': None,\\n            }\\n        query = history[-1][0]\\n        history = history[:-1]\\n        response = s1\\n        rejected_response = s2\\n        return {\\n            'query': query,\\n            'response': response,\\n            'rejected_response': rejected_response,\\n            'history': history,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(reorganize_row, **kwargs).filter(lambda row: row['query'] is not None)\\n\\n\\nregister_dataset(\\n    DatasetName.hh_rlhf,\\n    'AI-ModelScope/hh-rlhf', ['harmless-base', 'helpful-base', 'helpful-online', 'helpful-rejection-sampled'],\\n    process_hh_rlhf,\\n    get_dataset_from_repo,\\n    split=['train', 'test'],\\n    tags=['rlhf', 'dpo', 'pairwise'])\\n\\n\\ndef process_hh_rlhf_cn(dataset: DATASET_TYPE):\\n\\n    def reorganize_row(row):\\n        history = []\\n        try:\\n            if isinstance(row['context'], str):\\n                row['context'] = ast.literal_eval(row['context'])\\n            if isinstance(row['chosen'], str):\\n                row['chosen'] = ast.literal_eval(row['chosen'])\\n            if isinstance(row['rejected'], str):\\n                row['rejected'] = ast.literal_eval(row['rejected'])\\n            for idx, h in enumerate(row['context']):\\n                if idx % 2 == 0 and h['role'] != 'human':\\n                    raise ValueError()\\n                if idx % 2 != 0 and h['role'] != 'assistant':\\n                    raise ValueError()\\n                if idx % 2 == 0:\\n                    history.append([h['text'], None])\\n                else:\\n                    history[-1][-1] = h['text']\\n            if history[-1][-1] is not None:\\n                raise ValueError()\\n            query = history[-1][0]\\n            history = history[:-1]\\n            response = row['chosen']['text']\\n            rejected_response = row['rejected']['text']\\n        except:  # noqa\\n            return {\\n                'query': '',\\n                'response': '',\\n                'rejected_response': '',\\n                'history': [],\\n            }\\n        return {\\n            'query': query,\\n            'response': response,\\n            'rejected_response': rejected_response,\\n            'history': history,\\n        }\\n\\n    def row_can_be_parsed(row):\\n        try:\\n            if isinstance(row['context'], str):\\n                row['context'] = ast.literal_eval(row['context'])\\n            if isinstance(row['chosen'], str):\\n                row['chosen'] = ast.literal_eval(row['chosen'])\\n            if isinstance(row['rejected'], str):\\n                row['rejected'] = ast.literal_eval(row['rejected'])\\n            return True\\n        except:  # noqa\\n            return False\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.filter(row_can_be_parsed).map(reorganize_row, **kwargs).filter(lambda row: row['query'])\\n\\n\\nregister_dataset(\\n    DatasetName.hh_rlhf_cn,\\n    'AI-ModelScope/hh_rlhf_cn',\\n    ['hh_rlhf', 'harmless_base_cn', 'harmless_base_en', 'helpful_base_cn', 'helpful_base_en'],\\n    process_hh_rlhf_cn,\\n    get_dataset_from_repo,\\n    split=['train', 'test'],\\n    tags=['rlhf', 'dpo', 'pairwise', '🔥'])\\n\\n\\ndef _preprocess_m3it(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    column_mapping = {'instruction': 'system', 'inputs': 'query', 'image_base64_str': 'images', 'outputs': 'response'}\\n    dataset = dataset.rename_columns(column_mapping)\\n    return dataset\\n\\n\\ndef _preprocess_sharegpt4v(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    split = ['ShareGPT4V', 'ShareGPT4V-PT'] if dataset.config_name is None else dataset.config_name\\n    IMAGE_DATASET_REQUIREMENTS = {\\n        'ShareGPT4V': ['coco', 'sam', 'llava', 'wikiart', 'share_textvqa', 'web-celebrity', 'web-landmark'],\\n        'ShareGPT4V-PT': ['coco', 'sam', 'llava']\\n    }\\n\\n    if isinstance(split, str):\\n        split = [split]\\n    all_folders = {}\\n    for sp in split:\\n        for media_type in IMAGE_DATASET_REQUIREMENTS[sp]:\\n            all_folders[media_type] = MediaCache.download(media_type)\\n\\n    def preprocess_image(example, all_folders):\\n        image = example['image']\\n        if 'coco/' in image:\\n            image = os.path.join(all_folders['coco'], image.replace('coco/', ''))\\n        elif 'sam/' in image:\\n            image = os.path.join(all_folders['sam'], image.replace('sam/images/', ''))\\n        elif 'llava/' in image:\\n            image = os.path.join(all_folders['llava'], image.replace('llava/llava_pretrain/images/', ''))\\n        elif 'wikiart/' in image:\\n            image = os.path.join(all_folders['wikiart'], image.replace('wikiart/images/', 'data/wikiart/images/'))\\n        elif 'share_textvqa/' in image:\\n            image = os.path.join(all_folders['share_textvqa'],\\n                                 image.replace('share_textvqa/images/', 'data/share_textvqa/images/'))\\n        elif 'web-celebrity/' in image:\\n            image = os.path.join(all_folders['web-celebrity'],\\n                                 image.replace('web-celebrity/images/', 'data/web-celebrity/images/'))\\n        elif 'web-landmark/' in image:\\n            image = os.path.join(all_folders['web-landmark'],\\n                                 image.replace('web-landmark/images/', 'data/web-landmark/images/'))\\n        if os.path.exists(image):\\n            example['images'] = image\\n        else:\\n            example['images'] = None\\n        return example\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    dataset = dataset.map(partial(preprocess_image, all_folders=all_folders),\\n                          **kwargs).filter(lambda example: example['images'] is not None)\\n    processer = ConversationsPreprocessor(\\n        user_role='human', assistant_role='gpt', media_type='image', media_key='images', error_strategy='delete')\\n    return processer(dataset)\\n\\n\\nregister_dataset(\\n    DatasetName.m3it,\\n    'AI-ModelScope/M3IT',  # error: 'vist' , 'iqa-rephrased ', 'mmchat' / test: 'winoground','chinese-food'\\n    [\\n        'coco', 'vqa-v2', 'shapes', 'shapes-rephrased', 'coco-goi-rephrased', 'snli-ve', 'snli-ve-rephrased', 'okvqa',\\n        'a-okvqa', 'viquae', 'textcap', 'docvqa', 'science-qa', 'imagenet', 'imagenet-open-ended', 'imagenet-rephrased',\\n        'coco-goi', 'clevr', 'clevr-rephrased', 'nlvr', 'coco-itm', 'coco-itm-rephrased', 'vsr', 'vsr-rephrased',\\n        'mocheg', 'mocheg-rephrased', 'coco-text', 'fm-iqa', 'activitynet-qa', 'msrvtt', 'ss', 'coco-cn', 'refcoco',\\n        'refcoco-rephrased', 'multi30k', 'image-paragraph-captioning', 'visual-dialog', 'visual-dialog-rephrased',\\n        'iqa', 'vcr', 'visual-mrc', 'ivqa', 'msrvtt-qa', 'msvd-qa', 'gqa', 'text-vqa', 'ocr-vqa', 'st-vqa',\\n        'flickr8k-cn'\\n    ],\\n    _preprocess_m3it,\\n    get_dataset_from_repo,\\n    split=['train'],\\n    huge_dataset=True,\\n    tags=['chat', 'multi-modal', 'vision'])\\n\\nregister_dataset(\\n    DatasetName.sharegpt4v,\\n    'AI-ModelScope/ShareGPT4V', ['ShareGPT4V', 'ShareGPT4V-PT'],\\n    _preprocess_sharegpt4v,\\n    get_dataset_from_repo,\\n    split=['train'],\\n    huge_dataset=True,\\n    tags=['chat', 'multi-modal', 'vision'])\\n\\n\\ndef preprocess_text_caps(dataset: DATASET_TYPE):\\n\\n    def preprocess(row):\\n        try:\\n            image = row['image']\\n            response = np.random.choice(row['reference_strs'])\\n            return {'response': response, 'image': image}\\n        except Exception:\\n            return {'response': '', 'image': None}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs).filter(lambda row: row.get('response')).rename_columns({'image': 'images'})\\n\\n\\ndef preprocess_refcoco_unofficial_caption(dataset: DATASET_TYPE):\\n\\n    cache_dir = MediaCache.download(\\n        'https://www.modelscope.cn/api/v1/datasets/we_dont_produce_water/'\\n        'coco_res/repo?Revision=master&FilePath=coco_2014.zip', 'coco2014')\\n\\n    def preprocess(row):\\n        caption = row['captions'][0]\\n        bbox = row['bbox']\\n        image_path = os.path.join(cache_dir, row['image_path'].replace('coco/train2014', 'train2014'))\\n        media_tag = MediaTag(media_type='image', task_type='grounding_caption')\\n        for i in range(len(bbox)):\\n            bbox[i] = round(float(bbox[i]))\\n        res = {}\\n\\n        objects = [{\\n            'caption': caption,\\n            'bbox': bbox,\\n            'bbox_type': 'real',\\n            'image': 0,\\n        }]\\n        media_tag(res, [image_path])\\n        res['images'] = [image_path]\\n        res['objects'] = json.dumps(objects, ensure_ascii=False)\\n        if not os.path.exists(image_path):\\n            res['response'] = ''\\n        return res\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs).filter(lambda row: row.get('response'))\\n\\n\\nregister_dataset(\\n    DatasetName.refcoco_unofficial_caption,\\n    'swift/refcoco', [],\\n    preprocess_func=preprocess_refcoco_unofficial_caption,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='jxu124/refcoco',\\n    tags=['multi-modal', 'en', 'caption'])\\n\\nregister_dataset(\\n    DatasetName.refcocog_unofficial_caption,\\n    'swift/refcocog', [],\\n    preprocess_func=preprocess_refcoco_unofficial_caption,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='jxu124/refcocog',\\n    tags=['multi-modal', 'en', 'caption'])\\n\\n\\ndef preprocess_refcoco_unofficial_grounding(dataset: DATASET_TYPE):\\n\\n    cache_dir = MediaCache.download(\\n        'https://www.modelscope.cn/api/v1/datasets/we_dont_produce_water/'\\n        'coco_res/repo?Revision=master&FilePath=coco_2014.zip', 'coco2014')\\n\\n    def preprocess(row):\\n        caption = row['captions'][0]\\n        bbox = row['bbox']\\n        image_path = os.path.join(cache_dir, row['image_path'].replace('coco/train2014', 'train2014'))\\n        media_tag = MediaTag(media_type='image', task_type='ref_grounding')\\n        for i in range(len(bbox)):\\n            bbox[i] = round(float(bbox[i]))\\n        res = {}\\n\\n        objects = [{\\n            'caption': caption,\\n            'bbox': bbox,\\n            'bbox_type': 'real',\\n            'image': 0,\\n        }]\\n        media_tag(res, [image_path])\\n        res['images'] = [image_path]\\n        res['objects'] = json.dumps(objects, ensure_ascii=False)\\n        if not os.path.exists(image_path):\\n            res['response'] = ''\\n        return res\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs).filter(lambda row: row.get('response'))\\n\\n\\nregister_dataset(\\n    DatasetName.refcoco_unofficial_grounding,\\n    'swift/refcoco', [],\\n    preprocess_func=preprocess_refcoco_unofficial_grounding,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='jxu124/refcoco',\\n    tags=['multi-modal', 'en', 'grounding'])\\n\\nregister_dataset(\\n    DatasetName.refcocog_unofficial_grounding,\\n    'swift/refcocog', [],\\n    preprocess_func=preprocess_refcoco_unofficial_grounding,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='jxu124/refcocog',\\n    tags=['multi-modal', 'en', 'grounding'])\\n\\nregister_dataset(\\n    DatasetName.text_caps,\\n    'swift/TextCaps', [],\\n    preprocess_func=preprocess_text_caps,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='HuggingFaceM4/TextCaps',\\n    huge_dataset=True,\\n    tags=['multi-modal', 'en', 'caption', 'quality'])\\n\\nregister_dataset(\\n    DatasetName.lnqa,\\n    'swift/lnqa', [],\\n    preprocess_func=ListPreprocessor(query_key='question', response_key='answer', media_type='image'),\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='vikhyatk/lnqa',\\n    huge_dataset=True,\\n    tags=['multi-modal', 'en', 'ocr-vqa', 'quality'])\\n\\n\\ndef _preprocess_llava_instruct_images(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    all_folders = {}\\n    for media_type in ['coco', 'gqa', 'ocr_vqa', 'textvqa', 'VG_100K', 'VG_100K_2']:\\n        all_folders[media_type] = MediaCache.download(media_type)\\n\\n    def preprocess_image(example, all_folders):\\n        image = example['image']\\n        if 'coco/' in image:\\n            image = os.path.join(all_folders['coco'], image.replace('coco/', ''))\\n        elif 'gqa/' in image:\\n            image = os.path.join(all_folders['gqa'], image.replace('gqa/', ''))\\n        elif 'ocr_vqa/' in image:\\n            image = os.path.join(all_folders['ocr_vqa'], image)\\n        elif 'textvqa/' in image:\\n            image = os.path.join(all_folders['textvqa'], image.replace('textvqa/', ''))\\n        elif 'VG_100K/' in image:\\n            image = os.path.join(all_folders['VG_100K'], image.replace('vg/', ''))\\n        elif 'VG_100K_2/' in image:\\n            image = os.path.join(all_folders['VG_100K_2'], image.replace('vg/', ''))\\n        if os.path.exists(image):\\n            example['images'] = image\\n        else:\\n            example['images'] = None\\n        return example\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    dataset = dataset.map(partial(preprocess_image, all_folders=all_folders),\\n                          **kwargs).filter(lambda example: example['images'] is not None)\\n    processer = ConversationsPreprocessor(\\n        user_role='human', assistant_role='gpt', media_type='image', media_key='images', error_strategy='delete')\\n    return processer(dataset)\\n\\n\\nregister_dataset(\\n    DatasetName.llava_instruct_150k,\\n    'AI-ModelScope/LLaVA-Instruct-150K',\\n    None,\\n    _preprocess_llava_instruct_images,\\n    get_dataset_from_repo,\\n    split=['train'],\\n    revision='d5db3806e395c60496630a206c336932e85a2d00',\\n    tags=['chat', 'multi-modal', 'vision'])\\n\\n\\ndef preprocess_lmsys_chat(dataset):\\n\\n    def repair_conversations(s: Union[str, Any]) -> Any:\\n        if isinstance(s, str):\\n            s = s.replace('}\\\\n {', '},{')\\n            s = s.replace('}\\\\n{', '},{')\\n            s = s.replace('}{', '},{')\\n            s = s.replace('}\\\\n  {', '},{')\\n            return ast.literal_eval(s)\\n        return s\\n\\n    return ConversationsPreprocessor(\\n        user_role='user',\\n        assistant_role='assistant',\\n        conversations_key='conversation',\\n        from_key='role',\\n        value_key='content',\\n        error_strategy='delete',\\n        repair_conversations=repair_conversations)(\\n            dataset)\\n\\n\\nregister_dataset(\\n    DatasetName.lmsys_chat_1m,\\n    'AI-ModelScope/lmsys-chat-1m',\\n    None,\\n    preprocess_lmsys_chat,\\n    get_dataset_from_repo,\\n    hf_dataset_id='lmsys/lmsys-chat-1m',\\n    tags=['chat', 'em'])\\n\\n\\ndef _preprocess_llava_pretrain(dataset: DATASET_TYPE):\\n    media_dir = MediaCache.download(\\n        'https://www.modelscope.cn/api/v1/datasets/AI-ModelScope/LLaVA-Pretrain/repo?Revision=master&FilePath=images.zip',  # noqa\\n        'llava_pretrain')\\n\\n    def preprocess(row):\\n        if row['image']:\\n            file_path = os.path.join(media_dir, row['image'])\\n            if os.path.exists(file_path):\\n                return {'image': file_path}\\n            else:\\n                return {'image': ''}\\n        else:\\n            return {'image': ''}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    dataset = dataset.map(preprocess, **kwargs).filter(lambda row: row['image'])\\n    return ConversationsPreprocessor(\\n        user_role='human', assistant_role='gpt', media_type='image', error_strategy='delete')(\\n            dataset)\\n\\n\\nregister_dataset(\\n    DatasetName.llava_pretrain,\\n    'AI-ModelScope/LLaVA-Pretrain', ['default'],\\n    _preprocess_llava_pretrain,\\n    get_dataset_from_repo,\\n    split=['train'],\\n    hf_dataset_id='liuhaotian/LLaVA-Pretrain',\\n    huge_dataset=True,\\n    revision='e3a3f0bfaad05e90e46745152a32bf944e0f4a63',\\n    tags=['vqa', 'multi-modal', 'quality'])\\n\\n\\ndef process_shareai_dpo(dataset: DATASET_TYPE):\\n\\n    def reorganize_row(row):\\n        return {\\n            'query': row['question'],\\n            'response': row['answer_zh'],\\n            'rejected_response': row['answer_en'],\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(reorganize_row, **kwargs)\\n\\n\\ndef process_ultrafeedback_kto(dataset: DATASET_TYPE):\\n\\n    new_column_names = {'prompt': 'query', 'completion': 'response'}\\n\\n    return dataset.rename_columns(new_column_names)\\n\\n\\nregister_dataset(\\n    DatasetName.ultrafeedback_kto,\\n    'AI-ModelScope/ultrafeedback-binarized-preferences-cleaned-kto', ['default'],\\n    process_ultrafeedback_kto,\\n    get_dataset_from_repo,\\n    remove_useless_columns=False,\\n    tags=['rlhf', 'kto'])\\n\\n\\ndef process_zhihu_kol(dataset: DATASET_TYPE):\\n\\n    def reorganize_row(row):\\n        return {\\n            'query': row['INSTRUCTION'],\\n            'response': row['RESPONSE'],\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(reorganize_row, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.zhihu_kol_filtered,\\n    'OmniData/Zhihu-KOL-More-Than-100-Upvotes', ['default'],\\n    process_zhihu_kol,\\n    get_dataset_from_repo,\\n    hf_dataset_id='bzb2023/Zhihu-KOL-More-Than-100-Upvotes',\\n    tags=['zhihu', 'qa'])\\n\\nregister_dataset(\\n    DatasetName.zhihu_kol,\\n    'OmniData/Zhihu-KOL', ['default'],\\n    process_zhihu_kol,\\n    get_dataset_from_repo,\\n    hf_dataset_id='wangrui6/Zhihu-KOL',\\n    huge_dataset=True,\\n    tags=['zhihu', 'qa'])\\n\\n\\ndef preprocess_guanaco(dataset: DATASET_TYPE):\\n    from swift.utils.utils import split_str_parts_by\\n\\n    def preprocess_row(row):\\n        instruction = row['instruction']\\n        input = row['input']\\n        output = row['output']\\n        history = []\\n        if instruction:\\n            parts = split_str_parts_by(\\n                instruction, ['User:', 'User：', 'Assistant：', 'Assistant:', 'Asssistent:', 'Assistent:', 'Assistenz:'])\\n            for idx, part in enumerate(parts):\\n                if idx % 2 == 0:\\n                    if 'user' not in part['key'].lower():\\n                        return {'query': '', 'history': [], 'response': ''}\\n                    history.append([part['content'], None])\\n                else:\\n                    if 'assist' not in part['key'].lower() and 'asssist' not in part['key'].lower():\\n                        return {'query': '', 'history': [], 'response': ''}\\n                    history[-1][-1] = part['content']\\n        if input.startswith('User:'):\\n            input = input[len('User:'):].strip()\\n        if any([not h[0] or not h[1] for h in history]):\\n            return {'query': '', 'history': [], 'response': ''}\\n        return {\\n            'history': history,\\n            'query': input,\\n            'response': output,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs).filter(lambda row: row['query'] and row['response'])\\n\\n\\nregister_dataset(\\n    DatasetName.guanaco,\\n    'AI-ModelScope/GuanacoDataset', ['default'],\\n    preprocess_guanaco,\\n    get_dataset_from_repo,\\n    hf_dataset_id='JosephusCheung/GuanacoDataset',\\n    tags=['chat', 'zh'])\\n\\n\\ndef preprocess_dolly_15k(dataset: DATASET_TYPE):\\n\\n    def preprocess_row(row):\\n        instruction = row['instruction']\\n        context = row['context']\\n        response = row['response']\\n        query = ''\\n        if context:\\n            query = 'Here gives some useful information:\\\\n'\\n            query += context\\n            query += '\\\\n'\\n        query += instruction\\n        return {\\n            'query': query,\\n            'response': response,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.dolly_15k,\\n    'AI-ModelScope/databricks-dolly-15k', ['default'],\\n    preprocess_dolly_15k,\\n    get_dataset_from_repo,\\n    hf_dataset_id='databricks/databricks-dolly-15k',\\n    tags=['multi-task', 'en', 'quality'])\\n\\nregister_dataset(\\n    DatasetName.shareai_llama3_dpo_zh_en_emoji,\\n    'hjh0119/shareAI-Llama3-DPO-zh-en-emoji', ['default'],\\n    process_shareai_dpo,\\n    get_dataset_from_repo,\\n    tags=['rlhf', 'dpo', 'pairwise'])\\n\\nregister_dataset(\\n    DatasetName.midefics,\\n    'swift/MideficsDataset', [],\\n    ListPreprocessor(\\n        conversations_key='conversation',\\n        query_key='question',\\n        response_key='answer',\\n        inner_key='data',\\n        media_type='image'),\\n    get_dataset_from_repo,\\n    hf_dataset_id='WinterSchool/MideficsDataset',\\n    tags=['medical', 'en', 'vqa'])\\n\\n\\ndef preprocess_okvqa(dataset: DATASET_TYPE):\\n\\n    def preprocess(row):\\n        query = row['question']\\n        response = np.random.choice(row['answers'])\\n        return {\\n            'response': response,\\n            'query': query,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs).rename_column('image', 'images')\\n\\n\\nregister_dataset(\\n    DatasetName.okvqa,\\n    'swift/OK-VQA_train', [],\\n    preprocess_func=preprocess_okvqa,\\n    get_function=get_dataset_from_repo,\\n    split=['train'],\\n    hf_dataset_id='Multimodal-Fatima/OK-VQA_train',\\n    tags=['multi-modal', 'en', 'vqa', 'quality'])\\n\\n\\ndef preprocess_a_okvqa(dataset: DATASET_TYPE):\\n\\n    def preprocess(row):\\n        query = row['question']\\n        response = np.random.choice(row['rationales'])\\n        return {\\n            'response': response,\\n            'query': query,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs).rename_column('image', 'images')\\n\\n\\nregister_dataset(\\n    DatasetName.a_okvqa,\\n    'swift/A-OKVQA', [],\\n    preprocess_func=preprocess_a_okvqa,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='HuggingFaceM4/A-OKVQA',\\n    tags=['multi-modal', 'en', 'vqa', 'quality'])\\n\\n\\ndef preprocess_ocr_vqa(dataset: DATASET_TYPE):\\n\\n    def preprocess(row):\\n        idx = np.random.choice(range(len(row['questions'])))\\n        query = row['questions'][idx]\\n        response = row['answers'][idx]\\n        return {\\n            'response': response,\\n            'query': query,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs).rename_column('image', 'images')\\n\\n\\nregister_dataset(\\n    DatasetName.ocr_vqa,\\n    'swift/OCR-VQA', [],\\n    preprocess_func=preprocess_ocr_vqa,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='howard-hou/OCR-VQA',\\n    tags=['multi-modal', 'en', 'ocr-vqa'])\\n\\n\\ndef preprocess_science_qa(dataset: DATASET_TYPE):\\n\\n    def preprocess_row(row):\\n        query = row['question']\\n        response = row['choices'][row['answer']]\\n        solution = row['solution']\\n        return {'query': query, 'response': f'{solution}\\\\nSo the final answer is: {response}'}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs).filter(lambda row: row['image']).rename_columns({'image': 'images'})\\n\\n\\nregister_dataset(\\n    DatasetName.science_qa,\\n    'swift/ScienceQA', [],\\n    preprocess_func=preprocess_science_qa,\\n    get_function=get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    hf_dataset_id='derek-thomas/ScienceQA',\\n    tags=['multi-modal', 'science', 'vqa', 'quality'])\\n\\n\\ndef preprocess_grit(dataset: DATASET_TYPE):\\n\\n    def has_overlap(start_ends):\\n        for i in range(1, len(start_ends)):\\n            if start_ends[i][0] < start_ends[i - 1][1]:\\n                return True\\n        return False\\n\\n    def replace_intervals_with_tags(response, start_ends):\\n        result = []\\n        last_end = 0\\n        for start, end in start_ends:\\n            result.append(response[int(last_end):int(start)])\\n            result.append('<ref-object><bbox>')\\n            last_end = end\\n        result.append(response[int(last_end):])\\n        return ''.join(result)\\n\\n    def preprocess_row(row):\\n        images = row['url']\\n        caption = row['caption']\\n        ref_exps = row['ref_exps']\\n        objects = []\\n        start_end_pairs = []\\n        for ref_exp in ref_exps:\\n            start = ref_exp[0]\\n            end = ref_exp[1]\\n            # conf = ref_exp[6] TODO filter low confidence rows?\\n            start_end_pairs.append(ref_exp[0:2])\\n\\n            object_part = caption[int(start):int(end)]\\n            objects.append({'caption': object_part, 'bbox': ref_exp[2:6], 'bbox_type': 'real', 'image': 0})\\n\\n        start_end_pairs.sort(key=lambda x: (x[0], x[1]))\\n        if has_overlap(start_end_pairs):\\n            return {'images': None, 'response': '', 'objects': None}\\n\\n        response = replace_intervals_with_tags(caption, start_end_pairs)\\n\\n        return {'images': images, 'response': response, 'objects': json.dumps(objects or [], ensure_ascii=False)}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs).filter(lambda row: row['objects'])\\n\\n\\nregister_dataset(\\n    DatasetName.grit,\\n    'swift/GRIT', [],\\n    preprocess_func=preprocess_grit,\\n    get_function=get_dataset_from_repo,\\n    split=['train'],\\n    hf_dataset_id='zzliang/GRIT',\\n    huge_dataset=True,\\n    tags=['multi-modal', 'en', 'caption-grounding', 'quality'])\\n\\n\\ndef preprocess_gqa(dataset: DATASET_TYPE):\\n    local_cache = MediaCache.download('gqa')\\n\\n    def preprocess_row(row):\\n        if os.path.join(local_cache, 'images', row['imageId'] + '.jpg'):\\n            return {\\n                'query': row['question'],\\n                'response': row['fullAnswer'],\\n                'images': os.path.join(local_cache, 'images', row['imageId'] + '.jpg'),\\n            }\\n        else:\\n            return {'query': '', 'response': '', 'images': ''}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess_row, **kwargs).filter(lambda row: row['query'])\\n\\n\\nregister_dataset(\\n    DatasetName.gqa,\\n    None, ['train_all_instructions'],\\n    preprocess_gqa,\\n    get_function=get_dataset_from_repo,\\n    hf_dataset_id='lmms-lab/GQA',\\n    huge_dataset=True,\\n    tags=['multi-modal', 'en', 'vqa', 'quality'])\\n\\n\\ndef preprocess_llava_mix_sft(dataset: DATASET_TYPE):\\n\\n    def preprocess_row(row):\\n        messages = row['messages']\\n        rounds = []\\n        for msg in messages:\\n            role = msg['role']\\n            content = msg['content']\\n            text = ''\\n            for index in content:\\n                if index['type'] == 'text':\\n                    text += index['text']\\n                elif index['type'] == 'image':\\n                    text += '<image>'\\n\\n            rounds.append({'role': role, 'content': text})\\n\\n        return {'messages': rounds}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    dataset = dataset.map(preprocess_row, **kwargs).map(\\n        ConversationsPreprocessor(\\n            user_role='user',\\n            assistant_role='assistant',\\n            conversations_key='messages',\\n            from_key='role',\\n            value_key='content',\\n            media_key='images',\\n            media_type='image',\\n        ).preprocess, **kwargs)\\n    return dataset\\n\\n\\nregister_dataset(\\n    DatasetName.llava_instruct_mix,\\n    'swift/llava-instruct-mix-vsft', [],\\n    preprocess_llava_mix_sft,\\n    get_function=get_dataset_from_repo,\\n    split=['test'],\\n    hf_dataset_id='HuggingFaceH4/llava-instruct-mix-vsft',\\n    tags=['multi-modal', 'en', 'vqa', 'quality'])\\n\\n\\ndef orpo_dpo_mix_40k_preprocessor(dataset: DATASET_TYPE):\\n\\n    def preprocess(row):\\n        chosen_history = row['chosen']\\n        rejected_history = row['rejected']\\n        history = []\\n        query = None\\n        response = None\\n        rejected_response = None\\n        try:\\n            for i, (chosen, rejected) in enumerate(zip(chosen_history, rejected_history)):\\n                role = chosen['role']\\n                content = chosen['content']\\n                rejected_role = rejected['role']\\n                rejected_content = rejected['content']\\n                assert role == rejected_role\\n                if i % 2 == 0:\\n                    assert role == 'user'\\n                else:\\n                    assert role == 'assistant'\\n\\n                if content != rejected_content:\\n                    assert role == 'assistant'\\n                    response = content\\n                    rejected_response = rejected_content\\n                    query = history.pop(-1)[0]\\n                else:\\n                    if role == 'user':\\n                        history.append([content, None])\\n                    else:\\n                        history[-1][-1] = content\\n\\n        except (AssertionError, IndexError) as e:\\n            logger.warning(e)\\n\\n        return {\\n            'history': history,\\n            'query': query,\\n            'response': response,\\n            'rejected_response': rejected_response,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess,\\n                       **kwargs).filter(lambda r: r['source'] != 'toxic-dpo-v0.2' and r['query'] is not None)\\n\\n\\nregister_dataset(\\n    DatasetName.orpo_dpo_mix_40k,\\n    'AI-ModelScope/orpo-dpo-mix-40k', ['default'],\\n    orpo_dpo_mix_40k_preprocessor,\\n    get_dataset_from_repo,\\n    hf_dataset_id='mlabonne/orpo-dpo-mix-40k',\\n    tags=['dpo', 'orpo', 'en', 'quality'])\\n\\n\\ndef synthetic_text_to_sql_preprocesser(dataset: DATASET_TYPE):\\n\\n    def preprocess(row):\\n        sql_prompt = row['sql_prompt']\\n        sql_context = row['sql_context']\\n        sql = row['sql']\\n        sql_explanation = row['sql_explanation']\\n        query = f'Sql Table information:\\\\n{sql_context}\\\\n{sql_prompt}'\\n        response = f'Let\\\\'s think step by step:\\\\n{sql_explanation}\\\\nSo the final sql is:\\\\n{sql}'\\n        return {\\n            'query': query,\\n            'response': response,\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(preprocess, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.synthetic_text_to_sql,\\n    'AI-ModelScope/synthetic_text_to_sql', ['default'],\\n    synthetic_text_to_sql_preprocesser,\\n    get_dataset_from_repo,\\n    hf_dataset_id='gretelai/synthetic_text_to_sql',\\n    tags=['nl2sql', 'en'])\\n\\nregister_dataset(\\n    DatasetName.sharegpt,\\n    'swift/sharegpt', ['common-zh', 'computer-zh', 'unknow-zh', 'common-en', 'computer-en'],\\n    preprocess_sharegpt,\\n    get_dataset_from_repo,\\n    tags=['chat', 'general', 'multi-round'])\\n\\n\\ndef _preprocess_latex_ocr_dataset(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    from datasets import Image\\n    prompt = 'Using LaTeX to perform OCR on the image.'\\n\\n    def _process(d):\\n        return {'query': prompt, 'response': d['text']}\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(_process, **kwargs).rename_column('image', 'images')\\n\\n\\nregister_dataset(\\n    DatasetName.latex_ocr_print,\\n    'AI-ModelScope/LaTeX_OCR',\\n    ['full'],\\n    _preprocess_latex_ocr_dataset,\\n    get_dataset_from_repo,\\n    split=['validation', 'test'],  # There are some problems in the training dataset.\\n    hf_dataset_id='linxy/LaTeX_OCR',\\n    tags=['chat', 'ocr', 'multi-modal', 'vision'])\\n\\nregister_dataset(\\n    DatasetName.latex_ocr_handwrite,\\n    'AI-ModelScope/LaTeX_OCR', ['synthetic_handwrite'],\\n    _preprocess_latex_ocr_dataset,\\n    get_dataset_from_repo,\\n    split=['train', 'validation', 'test'],\\n    hf_dataset_id='linxy/LaTeX_OCR',\\n    tags=['chat', 'ocr', 'multi-modal', 'vision'])\\n\\n\\ndef _preprocess_capcha_images(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    from datasets import Image\\n    query = 'recognize the content.'\\n    response_key = 'solution'\\n\\n    def _process(d):\\n        return {'query': query, 'response': d[response_key]}\\n\\n    return dataset.map(_process).rename_column('image', 'images')\\n\\n\\nregister_dataset(\\n    DatasetName.capcha_images,\\n    'AI-ModelScope/captcha-images',\\n    None,\\n    _preprocess_capcha_images,\\n    get_dataset_from_repo,\\n    split=['train', 'validation'],\\n    tags=['chat', 'multi-modal', 'vision'])\\n\\n\\ndef _repair_toolbench(conversations: List[Dict[str, str]]) -> List[Dict[str, str]]:\\n    assert len(conversations) == 2\\n    if conversations[1]['from'] in {'caller', 'conclusion'}:\\n        conversations[1]['from'] = 'assistant'\\n    return conversations\\n\\n\\nregister_dataset(\\n    DatasetName.toolbench_for_alpha_umi,\\n    'shenweizhou/alpha-umi-toolbench-processed-v2', ['backbone', 'caller', 'planner', 'summarizer'],\\n    ConversationsPreprocessor('system', system_role='-', repair_conversations=_repair_toolbench),\\n    get_dataset_from_repo,\\n    tags=['chat', 'agent', '🔥'],\\n    huge_dataset=True)\\n\\n\\ndef _preprocess_blossom_math(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n\\n    def _process(d):\\n        output, answer = d['output'], d['answer']\\n        return {'query': d['input'], 'response': f'{output}\\\\n\\\\nAnswer: {answer}'}\\n\\n    return dataset.map(_process)\\n\\n\\nregister_dataset(\\n    DatasetName.blossom_math_zh,\\n    'AI-ModelScope/blossom-math-v2',\\n    None,\\n    _preprocess_blossom_math,\\n    get_dataset_from_repo,\\n    tags=['chat', 'math', '🔥'],\\n    hf_dataset_id='Azure99/blossom-math-v2')\\n\\nregister_dataset(\\n    DatasetName.sql_create_context_en,\\n    'AI-ModelScope/sql-create-context',\\n    None,\\n    ComposePreprocessor([\\n        RenameColumnsPreprocessor({\\n            'question': 'instruction',\\n            'context': 'input',\\n            'answer': 'output'\\n        }),\\n        AlpacaPreprocessor(),\\n    ]),\\n    get_dataset_from_repo,\\n    tags=['chat', 'sql', '🔥'],\\n    hf_dataset_id='b-mc2/sql-create-context')\\n\\n\\ndef _preprocess_tigerbot_law(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    prompt = \\\"\\\"\\\"{type}\\n{title}\\n\\\"\\\"\\\"\\n\\n    def _process(d):\\n        cur_prompt = prompt.format(type=d['type'], title=d['title'])\\n        for i in range(1, 4):\\n            chapter = d[f'chapter{i}']\\n            if chapter is not None:\\n                cur_prompt += f'{chapter}'\\n        cur_prompt += f'{d[\\\"content\\\"]}'\\n        return {'response': cur_prompt}\\n\\n    return dataset.map(_process)\\n\\n\\nregister_dataset(\\n    DatasetName.tigerbot_law_zh,\\n    'AI-ModelScope/tigerbot-law-plugin',\\n    None,\\n    _preprocess_tigerbot_law,\\n    get_dataset_from_repo,\\n    tags=['text-generation', 'law', 'pretrained'],\\n    hf_dataset_id='TigerResearch/tigerbot-law-plugin')\\n\\n\\ndef _preprocess_leetcode_python(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n\\n    def _process(d):\\n        code_with_problem = d['code_with_problem']\\n        idx = code_with_problem.find('```python')\\n        problem = code_with_problem[:idx]\\n        if problem.startswith('# '):\\n            problem = problem[2:]\\n        code = code_with_problem[idx:].strip()\\n        explanation = d['explanation_only']\\n        return {'query': problem, 'response': f'{code}\\\\n\\\\n{explanation}'}\\n\\n    return dataset.map(_process)\\n\\n\\nregister_dataset(\\n    DatasetName.leetcode_python_en,\\n    'AI-ModelScope/leetcode-solutions-python',\\n    None,\\n    _preprocess_leetcode_python,\\n    get_dataset_from_repo,\\n    tags=['chat', 'coding', '🔥'])\\n\\n\\ndef _repair_conversations_agent_instruct(s: str) -> List[Dict[str, Any]]:\\n    s = s.replace('}\\\\n {', '},\\\\n {')\\n    if isinstance(s, str):\\n        s = ast.literal_eval(s)\\n    return s\\n\\n\\nregister_dataset(\\n    DatasetName.agent_instruct_all_en,\\n    'huangjintao/AgentInstruct_copy', ['alfworld', 'db', 'kg', 'mind2web', 'os', 'webshop'],\\n    ConversationsPreprocessor('human', 'gpt', repair_conversations=_repair_conversations_agent_instruct),\\n    get_dataset_from_repo,\\n    tags=['chat', 'agent', 'multi-round'])\\n\\n\\ndef preprocess_mind2web(dataset):\\n\\n    def preprocess_row(row: Dict[str, Any]) -> Dict[str, Any]:\\n        raw_html = row['cleaned_html']\\n        screenshot = row['screenshot']\\n        row['screenshot'] = MediaCache.safe_save(screenshot, row['action_uid'] + '.jpg', 'mind2web')\\n        action = row['target_action_reprs']\\n        actions = action.split('->')\\n        row['query'] = f'The snapshot of screen:<image>\\\\nThe html source code:{raw_html}\\\\n'\\n        action = actions[-1]\\n        where = actions[0] if len(actions) > 1 else ''\\n        what = ''\\n        if ':' in action:\\n            action, what = action[:action.find(':')], action[action.find(':') + 1:]\\n        row['response'] = f'Action: {action.strip()}\\\\nAction Input: {where.strip()}{\\\",\\\" + what.strip()}'\\n        return row\\n\\n    conversations = []\\n    tools = [{\\n        'api': 'CLICK',\\n        'desc': 'Choose and click an element in the web page',\\n        'parameter': [{\\n            'element': 'string, the element in the web page to click'\\n        }]\\n    }, {\\n        'api':\\n        'TYPE',\\n        'desc':\\n        'Input some text into a web element like <input> or <textbox>',\\n        'parameter': [{\\n            'element': 'string, the element in the web page to input to',\\n            'content': 'string, what content to input into the textbox elment'\\n        }]\\n    }, {\\n        'api':\\n        'SELECT',\\n        'desc':\\n        'Select an element from a combobox',\\n        'parameter': [{\\n            'element': 'string, the combobox or dropdown in the web page on which the select happens',\\n            'content': 'string, which choices to choose'\\n        }]\\n    }]\\n    if isinstance(dataset, HfIterableDataset):\\n\\n        def generate_example(dataset):\\n            history = []\\n            images = []\\n            for row in dataset:\\n                target_action_index = row['target_action_index']\\n                row = preprocess_row(row)\\n                query = row['query']\\n                if target_action_index == '0':\\n                    if history:\\n                        query, response = history.pop(-1)\\n                        yield {\\n                            'history': history,\\n                            'query': query,\\n                            'response': response,\\n                            'images': images,\\n                            'tools': tools\\n                        }\\n                        images = []\\n                        history = []\\n                    query = query + '\\\\n' + row['confirmed_task']\\n                history.append([query, row['response']])\\n                images.append([row['screenshot']])\\n\\n            if history:\\n                query, response = history.pop(-1)\\n                yield {'history': history, 'query': query, 'response': response, 'images': images, 'tools': tools}\\n\\n        return HfIterableDataset.from_generator(generate_example, gen_kwargs={'dataset': dataset})\\n\\n    history = []\\n    images = []\\n    for row in tqdm(dataset):\\n        target_action_index = row['target_action_index']\\n        row = preprocess_row(row)\\n        query = row['query']\\n        if target_action_index == '0':\\n            if history:\\n                query, response = history.pop(-1)\\n                conversations.append({\\n                    'history': history,\\n                    'query': query,\\n                    'response': response,\\n                    'images': images,\\n                    'tools': tools\\n                })\\n                images = []\\n                history = []\\n            query = query + '\\\\n' + row['confirmed_task']\\n        history.append([query, row['response']])\\n        images.append([row['screenshot']])\\n\\n    if history:\\n        query, response = history.pop(-1)\\n        conversations.append({'history': history, 'query': query, 'response': response, 'images': images})\\n\\n    return HfDataset.from_list(conversations)\\n\\n\\nregister_dataset(\\n    DatasetName.mind2web,\\n    'swift/Multimodal-Mind2Web', [],\\n    preprocess_mind2web,\\n    get_dataset_from_repo,\\n    hf_dataset_id='osunlp/Multimodal-Mind2Web',\\n    tags=['agent', 'multi-modal'])\\n\\n\\ndef _preprocess_msagent_multirole_dataset(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    res_prompt = \\\"\\\"\\\"\\\\n\\\\n【注意事项】\\\\n1. 这是聊天室，不要发送私信给任何人\\\\n2. 仅代表你个人说话,不要扮演其他人，\\n    只根据对话历史进行回复\\\\n3. 长话短说，不要说太多话，不要超过50字 \\\"\\\"\\\"\\n    history_prompt = '\\\\n\\\\n【chat history】'\\n    conv_prompt = '\\\\n {name}:{content}'\\n\\n    def process_conversation(conv):\\n        query, response = '', conv[-1]['value']\\n        system = conv[0]['value'] if conv[0]['from'] != 'user' else ''\\n        if conv[0]['from'] == 'user':\\n            query = conv[0]['value']\\n        elif 'next_speakers:' not in system:\\n            if '【注意事项】' not in system and system:\\n                system += res_prompt\\n            system += history_prompt\\n            system += ''.join([conv_prompt.format(name=c['from'], content=c['value']) for c in conv[1:-1]])\\n\\n        return system, query, response\\n\\n    def _process(d):\\n        sys, qry, resp = process_conversation(d['conversations'])\\n        return {'system': sys, 'query': qry, 'response': resp}\\n\\n    return dataset.map(_process)\\n\\n\\nregister_dataset(\\n    DatasetName.ms_agent_multirole,\\n    'iic/MSAgent-MultiRole',\\n    None,\\n    _preprocess_msagent_multirole_dataset,\\n    get_dataset_from_repo,\\n    tags=['chat', 'agent', 'multi-round', 'role-play', 'multi-agent'])\\n\\n\\ndef _preprocess_toolbench(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n\\n    def reorganize_row(row):\\n        convs = row['conversations']\\n        history = []\\n        history_roles = []\\n        for idx in range(1, len(convs) - 2, 2):\\n            history.append((convs[idx]['value'], convs[idx + 1]['value']))\\n            history_roles.append((convs[idx]['from'], convs[idx + 1]['from']))\\n\\n        return {\\n            'history': history,\\n            'history_roles': history_roles,\\n            'query': convs[-2]['value'],\\n            'query_role': convs[-2]['from'],\\n            'response': convs[-1]['value']\\n        }\\n\\n    kwargs = {}\\n    if not isinstance(dataset, HfIterableDataset):\\n        kwargs['load_from_cache_file'] = dataset_enable_cache\\n    return dataset.map(reorganize_row, **kwargs)\\n\\n\\nregister_dataset(\\n    DatasetName.toolbench,\\n    'swift/ToolBench',\\n    None,\\n    _preprocess_toolbench,\\n    get_dataset_from_repo,\\n    remove_useless_columns=False,\\n    tags=['chat', 'agent', 'multi-round'])\\n\\n\\ndef _preprocess_hc3(dataset: DATASET_TYPE) -> DATASET_TYPE:\\n    prompt = \\\"\\\"\\\"Classification Task: Are the following responses from a human or from ChatGPT?\\nQuestion: {question}\\nAnswer: {answer}\\nCategory: Human, ChatGPT\\nOutput:\\\"\\\"\\\"\\n    if isinstance(dataset, HfIterableDataset):\\n\\n        def generate_example(dataset):\\n            for example in dataset:\\n                question = example['question']\\n                for h in example['human_answers']:\\n                    yield {'query': prompt.format(question=question, answer=h), 'response': 'Human'}\\n                for c in example['chatgpt_answers']:\\n                    yield {'query': prompt.format(question=question, answer=c), 'response': 'ChatGPT'}\\n\\n        return HfIterableDataset.from_generator(generate_example, gen_kwargs={'dataset': dataset})\\n\\n    query = []\\n    response = []\\n    for d in dataset:\\n        question = d['question']\\n        for h in d['human_answers']:\\n            query.append(prompt.format(question=question, answer=h))\\n            response.append('Human')\\n        for c in d['chatgpt_answers']:\\n            query.append(prompt.format(question=question, answer=c))\\n            response.append('ChatGPT')\\n    return HfDataset.from_dict({'query': query, 'response': response})\\n\\n\\nregister_dataset(\\n    DatasetName.hc3_zh,\\n    'simpleai/HC3-Chinese', ['baike', 'open_qa', 'nlpcc_dbqa', 'finance', 'medicine', 'law', 'psychology'],\\n    _preprocess_hc3,\\n    get_dataset_from_repo,\\n    tags=['text-generation', 'classification', '🔥'],\\n    hf_dataset_id='Hello-SimpleAI/HC3-Chinese')\\n\\nregister_dataset(\\n    DatasetName.hc3_en,\\n    'simpleai/HC3', ['finance', 'medicine'],\\n    _preprocess_hc3,\\n    get_dataset_from_repo,\\n    tags=['text-generation', 'classification', '🔥'],\\n    hf_dataset_id='Hello-SimpleAI/HC3')\\n\\nNoneType = type(None)\\n\\n\\ndef process_rlaif_v(dataset: DATASET_TYPE):\\n\\n    new_column_names = {'image': 'images', 'question': 'query', 'chosen': 'response', 'rejected': 'rejected_response'}\\n\\n    return dataset.rename_columns(new_column_names)\\n\\n\\nregister_dataset(\\n    DatasetName.rlaif_v,\\n    'swift/RLAIF-V-Dataset', ['default'],\\n    process_rlaif_v,\\n    get_dataset_from_repo,\\n    tags=['rlhf', 'dpo', 'multi-modal', 'en'],\\n    hf_dataset_id='openbmb/RLAIF-V-Dataset')\\n\\n\\ndef _check_dataset(dataset: Optional[HfDataset], check_dataset_strategy: Literal['none', 'discard', 'error',\\n                                                                                 'warning']) -> Optional[HfDataset]:\\n    if check_dataset_strategy == 'none' or dataset is None:\\n        return dataset\\n    idx_list = []\\n    has_query = 'query' in dataset.features\\n    has_history = 'history' in dataset.features\\n    has_system = 'system' in dataset.features\\n    is_modified = False\\n    for i, d in enumerate(tqdm(dataset)):\\n        if not isinstance(d['response'], str):\\n            is_modified = True\\n            if check_dataset_strategy == 'discard':\\n                continue\\n            elif check_dataset_strategy == 'warning':\\n                logger.warning(f\\\"d['response']: {d['response']}, i: {i}\\\")\\n                continue\\n            else:\\n                raise ValueError(f\\\"d['response']: {d['response']}, i: {i}\\\")\\n        if has_query and not isinstance(d['query'], (str, NoneType)):\\n            is_modified = True\\n            if check_dataset_strategy == 'discard':\\n                continue\\n            elif check_dataset_strategy == 'warning':\\n                logger.warning(f\\\"d['query']: {d['query']}, i: {i}\\\")\\n                continue\\n            else:\\n                raise ValueError(f\\\"d['query']: {d['query']}, i: {i}\\\")\\n        if has_history and not isinstance(d['history'], (list, NoneType)):\\n            is_modified = True\\n            if check_dataset_strategy == 'discard':\\n                continue\\n            elif check_dataset_strategy == 'warning':\\n                logger.warning(f\\\"d['history']: {d['history']}, i: {i}\\\")\\n                continue\\n            else:\\n                raise ValueError(f\\\"d['history']: {d['history']}, i: {i}\\\")\\n        if has_system and not isinstance(d['system'], (str, NoneType)):\\n            is_modified = True\\n            if check_dataset_strategy == 'discard':\\n                continue\\n            elif check_dataset_strategy == 'warning':\\n                logger.warning(f\\\"d['system']: {d['system']}, i: {i}\\\")\\n                continue\\n            else:\\n                raise ValueError(f\\\"d['system']: {d['system']}, i: {i}\\\")\\n        idx_list.append(i)\\n    if is_modified:\\n        dataset = dataset.select(idx_list)\\n    assert len(dataset) > 0\\n    return dataset\\n\\n\\ndef _safe_split(s: str,\\n                sep: str,\\n                use_0: bool,\\n                split_mode: Literal['left', 'right'] = 'left') -> Tuple[Optional[str], Optional[str]]:\\n    # use_0: When the length of the part is 1, is it considered as part0 or part1.\\n    if s is None or len(s) == 0:\\n        return None, None\\n    if split_mode == 'left':\\n        part = s.split(sep, 1)\\n    else:\\n        part = s.rsplit(sep, 1)\\n    if len(part) == 1:\\n        if use_0:\\n            part = part[0], None\\n        else:\\n            part = None, part[0]\\n    else:\\n        assert len(part) == 2\\n    return part\\n\\n\\ndef parse_dataset_name(dataset_name: str) -> Tuple[bool, str, List[str], int]:\\n    # HF::dataset_name:subset1/subset2/subset3#dataset_sample\\n    use_hf, other = _safe_split(dataset_name, '::', False)\\n    if use_hf is None:\\n        use_hf = strtobool(os.environ.get('USE_HF', 'False'))\\n    elif isinstance(use_hf, str):\\n        use_hf = {'hf': 1, 'ms': 0}[use_hf.lower()]\\n    if os.path.isfile(other):\\n        part1, dataset_sample = other, None\\n    else:\\n        part1, dataset_sample = _safe_split(other, '#', True, 'right')\\n    if os.path.isfile(part1):\\n        dataset_name, subsets = part1, None\\n    else:\\n        dataset_name, subsets = _safe_split(part1, ':', True)\\n\\n    if subsets is not None:\\n        subset_list = subsets.split('/')\\n        subset_list = [subset.strip() for subset in subset_list]\\n    else:\\n        subset_list = None\\n    if dataset_sample is None:\\n        dataset_sample = -1\\n    else:\\n        dataset_sample = int(dataset_sample)\\n    return tuple(t.strip() if isinstance(t, str) else t for t in [use_hf, dataset_name, subset_list, dataset_sample])\\n\\n\\ndef _dataset_name_exists(dataset_list: List[str], dataset_name: str) -> List[int]:\\n    dataset_name = parse_dataset_name(dataset_name)[1]\\n    cache_name_list = [parse_dataset_name(dataset)[1] for dataset in dataset_list]\\n    res = []\\n    for i, cache_name in enumerate(cache_name_list):\\n        if cache_name == dataset_name:\\n            res.append(i)\\n    return res\\n\\n\\ndef _preprocess_self_cognition_dataset(\\n    dataset_list: Tuple[DATASET_TYPE, Optional[DATASET_TYPE]],\\n    model_name: Tuple[str, Optional[str]],\\n    model_author: Tuple[str, Optional[str]],\\n) -> Tuple[DATASET_TYPE, Optional[DATASET_TYPE]]:\\n    # model_name: Tuple[zh, en]\\n    assert model_name[0] is not None\\n    assert model_author[0] is not None\\n    if len(model_name) == 1 or model_name[1] is None:\\n        model_name = (model_name[0], model_name[0])\\n    if len(model_author) == 1 or model_author[1] is None:\\n        model_author = (model_author[0], model_author[0])\\n    res_d_list = []\\n    for dataset in dataset_list:  # train_dataset, val_dataset\\n        if dataset is None:\\n            res_d_list.append(dataset)\\n            continue\\n        query = []\\n        response = []\\n        if isinstance(dataset, HfIterableDataset):\\n\\n            def generate_example(dataset):\\n                for d in dataset:\\n                    if d['tag'] == 'zh':\\n                        model_n, model_a = model_name[0], model_author[0]\\n                    else:\\n                        model_n, model_a = model_name[1], model_author[1]\\n                    yield {\\n                        'query': d['query'].replace('{{NAME}}', model_n).replace('{{AUTHOR}}', model_a),\\n                        'response': d['response'].replace('{{NAME}}', model_n).replace('{{AUTHOR}}', model_a)\\n                    }\\n\\n            dataset = HfIterableDataset.from_generator(generate_example, gen_kwargs={'dataset': dataset})\\n        else:\\n            for d in dataset:\\n                if d['tag'] == 'zh':\\n                    model_n, model_a = model_name[0], model_author[0]\\n                else:\\n                    model_n, model_a = model_name[1], model_author[1]\\n\\n                q = d['query'].replace('{{NAME}}', model_n).replace('{{AUTHOR}}', model_a)\\n                r = d['response'].replace('{{NAME}}', model_n).replace('{{AUTHOR}}', model_a)\\n                query.append(q)\\n                response.append(r)\\n            dataset = dataset.remove_columns('response').add_column('response', response)\\n            dataset = dataset.remove_columns('query').add_column('query', query)\\n            dataset = dataset.remove_columns('tag')\\n        res_d_list.append(dataset)\\n    return tuple(res_d_list)\\n\\n\\ndef _dataset_id_to_name(dataset_name_list: List[str]) -> List[str]:\\n    # register dataset_id (ms/hf). Convert dataset_id to dataset_name.\\n    ms_dataset_mapping = {}\\n    hf_dataset_mapping = {}\\n    for k_name, container in zip(['dataset_id_or_path', 'hf_dataset_id'], [ms_dataset_mapping, hf_dataset_mapping]):\\n        for k, v in DATASET_MAPPING.items():\\n            if v.get(k_name) is None or not v.get('is_main', True):\\n                continue\\n            if v[k_name] not in container:\\n                container[v[k_name]] = []\\n            container[v[k_name]].append(k)\\n\\n    res_dataset = []\\n    dataset_list = []\\n    # Add dataset_id or dataset_path to dataset_list, and add dataset_name to res_dataset.\\n    for d in dataset_name_list:\\n        use_hf, d_name = parse_dataset_name(d)[:2]\\n        if d_name in DATASET_MAPPING:\\n            res_dataset.append(d)\\n        else:\\n            dataset_list.append((d, use_hf, d_name))\\n\\n    extra_dataset = []\\n    for d, use_hf, d_id_or_path in dataset_list:\\n        dataset_mapping = hf_dataset_mapping if use_hf else ms_dataset_mapping\\n        if d_id_or_path in dataset_mapping:\\n            # Add the dataset_name corresponding to the dataset_id to res_dataset.\\n            for d_name in dataset_mapping[d_id_or_path]:\\n                res_dataset.append(d.replace(d_id_or_path, d_name))\\n        else:\\n            # This dataset needs to be registered.\\n            extra_dataset.append((d, use_hf, d_id_or_path))\\n\\n    for i, (d, use_hf, d_id_or_path) in enumerate(extra_dataset):\\n        d_info = {}\\n        d_name = f'_{i}'\\n        if os.path.isfile(d_id_or_path):\\n            d_info['dataset_path'] = d_id_or_path\\n        else:\\n            if d_id_or_path.startswith('/'):\\n                raise ValueError(f\\\"path: '{d_id_or_path}' not found\\\")\\n            if use_hf:\\n                d_info['hf_dataset_id'] = d_id_or_path\\n            else:\\n                d_info['dataset_id'] = d_id_or_path\\n        register_dataset_info(d_name, d_info)\\n        res_dataset.append(d.replace(d_id_or_path, d_name))\\n    return res_dataset\\n\\n\\ndef get_dataset(\\n        dataset_name_list: Union[List[str], str],\\n        dataset_test_ratio: float = 0.,\\n        dataset_seed: Union[int, RandomState] = 42,\\n        check_dataset_strategy: Literal['none', 'discard', 'error', 'warning'] = 'none',\\n        *,\\n        # for self-cognition\\n        model_name: Union[Tuple[str, str], List[str], None] = None,\\n        model_author: Union[Tuple[str, str], List[str], None] = None,\\n        **kwargs) -> Tuple[DATASET_TYPE, Optional[DATASET_TYPE]]:\\n    \\\"\\\"\\\"Returns train_dataset and val_dataset\\\"\\\"\\\"\\n    streaming = kwargs.get('streaming', False)\\n    if isinstance(dataset_name_list, str):\\n        dataset_name_list = [dataset_name_list]\\n    train_dataset_list: List[DATASET_TYPE] = []\\n    val_dataset_list: List[DATASET_TYPE] = []\\n\\n    # dataset_id_or_path -> dataset_name\\n    dataset_name_list = _dataset_id_to_name(dataset_name_list)\\n    for dataset_name in dataset_name_list:\\n        use_hf, dataset_name, subsets, dataset_sample = parse_dataset_name(dataset_name)\\n        dataset_info = DATASET_MAPPING[dataset_name]\\n        if subsets is None:\\n            subsets = dataset_info['subsets']\\n        if dataset_sample == -1:\\n            dataset_sample = dataset_info.get('dataset_sample', -1)\\n        if isinstance(dataset_seed, int):\\n            random_state = RandomState(dataset_seed)\\n        else:\\n            random_state = dataset_seed\\n\\n        get_function = dataset_info['get_function']\\n        is_local = dataset_info.get('is_local', False)\\n        dataset_id_or_path = dataset_info['dataset_id_or_path']\\n        remove_useless_columns = dataset_info.get('remove_useless_columns', True)\\n\\n        if not is_local:\\n            dataset_str_f = 'Downloading the dataset from {hub}, dataset_id: {dataset_id}'\\n            if not dataset_id_or_path:\\n                use_hf = True\\n            if use_hf:\\n                dataset_id_or_path = dataset_info['hf_dataset_id']\\n                dataset_str = dataset_str_f.format(hub='HuggingFace', dataset_id=dataset_id_or_path)\\n            else:\\n                dataset_str = dataset_str_f.format(hub='ModelScope', dataset_id=dataset_id_or_path)\\n            logger.info(dataset_str)\\n            assert dataset_id_or_path is not None, (f'dataset_name: {dataset_name}, use_hf: {use_hf}, '\\n                                                    f'dataset_id_or_path: {dataset_id_or_path}.')\\n        dataset = get_function(\\n            dataset_id_or_path,\\n            subsets,\\n            dataset_info['preprocess_func'],\\n            dataset_info['split'],\\n            dataset_sample,\\n            random_state=random_state,\\n            dataset_test_ratio=dataset_test_ratio,\\n            remove_useless_columns=remove_useless_columns,\\n            use_hf=use_hf,\\n            revision=dataset_info.get('revision'),\\n            **kwargs)\\n\\n        if dataset_name == 'self-cognition':\\n            assert model_name is not None and model_author is not None\\n            dataset = _preprocess_self_cognition_dataset(dataset, model_name, model_author)\\n\\n        train_d: HfDataset\\n        if isinstance(dataset, (list, tuple)):\\n            train_d, val_d = dataset\\n        else:\\n            train_d, val_d = dataset, None\\n\\n        assert train_d is not None or val_d is not None\\n        if train_d is not None:\\n            train_dataset_list.append(train_d)\\n        if val_d is not None:\\n            val_dataset_list.append(val_d)\\n\\n    if len(train_dataset_list) > 1:\\n        train_dataset = concatenate_datasets(train_dataset_list) if not streaming else interleave_datasets(\\n            train_dataset_list)\\n    else:\\n        train_dataset = train_dataset_list[0] if train_dataset_list else None\\n\\n    if len(val_dataset_list) > 1:\\n        val_dataset = concatenate_datasets(val_dataset_list) if not streaming else interleave_datasets(val_dataset_list)\\n    else:\\n        val_dataset = val_dataset_list[0] if val_dataset_list else None\\n    if check_dataset_strategy != 'none':\\n        logger.info('check dataset...')\\n        logger.info(f\\\"check_dataset_strategy: '{check_dataset_strategy}'\\\")\\n\\n    if not streaming:\\n        train_dataset = _check_dataset(train_dataset, check_dataset_strategy)\\n        val_dataset = _check_dataset(val_dataset, check_dataset_strategy)\\n\\n    return train_dataset, val_dataset\\n\\n\\ndef load_dataset_from_local(dataset_path_list: Optional[Union[str, List[str]]],\\n                            preprocess_func: PreprocessFunc,\\n                            streaming: bool = False) -> Optional[DATASET_TYPE]:\\n    if isinstance(dataset_path_list, str):\\n        dataset_path_list = [dataset_path_list]\\n    if dataset_path_list is None or len(dataset_path_list) == 0:\\n        return None\\n    assert isinstance(dataset_path_list, (list, tuple))\\n\\n    dataset_list = []\\n    for dataset_path in dataset_path_list:\\n        assert isinstance(dataset_path, str)\\n        df: DataFrame\\n        if dataset_path.endswith('.csv'):\\n            dataset = HfDataset.from_csv(dataset_path, na_filter=False)\\n        elif dataset_path.endswith('.jsonl') or dataset_path.endswith('.json'):\\n            dataset = HfDataset.from_json(dataset_path)\\n        else:\\n            raise ValueError('The custom dataset only supports CSV, JSONL or JSON format.')\\n        dataset = preprocess_func(dataset)\\n        if streaming:\\n            dataset = dataset.to_iterable_dataset()\\n        dataset_list.append(dataset)\\n\\n    if len(dataset_list) == 1:\\n        return dataset_list[0]\\n    return concatenate_datasets(dataset_list) if not streaming else interleave_datasets(dataset_list)\\n\\n\\ndef get_local_dataset(_1: str,\\n                      _2: Optional[List[str]],\\n                      preprocess_func: PreprocessFunc,\\n                      split: List[str],\\n                      dataset_sample: int = -1,\\n                      random_state: Optional[RandomState] = None,\\n                      dataset_test_ratio: float = 0.,\\n                      remove_useless_columns: bool = True,\\n                      **kwargs) -> Tuple[DATASET_TYPE, Optional[DATASET_TYPE]]:\\n    streaming = kwargs.get('streaming', False)\\n    dataset = load_dataset_from_local(split, preprocess_func, streaming)\\n    return _post_preprocess(dataset, dataset_sample, random_state, None, dataset_test_ratio, remove_useless_columns,\\n                            **kwargs)\\n\\n\\ndef register_dataset_info_file(dataset_info_path: Optional[str] = None) -> None:\\n    # dataset_info_path: path, json or None\\n    if dataset_info_path is None:\\n        dataset_info_path = os.path.abspath(os.path.join(__file__, '..', '..', 'data', 'dataset_info.json'))\\n    if isinstance(dataset_info_path, str):\\n        if os.path.isfile(dataset_info_path):\\n            with open(dataset_info_path, 'r') as f:\\n                dataset_info = json.load(f)\\n            base_dir = os.path.dirname(dataset_info_path)\\n        else:\\n            dataset_info = json.loads(dataset_info_path)\\n            dataset_info_path = list(dataset_info.keys())\\n            base_dir = None\\n    else:\\n        assert isinstance(dataset_info_path, dict)\\n        dataset_info = deepcopy(dataset_info_path)\\n        dataset_info_path = list(dataset_info.keys())\\n        base_dir = None\\n    for dataset_name, d_info in dataset_info.items():\\n        register_dataset_info(dataset_name, d_info, base_dir=base_dir)\\n    logger.info(f'Successfully registered `{dataset_info_path}`')\\n\\n\\nregister_dataset_info_file()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport time\\nimport uuid\\nfrom dataclasses import dataclass, field\\nfrom typing import Any, Dict, List, Literal, Optional, Union\\n\\n\\ndef random_uuid() -> str:\\n    return str(uuid.uuid4().hex)\\n\\n\\n@dataclass\\nclass Model:\\n    id: str  # model_type\\n    is_chat: bool = True  # chat model or generation model\\n    is_multimodal: bool = False\\n\\n    object: str = 'model'\\n    created: int = field(default_factory=lambda: int(time.time()))\\n    owned_by: str = 'swift'\\n\\n\\n@dataclass\\nclass ModelList:\\n    data: List[Model]\\n    object: str = 'list'\\n\\n\\n@dataclass\\nclass XRequestConfig:\\n    \\\"\\\"\\\"NOTE: The following behavior is inconsistent with the OpenAI API.\\n    Default values for OpenAI:\\n        temperature = 1.\\n        top_k = -1\\n        top_p = 1.\\n        repetition_penalty = 1.\\n    \\\"\\\"\\\"\\n    max_tokens: Optional[int] = None  # None: max_model_len - num_tokens\\n    # None: use deploy_args\\n    temperature: Optional[float] = None\\n    top_p: Optional[float] = None\\n\\n    n: int = 1\\n    seed: Optional[int] = None\\n    stop: Optional[List[str]] = None\\n    stream: bool = False\\n    logprobs: bool = False\\n    top_logprobs: Optional[int] = None\\n\\n    best_of: Optional[int] = None\\n    presence_penalty: float = 0.\\n    frequency_penalty: float = 0.\\n    length_penalty: float = 1.\\n\\n    # additional\\n    num_beams: int = 1\\n    # None: use deploy_args\\n    top_k: Optional[int] = None\\n    repetition_penalty: Optional[float] = None\\n\\n\\n@dataclass\\nclass MultiModalRequestMixin:\\n    images: List[str] = field(default_factory=list)\\n    audios: List[str] = field(default_factory=list)\\n    videos: List[str] = field(default_factory=list)\\n\\n\\n@dataclass\\nclass CompletionRequestMixin:\\n    model: str\\n    prompt: str\\n\\n\\n@dataclass\\nclass ChatCompletionRequestMixin:\\n    model: str\\n    messages: List[Dict[str, Union[str, List[Dict]]]]\\n    tools: Optional[List[Dict[str, Union[str, Dict]]]] = None\\n    tool_choice: Optional[Union[str, Dict]] = 'auto'\\n\\n\\n@dataclass\\nclass CompletionRequest(MultiModalRequestMixin, XRequestConfig, CompletionRequestMixin):\\n    pass\\n\\n\\n@dataclass\\nclass ChatCompletionRequest(MultiModalRequestMixin, XRequestConfig, ChatCompletionRequestMixin):\\n    pass\\n\\n\\n@dataclass\\nclass UsageInfo:\\n    prompt_tokens: int = 0\\n    completion_tokens: int = 0\\n    total_tokens: int = 0\\n\\n\\n@dataclass\\nclass Function:\\n    arguments: Optional[str] = None\\n    name: str = ''\\n\\n\\n@dataclass\\nclass ChatCompletionMessageToolCall:\\n    id: str\\n    function: Function\\n    type: str = 'function'\\n\\n\\n@dataclass\\nclass ChatMessage:\\n    role: Literal['system', 'user', 'assistant']\\n    content: str\\n    tool_calls: Optional[List[ChatCompletionMessageToolCall]] = None\\n\\n\\n@dataclass\\nclass ChatCompletionResponseChoice:\\n    index: int\\n    message: ChatMessage\\n    finish_reason: Literal['stop', 'length', None]  # None: for infer_backend='pt'\\n    logprobs: Optional[Dict[str, List[Dict[str, Any]]]] = None\\n\\n\\n@dataclass\\nclass CompletionResponseChoice:\\n    index: int\\n    text: str\\n    finish_reason: Literal['stop', 'length', None]  # None: for infer_backend='pt'\\n    logprobs: Optional[Dict[str, List[Dict[str, Any]]]] = None\\n\\n\\n@dataclass\\nclass ChatCompletionResponse:\\n    model: str\\n    choices: List[ChatCompletionResponseChoice]\\n    usage: UsageInfo\\n    id: str = field(default_factory=lambda: f'chatcmpl-{random_uuid()}')\\n    object: str = 'chat.completion'\\n    created: int = field(default_factory=lambda: int(time.time()))\\n\\n\\n@dataclass\\nclass CompletionResponse:\\n    model: str\\n    choices: List[CompletionResponseChoice]\\n    usage: UsageInfo\\n    id: str = field(default_factory=lambda: f'cmpl-{random_uuid()}')\\n    object: str = 'text_completion'\\n    created: int = field(default_factory=lambda: int(time.time()))\\n\\n\\n@dataclass\\nclass DeltaMessage:\\n    role: Literal['system', 'user', 'assistant', None] = None\\n    content: Optional[str] = None\\n    tool_calls: Optional[List[ChatCompletionMessageToolCall]] = None\\n\\n\\n@dataclass\\nclass ChatCompletionResponseStreamChoice:\\n    index: int\\n    delta: DeltaMessage\\n    finish_reason: Literal['stop', 'length', None]\\n    logprobs: Optional[Dict[str, List[Dict[str, Any]]]] = None\\n\\n\\n@dataclass\\nclass ChatCompletionStreamResponse:\\n    model: str\\n    choices: List[ChatCompletionResponseStreamChoice]\\n    usage: Optional[UsageInfo] = None\\n    id: str = field(default_factory=lambda: f'chatcmpl-{random_uuid()}')\\n    object: str = 'chat.completion.chunk'\\n    created: int = field(default_factory=lambda: int(time.time()))\\n\\n\\n@dataclass\\nclass CompletionResponseStreamChoice:\\n    index: int\\n    text: str\\n    finish_reason: Literal['stop', 'length', None]\\n    logprobs: Optional[Dict[str, List[Dict[str, Any]]]] = None\\n\\n\\n@dataclass\\nclass CompletionStreamResponse:\\n    model: str\\n    choices: List[CompletionResponseStreamChoice]\\n    usage: Optional[UsageInfo] = None\\n    id: str = field(default_factory=lambda: f'cmpl-{random_uuid()}')\\n    object: str = 'text_completion.chunk'\\n    created: int = field(default_factory=lambda: int(time.time()))\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport ast\\nimport os\\nfrom multiprocessing import shared_memory\\nfrom typing import Any, Callable, Dict, List, Literal, Optional, Union\\n\\nimport numpy as np\\nfrom datasets import Dataset as HfDataset\\nfrom datasets import IterableDataset as HfIterableDataset\\nfrom tqdm import tqdm\\nfrom transformers.utils import strtobool\\n\\nfrom swift.utils import get_logger\\nfrom .media import MediaTag\\nfrom .template import History\\n\\ndataset_enable_cache = strtobool(os.environ.get('DATASET_ENABLE_CACHE', 'False'))\\n\\nDATASET_TYPE = Union[HfDataset, HfIterableDataset]\\nPreprocessFunc = Callable[[DATASET_TYPE], DATASET_TYPE]\\n\\nlogger = get_logger()\\n\\n\\ndef _reduce_columns(cls: type) -> type:\\n    # Remove unnecessary columns from the output dataset.\\n    if getattr(cls, '_patching', False):\\n        return cls\\n\\n    call_func = cls.__call__\\n    preprocess = cls.preprocess\\n    cls._patching = True\\n\\n    def new_call_func(self, dataset: DATASET_TYPE) -> DATASET_TYPE:\\n        self.key_mapping = {k: i for i, k in enumerate(self.empty_row.keys())}\\n        num_proc = int(os.environ.get('DATASET_MAP_NPROC', '1'))\\n        self.shared_shm_name = None\\n        shm, buffer = None, None\\n        if num_proc > 1:  # multiprocess\\n            shm = shared_memory.SharedMemory(create=True, size=len(self.key_mapping))\\n            self.shared_shm_name = shm.name\\n            buffer = shm.buf\\n        self.column_state = np.ndarray((len(self.key_mapping), ), dtype=np.bool_, buffer=buffer)\\n        self.column_state[:] = False\\n        dataset = call_func(self, dataset)\\n        if isinstance(dataset, HfIterableDataset) and dataset.features is None:\\n            features = next(iter(dataset)).keys()\\n        else:\\n            features = dataset.features.keys()\\n        for k in features:\\n            if k in ['images', 'videos', 'audios']:\\n                continue\\n            k_i = self.key_mapping.get(k, -1)\\n            if k_i == -1 or not self.column_state[k_i]:\\n                dataset = dataset.remove_columns([k])\\n        if shm:\\n            shm.close()\\n            shm.unlink()\\n        return dataset\\n\\n    def new_preprocess(self, row: Dict[str, Any]) -> Dict[str, Any]:\\n        if self.shared_shm_name is not None:  # multiprocess\\n            shm = shared_memory.SharedMemory(name=self.shared_shm_name)\\n            column_state = np.ndarray((len(self.key_mapping), ), dtype=np.bool_, buffer=shm.buf)\\n        else:\\n            column_state = self.column_state\\n        row = preprocess(self, row)\\n        for k, v in row.items():\\n            k_i = self.key_mapping[k]\\n            if column_state[k_i]:\\n                continue\\n            if k == 'query_role':\\n                if v and v != 'user':\\n                    column_state[k_i] = True\\n            elif k == 'history_roles':\\n                if v and any(_v[0] != 'user' or _v[1] != 'assistant' for _v in v):\\n                    column_state[k_i] = True\\n            elif v:\\n                column_state[k_i] = True\\n        return row\\n\\n    cls.__call__ = new_call_func\\n    cls.preprocess = new_preprocess\\n\\n    return cls\\n\\n\\ndef parse_medias(d: Dict[str, Any], media_key=None):\\n    if isinstance(media_key, str):\\n        if media_key in d:\\n            medias = d[media_key]\\n        else:\\n            medias = None\\n    elif media_key:  # function\\n        medias = media_key(d)\\n    else:\\n        medias = None\\n    return medias\\n\\n\\nclass MediaMixin:\\n\\n    def __init__(self,\\n                 media_key: Union[str, Callable] = 'image',\\n                 media_tag: str = '<image>',\\n                 media_type: Literal['image', 'audio', 'video'] = None):\\n        self.media_key = media_key\\n        self.media_tag = media_tag\\n        self.media_type = media_type\\n        self.media_replacer = MediaTag(media_type, media_tag)\\n\\n    @property\\n    def media_name(self):\\n        if not self.media_type:\\n            return None\\n        return self.media_replacer.media_keys[self.media_type]\\n\\n    def parse_medias(self, d: Dict[str, Any]):\\n        return parse_medias(d, self.media_key)\\n\\n    @property\\n    def empty_row(self):\\n        empty_row = {\\n            'query': None,\\n            'response': None,\\n            'tools': None,\\n            'system': None,\\n            'history': None,\\n        }\\n        if self.media_type and not isinstance(self.media_key, str):\\n            empty_row[self.media_name] = None\\n        return empty_row\\n\\n\\nclass RowPreprocessMixin:\\n\\n    def preprocess(self, d: Dict[str, Any]) -> Dict[str, Any]:\\n        raise NotImplementedError\\n\\n\\nclass SwiftPreprocessor:\\n\\n    def __call__(self, dataset: DATASET_TYPE) -> DATASET_TYPE:\\n        if isinstance(dataset, HfIterableDataset):\\n            return dataset\\n        if 'history' in dataset.features:\\n            old_history = dataset['history']\\n            has_history = False\\n            history: List[History] = []\\n            for h in tqdm(old_history):\\n                if isinstance(h, str):\\n                    h = ast.literal_eval(h)\\n                elif h is None:\\n                    h = []\\n                if len(h) > 0:\\n                    has_history = True\\n                history.append(h)\\n            dataset = dataset.remove_columns(['history'])\\n            if has_history:\\n                dataset = dataset.add_column('history', history)\\n        if 'system' in dataset.features:\\n            system = dataset['system']\\n            has_system = len([sys for sys in system if sys not in {None, ''}]) > 0\\n            if not has_system:\\n                dataset = dataset.remove_columns(['system'])\\n        return dataset\\n\\n\\n@_reduce_columns\\nclass AlpacaPreprocessor(MediaMixin, RowPreprocessMixin):\\n\\n    def __init__(self, concat_inst_inp: Optional[Callable[[str, str], str]] = None, **kwargs):\\n        self.concat_inst_inp = concat_inst_inp\\n        super().__init__(**kwargs)\\n\\n    def preprocess(self, d: Dict[str, Any]) -> Dict[str, Any]:\\n        inst = d['instruction']\\n        inp: Optional[str] = d.get('input', None)\\n        h, output = d.pop('history', None), d['output']\\n        sys = d.pop('system', None)\\n        tool = d.pop('tools', None)\\n        if output is None:\\n            return self.empty_row\\n        if inp is None or len(inp) == 0:\\n            q = inst\\n        elif self.concat_inst_inp is not None:\\n            q = self.concat_inst_inp(inst, inp)\\n        else:\\n            q = f'{inst}\\\\n{inp}'\\n        row = {\\n            'history': h,\\n            'query': q,\\n            'system': sys,\\n            'response': output,\\n            'tools': tool,\\n        }\\n        medias = self.parse_medias(d)\\n        self.media_replacer(row, medias)\\n        if self.media_type:\\n            if not isinstance(self.media_key, str):\\n                row[self.media_name] = medias\\n            else:\\n                row[self.media_key] = medias\\n        return row\\n\\n    def __call__(self, dataset: DATASET_TYPE) -> DATASET_TYPE:\\n        kwargs = {}\\n        if not isinstance(dataset, HfIterableDataset):\\n            kwargs['load_from_cache_file'] = dataset_enable_cache\\n        dataset = dataset.map(self.preprocess, **kwargs).filter(lambda row: row.get('response'))\\n        if self.media_type and isinstance(self.media_key, str) and self.media_key != self.media_name:\\n            dataset = dataset.rename_columns({self.media_key: self.media_name})\\n        return dataset\\n\\n\\ndef _default_repair_conversations(s: Union[str, Any]) -> Any:\\n    if isinstance(s, str):\\n        return ast.literal_eval(s)\\n    return s\\n\\n\\n@_reduce_columns\\nclass ConversationsPreprocessor(MediaMixin, RowPreprocessMixin):\\n\\n    def __init__(self,\\n                 user_role: str = 'user',\\n                 assistant_role: str = 'assistant',\\n                 system_role: str = 'system',\\n                 conversations_key: str = 'conversations',\\n                 from_key: str = 'from',\\n                 value_key: str = 'value',\\n                 tool_role: str = 'tool',\\n                 repair_conversations: Callable[[Union[str, List[Dict[str, str]]]],\\n                                                Optional[List[Dict[str, str]]]] = _default_repair_conversations,\\n                 error_strategy: Literal['delete', 'raise'] = 'raise',\\n                 **kwargs):\\n        self.user_role = user_role\\n        self.assistant_role = assistant_role\\n        self.system_role = system_role\\n        self.conversations_key = conversations_key\\n        self.from_key = from_key\\n        self.value_key = value_key\\n        self.tool_role = tool_role\\n        self.repair_conversations = repair_conversations\\n        self.error_strategy = error_strategy\\n        super().__init__(**kwargs)\\n\\n    @property\\n    def empty_row(self):\\n        empty_row = super().empty_row\\n        empty_row['history_roles'] = None\\n        empty_row['query_role'] = None\\n        empty_row['tools'] = None\\n        return empty_row\\n\\n    def preprocess(self, d: Dict[str, Any]) -> Dict[str, Any]:\\n        try:\\n            conversations = d[self.conversations_key]\\n            conversations = self.repair_conversations(conversations)\\n            if conversations is None:\\n                return self.empty_row\\n            lo = 0\\n            sys = None\\n            h: History = []\\n            hr: History = []\\n            assert len(conversations) >= 2\\n            if conversations[0][self.from_key] == self.system_role:\\n                lo += 1\\n                sys = conversations[0][self.value_key]\\n            assert conversations[-2][self.from_key] in [self.user_role, self.tool_role]\\n            assert conversations[-1][self.from_key] == self.assistant_role\\n\\n            for q, r in zip(conversations[lo:-2:2], conversations[lo + 1:-2:2]):\\n                assert q[self.from_key] in [self.user_role, self.tool_role]\\n                assert r[self.from_key] == self.assistant_role\\n                h.append([q[self.value_key], r[self.value_key]])\\n                _q_role = q[self.from_key]\\n                _r_role = r[self.from_key]\\n                _q_role = _q_role if _q_role == 'tool' else 'user'\\n                _r_role = _r_role if _r_role == 'tool' else 'assistant'\\n                hr.append([_q_role, _r_role])\\n            query = conversations[-2][self.value_key]\\n            query_role = conversations[-2][self.from_key]\\n            query_role = query_role if query_role == 'tool' else 'user'\\n            response = conversations[-1][self.value_key]\\n            system = sys\\n            history = h\\n            tools = d.get('tools') or []\\n            row = {'system': system, 'history': history, 'history_roles': hr}\\n            row.update({\\n                'query': query,\\n                'query_role': query_role,\\n                'response': response,\\n                'tools': tools,\\n            })\\n            medias = self.parse_medias(d)\\n            self.media_replacer(row, medias)\\n            if self.media_type:\\n                if not isinstance(self.media_key, str):\\n                    row[self.media_name] = medias\\n                else:\\n                    row[self.media_key] = medias\\n            return row\\n        except (AssertionError, SyntaxError) as e:\\n            logger.error(e)\\n            if self.error_strategy == 'raise':\\n                raise ValueError(f'conversations: {conversations}')\\n            else:\\n                return self.empty_row\\n\\n    def __call__(self, dataset: DATASET_TYPE) -> DATASET_TYPE:\\n        kwargs = {}\\n        if not isinstance(dataset, HfIterableDataset):\\n            kwargs['load_from_cache_file'] = dataset_enable_cache\\n        dataset = dataset.map(self.preprocess, **kwargs).filter(lambda row: row.get('response') is not None)\\n        if self.media_type and isinstance(self.media_key, str) and self.media_key != self.media_name:\\n            dataset = dataset.rename_columns({self.media_key: self.media_name})\\n        return dataset\\n\\n\\nclass ListPreprocessor(MediaMixin, RowPreprocessMixin):\\n\\n    def __init__(self,\\n                 query_key: str = 'user',\\n                 response_key: str = 'assistant',\\n                 conversations_key: str = 'conversations',\\n                 inner_key: str = None,\\n                 repair_conversations: Callable[[Union[str, Dict[str, str]]],\\n                                                Optional[Dict[str, str]]] = _default_repair_conversations,\\n                 error_strategy: Literal['delete', 'raise'] = 'raise',\\n                 **kwargs):\\n        self.query_key = query_key\\n        self.response_key = response_key\\n        self.conversations_key = conversations_key\\n        self.inner_key = inner_key\\n        self.repair_conversations = repair_conversations\\n        self.error_strategy = error_strategy\\n        super().__init__(**kwargs)\\n\\n    def preprocess(self, d: Dict[str, Any]) -> Dict[str, Any]:\\n        conversations = None\\n        try:\\n            conversations = d[self.conversations_key]\\n            if self.inner_key is not None:\\n                conversations = conversations[self.inner_key]\\n            history = []\\n            for c in conversations:\\n                history.append([c[self.query_key], c[self.response_key]])\\n\\n            query, response = history.pop(-1)\\n            row = {\\n                'history': history,\\n                'query': query,\\n                'response': response,\\n            }\\n            medias = self.parse_medias(d)\\n            self.media_replacer(row, medias)\\n            if self.media_type:\\n                if not isinstance(self.media_key, str):\\n                    row[self.media_name] = medias\\n                else:\\n                    row[self.media_key] = medias\\n        except Exception:\\n            if self.error_strategy == 'raise':\\n                raise ValueError(f'conversations: {conversations}')\\n            else:\\n                return self.empty_row\\n        return row\\n\\n    def __call__(self, dataset: DATASET_TYPE) -> DATASET_TYPE:\\n        kwargs = {}\\n        if not isinstance(dataset, HfIterableDataset):\\n            kwargs['load_from_cache_file'] = dataset_enable_cache\\n        dataset = dataset.map(self.preprocess, **kwargs).filter(lambda d: d.get('response'))\\n        if self.media_type and isinstance(self.media_key, str) and self.media_key != self.media_name:\\n            dataset = dataset.rename_columns({self.media_key: self.media_name})\\n        return dataset\\n\\n\\nclass ComposePreprocessor:\\n\\n    def __init__(self, preprocessor_list: List[PreprocessFunc]) -> None:\\n        self.preprocessor_list = preprocessor_list\\n\\n    def __call__(self, dataset: HfDataset) -> HfDataset:\\n        for preprocessor in self.preprocessor_list:\\n            dataset = preprocessor(dataset)\\n        return dataset\\n\\n\\nclass RenameColumnsPreprocessor:\\n\\n    def __init__(self, rename_mapping: Dict[str, str]) -> None:\\n        self.rename_mapping = rename_mapping\\n\\n    def __call__(self, dataset: HfDataset) -> HfDataset:\\n        for old_name, new_name in self.rename_mapping.items():\\n            if old_name in dataset.features:\\n                dataset = dataset.rename_column(old_name, new_name)\\n        return dataset\\n\\n\\ndef preprocess_sharegpt(dataset: HfDataset) -> HfDataset:\\n    query = []\\n    response = []\\n    system: List[Optional[str]] = []\\n    has_system = False\\n    history: List[History] = []\\n    has_history = False\\n    for d in tqdm(dataset):\\n        if isinstance(d['conversation'], str):\\n            try:\\n                conversation = ast.literal_eval(d['conversation'])\\n            except SyntaxError:\\n                continue\\n        else:\\n            conversation = d['conversation']\\n        query.append(conversation[-1]['human'])\\n        response.append(conversation[-1]['assistant'])\\n        h = []\\n        for c in conversation[:-1]:\\n            h.append([c['human'], c['assistant']])\\n        if len(h) > 0:\\n            has_history = True\\n        history.append(h)\\n        sys = d.get('system')\\n        if sys is not None:\\n            has_system = True\\n        system.append(sys)\\n    kwargs = {'query': query, 'response': response}\\n    if has_history:\\n        kwargs['history'] = history\\n    if has_system:\\n        kwargs['system'] = system\\n    return HfDataset.from_dict(kwargs)\\n\\n\\nclass SmartPreprocessor:\\n\\n    def __init__(self) -> None:\\n        self.preprocessor_mapping = {\\n            'swift': {\\n                'required': ['response'],\\n                'preprocessor': SwiftPreprocessor()\\n            },\\n            'alpaca': {\\n                'required': ['instruction', 'output'],\\n                'preprocessor': AlpacaPreprocessor()\\n            },\\n            'conversations': {  # qwen\\n                'required': ['conversations'],\\n                'preprocessor': ConversationsPreprocessor()\\n            },\\n            'chatml': {\\n                'required': ['messages'],\\n                'preprocessor':\\n                ConversationsPreprocessor(conversations_key='messages', from_key='role', value_key='content')\\n            },\\n            'sharegpt': {\\n                'required': ['conversation'],\\n                'preprocessor': preprocess_sharegpt\\n            },\\n            'pretrain': {\\n                'required': ['text'],\\n                'preprocessor': RenameColumnsPreprocessor({\\n                    'prompt': 'query',\\n                    'text': 'response'\\n                })\\n            }\\n        }\\n\\n    def _get_preprocessor(self, dataset: DATASET_TYPE) -> PreprocessFunc:\\n        if isinstance(dataset, HfIterableDataset) and dataset.features is None:\\n            keys = set(next(iter(dataset)).keys())\\n        else:\\n            keys = set(dataset.features.keys())\\n        required_keys_mapping = {k: v['required'] for k, v in self.preprocessor_mapping.items()}\\n        for k, required_keys in required_keys_mapping.items():\\n            if len(set(required_keys) - keys) == 0:\\n                return self.preprocessor_mapping[k]['preprocessor']\\n        raise ValueError(f\\\"\\\"\\\"dataset.features.keys(): {dataset.features.keys()}\\nrequired_keys_mapping: {required_keys_mapping}\\\"\\\"\\\")\\n\\n    def __call__(self, dataset: HfDataset) -> HfDataset:\\n        preprocessor = self._get_preprocessor(dataset)\\n        return preprocessor(dataset)\\n\\n\\nclass TextGenerationPreprocessor:\\n\\n    def __init__(self, prompt: str, query_key: str = 'query', response_key: str = 'response') -> None:\\n        self.prompt = prompt\\n        self.query_key = query_key\\n        self.response_key = response_key\\n\\n    def __call__(self, dataset: HfDataset) -> HfDataset:\\n        query = []\\n        for d in tqdm(dataset):\\n            query.append(self.prompt.format(query=d[self.query_key]))\\n        return HfDataset.from_dict({'query': query, 'response': dataset[self.response_key]})\\n\\n\\nclass ClsPreprocessor:\\n\\n    def __init__(self, labels: List[str], task_name: str, is_pair_seq: bool = False) -> None:\\n        self.labels = labels\\n        category = ', '.join(labels)\\n        if is_pair_seq:\\n            inputs = 'Sentence1: {sentence1}\\\\nSentence2: {sentence2}'\\n        else:\\n            inputs = 'Sentence: {sentence}'\\n        self.prompt = f\\\"\\\"\\\"Task: {task_name}\\n{inputs}\\nCategory: {category}\\nOutput:\\\"\\\"\\\"\\n        self.task_name = task_name\\n        self.is_pair_seq = is_pair_seq\\n\\n    def __call__(self, dataset: HfDataset) -> HfDataset:\\n        query = []\\n        response = []\\n        for d in tqdm(dataset):\\n            if d['label'] is None:  # ignore dataset error\\n                continue\\n            if self.is_pair_seq:\\n                q = self.prompt.format(sentence1=d['sentence1'], sentence2=d['sentence2'])\\n            else:\\n                q = self.prompt.format(sentence=d['sentence'])\\n            query.append(q)\\n            response.append(self.labels[int(d['label'])])\\n        return HfDataset.from_dict({'query': query, 'response': response})\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport inspect\\nimport math\\nimport os\\nimport platform\\nimport sys\\nfrom dataclasses import dataclass, field\\nfrom typing import Any, Dict, List, Literal, Optional, Set, Tuple, Union\\n\\nimport json\\nimport numpy as np\\nimport torch\\nimport torch.distributed as dist\\nimport transformers\\nfrom datasets import Dataset as HfDataset\\nfrom datasets import IterableDataset as HfIterableDataset\\nfrom datasets import concatenate_datasets\\nfrom packaging import version\\nfrom transformers.utils import is_torch_bf16_gpu_available, is_torch_cuda_available, is_torch_npu_available, strtobool\\nfrom transformers.utils.versions import require_version\\n\\nfrom swift.hub import HubApi, ModelScopeConfig\\nfrom swift.trainers import LOSS_MAPPING, TrainerFactory\\nfrom swift.tuners import Swift\\nfrom swift.utils import (add_version_to_work_dir, get_dist_setting, get_logger, get_pai_tensorboard_dir, is_dist,\\n                         is_local_master, is_mp, is_pai_training_job, use_torchacc)\\nfrom .client_utils import get_model_list_client\\nfrom .dataset import (DATASET_MAPPING, _dataset_name_exists, get_dataset, parse_dataset_name,\\n                      register_dataset_info_file, sample_dataset)\\nfrom .media import MediaTag\\nfrom .model import (MODEL_MAPPING, dtype_mapping, get_additional_saved_files, get_default_lora_target_modules,\\n                    get_default_template_type)\\nfrom .template import TEMPLATE_MAPPING\\nfrom .utils import get_mllm_arch, is_liger_available, is_lmdeploy_available, is_quant_model, is_vllm_available\\n\\nlogger = get_logger()\\nDATASET_TYPE = Union[HfDataset, HfIterableDataset]\\n\\n\\ndef is_adapter(sft_type: str) -> bool:\\n    return sft_type in {\\n        'lora', 'longlora', 'adalora', 'ia3', 'llamapro', 'adapter', 'vera', 'boft', 'fourierft', 'reft'\\n    }\\n\\n\\nclass ArgumentsBase:\\n\\n    def _load_json_or_path(self, key) -> None:\\n        value = getattr(self, key)\\n        if isinstance(value, str):\\n            if os.path.exists(value):  # local path\\n                with open(value, 'r') as f:\\n                    value = json.load(f)\\n            else:  # json str\\n                value = json.loads(value)\\n        setattr(self, key, value)\\n\\n    def __post_init__(self) -> None:\\n        if self.max_length == -1:\\n            self.max_length = None\\n        if self.model_kwargs is None:\\n            self.model_kwargs = {}\\n        self._load_json_or_path('model_kwargs')\\n        for k, v in self.model_kwargs.items():\\n            k = k.upper()\\n            os.environ[k] = str(v)\\n\\n        self._load_json_or_path('device_map_config')\\n        _, local_rank, _, local_world_size = get_dist_setting()\\n        # compat mp&ddp\\n        if local_world_size > 1 and isinstance(self.device_map_config, dict) and local_rank > 0:\\n            for k, v in self.device_map_config.items():\\n                if isinstance(v, int):\\n                    self.device_map_config[k] += local_rank\\n\\n    @classmethod\\n    def _check_path(cls,\\n                    value: Union[str, List[str]],\\n                    k: Optional[str] = None,\\n                    check_exist_path_set: Optional[Set[str]] = None) -> Union[str, List[str]]:\\n        if check_exist_path_set is None:\\n            check_exist_path_set = set()\\n        if isinstance(value, str):\\n            value = os.path.expanduser(value)\\n            value = os.path.abspath(value)\\n            if k in check_exist_path_set and not os.path.exists(value):\\n                if k is not None:\\n                    raise FileNotFoundError(f\\\"`{k}`: '{value}'\\\")\\n                else:\\n                    raise FileNotFoundError(f\\\"path: '{value}'\\\")\\n        elif isinstance(value, list):\\n            res = []\\n            for v in value:\\n                res.append(cls._check_path(v, k, check_exist_path_set))\\n            value = res\\n        return value\\n\\n    def _is_multimodal(self, model_type: Optional[str] = None) -> bool:\\n        if model_type is None:\\n            return False\\n        model_info = MODEL_MAPPING[model_type]\\n        tags = model_info.get('tags') or []\\n        return 'multi-modal' in tags\\n\\n    def _is_vision(self, model_type: Optional[str] = None) -> bool:\\n        if model_type is None:\\n            return False\\n        model_info = MODEL_MAPPING[model_type]\\n        tags = model_info.get('tags') or []\\n        return 'vision' in tags\\n\\n    def handle_path(self: Union['SftArguments', 'InferArguments']) -> None:\\n        check_exist_path = ['ckpt_dir', 'resume_from_checkpoint', 'custom_register_path']\\n        maybe_check_exist_path = ['model_id_or_path', 'custom_dataset_info']\\n        if isinstance(self, SftArguments):\\n            check_exist_path.append('deepspeed_config_path')\\n            maybe_check_exist_path.append('deepspeed')\\n\\n        for k in maybe_check_exist_path:\\n            v = getattr(self, k)\\n            if isinstance(v, str) and v is not None and (v.startswith('~') or v.startswith('/') or os.path.exists(v)):\\n                check_exist_path.append(k)\\n        check_exist_path_set = set(check_exist_path)\\n        other_path = ['output_dir', 'logging_dir']\\n        for k in check_exist_path + other_path:\\n            value = getattr(self, k, None)\\n            if value is None:\\n                continue\\n            value = self._check_path(value, k, check_exist_path_set)\\n            setattr(self, k, value)\\n\\n    def check_flash_attn(self: Union['SftArguments', 'InferArguments']) -> None:\\n        model_info = MODEL_MAPPING[self.model_type]\\n        support_flash_attn = model_info.get('support_flash_attn', False)\\n        if self.use_flash_attn and not support_flash_attn:\\n            logger.warning(f'use_flash_attn: {self.use_flash_attn}, ' f'but support_flash_attn: {support_flash_attn}')\\n\\n    def handle_generation_config(self: Union['SftArguments', 'InferArguments']) -> None:\\n        if self.temperature == 0:\\n            self.do_sample = False\\n        if self.do_sample is False and (isinstance(self, InferArguments) and self.infer_backend == 'pt'\\n                                        or isinstance(self, SftArguments)):\\n            # fix warning\\n            self.temperature = 1.\\n            self.top_p = 1.\\n            self.top_k = 50\\n            logger.info('Due to do_sample=False, the following settings are applied: args.temperature: '\\n                        f'{self.temperature}, args.top_p: {self.top_p}, args.top_k: {self.top_k}.')\\n\\n    def select_dtype(self: Union['SftArguments', 'InferArguments']) -> Tuple[Optional[torch.dtype], bool, bool]:\\n        if not is_torch_cuda_available() and not is_torch_npu_available():\\n            # cpu\\n            if self.dtype == 'AUTO':\\n                self.dtype = 'fp32'\\n                logger.info(f'Setting args.dtype: {self.dtype}')\\n            assert self.dtype != 'fp16', 'The CPU does not support matrix multiplication with FP16.'\\n            if self.dtype == 'fp32':\\n                return torch.float32, False, False\\n            elif self.dtype == 'bf16':\\n                return torch.bfloat16, False, True\\n            else:\\n                raise ValueError(f'args.dtype: {self.dtype}')\\n        # cuda, npu\\n        if self.dtype == 'AUTO':\\n            if not is_torch_bf16_gpu_available():\\n                self.dtype = 'fp16'\\n            else:\\n                model_torch_dtype = MODEL_MAPPING[self.model_type].get('torch_dtype')\\n                if model_torch_dtype is not None:\\n                    self.dtype = dtype_mapping[model_torch_dtype]\\n                elif isinstance(self, SftArguments):\\n                    self.dtype = 'bf16'\\n                else:\\n                    return None, False, False\\n\\n        torch_dtype = dtype_mapping_reversed[self.dtype]\\n\\n        assert torch_dtype in {torch.float16, torch.bfloat16, torch.float32}\\n        if torch_dtype == torch.float16:\\n            if isinstance(self, SftArguments) and self.sft_type == 'full':\\n                self.dtype = 'fp32'\\n                torch_dtype = torch.float32\\n                logger.warning(\\n                    'Fine-tuning with full parameters does not support fp16, and is prone to NaN. '\\n                    'We will use the fp32 & AMP approach, which consumes approximately twice the memory of bf16.')\\n                logger.info(f'Setting torch_dtype: {torch_dtype}')\\n            fp16, bf16 = True, False\\n        elif torch_dtype == torch.bfloat16:\\n            support_bf16 = is_torch_bf16_gpu_available()\\n            if not support_bf16:\\n                logger.warning(f'support_bf16: {support_bf16}')\\n            fp16, bf16 = False, True\\n        else:\\n            fp16, bf16 = False, False\\n        return torch_dtype, fp16, bf16\\n\\n    def select_bnb(self: Union['SftArguments', 'InferArguments']) -> Tuple[Optional[torch.dtype], bool, bool]:\\n        if self.bnb_4bit_comp_dtype == 'AUTO':\\n            self.bnb_4bit_comp_dtype = self.dtype\\n\\n        if self.bnb_4bit_comp_dtype != 'AUTO':\\n            bnb_4bit_compute_dtype = dtype_mapping_reversed[self.bnb_4bit_comp_dtype]\\n            assert bnb_4bit_compute_dtype in {torch.float16, torch.bfloat16, torch.float32}\\n        else:\\n            bnb_4bit_compute_dtype = None\\n        quantization_bit = self.quantization_bit\\n        if self.quant_method == 'bnb':\\n            if quantization_bit == 4:\\n                require_version('bitsandbytes')\\n                load_in_4bit, load_in_8bit = True, False\\n            elif quantization_bit == 8:\\n                require_version('bitsandbytes')\\n                load_in_4bit, load_in_8bit = False, True\\n            else:\\n                logger.warning('bnb only support 4/8 bits quantization, you should assign --quantization_bit 4 or 8,\\\\\\n                    Or specify another quantization method; No quantization will be performed here.')\\n                load_in_4bit, load_in_8bit = False, False\\n        else:\\n            load_in_4bit, load_in_8bit = False, False\\n\\n        return bnb_4bit_compute_dtype, load_in_4bit, load_in_8bit\\n\\n    def handle_custom_register(self: Union['SftArguments', 'InferArguments']) -> None:\\n        if self.custom_register_path is None:\\n            return\\n        folder, fname = os.path.split(self.custom_register_path)\\n        sys.path.append(folder)\\n        __import__(fname.rstrip('.py'))\\n\\n    def handle_compatibility(self: Union['SftArguments', 'InferArguments']) -> None:\\n        template_type_mapping = {'chatglm2-generation': 'chatglm-generation', 'chatml': 'qwen'}\\n        model_type_mapping = {\\n            'openbmb-minicpm-2b-sft-chat': 'minicpm-2b-sft-chat',\\n            'openbmb-minicpm-2b-chat': 'minicpm-2b-chat',\\n            'cogvlm-17b-instruct': 'cogvlm-17b-chat',\\n            'minicpm-v-v2': 'minicpm-v-v2-chat',\\n            'mplug-owl2d1-chat': 'mplug-owl2_1-chat',\\n            'llava1d6-mistral-7b-instruct': 'llava1_6-mistral-7b-instruct',\\n            'llava1d6-yi-34b-instruct': 'llava1_6-yi-34b-instruct',\\n        }\\n        dataset_name_mapping = {\\n            'ms-bench-mini': 'ms-bench#20000',\\n            'multi-alpaca-all': 'multi-alpaca',\\n            'instinwild-en': 'instinwild:subset',\\n            'instinwild-zh': 'instinwild:default',\\n            'firefly-all-zh': 'firefly-zh',\\n            'sharegpt-en': 'sharegpt:common-en/computer-en',\\n            'sharegpt-zh': 'sharegpt:common-zh/computer-zh/unknow-zh',\\n            'open-orca-gpt4': 'open-orca:default',\\n            'sharegpt-gpt4-mini': 'sharegpt-gpt4:default',\\n            'deepctrl-sft-zh': 'deepctrl-sft:default',\\n            'deepctrl-sft-en': 'deepctrl-sft:en',\\n            'ms-agent-for-agentfabric-default': 'ms-agent-for-agentfabric:default',\\n            'ms-agent-for-agentfabric-addition': 'ms-agent-for-agentfabric:addition',\\n            **{\\n                f'toolbench-for-alpha-umi-{sn}': f'toolbench-for-alpha-umi:{sn}'\\n                for sn in DATASET_MAPPING['toolbench-for-alpha-umi']['subsets']\\n            },\\n            'medical-mini-zh': 'medical-zh#50000',\\n            'cmnli-mini-zh': 'cmnli-zh#20000',\\n            'coco-mini-en': 'coco-en-mini',\\n            'coco-mini-en-2': 'coco-en-2-mini',\\n            'aishell1-mini-zh': 'aishell1-zh-mini',\\n            **{f'hh-rlhf-{sn}': f'hh-rlhf:{sn}'\\n               for sn in DATASET_MAPPING['hh-rlhf']['subsets']},\\n            **{\\n                f\\\"hh-rlhf-cn-{sn.replace('_', '-')}\\\": f'hh-rlhf-cn:{sn}'\\n                for sn in DATASET_MAPPING['hh-rlhf-cn']['subsets']\\n            },\\n            **{\\n                f\\\"coig-cqia-{sn.replace('_', '-')}\\\": f'coig-cqia:{sn}'\\n                for sn in DATASET_MAPPING['coig-cqia']['subsets']\\n            },\\n            **{f'ruozhiba-{sn}': f'ruozhiba:{sn}'\\n               for sn in DATASET_MAPPING['ruozhiba']['subsets']},\\n        }\\n        for _name, _mapping in [['template_type', template_type_mapping], ['model_type', model_type_mapping]]:\\n            k = getattr(self, _name)\\n            if k in _mapping:\\n                v = _mapping[k]\\n                setattr(self, _name, v)\\n                break\\n        for key in ['dataset', 'val_dataset']:\\n            _dataset = getattr(self, key)\\n            if isinstance(_dataset, str):\\n                _dataset = [_dataset]\\n            elif _dataset is None:\\n                _dataset = []\\n            if len(_dataset) == 1 and ',' in _dataset[0]:\\n                _dataset = _dataset[0].split(',')\\n            for i, d in enumerate(_dataset):\\n                if d in dataset_name_mapping:\\n                    _dataset[i] = dataset_name_mapping[d]\\n            for d in _dataset:\\n                assert ',' not in d, f'dataset: {d}, please use `/`'\\n            setattr(self, key, _dataset)\\n        if self.truncation_strategy == 'ignore':\\n            self.truncation_strategy = 'delete'\\n        if self.safe_serialization is not None:\\n            self.save_safetensors = self.safe_serialization\\n        if len(self.custom_train_dataset_path) > 0:\\n            self.dataset += self.custom_train_dataset_path\\n        if len(self.custom_val_dataset_path) > 0:\\n            self.val_dataset += self.custom_val_dataset_path\\n        if self.device_map_config_path is not None:\\n            self.device_map_config = self.device_map_config_path\\n\\n        if isinstance(self, InferArguments):\\n            if self.merge_lora_and_save is not None:\\n                self.merge_lora = self.merge_lora_and_save\\n            if self.vllm_lora_modules is not None:\\n                self.lora_modules = self.vllm_lora_modules\\n        if isinstance(self, AppUIArguments):\\n            if self.server_name is not None:\\n                self.host = self.server_name\\n            if self.server_port is not None:\\n                self.port = self.server_port\\n        if isinstance(self, SftArguments):\\n            log_freeze_warning = False\\n            try:\\n                if isinstance(self.freeze_parameters, (int, float)):\\n                    log_freeze_warning = True\\n                elif isinstance(self.freeze_parameters, list) and len(self.freeze_parameters) == 1:\\n                    self.freeze_parameters = float(self.freeze_parameters[0])\\n                    log_freeze_warning = True\\n            except Exception:\\n                pass\\n            if log_freeze_warning:\\n                logger.warning(f'please use `--freeze_parameters_ratio {self.freeze_parameters}`')\\n                self.freeze_parameters_ratio = self.freeze_parameters\\n                self.freeze_parameters = []\\n\\n            if isinstance(self.train_dataset_mix_ds, str):\\n                self.train_dataset_mix_ds = [self.train_dataset_mix_ds]\\n            if self.only_save_model is not None:\\n                self.save_only_model = self.only_save_model\\n            if self.neftune_alpha is not None:\\n                self.neftune_noise_alpha = self.neftune_alpha\\n            if self.per_device_train_batch_size is not None:\\n                self.batch_size = self.per_device_train_batch_size\\n            if self.per_device_eval_batch_size is not None:\\n                self.eval_batch_size = self.per_device_eval_batch_size\\n            if self.deepspeed_config_path is not None:\\n                self.deepspeed = self.deepspeed_config_path\\n            if self.eval_strategy is not None:\\n                self.evaluation_strategy = self.eval_strategy\\n            if self.lora_dropout_p is not None:\\n                self.lora_dropout = self.lora_dropout_p\\n\\n            if self.boft_target_modules:\\n                self.target_modules = self.boft_target_modules\\n            if self.boft_modules_to_save:\\n                self.modules_to_save = self.boft_modules_to_save\\n\\n            if self.ia3_target_modules:\\n                self.target_modules = self.ia3_target_modules\\n            if self.ia3_modules_to_save:\\n                self.modules_to_save = self.ia3_modules_to_save\\n\\n            if self.vera_target_modules:\\n                self.target_modules = self.vera_target_modules\\n            if self.vera_modules_to_save:\\n                self.modules_to_save = self.vera_modules_to_save\\n\\n            if self.lora_target_modules:\\n                self.target_modules = self.lora_target_modules\\n            if self.lora_modules_to_save:\\n                self.modules_to_save = self.lora_modules_to_save\\n            if self.lora_target_regex:\\n                self.target_regex = self.lora_target_regex\\n\\n        if getattr(self, 'push_hub_strategy', None):\\n            self.hub_strategy = self.push_hub_strategy\\n            if self.hub_strategy in ('push_last', 'push_best'):\\n                self.hub_strategy = 'every_save'\\n\\n    def handle_custom_dataset_info(self: Union['SftArguments', 'InferArguments']):\\n        if self.custom_dataset_info is None:\\n            return\\n        register_dataset_info_file(self.custom_dataset_info)\\n\\n    def _handle_dataset_sample(self: Union['SftArguments', 'InferArguments']):\\n        # compatibility. (Deprecated)\\n        # Avoid post-processing\\n        if len(self.dataset) != 1 or self.train_dataset_sample == -1:\\n            return\\n        _dataset = self.dataset[0]\\n        train_sample = parse_dataset_name(_dataset)[3]\\n        if train_sample == -1:\\n            train_sample = self.train_dataset_sample\\n        else:\\n            _dataset = _dataset[:_dataset.find('#')]\\n            if self.train_dataset_sample < train_sample:\\n                train_sample = self.train_dataset_sample\\n        _dataset = f'{_dataset}#{train_sample}'\\n        self.dataset[0] = _dataset\\n        self.train_dataset_sample = -1\\n\\n    def _register_self_cognition(self: Union['SftArguments', 'InferArguments']) -> None:\\n\\n        # compatibility. (Deprecated)\\n        idx_list = _dataset_name_exists(self.dataset, 'self-cognition')\\n        assert len(idx_list) <= 1\\n        self.use_self_cognition = len(idx_list) == 1\\n        if self.self_cognition_sample > 0:\\n            d = f'self-cognition#{self.self_cognition_sample}'\\n            if len(idx_list) == 1:\\n                self.dataset[idx_list[0]] = d\\n            else:\\n                self.dataset.append(d)\\n            self.use_self_cognition = True\\n        # check\\n        if self.use_self_cognition:\\n            for k in ['model_name', 'model_author']:\\n                v = getattr(self, k)\\n                if isinstance(v, str):\\n                    v = [v]\\n                elif v is None:\\n                    v = [None, None]\\n                if len(v) == 1:\\n                    v = v * 2\\n                if v[0] is None and v[1] is None:\\n                    raise ValueError('Please set self.model_name self.model_author. '\\n                                     'For example: `--model_name 小黄 \\\"Xiao Huang\\\" --model_author 魔搭 ModelScope`. '\\n                                     'Representing the model name and model author in Chinese and English.')\\n                setattr(self, k, v)\\n\\n    def _handle_dataset_compat(\\n            self: Union['SftArguments', 'InferArguments'], train_dataset: Optional[DATASET_TYPE],\\n            val_dataset: Optional[DATASET_TYPE]) -> Tuple[Optional[DATASET_TYPE], Optional[DATASET_TYPE]]:\\n        # compatibility. (Deprecated)\\n        streaming = getattr(self, 'streaming', False)\\n        random_state = np.random.RandomState(self.dataset_seed)\\n        val_dataset_sample = self.val_dataset_sample\\n\\n        if train_dataset is not None and self.train_dataset_sample >= 0:\\n            train_dataset_sample = min(self.train_dataset_sample, train_dataset.shape[0])\\n            if train_dataset.shape[0] > train_dataset_sample:\\n                logger.info(f'train_dataset_sample: {train_dataset_sample}')\\n                train_idxs = random_state.permutation(train_dataset_sample)\\n                train_dataset = train_dataset.select(train_idxs)\\n            if val_dataset_sample is None:\\n                val_dataset_sample = max(int(train_dataset_sample * self.dataset_test_ratio), 1)\\n        if val_dataset is not None and val_dataset_sample is not None and val_dataset_sample >= 0:\\n            if not streaming and val_dataset.shape[0] > val_dataset_sample:\\n                logger.info(f'val_dataset_sample: {val_dataset_sample}')\\n                val_idxs = random_state.permutation(val_dataset_sample)\\n                val_dataset = val_dataset.select(val_idxs)\\n            elif streaming:\\n                val_dataset = val_dataset.shuffle(\\n                    seed=self.dataset_seed, buffer_size=self.streaming_buffer_size).take(val_dataset_sample)\\n\\n        if (train_dataset is None or not hasattr(self, 'train_dataset_mix_ratio') or self.train_dataset_mix_ratio <= 0\\n                or len(self.train_dataset_mix_ds) == 0):\\n            return train_dataset, val_dataset\\n\\n        mix_dataset_sample = int(len(train_dataset) * self.train_dataset_mix_ratio)\\n        logger.info(f'train_dataset_mix_ds: {self.train_dataset_mix_ds}')\\n        logger.info(f'len(train_dataset): {len(train_dataset)}, mix_dataset_sample: {mix_dataset_sample}')\\n        mixed_dataset = get_dataset(\\n            self.train_dataset_mix_ds,\\n            0.0,\\n            random_state,\\n            check_dataset_strategy=self.check_dataset_strategy,\\n            streaming=streaming)[0]\\n        if len(mixed_dataset) < mix_dataset_sample:\\n            logger.warn(f'The length of dataset used for mixin: {self.train_dataset_mix_ds} are '\\n                        'lesser than the ratio required by the `train_dataset_mix_ratio` '\\n                        f'argument: {self.train_dataset_mix_ratio}. '\\n                        f'the actual ratio is: {len(mixed_dataset) / len(train_dataset):.6}.')\\n        else:\\n            mixed_dataset = sample_dataset(mixed_dataset, mix_dataset_sample, random_state)\\n        train_dataset = concatenate_datasets([train_dataset, mixed_dataset])\\n        return train_dataset, val_dataset\\n\\n    def prepare_template(self: Union['SftArguments', 'InferArguments']):\\n        if self.template_type == 'AUTO':\\n            self.template_type = get_default_template_type(self.model_type)\\n            logger.info(f'Setting template_type: {self.template_type}')\\n\\n    def set_model_type(self: Union['SftArguments', 'InferArguments']) -> None:\\n        # compat with swift<1.7\\n        if self.model_cache_dir is not None and self.model_id_or_path is None:\\n            self.model_id_or_path = self.model_cache_dir\\n            self.model_cache_dir = None\\n\\n        if self.model_id_or_path is not None:\\n            use_hf = strtobool(os.environ.get('USE_HF', 'False'))\\n            model_mapping_reversed = {}\\n            for k, v in MODEL_MAPPING.items():\\n                if use_hf:\\n                    model_id = v.get('hf_model_id')\\n                else:\\n                    model_id = v.get('model_id_or_path')\\n                if model_id is None:\\n                    continue\\n                model_id = model_id.lower()\\n                model_mapping_reversed[model_id] = k\\n            model_id_or_path = self.model_id_or_path\\n            model_id_or_path_lower = model_id_or_path.lower()\\n\\n            if self.model_type is None and model_id_or_path_lower in model_mapping_reversed:\\n                model_type = model_mapping_reversed[model_id_or_path_lower]\\n                assert self.model_type is None or self.model_type == model_type\\n                self.model_type = model_type\\n                logger.info(f'Setting args.model_type: {model_type}')\\n                if self.model_cache_dir is not None:\\n                    self.model_id_or_path = self.model_cache_dir\\n            else:\\n                if (isinstance(self, InferArguments) and 'checkpoint-' in model_id_or_path\\n                        and 'merged' not in model_id_or_path and self.ckpt_dir is None):\\n                    raise ValueError('Please use `--ckpt_dir vx-xxx/checkpoint-xxx` to use the checkpoint.')\\n                if self.model_type is None:\\n                    raise ValueError(f\\\"model_id_or_path: '{model_id_or_path}' is not registered. \\\"\\n                                     'Please set `--model_type <model_type> --model_id_or_path <model_id_or_path>`.')\\n                assert self.model_cache_dir is None\\n\\n        error_msg = f'The model_type you can choose: {list(MODEL_MAPPING.keys())}'\\n        if self.model_type is None:\\n            raise ValueError('please setting `--model_type <model_type>`. ' + error_msg)\\n        elif self.model_type not in MODEL_MAPPING:\\n            raise ValueError(f\\\"model_type: '{self.model_type}' is not registered. \\\" + error_msg)\\n        model_info = MODEL_MAPPING[self.model_type]\\n        use_hf = strtobool(os.environ.get('USE_HF', 'False'))\\n        if self.model_revision is not None:\\n            model_info['revision'] = self.model_revision\\n            logger.info(f\\\"Setting model_info['revision']: {self.model_revision}\\\")\\n        elif use_hf:\\n            model_info['revision'] = 'main'\\n        self.model_revision = model_info['revision']\\n        if self.model_id_or_path is None:\\n            self.model_id_or_path = model_info['hf_model_id'] if use_hf else model_info['model_id_or_path']\\n        requires = model_info['requires']\\n        for require in requires:\\n            require_version(require)\\n\\n    def prepare_ms_hub(self: Union['SftArguments', 'InferArguments']) -> None:\\n        hub_token = self.hub_token\\n        if hub_token is None:\\n            hub_token = os.environ.get('MODELSCOPE_API_TOKEN')\\n        if hub_token:\\n            api = HubApi()\\n            api.login(hub_token)\\n        if not hasattr(self, 'push_to_hub') or not self.push_to_hub:\\n            return\\n        self.hub_token = hub_token\\n        assert ModelScopeConfig.get_token() is not None, 'Please enter hub_token'\\n        if self.hub_model_id is None:\\n            self.hub_model_id = f'{self.model_type}-{self.sft_type}'\\n            logger.info(f'Setting hub_model_id: {self.hub_model_id}')\\n        logger.info('hub login successful!')\\n\\n    def load_from_ckpt_dir(self, is_sft: bool = False) -> None:\\n        if is_sft:\\n            ckpt_dir = self.resume_from_checkpoint\\n        else:\\n            ckpt_dir = self.ckpt_dir\\n        sft_args_path = os.path.join(ckpt_dir, 'sft_args.json')\\n        export_args_path = os.path.join(ckpt_dir, 'export_args.json')\\n        from_sft_args = os.path.exists(sft_args_path)\\n        if not os.path.exists(sft_args_path) and not os.path.exists(export_args_path):\\n            logger.warning(f'{sft_args_path} not found')\\n            return\\n        args_path = sft_args_path if from_sft_args else export_args_path\\n        with open(args_path, 'r', encoding='utf-8') as f:\\n            old_args = json.load(f)\\n\\n        imported_keys = [\\n            'model_type', 'model_revision', 'template_type', 'dtype', 'quant_method', 'quantization_bit',\\n            'bnb_4bit_comp_dtype', 'bnb_4bit_quant_type', 'bnb_4bit_use_double_quant', 'model_id_or_path',\\n            'custom_register_path', 'custom_dataset_info'\\n        ]\\n        if (isinstance(self, SftArguments) and self.train_backend == 'megatron'\\n                or isinstance(self, ExportArguments) and self.to_hf is True):\\n            imported_keys += ['tp', 'pp']\\n        if not is_sft:\\n            imported_keys += ['sft_type', 'rope_scaling', 'system']\\n            if getattr(self, 'load_dataset_config', False) and from_sft_args:\\n                imported_keys += [\\n                    'dataset', 'val_dataset', 'dataset_seed', 'dataset_test_ratio', 'check_dataset_strategy',\\n                    'self_cognition_sample', 'model_name', 'model_author', 'train_dataset_sample', 'val_dataset_sample'\\n                ]\\n        for key in imported_keys:\\n            if not hasattr(self, key):\\n                continue\\n            value = getattr(self, key)\\n            old_value = old_args.get(key)\\n            if old_value is None:\\n                continue\\n            if key in {'dataset', 'val_dataset'} and len(value) > 0:\\n                continue\\n            if key in {\\n                    'system', 'quant_method', 'model_id_or_path', 'custom_register_path', 'custom_dataset_info',\\n                    'dataset_seed'\\n            } and value is not None:\\n                continue\\n            if key in {'template_type', 'dtype'} and value != 'AUTO':\\n                continue\\n            setattr(self, key, old_value)\\n\\n        # compat\\n        if self.val_dataset is None:\\n            self.val_dataset = []\\n\\n\\n@dataclass\\nclass SftArguments(ArgumentsBase):\\n    # You can specify the model by either using the model_type or model_id_or_path.\\n    model_type: Optional[str] = field(\\n        default=None, metadata={'help': f'model_type choices: {list(MODEL_MAPPING.keys())}'})\\n    model_id_or_path: Optional[str] = None\\n    model_revision: Optional[str] = None\\n\\n    full_determinism: bool = False\\n\\n    sft_type: Literal['lora', 'full', 'longlora', 'adalora', 'ia3', 'llamapro', 'adapter', 'vera', 'boft', 'fourierft',\\n                      'reft'] = 'lora'\\n    freeze_parameters: List[str] = field(default_factory=list)\\n    freeze_vit: bool = False\\n    freeze_parameters_ratio: float = 0.  # 0 ~ 1\\n    additional_trainable_parameters: List[str] = field(default_factory=list)\\n    tuner_backend: Literal['swift', 'peft', 'unsloth'] = 'peft'\\n    template_type: str = field(\\n        default='AUTO', metadata={'help': f\\\"template_type choices: {list(TEMPLATE_MAPPING.keys()) + ['AUTO']}\\\"})\\n    output_dir: str = 'output'\\n    add_output_dir_suffix: Optional[bool] = None\\n    ddp_backend: Optional[Literal['nccl', 'gloo', 'mpi', 'ccl', 'hccl']] = None\\n    ddp_find_unused_parameters: Optional[bool] = None\\n    ddp_broadcast_buffers: Optional[bool] = None\\n    ddp_timeout: int = 1800\\n\\n    seed: int = 42\\n    resume_from_checkpoint: Optional[str] = None\\n    resume_only_model: bool = False\\n    ignore_data_skip: bool = False\\n    dtype: Literal['bf16', 'fp16', 'fp32', 'AUTO'] = 'AUTO'\\n    packing: bool = False\\n    # megatron\\n    train_backend: Literal['transformers', 'megatron'] = 'transformers'\\n    tp: int = 1\\n    pp: int = 1\\n    min_lr: Optional[float] = None\\n    sequence_parallel: bool = False\\n\\n    # multimodal\\n    model_kwargs: Optional[str] = None\\n    loss_name: Optional[str] = field(default=None, metadata={'help': f'loss_func choices: {list(LOSS_MAPPING.keys())}'})\\n\\n    # dataset_id or dataset_name or dataset_path or ...\\n    dataset: List[str] = field(\\n        default_factory=list, metadata={'help': f'dataset choices: {list(DATASET_MAPPING.keys())}'})\\n    val_dataset: List[str] = field(\\n        default_factory=list, metadata={'help': f'dataset choices: {list(DATASET_MAPPING.keys())}'})\\n    dataset_seed: Optional[int] = None\\n    dataset_test_ratio: float = 0.01\\n    use_loss_scale: bool = False  # for agent\\n    loss_scale_config_path: str = 'DEFAULT'\\n    system: Optional[str] = None\\n    tools_prompt: Literal['react_en', 'react_zh', 'toolbench'] = 'react_en'\\n    max_length: int = 2048  # -1: no limit\\n    truncation_strategy: Literal['delete', 'truncation_left'] = 'delete'\\n    check_dataset_strategy: Literal['none', 'discard', 'error', 'warning'] = 'none'\\n    # streaming dataset\\n    streaming: bool = False\\n    streaming_val_size: int = 0\\n    streaming_buffer_size: int = 16384\\n    # Chinese name and English name\\n    model_name: List[str] = field(default_factory=lambda: [None, None], metadata={'help': \\\"e.g. ['小黄', 'Xiao Huang']\\\"})\\n    model_author: List[str] = field(\\n        default_factory=lambda: [None, None], metadata={'help': \\\"e.g. ['魔搭', 'ModelScope']\\\"})\\n\\n    # note: bf16 and quantization have requirements for gpu architecture\\n    # awq, gptq, and aqlm need to be pre-quantized models,\\n    # while bnb, hqq, and eetq can be quantized during SFT using the original models.\\n    quant_method: Literal['bnb', 'hqq', 'eetq', 'awq', 'gptq', 'aqlm'] = None\\n    quantization_bit: Literal[0, 1, 2, 3, 4, 8] = 0  # hqq: 1,2,3,4,8. bnb: 4,8\\n    hqq_axis: Literal[0, 1] = 0\\n    hqq_dynamic_config_path: Optional[str] = None\\n    bnb_4bit_comp_dtype: Literal['fp16', 'bf16', 'fp32', 'AUTO'] = 'AUTO'\\n    bnb_4bit_quant_type: Literal['fp4', 'nf4'] = 'nf4'\\n    bnb_4bit_use_double_quant: bool = True\\n    bnb_4bit_quant_storage: Optional[str] = None\\n\\n    # multi-modal\\n    rescale_image: int = -1\\n\\n    # tuners\\n    target_modules: List[str] = field(default_factory=lambda: ['DEFAULT'])\\n    target_regex: Optional[str] = None\\n    # e.g. ['wte', 'ln_1', 'ln_2', 'ln_f', 'lm_head']\\n    modules_to_save: List[str] = field(default_factory=list)\\n\\n    # lora\\n    lora_rank: int = 8\\n    lora_alpha: int = 32\\n    lora_dropout: float = 0.05\\n    lora_bias_trainable: Literal['none', 'all'] = 'none'\\n    lora_dtype: Literal['fp16', 'bf16', 'fp32', 'AUTO'] = 'AUTO'\\n    lora_lr_ratio: float = None\\n    use_rslora: bool = False\\n    use_dora: bool = False\\n    # Literal['gaussian', 'pissa', 'pissa_niter_[number of iters]', 'olora', 'loftq', 'true', 'false']\\n    init_lora_weights: str = 'true'\\n\\n    # fourierft\\n    fourier_n_frequency: int = 2000\\n    fourier_scaling: float = 300.0\\n\\n    # rope-scaling\\n    rope_scaling: Literal['linear', 'dynamic'] = None\\n\\n    # BOFT\\n    boft_block_size: int = 4\\n    boft_block_num: int = 0\\n    boft_n_butterfly_factor: int = 1\\n    boft_dropout: float = 0.0\\n\\n    # Vera\\n    vera_rank: int = 256\\n    vera_projection_prng_key: int = 0\\n    vera_dropout: float = 0.0\\n    vera_d_initial: float = 0.1\\n\\n    # adapter\\n    adapter_act: str = 'gelu'\\n    adapter_length: int = 128\\n\\n    # galore\\n    use_galore: bool = False\\n    galore_target_modules: Optional[List[str]] = None\\n    galore_rank: int = 128\\n    galore_update_proj_gap: int = 50\\n    galore_scale: float = 1.0\\n    galore_proj_type: str = 'std'\\n    galore_optim_per_parameter: bool = False\\n    galore_with_embedding: bool = False\\n    galore_quantization: bool = False\\n    galore_proj_quant: bool = False\\n    galore_proj_bits: int = 4\\n    galore_proj_group_size: int = 256\\n    galore_cos_threshold: float = 0.4\\n    galore_gamma_proj: int = 2\\n    galore_queue_size: int = 5\\n\\n    # adalora\\n    adalora_target_r: int = 8\\n    adalora_init_r: int = 12\\n    adalora_tinit: int = 0\\n    adalora_tfinal: int = 0\\n    adalora_deltaT: int = 1\\n    adalora_beta1: float = 0.85\\n    adalora_beta2: float = 0.85\\n    adalora_orth_reg_weight: float = 0.5\\n\\n    # ia3\\n    ia3_feedforward_modules: List[str] = field(default_factory=list)\\n\\n    # llamapro\\n    llamapro_num_new_blocks: int = 4\\n    llamapro_num_groups: Optional[int] = None\\n\\n    # neftune\\n    neftune_noise_alpha: Optional[float] = None  # e.g. 5, 10, 15\\n    neftune_backend: Literal['swift', 'transformers'] = None\\n\\n    # lisa\\n    lisa_activated_layers: int = 0\\n    lisa_step_interval: int = 20\\n\\n    # reft\\n    reft_layer_key: Optional[str] = None\\n    reft_layers: Optional[List[int]] = None\\n    reft_rank: int = 4\\n    reft_intervention_type: Literal['NoreftIntervention', 'LoreftIntervention', 'ConsreftIntervention',\\n                                    'LobireftIntervention', 'DireftIntervention',\\n                                    'NodireftIntervention'] = 'LoreftIntervention'\\n    reft_args: Optional[str] = None\\n\\n    # use_liger\\n    use_liger: bool = False\\n\\n    gradient_checkpointing: Optional[bool] = None\\n    vit_use_gc: bool = True  # vit use gradient_checkpointing\\n    # e.g. 'default-zero3', 'default-zero2', 'ds_config/zero2.json', 'zero2-offload', 'zero3-offload'\\n    deepspeed: Optional[str] = None\\n    batch_size: int = 1\\n    eval_batch_size: Optional[int] = None\\n    auto_find_batch_size: bool = False\\n    num_train_epochs: int = 1\\n    # if max_steps >= 0, override num_train_epochs\\n    max_steps: int = -1\\n    optim: str = 'adamw_torch'\\n    adam_beta1: float = 0.9\\n    adam_beta2: float = 0.95\\n    adam_epsilon: float = 1e-8\\n    learning_rate: Optional[float] = None\\n    weight_decay: float = 0.1\\n    gradient_accumulation_steps: Optional[int] = None\\n    max_grad_norm: float = 1\\n    predict_with_generate: bool = False\\n    lr_scheduler_type: str = 'cosine'\\n    lr_scheduler_kwargs: Optional[str] = None  # json\\n    warmup_ratio: float = 0.05\\n    warmup_steps: int = 0  # Overrides any effect of `warmup_ratio` if warmup_steps > 0\\n\\n    eval_steps: Optional[int] = None  # full: 200, other: 50\\n    save_steps: Optional[int] = None\\n    save_only_model: bool = False\\n    save_total_limit: int = 2  # save last and best. -1: all checkpoints\\n    logging_steps: int = 5\\n    acc_steps: int = 1\\n    dataloader_num_workers: Optional[int] = None\\n    dataloader_pin_memory: bool = True\\n    dataloader_drop_last: bool = False\\n\\n    # push to ms hub\\n    push_to_hub: bool = False\\n    # 'user_name/repo_name' or 'repo_name'\\n    hub_model_id: Optional[str] = None\\n    # None: use env var `MODELSCOPE_API_TOKEN`\\n    hub_token: Optional[str] = field(\\n        default=None, metadata={'help': 'SDK token can be found in https://modelscope.cn/my/myaccesstoken'})\\n    hub_private_repo: bool = False\\n    hub_strategy: Literal['end', 'every_save', 'checkpoint', 'all_checkpoints'] = 'every_save'\\n\\n    # other\\n    test_oom_error: bool = field(\\n        default=False,\\n        metadata={\\n            'help':\\n            'If set to True, the train_dataset will be sorted in descending order based on max_length, '\\n            'enabling faster detection of OOM (Out of Memory) errors.'\\n        })\\n    disable_tqdm: bool = False\\n    lazy_tokenize: Optional[bool] = None\\n    preprocess_num_proc: int = 1\\n    use_flash_attn: Optional[bool] = None\\n    ignore_args_error: bool = False  # True: notebook compatibility\\n    check_model_is_latest: bool = True\\n\\n    logging_dir: Optional[str] = None\\n    report_to: List[str] = field(default_factory=lambda: ['tensorboard'])\\n    acc_strategy: Literal['token', 'sentence'] = 'token'\\n    save_on_each_node: bool = False\\n    evaluation_strategy: Literal['steps', 'epoch', 'no'] = 'steps'\\n    save_strategy: Literal['steps', 'epoch', 'no'] = 'steps'\\n    save_safetensors: bool = True\\n    gpu_memory_fraction: Optional[float] = None\\n    include_num_input_tokens_seen: Optional[bool] = False\\n    local_repo_path: Optional[str] = None\\n    custom_register_path: Optional[str] = None  # .py\\n    custom_dataset_info: Optional[str] = None  # .json\\n\\n    device_map_config: Optional[str] = None\\n    device_max_memory: List[str] = field(default_factory=list)\\n\\n    # generation config\\n    max_new_tokens: int = 2048\\n    do_sample: Optional[bool] = None\\n    temperature: Optional[float] = None\\n    top_k: Optional[int] = None\\n    top_p: Optional[float] = None\\n    repetition_penalty: Optional[float] = None\\n    num_beams: int = 1\\n\\n    # fsdp option\\n    fsdp: Optional[str] = ''\\n    # fsdp config file\\n    fsdp_config: Optional[str] = None\\n\\n    sequence_parallel_size: int = 1\\n    # for torchacc\\n    model_layer_cls_name: Optional[str] = field(\\n        default=None,\\n        metadata={'help': \\\"Decoder Class name of model, e.g. 'QWenBlock' for QWen, 'LlamaDecoderLayer' for LLama\\\"})\\n    metric_warmup_step: Optional[float] = 0\\n    fsdp_num: int = 1\\n\\n    # compatibility hf\\n    per_device_train_batch_size: Optional[int] = None\\n    per_device_eval_batch_size: Optional[int] = None\\n    eval_strategy: Literal['steps', 'epoch', 'no', None] = None\\n    # compatibility. (Deprecated)\\n    self_cognition_sample: int = 0\\n    train_dataset_mix_ratio: float = 0.\\n    train_dataset_mix_ds: List[str] = field(default_factory=lambda: ['ms-bench'])\\n    train_dataset_sample: int = -1  # -1: all dataset\\n    val_dataset_sample: Optional[int] = None  # -1: all dataset\\n    safe_serialization: Optional[bool] = None\\n    only_save_model: Optional[bool] = None\\n    neftune_alpha: Optional[float] = None\\n    deepspeed_config_path: Optional[str] = None\\n    model_cache_dir: Optional[str] = None\\n    lora_dropout_p: Optional[float] = None\\n    lora_target_modules: List[str] = field(default_factory=list)\\n    lora_target_regex: Optional[str] = None\\n    lora_modules_to_save: List[str] = field(default_factory=list)\\n    boft_target_modules: List[str] = field(default_factory=list)\\n    boft_modules_to_save: List[str] = field(default_factory=list)\\n    vera_target_modules: List[str] = field(default_factory=list)\\n    vera_modules_to_save: List[str] = field(default_factory=list)\\n    ia3_target_modules: List[str] = field(default_factory=list)\\n    ia3_modules_to_save: List[str] = field(default_factory=list)\\n\\n    custom_train_dataset_path: List[str] = field(default_factory=list)\\n    custom_val_dataset_path: List[str] = field(default_factory=list)\\n    device_map_config_path: Optional[str] = None\\n    push_hub_strategy: Optional[Literal['end', 'push_best', 'push_last', 'checkpoint', 'all_checkpoints']] = None\\n\\n    def _prepare_target_modules(self, target_modules) -> Union[List[str], str]:\\n        if isinstance(target_modules, str):\\n            target_modules = [target_modules]\\n        if len(target_modules) == 0:\\n            return target_modules\\n        elif len(target_modules) == 1:\\n            if ',' in target_modules[0]:\\n                target_modules = target_modules[0].split(',')\\n        if 'AUTO' in target_modules:\\n            target_modules.remove('AUTO')\\n            target_modules.append('DEFAULT')\\n        if 'DEFAULT' in target_modules:\\n            target_modules.remove('DEFAULT')\\n            default_lora_tm = get_default_lora_target_modules(self.model_type) or []\\n            if isinstance(default_lora_tm, str):\\n                return default_lora_tm\\n            target_modules += default_lora_tm\\n        if 'EMBEDDING' in target_modules:\\n            self.lora_use_embedding = True\\n        if 'ALL' in target_modules:\\n            self.lora_use_all = True\\n        return target_modules\\n\\n    def handle_lr_scheduler_kwargs(self):\\n        if self.lr_scheduler_kwargs is None:\\n            self.lr_scheduler_kwargs = {}\\n        elif isinstance(self.lr_scheduler_kwargs, str):\\n            self.lr_scheduler_kwargs = json.loads(self.lr_scheduler_kwargs)\\n\\n    def _prepare_modules_to_save(self, modules_to_save) -> List[str]:\\n        if isinstance(modules_to_save, str):\\n            modules_to_save = [modules_to_save]\\n        if len(modules_to_save) == 0:\\n            return modules_to_save\\n        if 'EMBEDDING' in modules_to_save:\\n            modules_to_save.remove('EMBEDDING')\\n            self.lora_m2s_use_embedding = True\\n        if 'LN' in modules_to_save:\\n            modules_to_save.remove('LN')\\n            self.lora_m2s_use_ln = True\\n        return modules_to_save\\n\\n    def __post_init__(self) -> None:\\n        super().__post_init__()\\n        self.handle_compatibility()\\n        if self.preprocess_num_proc and self.preprocess_num_proc > 1:\\n            os.environ['DATASET_MAP_NPROC'] = str(self.preprocess_num_proc)\\n        if len(self.val_dataset) > 0:\\n            self.dataset_test_ratio = 0.0\\n            logger.info('Using val_dataset, ignoring dataset_test_ratio')\\n        if is_pai_training_job():\\n            self._handle_pai_compat()\\n        ds_config_folder = os.path.abspath(os.path.join(__file__, '..', '..', 'ds_config'))\\n        deepspeed_mapping = {\\n            'default-zero2': 'zero2.json',\\n            'default-zero3': 'zero3.json',\\n            'zero2-offload': 'zero2_offload.json',\\n            'zero3-offload': 'zero3_offload.json',\\n        }\\n        for ds_name, ds_config in deepspeed_mapping.items():\\n            if self.deepspeed == ds_name:\\n                self.deepspeed = os.path.join(ds_config_folder, ds_config)\\n                break\\n        if self.loss_scale_config_path:\\n            if self.loss_scale_config_path == 'DEFAULT':\\n                self.loss_scale_config_path = os.path.abspath(\\n                    os.path.join(__file__, '..', '..', 'agent', 'default_loss_scale_config.json'))\\n            elif self.loss_scale_config_path == 'alpha-umi':  # https://arxiv.org/pdf/2401.07324\\n                self.loss_scale_config_path = os.path.abspath(\\n                    os.path.join(__file__, '..', '..', 'agent', 'alpha_umi_loss_scale_config.json'))\\n            elif self.loss_scale_config_path == 'agent-flan':  # https://arxiv.org/abs/2403.12881\\n                self.loss_scale_config_path = os.path.abspath(\\n                    os.path.join(__file__, '..', '..', 'agent', 'agentflan.json'))\\n        if self.train_backend == 'megatron' and self.resume_from_checkpoint is None:\\n            self.resume_from_checkpoint = f'{self.model_type}-tp{self.tp}-pp{self.pp}'\\n        self.handle_path()\\n        self._handle_dataset_sample()\\n        self._register_self_cognition()\\n        self.handle_custom_register()\\n        self.handle_custom_dataset_info()\\n        if self.resume_from_checkpoint:\\n            self.load_from_ckpt_dir(True)\\n            if self.sft_type == 'full' or self.train_backend == 'megatron':\\n                self.model_id_or_path = self.resume_from_checkpoint\\n\\n        if self.rope_scaling:\\n            logger.info(f'rope_scaling is set to {self.rope_scaling}, please remember to set max_length')\\n\\n        if self.dataset_seed is None:\\n            self.dataset_seed = self.seed\\n        self.set_model_type()\\n        self.check_flash_attn()\\n        self.handle_lr_scheduler_kwargs()\\n        self.is_multimodal = self._is_multimodal(self.model_type)\\n        self.is_vision = self._is_vision(self.model_type)\\n\\n        self.lora_use_embedding = False\\n        self.lora_use_all = False\\n        self.lora_m2s_use_embedding = False\\n        self.lora_m2s_use_ln = False\\n        self.target_modules = self._prepare_target_modules(self.target_modules)\\n        self.modules_to_save = self._prepare_modules_to_save(self.modules_to_save)\\n        if self.use_self_cognition and self.sft_type == 'lora' and not self.lora_use_all:\\n            logger.warning('Due to knowledge editing involved, it is recommended to add LoRA on MLP. '\\n                           'For example: `--lora_target_modules ALL`. '\\n                           'If you have already added LoRA on MLP, please ignore this warning.')\\n\\n        if self.sft_type in {'adalora', 'ia3'} and self.lora_use_embedding:\\n            raise ValueError('`adalora` and `ia3` do not support setting embedding as target_modules.')\\n\\n        self.torch_dtype, self.fp16, self.bf16 = self.select_dtype()\\n        self.rank, self.local_rank, self.world_size, self.local_world_size = get_dist_setting()\\n        if is_dist():\\n            if is_torch_npu_available():\\n                torch.npu.set_device(self.local_rank)\\n            else:\\n                torch.cuda.set_device(self.local_rank)\\n            self.seed += self.rank  # Avoid the same dropout\\n            if self.ddp_backend is None:\\n                self.ddp_backend = 'nccl'\\n            if self.ddp_backend == 'gloo' and self.quantization_bit != 0:\\n                raise ValueError('not supported, please use `nccl`')\\n\\n        if self.train_backend == 'megatron' and self.sft_type == 'lora':\\n            logger.warning('Currently, only full parameter is supported. Setting args.sft_type: \\\"full\\\"')\\n            self.sft_type = 'full'\\n\\n        model_info = MODEL_MAPPING[self.model_type]\\n        if is_adapter(self.sft_type):\\n            assert self.freeze_parameters_ratio == 0., (\\n                'lora does not support `freeze_parameters_ratio`, please set `--sft_type full`')\\n            assert len(self.additional_trainable_parameters) == 0, (\\n                'lora does not support `additional_trainable_parameters`, please set `--sft_type full`')\\n            if is_quant_model(self.model_type):\\n                assert self.quantization_bit == 0, (\\n                    f'{self.model_type} is already a quantized model and does not need to be quantized again.')\\n            if self.learning_rate is None:\\n                self.learning_rate = 1e-4\\n            if self.eval_steps is None:\\n                self.eval_steps = 50\\n        elif self.sft_type == 'full':\\n            mllm_arch = get_mllm_arch(self.model_type)\\n            if mllm_arch:\\n                if self.freeze_vit and mllm_arch.vision_tower:\\n                    self.freeze_parameters += mllm_arch.vision_tower\\n                if mllm_arch.generator:\\n                    self.freeze_parameters += mllm_arch.generator\\n            assert 0 <= self.freeze_parameters_ratio <= 1\\n            assert self.quantization_bit == 0, 'Full parameter fine-tuning does not support quantization.'\\n            assert self.dtype != 'fp16', (\\\"Fine-tuning with dtype=='fp16' can lead to NaN issues. \\\"\\n                                          'Please use fp32+AMP or bf16 to perform full parameter fine-tuning.')\\n            if isinstance(self.additional_trainable_parameters, str):\\n                self.additional_trainable_parameters = [self.additional_trainable_parameters]\\n            if self.learning_rate is None:\\n                self.learning_rate = 1e-5\\n            if self.eval_steps is None:\\n                self.eval_steps = 200\\n        else:\\n            raise ValueError(f'sft_type: {self.sft_type}')\\n\\n        self.prepare_template()\\n        if len(self.dataset) == 0:\\n            raise ValueError(f'self.dataset: {self.dataset}, Please input the training dataset.')\\n\\n        if self.save_steps is None:\\n            self.save_steps = self.eval_steps\\n\\n        if self.use_liger:\\n            assert is_liger_available(), 'use_liger requires liger_kernels, try `pip install liger-kernel`'\\n            if self.use_loss_scale:\\n                logger.warn('use_liger is not compatible with `use_loss_scale`, setting to False...')\\n                self.use_loss_scale = False\\n\\n        # compatibility\\n        if self.quantization_bit > 0 and self.quant_method is None:\\n            if self.quantization_bit == 4 or self.quantization_bit == 8:\\n                logger.info('Since you have specified quantization_bit as greater than 0 '\\n                            \\\"and have not designated a quant_method, quant_method will be set to 'bnb'.\\\")\\n                self.quant_method = 'bnb'\\n            else:\\n                self.quant_method = 'hqq'\\n                logger.info('Since you have specified quantization_bit as greater than 0 '\\n                            \\\"and have not designated a quant_method, quant_method will be set to 'hqq'.\\\")\\n\\n        self.bnb_4bit_compute_dtype, self.load_in_4bit, self.load_in_8bit = self.select_bnb()\\n\\n        if self.neftune_backend is None:\\n            self.neftune_backend = 'swift' if version.parse(transformers.__version__) < version.parse('4.35') \\\\\\n                else 'transformers'\\n\\n        self.prepare_ms_hub()\\n        self.train_sampler_random = not self.test_oom_error\\n        if self.eval_batch_size is None:\\n            if self.predict_with_generate:\\n                self.eval_batch_size = 1\\n            else:\\n                self.eval_batch_size = self.batch_size\\n        if self.save_total_limit == -1:\\n            self.save_total_limit = None\\n\\n        if self.deepspeed is not None:\\n            if is_mp():\\n                raise ValueError('DeepSpeed is not compatible with MP. '\\n                                 f'n_gpu: {torch.cuda.device_count()}, '\\n                                 f'local_world_size: {self.local_world_size}.')\\n            require_version('deepspeed')\\n            if self.deepspeed.endswith('.json') or os.path.isfile(self.deepspeed):\\n                with open(self.deepspeed, 'r', encoding='utf-8') as f:\\n                    self.deepspeed = json.load(f)\\n            logger.info(f'Using deepspeed: {self.deepspeed}')\\n\\n        if self.gradient_accumulation_steps is None:\\n            self.gradient_accumulation_steps = math.ceil(16 / self.batch_size / self.world_size)\\n        template_info = TEMPLATE_MAPPING[self.template_type]\\n        self._handle_streaming_args()\\n        if self.lazy_tokenize is None and not self.streaming:\\n            self.lazy_tokenize = template_info.get('lazy_tokenize', False)\\n            logger.info(f'Setting args.lazy_tokenize: {self.lazy_tokenize}')\\n        if self.dataloader_num_workers is None:\\n            if 'dataloader_num_workers' in template_info:\\n                self.dataloader_num_workers = template_info['dataloader_num_workers']\\n            elif platform.system() == 'Windows':\\n                self.dataloader_num_workers = 0\\n            else:\\n                self.dataloader_num_workers = 1\\n            logger.info(f'Setting args.dataloader_num_workers: {self.dataloader_num_workers}')\\n        if 'dataloader_pin_memory' in template_info:\\n            self.dataloader_pin_memory = template_info['dataloader_pin_memory']\\n            logger.info(f'Setting args.dataloader_pin_memory: {self.dataloader_pin_memory}')\\n        if 'qwen-audio' in self.model_type:\\n            assert self.preprocess_num_proc == 1 or self.lazy_tokenize, 'not support'\\n        support_gradient_checkpointing = model_info.get('support_gradient_checkpointing', True)\\n        if self.gradient_checkpointing is None:\\n            self.gradient_checkpointing = support_gradient_checkpointing\\n        elif not support_gradient_checkpointing and self.gradient_checkpointing:\\n            logger.warning(f'{self.model_type} not support gradient_checkpointing.')\\n\\n        if use_torchacc():\\n            self.dataloader_drop_last = True\\n\\n        if self.train_backend == 'transformers':\\n            self._init_training_args()\\n        else:\\n            assert is_dist(), 'Please start in distributed mode.'\\n            dist.init_process_group(backend=self.ddp_backend)\\n            if self.min_lr is None:\\n                self.min_lr = self.learning_rate * 0.1\\n        if self.add_output_dir_suffix is None:\\n            self.add_output_dir_suffix = True\\n        if self.add_output_dir_suffix:\\n            if self.train_backend == 'megatron':\\n                self.output_dir = os.path.join(self.output_dir, f'{self.model_type}-tp{self.tp}-pp{self.pp}')\\n            else:\\n                self.output_dir = os.path.join(self.output_dir, self.model_type)\\n            self.output_dir = add_version_to_work_dir(self.output_dir)\\n            logger.info(f'output_dir: {self.output_dir}')\\n            if self.train_backend == 'transformers':\\n                self.training_args.output_dir = self.output_dir\\n                self.training_args.run_name = self.output_dir\\n        if is_local_master():\\n            os.makedirs(self.output_dir, exist_ok=True)\\n        if self.logging_dir is None:\\n            self.logging_dir = f'{self.output_dir}/runs'\\n            if self.train_backend == 'transformers':\\n                self.training_args.logging_dir = self.logging_dir\\n        self.handle_generation_config()\\n\\n    def _init_training_args(self) -> None:\\n        self.train_type = self.rlhf_type if hasattr(self, 'rlhf_type') else 'sft'\\n        training_args_cls, kwargs = TrainerFactory.get_training_args_info(self)\\n        additional_saved_files = []\\n        if self.sft_type == 'full':\\n            additional_saved_files = get_additional_saved_files(self.model_type)\\n\\n        if self.neftune_backend != 'swift':\\n            kwargs['neftune_noise_alpha'] = self.neftune_noise_alpha\\n\\n        parameters = inspect.signature(training_args_cls.__init__).parameters\\n        for k in ['lr_scheduler_kwargs', 'include_num_input_tokens_seen', 'auto_find_batch_size']:\\n            if k in parameters:\\n                kwargs[k] = getattr(self, k)\\n        if 'eval_strategy' in parameters:\\n            kwargs['eval_strategy'] = self.evaluation_strategy\\n        else:\\n            kwargs['evaluation_strategy'] = self.evaluation_strategy\\n\\n        if 'accelerator_config' in parameters:\\n            kwargs['accelerator_config'] = {'dispatch_batches': False}\\n\\n        training_args = training_args_cls(\\n            output_dir=self.output_dir,\\n            logging_dir=self.logging_dir,\\n            per_device_train_batch_size=self.batch_size,\\n            per_device_eval_batch_size=self.eval_batch_size,\\n            gradient_accumulation_steps=self.gradient_accumulation_steps,\\n            learning_rate=self.learning_rate,\\n            weight_decay=self.weight_decay,\\n            max_grad_norm=self.max_grad_norm,\\n            num_train_epochs=self.num_train_epochs,\\n            max_steps=self.max_steps,\\n            lr_scheduler_type=self.lr_scheduler_type,\\n            warmup_ratio=self.warmup_ratio,\\n            warmup_steps=self.warmup_steps,\\n            logging_steps=self.logging_steps,\\n            save_strategy=self.save_strategy,\\n            save_steps=self.save_steps,\\n            save_total_limit=self.save_total_limit,\\n            remove_unused_columns=False,\\n            bf16=self.bf16,\\n            fp16=self.fp16,\\n            eval_steps=self.eval_steps,\\n            dataloader_num_workers=self.dataloader_num_workers,\\n            dataloader_pin_memory=self.dataloader_pin_memory,\\n            metric_for_best_model='rouge-l' if self.predict_with_generate else 'loss',\\n            greater_is_better=self.predict_with_generate,\\n            full_determinism=self.full_determinism,\\n            optim=self.optim,\\n            adam_beta1=self.adam_beta1,\\n            adam_beta2=self.adam_beta2,\\n            adam_epsilon=self.adam_epsilon,\\n            hub_model_id=self.hub_model_id,\\n            hub_private_repo=self.hub_private_repo,\\n            hub_strategy=self.hub_strategy,\\n            hub_token=self.hub_token,\\n            push_to_hub=self.push_to_hub,\\n            resume_from_checkpoint=self.resume_from_checkpoint,\\n            ignore_data_skip=self.ignore_data_skip,\\n            ddp_backend=self.ddp_backend,\\n            gradient_checkpointing=self.gradient_checkpointing,\\n            local_rank=self.local_rank,\\n            save_only_model=self.save_only_model,\\n            train_sampler_random=self.train_sampler_random,\\n            report_to=self.report_to,\\n            deepspeed=self.deepspeed,\\n            additional_saved_files=additional_saved_files,\\n            disable_tqdm=self.disable_tqdm,\\n            save_on_each_node=self.save_on_each_node,\\n            acc_strategy=self.acc_strategy,\\n            save_safetensors=self.save_safetensors,\\n            logging_first_step=True,\\n            metric_warmup_step=self.metric_warmup_step,\\n            fsdp=self.fsdp,\\n            fsdp_config=self.fsdp_config,\\n            dataloader_drop_last=self.dataloader_drop_last,\\n            seed=self.seed,\\n            data_seed=self.dataset_seed,\\n            loss_name=self.loss_name,\\n            **kwargs)\\n\\n        training_args.ddp_find_unused_parameters = self.ddp_find_unused_parameters\\n        training_args.ddp_broadcast_buffers = self.ddp_broadcast_buffers\\n        training_args.ddp_timeout = self.ddp_timeout\\n        if is_dist() and training_args.ddp_find_unused_parameters is None:\\n            if self.gradient_checkpointing:\\n                training_args.ddp_find_unused_parameters = False\\n            else:\\n                training_args.ddp_find_unused_parameters = True\\n\\n        if is_dist() and training_args.ddp_broadcast_buffers is None:\\n            if self.gradient_checkpointing:\\n                training_args.ddp_broadcast_buffers = False\\n            else:\\n                training_args.ddp_broadcast_buffers = True\\n\\n        self.training_args = training_args\\n\\n    def _handle_pai_compat(self) -> None:\\n        assert is_pai_training_job()\\n        logger.info('Handle pai compat...')\\n        pai_tensorboard_dir = get_pai_tensorboard_dir()\\n        if self.logging_dir is None and pai_tensorboard_dir is not None:\\n            self.logging_dir = pai_tensorboard_dir\\n            logger.info(f'Setting args.logging_dir: {self.logging_dir}')\\n        if self.add_output_dir_suffix is None:\\n            self.add_output_dir_suffix = False\\n            logger.info(f'Setting args.add_output_dir_suffix: {self.add_output_dir_suffix}')\\n\\n    def _handle_streaming_args(self) -> None:\\n        if not self.streaming:\\n            return\\n        if self.max_steps == -1:\\n            raise ValueError('Please specify `max_steps` in streaming mode.')\\n\\n        if self.packing:\\n            self.packing = False\\n            logger.warning('Packing is not supported for streaming dataset, set to False')\\n\\n        if self.test_oom_error:\\n            self.test_oom_error = False\\n            logger.warning('test_oom_error is not supported for streaming dataset, set to False')\\n\\n        if self.lazy_tokenize:\\n            self.lazy_tokenize = False\\n            logger.info('lazy_tokenize set to False in streaming dataset')\\n\\n        if self.train_dataset_mix_ratio > 0:\\n            logger.warning('train_dataset_mix_ratio is not supported for streaming dataset, set to 0')\\n            self.train_dataset_mix_ratio = 0\\n\\n        if self.dataset_test_ratio > 0:\\n            logger.info('Set dataset_test_ratio to 0 in streaming mode.'\\n                        'You can manually set val_dataset and val_dataset_sample.'\\n                        'or set streaming_val_size instead to split from train dataset')\\n            self.dataset_test_ratio = 0\\n\\n        if self.train_dataset_sample > 0:\\n            logger.warning('train_dataset_sample is not supported for streaming dataset, set to -1')\\n            self.train_dataset_sample = -1\\n\\n        if self.dataloader_num_workers is None or self.dataloader_num_workers > 0:\\n            logger.info('Set dataloader_num_workers to 0 in streaming mode')\\n            self.dataloader_num_workers = 0\\n\\n\\n@dataclass\\nclass InferArguments(ArgumentsBase):\\n    # You can specify the model by either using the model_type or model_id_or_path.\\n    model_type: Optional[str] = field(\\n        default=None, metadata={'help': f'model_type choices: {list(MODEL_MAPPING.keys())}'})\\n    model_id_or_path: Optional[str] = None\\n    model_revision: Optional[str] = None\\n\\n    sft_type: Literal['lora', 'full', 'longlora', 'adalora', 'ia3', 'llamapro', 'vera', 'boft'] = 'lora'\\n    template_type: str = field(\\n        default='AUTO', metadata={'help': f\\\"template_type choices: {list(TEMPLATE_MAPPING.keys()) + ['AUTO']}\\\"})\\n    infer_backend: Literal['AUTO', 'vllm', 'pt', 'lmdeploy'] = 'AUTO'\\n    ckpt_dir: Optional[str] = field(default=None, metadata={'help': '/path/to/your/vx-xxx/checkpoint-xxx'})\\n    result_dir: Optional[str] = field(default=None, metadata={'help': '/path/to/your/infer_result'})\\n    load_args_from_ckpt_dir: bool = True\\n    load_dataset_config: bool = False\\n    eval_human: Optional[bool] = None\\n\\n    seed: int = 42\\n    dtype: Literal['bf16', 'fp16', 'fp32', 'AUTO'] = 'AUTO'\\n\\n    # multimodal\\n    model_kwargs: Optional[str] = None\\n\\n    # dataset_id or dataset_name or dataset_path or ...\\n    dataset: List[str] = field(\\n        default_factory=list, metadata={'help': f'dataset choices: {list(DATASET_MAPPING.keys())}'})\\n    val_dataset: List[str] = field(\\n        default_factory=list, metadata={'help': f'dataset choices: {list(DATASET_MAPPING.keys())}'})\\n    dataset_seed: Optional[int] = None\\n    dataset_test_ratio: float = 0.01\\n    show_dataset_sample: int = -1\\n    save_result: bool = True\\n    system: Optional[str] = None\\n    tools_prompt: Literal['react_en', 'react_zh', 'toolbench'] = 'react_en'\\n    max_length: int = -1  # -1: no limit\\n    truncation_strategy: Literal['delete', 'truncation_left'] = 'delete'\\n    check_dataset_strategy: Literal['none', 'discard', 'error', 'warning'] = 'none'\\n    # Chinese name and English name\\n    model_name: List[str] = field(default_factory=lambda: [None, None], metadata={'help': \\\"e.g. ['小黄', 'Xiao Huang']\\\"})\\n    model_author: List[str] = field(\\n        default_factory=lambda: [None, None], metadata={'help': \\\"e.g. ['魔搭', 'ModelScope']\\\"})\\n    # 'awq', 'gptq', 'aqlm' are used for inference on pre-quantized models.\\n    quant_method: Literal['bnb', 'hqq', 'eetq', 'awq', 'gptq', 'aqlm'] = None\\n    quantization_bit: Literal[0, 1, 2, 3, 4, 8] = 0  # hqq: 1,2,3,4,8. bnb: 4,8\\n    hqq_axis: Literal[0, 1] = 0\\n    hqq_dynamic_config_path: Optional[str] = None\\n    bnb_4bit_comp_dtype: Literal['fp16', 'bf16', 'fp32', 'AUTO'] = 'AUTO'\\n    bnb_4bit_quant_type: Literal['fp4', 'nf4'] = 'nf4'\\n    bnb_4bit_use_double_quant: bool = True\\n    bnb_4bit_quant_storage: Optional[str] = None\\n\\n    max_new_tokens: int = 2048\\n    do_sample: Optional[bool] = None\\n    temperature: Optional[float] = None\\n    top_k: Optional[int] = None\\n    top_p: Optional[float] = None\\n    repetition_penalty: Optional[float] = None\\n    num_beams: int = 1\\n    stop_words: List[str] = field(default_factory=list)\\n\\n    # rope-scaling\\n    rope_scaling: Literal['linear', 'dynamic'] = None\\n\\n    # other\\n    use_flash_attn: Optional[bool] = None\\n    ignore_args_error: bool = False  # True: notebook compatibility\\n    stream: bool = True\\n    merge_lora: bool = False\\n    merge_device_map: Optional[str] = None\\n    save_safetensors: bool = True\\n    overwrite_generation_config: bool = False\\n    verbose: Optional[bool] = None\\n    local_repo_path: Optional[str] = None\\n    custom_register_path: Optional[str] = None  # .py\\n    custom_dataset_info: Optional[str] = None  # .json\\n    device_map_config: Optional[str] = None\\n    device_max_memory: List[str] = field(default_factory=list)\\n    # None: use env var `MODELSCOPE_API_TOKEN`\\n    hub_token: Optional[str] = field(\\n        default=None, metadata={'help': 'SDK token can be found in https://modelscope.cn/my/myaccesstoken'})\\n\\n    # vllm\\n    gpu_memory_utilization: float = 0.9\\n    tensor_parallel_size: int = 1\\n    max_num_seqs: int = 256\\n    max_model_len: Optional[int] = None\\n    disable_custom_all_reduce: bool = True  # Default values different from vllm\\n    enforce_eager: bool = False\\n    limit_mm_per_prompt: Optional[str] = None  # '{\\\"image\\\": 10, \\\"video\\\": 5}'\\n    vllm_enable_lora: bool = False\\n    vllm_max_lora_rank: int = 16\\n    lora_modules: List[str] = field(default_factory=list)\\n    max_logprobs: int = 20\\n\\n    # lmdeploy\\n    tp: int = 1\\n    cache_max_entry_count: float = 0.8\\n    quant_policy: int = 0  # e.g. 4, 8\\n    vision_batch_size: int = 1  # max_batch_size in VisionConfig\\n\\n    # compatibility. (Deprecated)\\n    self_cognition_sample: int = 0\\n    train_dataset_sample: int = -1  # Used for splitting the validation set.\\n    val_dataset_sample: Optional[int] = None  # -1: all dataset\\n    safe_serialization: Optional[bool] = None\\n    model_cache_dir: Optional[str] = None\\n    merge_lora_and_save: Optional[bool] = None\\n    custom_train_dataset_path: List[str] = field(default_factory=list)\\n    custom_val_dataset_path: List[str] = field(default_factory=list)\\n    vllm_lora_modules: List[str] = None\\n    device_map_config_path: Optional[str] = None\\n\\n    def __post_init__(self) -> None:\\n        super().__post_init__()\\n        if self.ckpt_dir is not None and not self.check_ckpt_dir_correct(self.ckpt_dir):\\n            logger.warning(f'The checkpoint dir {self.ckpt_dir} passed in is invalid, please make sure'\\n                           'the dir contains a `configuration.json` file.')\\n        self.handle_compatibility()\\n        if len(self.val_dataset) > 0:\\n            self.dataset_test_ratio = 0.0\\n            logger.info('Using val_dataset, ignoring dataset_test_ratio')\\n        self.handle_path()\\n        logger.info(f'ckpt_dir: {self.ckpt_dir}')\\n        if self.ckpt_dir is None and self.load_args_from_ckpt_dir:\\n            self.load_args_from_ckpt_dir = False\\n            logger.info('Due to `ckpt_dir` being `None`, `load_args_from_ckpt_dir` is set to `False`.')\\n        if self.load_args_from_ckpt_dir:\\n            self.load_from_ckpt_dir()\\n        else:\\n            assert self.load_dataset_config is False, 'You need to first set `--load_args_from_ckpt_dir true`.'\\n\\n        if self.rope_scaling:\\n            logger.info(f'rope_scaling is set to {self.rope_scaling}, '\\n                        f'please remember to set max_length, which is supposed to be the same as training')\\n        if self.dataset_seed is None:\\n            self.dataset_seed = self.seed\\n        self._handle_dataset_sample()\\n        self._register_self_cognition()\\n        self.handle_custom_register()\\n        self.handle_custom_dataset_info()\\n        self.set_model_type()\\n        self.check_flash_attn()\\n        self.is_multimodal = self._is_multimodal(self.model_type)\\n        self.prepare_ms_hub()\\n\\n        self.torch_dtype, _, _ = self.select_dtype()\\n        self.prepare_template()\\n        if self.eval_human is None:\\n            if len(self.dataset) == 0 and len(self.val_dataset) == 0:\\n                self.eval_human = True\\n            else:\\n                self.eval_human = False\\n            logger.info(f'Setting args.eval_human: {self.eval_human}')\\n        elif self.eval_human is False and len(self.dataset) == 0 and len(self.val_dataset) == 0:\\n            raise ValueError('Please provide the dataset or set `--load_dataset_config true`.')\\n\\n        # compatibility\\n        if self.quantization_bit > 0 and self.quant_method is None:\\n            if self.quantization_bit == 4 or self.quantization_bit == 8:\\n                logger.info('Since you have specified quantization_bit as greater than 0 '\\n                            \\\"and have not designated a quant_method, quant_method will be set to 'bnb'.\\\")\\n                self.quant_method = 'bnb'\\n            else:\\n                self.quant_method = 'hqq'\\n                logger.info('Since you have specified quantization_bit as greater than 0 '\\n                            \\\"and have not designated a quant_method, quant_method will be set to 'hqq'.\\\")\\n\\n        self.bnb_4bit_compute_dtype, self.load_in_4bit, self.load_in_8bit = self.select_bnb()\\n\\n        if self.ckpt_dir is None:\\n            self.sft_type = 'full'\\n\\n        self.handle_infer_backend()\\n        self.handle_generation_config()\\n        self._load_json_or_path('limit_mm_per_prompt')\\n\\n    def handle_infer_backend(self):\\n        model_info = MODEL_MAPPING[self.model_type]\\n        support_vllm = model_info.get('support_vllm', False)\\n        support_lmdeploy = model_info.get('support_lmdeploy', False)\\n        self.lora_request_list = None\\n        if self.infer_backend == 'AUTO':\\n            self.infer_backend = 'pt'\\n            if is_vllm_available() and support_vllm and not self.is_multimodal:\\n                if ((self.sft_type == 'full' or self.sft_type == 'lora' and self.merge_lora)\\n                        and self.quantization_bit == 0):\\n                    self.infer_backend = 'vllm'\\n                if self.vllm_enable_lora:\\n                    self.infer_backend = 'vllm'\\n            if is_lmdeploy_available() and support_lmdeploy and self.is_multimodal:\\n                if ((self.sft_type == 'full' or self.sft_type == 'lora' and self.merge_lora)\\n                        and self.quantization_bit == 0):\\n                    self.infer_backend = 'lmdeploy'\\n        if self.infer_backend == 'vllm':\\n            require_version('vllm')\\n            if not support_vllm:\\n                logger.warning(f'vllm not support `{self.model_type}`')\\n            if self.sft_type == 'lora' and not self.vllm_enable_lora:\\n                assert self.merge_lora, ('To use vLLM, you need to provide the complete weight parameters. '\\n                                         'Please set `--merge_lora true`.')\\n        if self.infer_backend == 'lmdeploy':\\n            require_version('lmdeploy')\\n            assert self.quantization_bit == 0, 'lmdeploy does not support bnb.'\\n            if not support_lmdeploy:\\n                logger.warning(f'lmdeploy not support `{self.model_type}`')\\n            if self.sft_type == 'lora':\\n                assert self.merge_lora, ('To use LMDeploy, you need to provide the complete weight parameters. '\\n                                         'Please set `--merge_lora true`.')\\n\\n        if (self.infer_backend == 'vllm' and self.vllm_enable_lora\\n                or self.infer_backend == 'pt' and isinstance(self, DeployArguments) and self.sft_type == 'lora'):\\n            assert self.ckpt_dir is not None\\n            self.lora_modules.append(f'default-lora={self.ckpt_dir}')\\n            self.lora_request_list, self.use_dora = _parse_lora_modules(self.lora_modules, self.infer_backend == 'vllm')\\n\\n        template_info = TEMPLATE_MAPPING[self.template_type]\\n        if self.num_beams != 1 or not template_info.get('stream', True):\\n            self.stream = False\\n            logger.info('Setting args.stream: False')\\n        self.infer_media_type = template_info.get('infer_media_type', 'none')\\n        if self.infer_media_type == 'none' and self.is_multimodal:\\n            self.infer_media_type = 'interleave'\\n        self.media_type = template_info.get('media_type', 'image')\\n        self.media_key = MediaTag.media_keys.get(self.media_type, 'images')\\n        if self.merge_device_map is None and not isinstance(self, ExportArguments):\\n            self.merge_device_map = 'cpu'\\n\\n    @staticmethod\\n    def check_ckpt_dir_correct(ckpt_dir) -> bool:\\n        \\\"\\\"\\\"Check the checkpoint dir is correct, which means it must contain a `configuration.json` file.\\n        Args:\\n            ckpt_dir: The checkpoint dir\\n        Returns:\\n            A bool value represents the dir is valid or not.\\n        \\\"\\\"\\\"\\n        if not os.path.exists(ckpt_dir):\\n            return False\\n        return os.path.isfile(os.path.join(ckpt_dir, 'configuration.json'))\\n\\n\\n@dataclass\\nclass AppUIArguments(InferArguments):\\n    host: str = '127.0.0.1'\\n    port: int = 7860\\n    share: bool = False\\n    # compatibility. (Deprecated)\\n    server_name: Optional[str] = None\\n    server_port: Optional[int] = None\\n\\n\\n@dataclass\\nclass DeployArguments(InferArguments):\\n    host: str = '0.0.0.0'\\n    port: int = 8000\\n    api_key: Optional[str] = None\\n    ssl_keyfile: Optional[str] = None\\n    ssl_certfile: Optional[str] = None\\n\\n    owned_by: str = 'swift'\\n    served_model_name: Optional[str] = None\\n    verbose: bool = True  # Whether to log request_info\\n    log_interval: int = 10  # Interval for printing global statistics\\n\\n\\n@dataclass\\nclass EvalArguments(InferArguments):\\n\\n    eval_dataset: List[str] = field(default_factory=list)\\n    eval_few_shot: Optional[int] = None\\n    eval_limit: Optional[str] = None\\n\\n    name: str = ''\\n    eval_url: Optional[str] = None\\n    eval_token: str = 'EMPTY'\\n    eval_is_chat_model: Optional[bool] = None\\n    custom_eval_config: Optional[str] = None  # path\\n    eval_use_cache: bool = False\\n    eval_output_dir: str = 'eval_outputs'\\n    eval_backend: Literal['Native', 'OpenCompass'] = 'OpenCompass'\\n    eval_batch_size: int = 8\\n    deploy_timeout: int = 60\\n\\n    do_sample: bool = False  # Note: for evaluation default is False\\n    temperature: float = 0.\\n    eval_nproc: int = 16\\n\\n    def __post_init__(self):\\n        super().__post_init__()\\n        if isinstance(self.eval_dataset, str):\\n            self.eval_dataset = [self.eval_dataset]\\n        if len(self.eval_dataset) == 1 and self.eval_dataset[0] == 'no':\\n            self.eval_dataset = []\\n        if self.eval_url is not None and (self.eval_is_chat_model is None or self.model_type is None):\\n            model = get_model_list_client(url=self.eval_url).data[0]\\n            if self.eval_is_chat_model is None:\\n                self.eval_is_chat_model = model.is_chat\\n            if self.model_type is None:\\n                self.model_type = model.id\\n\\n    def select_dtype(self):\\n        if self.eval_url is None:\\n            return super().select_dtype()\\n        return None, None, None\\n\\n    def set_model_type(self) -> None:\\n        if self.eval_url is None:\\n            super().set_model_type()\\n\\n    def check_flash_attn(self) -> None:\\n        if self.eval_url is None:\\n            super().check_flash_attn()\\n\\n    def prepare_template(self) -> None:\\n        if self.eval_url is None:\\n            super().prepare_template()\\n\\n    def handle_infer_backend(self) -> None:\\n        if self.eval_url is None:\\n            super().handle_infer_backend()\\n\\n    def _is_multimodal(self, model_type: Optional[str] = None) -> bool:\\n        return False if self.eval_url is not None else super()._is_multimodal(model_type)\\n\\n    def _is_vision(self, model_type: Optional[str] = None) -> bool:\\n        return False if self.eval_url is not None else super()._is_vision(model_type)\\n\\n\\n@dataclass\\nclass ExportArguments(InferArguments):\\n    to_peft_format: bool = False\\n    to_ollama: bool = False\\n    ollama_output_dir: Optional[str] = None\\n    gguf_file: Optional[str] = None\\n\\n    # awq: 4; gptq: 2, 3, 4, 8\\n    quant_bits: int = 0  # e.g. 4\\n    quant_method: Literal['awq', 'gptq', 'bnb'] = 'awq'\\n    quant_n_samples: int = 256\\n    quant_seqlen: int = 2048\\n    quant_device_map: Optional[str] = None  # e.g. 'cpu', 'auto'\\n    quant_output_dir: Optional[str] = None\\n    quant_batch_size: int = 1\\n\\n    # push to ms hub\\n    push_to_hub: bool = False\\n    # 'user_name/repo_name' or 'repo_name'\\n    hub_model_id: Optional[str] = None\\n    hub_private_repo: bool = False\\n    commit_message: str = 'update files'\\n\\n    # megatron\\n    to_megatron: bool = False\\n    to_hf: bool = False\\n    megatron_output_dir: Optional[str] = None\\n    hf_output_dir: Optional[str] = None\\n    tp: int = 1\\n    pp: int = 1\\n\\n    # The parameter has been defined in InferArguments.\\n    # merge_lora, hub_token\\n\\n    def __post_init__(self):\\n        if self.merge_device_map is None and self.quant_bits > 0:\\n            self.merge_device_map = 'cpu'\\n        if self.quant_bits > 0 and self.dtype == 'AUTO':\\n            self.dtype = 'fp16'\\n            logger.info(f'Setting args.dtype: {self.dtype}')\\n        super().__post_init__()\\n        if self.quant_bits > 0:\\n            if len(self.dataset) == 0:\\n                self.dataset = ['alpaca-zh#10000', 'alpaca-en#10000']\\n                logger.info(f'Setting args.dataset: {self.dataset}')\\n            if self.quant_output_dir is None:\\n                if self.ckpt_dir is None:\\n                    self.quant_output_dir = f'{self.model_type}-{self.quant_method}-int{self.quant_bits}'\\n                else:\\n                    ckpt_dir, ckpt_name = os.path.split(self.ckpt_dir)\\n                    self.quant_output_dir = os.path.join(ckpt_dir,\\n                                                         f'{ckpt_name}-{self.quant_method}-int{self.quant_bits}')\\n                self.quant_output_dir = self._check_path(self.quant_output_dir)\\n                logger.info(f'Setting args.quant_output_dir: {self.quant_output_dir}')\\n            assert not os.path.exists(self.quant_output_dir), f'args.quant_output_dir: {self.quant_output_dir}'\\n        elif self.to_ollama:\\n            assert self.sft_type in ('full', 'lora', 'longlora', 'llamapro')\\n            if self.sft_type in ('lora', 'longlora', 'llamapro'):\\n                self.merge_lora = True\\n            if not self.ollama_output_dir:\\n                self.ollama_output_dir = f'{self.model_type}-ollama'\\n            self.ollama_output_dir = self._check_path(self.ollama_output_dir)\\n            assert not os.path.exists(\\n                self.ollama_output_dir), f'Please make sure your output dir does not exists: {self.ollama_output_dir}'\\n        elif self.to_megatron or self.to_hf:\\n            self.quant_method = None\\n            os.environ['RANK'] = '0'\\n            os.environ['LOCAL_RANK'] = '0'\\n            os.environ['WORLD_SIZE'] = '1'\\n            os.environ['LOCAL_WORLD_SIZE'] = '1'\\n            os.environ['MASTER_ADDR'] = '127.0.0.1'\\n            os.environ['MASTER_PORT'] = os.environ.get('MASTER_PORT', '29500')\\n            assert is_dist(), 'Please start in distributed mode.'\\n            dist.init_process_group(backend='nccl')\\n        if self.to_megatron:\\n            if self.megatron_output_dir is None:\\n                self.megatron_output_dir = f'{self.model_type}-tp{self.tp}-pp{self.pp}'\\n            self.megatron_output_dir = self._check_path(self.megatron_output_dir)\\n            logger.info(f'Setting args.megatron_output_dir: {self.megatron_output_dir}')\\n        if self.to_hf:\\n            if self.hf_output_dir is None:\\n                self.hf_output_dir = os.path.join(self.ckpt_dir, f'{self.model_type}-hf')\\n            self.hf_output_dir = self._check_path(self.hf_output_dir)\\n            logger.info(f'Setting args.hf_output_dir: {self.hf_output_dir}')\\n\\n\\n@dataclass\\nclass PtArguments(SftArguments):\\n    sft_type: Literal['lora', 'full', 'longlora', 'adalora', 'ia3', 'llamapro', 'vera', 'boft'] = 'full'\\n    target_modules: List[str] = field(default_factory=lambda: ['ALL'])\\n    lazy_tokenize: Optional[bool] = True\\n    eval_steps: int = 500\\n\\n\\n@dataclass\\nclass RLHFArguments(SftArguments):\\n    rlhf_type: Literal['dpo', 'orpo', 'simpo', 'kto', 'cpo'] = 'dpo'\\n    ref_model_type: Optional[str] = field(\\n        default=None, metadata={'help': f'model_type choices: {list(MODEL_MAPPING.keys())}'})\\n    ref_model_id_or_path: Optional[str] = None\\n    ref_model_revision: Optional[str] = None\\n\\n    beta: Optional[float] = None\\n    label_smoothing: float = 0\\n    # dpo: 'sigmoid', 'hinge', 'ipo', 'exo_pair', 'nca_pair', 'robust', 'bco_pair',\\n    #      'sppo_hard', 'aot', 'aot_pair', 'apo_zero', 'apo_down'\\n    # cpo: 'sigmoid', 'hinge', 'ipo', 'simpo'\\n    loss_type: Optional[str] = None\\n    # DPO\\n    # The alpha parameter from the [RPO](https://huggingface.co/papers/2404.19733) paper V3.\\n    # The paper recommends `rpo_alpha=1.0`.\\n    rpo_alpha: float = 1.\\n    # CPO\\n    cpo_alpha: float = 1.\\n    # SimPO\\n    simpo_gamma: float = 1\\n    # KTO\\n    desirable_weight: float = 1.0\\n    undesirable_weight: float = 1.0\\n\\n    def __post_init__(self):\\n        self._check_simpo()\\n        self._set_default()\\n        self.ref_model_free = self.rlhf_type in ['cpo', 'orpo']\\n        super().__post_init__()\\n\\n    def _check_simpo(self):\\n        if self.rlhf_type != 'simpo':\\n            return\\n\\n        self.rlhf_type = 'cpo'\\n        if self.loss_type is None:\\n            self.loss_type = 'simpo'\\n        if self.beta is None:\\n            self.beta = 2.\\n\\n    def _set_default(self):\\n        if self.beta is None:\\n            self.beta = 0.1\\n        if self.loss_type is None:\\n            if self.rlhf_type in ['dpo', 'cpo']:\\n                self.loss_type = 'sigmoid'  # else None\\n\\n\\n@dataclass\\nclass WebuiArguments:\\n    share: bool = False\\n    lang: str = 'zh'\\n    host: str = '127.0.0.1'\\n    port: int = 7860\\n\\n\\n@dataclass\\nclass RomeArguments(InferArguments):\\n    rome_request_file: str = field(\\n        default=None, metadata={'help': 'The rome request file, please check the documentation '\\n                                'to get the format'})\\n\\n    def __post_init__(self) -> None:\\n        self.handle_compatibility()\\n        self.handle_path()\\n        self.set_model_type()\\n        self.check_flash_attn()\\n\\n        self.torch_dtype, _, _ = self.select_dtype()\\n        if self.template_type == 'AUTO':\\n            self.template_type = get_default_template_type(self.model_type)\\n            logger.info(f'Setting template_type: {self.template_type}')\\n\\n        if self.max_length == -1:\\n            self.max_length = None\\n\\n\\ndtype_mapping_reversed = {v: k for k, v in dtype_mapping.items()}\\n\\n\\ndef swift_to_peft_format(lora_checkpoint_path: str) -> str:\\n    if 'default' in os.listdir(lora_checkpoint_path):  # swift_backend\\n        new_lora_checkpoint_path = f'{lora_checkpoint_path}-peft'\\n        Swift.save_to_peft_format(lora_checkpoint_path, new_lora_checkpoint_path)\\n        lora_checkpoint_path = new_lora_checkpoint_path\\n        logger.info('Converting the swift format checkpoint to peft format, '\\n                    f\\\"and saving it to: '{new_lora_checkpoint_path}'\\\")\\n    else:\\n        logger.info('The format of the checkpoint is already in peft format.')\\n    return lora_checkpoint_path\\n\\n\\ndef _parse_lora_modules(lora_modules: List[str], use_vllm: bool) -> Tuple[List[Any], bool]:\\n    VllmLoRARequest = None\\n    if use_vllm:\\n        try:\\n            from .vllm_utils import LoRARequest as VllmLoRARequest\\n        except ImportError:\\n            logger.warning('The current version of VLLM does not support `enable_lora`. Please upgrade VLLM.')\\n            raise\\n\\n    @dataclass\\n    class PtLoRARequest:\\n        lora_name: str\\n        lora_int_id: int\\n        lora_local_path: str\\n\\n    LoRARequest = VllmLoRARequest if use_vllm else PtLoRARequest\\n    lora_request_list = []\\n    use_dora_list = []\\n    for i, lora_module in enumerate(lora_modules):\\n        lora_name, lora_local_path = lora_module.split('=')\\n        lora_local_path = swift_to_peft_format(lora_local_path)\\n        with open(os.path.join(lora_local_path, 'adapter_config.json'), 'r') as f:\\n            _json = json.load(f)\\n            use_dora_list.append(_json.get('use_dora', False))\\n        lora_request_list.append(LoRARequest(lora_name, i + 1, lora_local_path))\\n    if any(use_dora_list) and len(lora_modules) > 1:\\n        raise ValueError('Dora does not support inference with other loras')\\n    elif not any(use_dora_list):\\n        use_dora = False\\n    else:\\n        use_dora = True\\n    return lora_request_list, use_dora\\n\\n\\nimport asyncio\\nimport concurrent.futures\\nimport inspect\\nimport os\\nimport time\\nfrom contextlib import contextmanager\\nfrom copy import deepcopy\\nfrom dataclasses import dataclass\\nfrom functools import wraps\\nfrom queue import Queue\\nfrom threading import Thread\\nfrom typing import Any, Dict, Iterator, List, Optional, Tuple, Union\\n\\nimport torch\\nfrom lmdeploy import PytorchEngineConfig, TurbomindEngineConfig, VisionConfig, pipeline\\nfrom lmdeploy.api import autoget_backend_config\\nfrom lmdeploy.serve.async_engine import AsyncEngine\\nfrom lmdeploy.serve.vl_async_engine import VLAsyncEngine\\nfrom tqdm import tqdm\\nfrom transformers import AutoConfig, AutoTokenizer, GenerationConfig\\n\\nfrom swift.utils import get_logger, get_seed\\nfrom .argument import InferArguments\\nfrom .model import get_model_tokenizer\\nfrom .template import Template, get_template\\nfrom .utils import get_max_model_len\\n\\ntry:\\n    from lmdeploy import EngineGenerationConfig as _LmdeployGenerationConfig\\nexcept ImportError:\\n    # lmdeploy removed EngineGenerationConfig after v0.6.0\\n    from lmdeploy import GenerationConfig as _LmdeployGenerationConfig\\n\\nlogger = get_logger()\\n\\n\\n@contextmanager\\ndef _patch_pipeline(tokenizer):\\n    _old_from_pretrained = AutoTokenizer.from_pretrained\\n\\n    @wraps(_old_from_pretrained)\\n    def _from_pretrained(self, *args, **kwargs):\\n        return tokenizer\\n\\n    AutoTokenizer.from_pretrained = _from_pretrained\\n\\n    from lmdeploy.serve import async_engine\\n    _old_best_match_model = async_engine.best_match_model\\n\\n    def _best_match_model(query: str) -> Optional[str]:\\n        return tokenizer.model_type\\n\\n    async_engine.best_match_model = _best_match_model\\n    yield\\n    AutoTokenizer.from_pretrained = _old_from_pretrained\\n    async_engine.best_match_model = _old_best_match_model\\n\\n\\ndef get_lmdeploy_engine(\\n        model_type: str,\\n        # TODO: https://github.com/InternLM/lmdeploy/issues/1846\\n        # torch_dtype: Optional[torch.dtype] = None,\\n        *,\\n        model_id_or_path: Optional[str] = None,\\n        revision: Optional[str] = None,\\n        tp: int = 1,\\n        cache_max_entry_count: float = 0.8,\\n        quant_policy: int = 0,  # e.g. 4, 8\\n        vision_batch_size: int = 1,  # max_batch_size in VisionConfig\\n        engine_kwargs: Optional[Dict[str, Any]] = None,\\n        **kwargs) -> Union[AsyncEngine, VLAsyncEngine]:\\n    model_dir = kwargs.pop('model_dir', None)\\n    tokenizer = get_model_tokenizer(\\n        model_type,\\n        load_model=False,\\n        model_id_or_path=model_id_or_path,\\n        model_dir=model_dir,\\n        revision=revision,\\n        download_model=True)[1]\\n    model_dir = tokenizer.model_dir\\n    model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n\\n    if engine_kwargs is None:\\n        engine_kwargs = {}\\n    engine_kwargs['tp'] = tp\\n    engine_kwargs['cache_max_entry_count'] = cache_max_entry_count\\n    engine_kwargs['quant_policy'] = quant_policy\\n\\n    backend_config = TurbomindEngineConfig(**engine_kwargs)\\n    backend_config = autoget_backend_config(model_dir, backend_config)\\n    if isinstance(backend_config, PytorchEngineConfig):\\n        backend_config.thread_safe = True\\n    logger.info(f'backend_config: {backend_config}')\\n    pipeline_kwargs = {}\\n    is_multimodal = tokenizer.is_multimodal\\n    if is_multimodal:\\n        vision_config = VisionConfig(max_batch_size=vision_batch_size)\\n        pipeline_kwargs['vision_config'] = vision_config\\n        logger.info(f'vision_config: {vision_config}')\\n\\n    with _patch_pipeline(tokenizer):\\n        lmdeploy_engine = pipeline(model_dir, backend_config=backend_config, **pipeline_kwargs)\\n\\n    lmdeploy_engine.model_dir = model_dir\\n    lmdeploy_engine.model_type = model_type\\n    lmdeploy_engine.is_multimodal = is_multimodal\\n    lmdeploy_engine.hf_tokenizer = tokenizer\\n    lmdeploy_engine.model_config = model_config\\n    lmdeploy_engine.max_model_len = get_max_model_len(model_config)\\n\\n    generation_config_path = os.path.join(model_dir, 'generation_config.json')\\n    if os.path.isfile(generation_config_path):\\n        generation_config = GenerationConfig.from_pretrained(model_dir)\\n        kwargs = generation_config.to_dict()\\n        if kwargs.get('max_new_tokens') is None:\\n            kwargs.pop('max_new_tokens', None)\\n        parameters = inspect.signature(LmdeployGenerationConfig.__init__).parameters\\n        for k, v in kwargs.copy().items():\\n            if k not in parameters or v is None:\\n                kwargs.pop(k)\\n        lmdeploy_engine.generation_config = LmdeployGenerationConfig(**kwargs)\\n    else:\\n        lmdeploy_engine.generation_config = LmdeployGenerationConfig()\\n\\n    return lmdeploy_engine\\n\\n\\n@dataclass\\nclass LmdeployGenerationConfig(_LmdeployGenerationConfig):\\n    max_new_tokens: int = 64\\n    temperature: float = 1.\\n    top_k: int = 50  # -1: all\\n    top_p: float = 1.\\n    repetition_penalty: float = 1.\\n\\n    n: int = 1\\n    stop_words: Optional[List[int]] = None\\n    logprobs: Optional[int] = None\\n    random_seed: Optional[int] = None\\n    skip_special_tokens: bool = False\\n    do_sample: bool = True  # compat lmdeploy==0.6\\n\\n    def __post_init__(self):\\n        if self.stop_words is None:\\n            self.stop_words = []\\n        self._temperature = self.temperature\\n\\n        super().__post_init__()\\n\\n    def __setattr__(self, key: str, value: str) -> None:\\n        if key == 'max_length':\\n            raise ValueError('`max_length` is not supported, please use `max_new_tokens` for setting.')\\n\\n        if key == 'do_sample' and hasattr(self, '_temperature'):\\n            assert value in {True, False}\\n            super().__setattr__('temperature', self._temperature if value else 0)\\n        elif key == 'temperature':\\n            self._temperature = value\\n        elif key == 'stop_words' and hasattr(self, 'stop_token_ids'):  # compat lmdeploy==0.6\\n            self.stop_token_ids = value\\n        super().__setattr__(key, value)\\n\\n\\ndef _add_stop_word(stop_words: List[int], token: Union[List[int], int, str, None], tokenizer=None) -> None:\\n    if token is None:\\n        return\\n    elif isinstance(token, int):\\n        stop_words.append(token)\\n    elif isinstance(token, str) and tokenizer is not None:\\n        token_list = tokenizer.encode(token, add_special_tokens=False)\\n        if len(token_list) == 1 and token_list[0] not in stop_words:\\n            stop_words.append(token_list[0])\\n    elif isinstance(token, list) and len(token) == 1 and token[0] not in stop_words:\\n        stop_words.append(token[0])\\n\\n\\ndef _prepare_lmdeploy_request(lmdeploy_engine: Union[AsyncEngine, VLAsyncEngine],\\n                              template: Template,\\n                              request_list: List[Dict[str, Any]],\\n                              *,\\n                              generation_config: LmdeployGenerationConfig,\\n                              generation_info: Dict[str, Any],\\n                              use_tqdm: bool = False,\\n                              **kwargs):\\n    for key in ['num_prompt_tokens', 'num_generated_tokens', 'num_samples']:\\n        if key not in generation_info:\\n            generation_info[key] = 0\\n\\n    if hasattr(lmdeploy_engine, 'vl_encoder'):\\n        lmdeploy_engine.vl_encoder._loop_task = None\\n\\n    template.model = lmdeploy_engine\\n    tokenizer = template.tokenizer\\n\\n    _add_stop_word(generation_config.stop_words, tokenizer.eos_token_id, tokenizer=tokenizer)\\n    _add_stop_word(generation_config.stop_words, template.suffix[-1], tokenizer=tokenizer)\\n    if generation_config.random_seed is None:\\n        generation_config.random_seed = get_seed()\\n\\n    resp_list: List[Optional[Dict[str, Any]]] = [None] * len(request_list)\\n    generators = []\\n    is_multimodal = getattr(lmdeploy_engine, 'is_multimodal', False)\\n    max_workers = os.cpu_count()\\n    if not is_multimodal:\\n        use_tqdm = False\\n        max_workers = 1\\n\\n    prog_bar = tqdm(request_list, dynamic_ncols=True, disable=not use_tqdm)\\n\\n    def _prepare_inputs(request: Dict[str, Any]) -> Dict[str, Any]:\\n        request['history'] = request.get('history') or []\\n        inputs = template.encode(request)[0]\\n        prog_bar.update()\\n        return inputs\\n\\n    with template.lmdeploy_context(), concurrent.futures.ThreadPoolExecutor(\\n            max_workers=min(max_workers, len(request_list))) as executor:\\n        futures = [executor.submit(_prepare_inputs, request) for request in request_list]\\n        concurrent.futures.wait(futures)\\n        inputs_list = [future.result() for future in futures]\\n    prog_bar.close()\\n\\n    for i, (inputs, request) in enumerate(zip(inputs_list, request_list)):\\n        truncation_strategy = kwargs.pop('truncation_strategy', 'delete')\\n        if len(inputs) == 0 and truncation_strategy == 'delete':\\n            # input_ids exceeds `max_length`. Please increase the value of `max_length`.\\n            resp_list[i] = {'response': '', 'history': request['history']}\\n            continue\\n        generator = lmdeploy_engine.get_generator(False, i)\\n        generators.append((i, inputs, generator))\\n\\n    generation_info['num_samples'] = len(generators)\\n    return resp_list, generators\\n\\n\\n@torch.inference_mode()\\ndef inference_stream_lmdeploy(lmdeploy_engine: Union[AsyncEngine, VLAsyncEngine],\\n                              template: Template,\\n                              request_list: List[Dict[str, Any]],\\n                              *,\\n                              generation_config: Optional[LmdeployGenerationConfig] = None,\\n                              generation_info: Optional[Dict[str, Any]] = None,\\n                              use_tqdm: bool = False,\\n                              **kwargs) -> Iterator[List[Dict[str, Any]]]:\\n    \\\"\\\"\\\"\\n    request_list: e.g. [{'query': 'hello!'}].\\n        The keys that can be included are: 'query', 'history', 'system', 'images'.\\n    \\\"\\\"\\\"\\n    if len(request_list) == 0:\\n        return\\n    start_runtime = time.perf_counter()\\n    if generation_config is None:\\n        generation_config = getattr(lmdeploy_engine, 'generation_config', None) or LmdeployGenerationConfig()\\n    assert isinstance(generation_config, LmdeployGenerationConfig)\\n    request_list = deepcopy(request_list)\\n    generation_config = deepcopy(generation_config)\\n    if generation_info is None:\\n        generation_info = {}\\n    else:\\n        generation_info.clear()\\n\\n    resp_list, generators = _prepare_lmdeploy_request(\\n        lmdeploy_engine,\\n        template,\\n        request_list,\\n        generation_config=generation_config,\\n        generation_info=generation_info,\\n        use_tqdm=use_tqdm,\\n        **kwargs)\\n\\n    n_finished = 0\\n    print_idx_list = [[0] for _ in range(len(request_list))]\\n    outputs = [None] * len(request_list)\\n    num_generated_tokens = [0] * len(request_list)\\n    prog_bar = tqdm(total=len(generators), dynamic_ncols=True, disable=not use_tqdm)\\n    queue = Queue()\\n\\n    async def _inner_infer(i: int, inputs: Dict[str, Any], generator) -> None:\\n        generator = await generator\\n        images = inputs.pop('images', None) or []\\n        if len(images) > 0:\\n            inputs['images'] = await lmdeploy_engine.vl_encoder.async_infer(images)\\n            await template.prepare_lmdeploy_inputs(inputs)\\n        generation_info['num_prompt_tokens'] += len(inputs['input_ids'])\\n        async with lmdeploy_engine.safe_run(i):\\n            async for output in generator.async_stream_infer(\\n                    session_id=i, **inputs, stream_output=True, gen_config=generation_config):\\n                queue.put((i, output))\\n            queue.put((i, None))\\n\\n    async def _batch_infer() -> None:\\n        tasks = [_inner_infer(i, inputs, generator) for i, inputs, generator in generators]\\n        await asyncio.gather(*tasks)\\n\\n    thread = Thread(target=lambda: asyncio.run(_batch_infer()))\\n    thread.start()\\n\\n    while n_finished < len(generators):\\n        i, output = queue.get()\\n        is_finished = False\\n        if output is None:\\n            is_finished = True\\n            n_finished += 1\\n            prog_bar.update()\\n            output = outputs[i]  # old value\\n        outputs[i] = output\\n        request = request_list[i]\\n        logprobs = output.logprobs\\n        safe_response = template.generate_ids_to_response(output.token_ids, is_finished, print_idx=print_idx_list[i])\\n        query = request['query']\\n        history = request['history']\\n        if resp_list[i] is None:\\n            history.append(None)\\n        history[-1] = [query, safe_response]\\n        n_gen_tokens = len(output.token_ids)\\n        generation_info['num_generated_tokens'] += n_gen_tokens - num_generated_tokens[i]\\n        num_generated_tokens[i] = n_gen_tokens\\n        resp_list[i] = {'response': safe_response, 'history': history}\\n        if logprobs is not None:\\n            resp_list[i]['logprobs'] = logprobs\\n\\n        runtime = time.perf_counter() - start_runtime\\n        generation_info['runtime'] = runtime\\n        generation_info['samples/s'] = n_finished / runtime\\n        generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n        yield resp_list\\n    prog_bar.close()\\n\\n\\n@torch.inference_mode()\\ndef inference_lmdeploy(lmdeploy_engine: Union[AsyncEngine, VLAsyncEngine],\\n                       template: Template,\\n                       request_list: List[Dict[str, Any]],\\n                       *,\\n                       generation_config: Optional[LmdeployGenerationConfig] = None,\\n                       generation_info: Optional[Dict[str, Any]] = None,\\n                       max_batch_size: Optional[int] = None,\\n                       use_tqdm: bool = False,\\n                       verbose: bool = False,\\n                       prompt_prefix: str = '[PROMPT]',\\n                       output_prefix: str = '[OUTPUT]',\\n                       **kwargs) -> List[Dict[str, Any]]:\\n    \\\"\\\"\\\"\\n    request_list: e.g. [{'query': 'hello!'}].\\n        The keys that can be included are: 'query', 'history', 'system', 'images'.\\n    \\\"\\\"\\\"\\n    if len(request_list) == 0:\\n        return []\\n    runtime = time.perf_counter()\\n\\n    is_multimodal = getattr(lmdeploy_engine, 'is_multimodal', False)\\n    if is_multimodal and max_batch_size is None:\\n        max_batch_size = 512\\n\\n    _inner_call = kwargs.get('_inner_call', False)\\n    if generation_info is None:\\n        generation_info = {}\\n    elif not _inner_call:\\n        generation_info.clear()\\n    if max_batch_size is not None and len(request_list) > max_batch_size:\\n        i = 0\\n        resp_list = []\\n        kwargs['_inner_call'] = True\\n        while i < len(request_list):\\n            resp_list += inference_lmdeploy(\\n                lmdeploy_engine,\\n                template,\\n                request_list[i:i + max_batch_size],\\n                generation_config=generation_config,\\n                generation_info=generation_info,\\n                max_batch_size=max_batch_size,\\n                use_tqdm=use_tqdm,\\n                verbose=verbose,\\n                prompt_prefix=prompt_prefix,\\n                output_prefix=output_prefix,\\n                **kwargs)\\n            i += max_batch_size\\n        runtime = time.perf_counter() - runtime\\n        generation_info['runtime'] = runtime\\n        generation_info['samples/s'] = generation_info['num_samples'] / runtime\\n        generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n        return resp_list\\n\\n    if generation_config is None:\\n        generation_config = getattr(lmdeploy_engine, 'generation_config', None) or LmdeployGenerationConfig()\\n    assert isinstance(generation_config, LmdeployGenerationConfig)\\n    request_list = deepcopy(request_list)\\n    generation_config = deepcopy(generation_config)\\n\\n    resp_list, generators = _prepare_lmdeploy_request(\\n        lmdeploy_engine,\\n        template,\\n        request_list,\\n        generation_config=generation_config,\\n        generation_info=generation_info,\\n        use_tqdm=use_tqdm,\\n        **kwargs)\\n\\n    tokenizer = template.tokenizer\\n    if use_tqdm:\\n        assert verbose is False\\n    prog_bar = tqdm(total=len(generators), dynamic_ncols=True, disable=not use_tqdm)\\n\\n    async def _inner_infer(i: int, inputs: Dict[str, Any], generator) -> None:\\n        generator = await generator\\n        images = inputs.pop('images', None) or []\\n        if len(images) > 0:\\n            inputs['images'] = await lmdeploy_engine.vl_encoder.async_infer(images)\\n            await template.prepare_lmdeploy_inputs(inputs)\\n        generation_info['num_prompt_tokens'] += len(inputs['input_ids'])\\n        async with lmdeploy_engine.safe_run(i):\\n            async for output in generator.async_stream_infer(\\n                    session_id=i, **inputs, stream_output=False, gen_config=generation_config):\\n                pass\\n        request = request_list[i]\\n        input_ids = inputs['input_ids']\\n        logprobs = output.logprobs\\n        response = template.generate_ids_to_response(output.token_ids)\\n        query = request['query']\\n        history = request['history']\\n        history.append([query, response])\\n\\n        generation_info['num_generated_tokens'] += len(output.token_ids)\\n        resp_list[i] = {'response': response, 'history': history}\\n        if logprobs is not None:\\n            resp_list[i]['logprobs'] = logprobs\\n        if verbose:\\n            print(f'{prompt_prefix}{tokenizer.decode(input_ids, False)}{output_prefix}', end='')\\n            print(tokenizer.decode(output.token_ids, False))\\n        prog_bar.update()\\n\\n    async def _batch_infer() -> None:\\n        tasks = [_inner_infer(i, inputs, generator) for i, inputs, generator in generators]\\n        await asyncio.gather(*tasks)\\n\\n    asyncio.run(_batch_infer())\\n    prog_bar.close()\\n    runtime = time.perf_counter() - runtime\\n    generation_info['runtime'] = runtime\\n    generation_info['samples/s'] = generation_info['num_samples'] / runtime\\n    generation_info['tokens/s'] = generation_info['num_generated_tokens'] / runtime\\n    return resp_list\\n\\n\\ndef prepare_lmdeploy_engine_template(args: InferArguments) -> Tuple[Union[AsyncEngine, VLAsyncEngine], Template]:\\n    logger.info(f'device_count: {torch.cuda.device_count()}')\\n\\n    assert args.quantization_bit == 0, 'not support bnb'\\n    assert not args.sft_type == 'lora', 'you need to merge lora'\\n    # Loading Model and Tokenizer\\n    model_id_or_path = None\\n    if args.sft_type == 'full' and args.ckpt_dir is not None:\\n        model_id_or_path = args.ckpt_dir\\n    elif args.model_id_or_path is not None:\\n        model_id_or_path = args.model_id_or_path\\n    lmdeploy_engine = get_lmdeploy_engine(\\n        args.model_type,\\n        tp=args.tp,\\n        cache_max_entry_count=args.cache_max_entry_count,\\n        quant_policy=args.quant_policy,\\n        vision_batch_size=args.vision_batch_size,\\n        model_id_or_path=model_id_or_path)\\n    tokenizer = lmdeploy_engine.hf_tokenizer\\n\\n    stop_words = []\\n    for stop_word in args.stop_words:\\n        _add_stop_word(stop_words, stop_word, tokenizer=tokenizer)\\n    setattr(lmdeploy_engine.generation_config, 'max_new_tokens', args.max_new_tokens)\\n    for k in ['temperature', 'do_sample', 'top_k', 'top_p', 'repetition_penalty']:\\n        val = getattr(args, k, None)\\n        if val is not None:\\n            setattr(lmdeploy_engine.generation_config, k, val)\\n    logger.info(f'lmdeploy_engine.generation_config: {lmdeploy_engine.generation_config}')\\n\\n    template: Template = get_template(\\n        args.template_type,\\n        tokenizer,\\n        args.system,\\n        args.max_length,\\n        args.truncation_strategy,\\n        model=lmdeploy_engine,\\n        tools_prompt=args.tools_prompt)\\n    args.system = template.default_system\\n    logger.info(f'system: {args.system}')\\n    return lmdeploy_engine, template\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport inspect\\nimport os\\nimport re\\nfrom contextlib import contextmanager\\nfrom copy import deepcopy\\nfrom datetime import datetime\\nfrom functools import partial, wraps\\nfrom types import MethodType\\nfrom typing import Any, Callable, Dict, List, Literal, Optional, Tuple, TypeVar, Union\\n\\nimport json\\nimport torch\\nimport torch.nn.functional as F\\nimport transformers\\nfrom packaging import version\\nfrom peft import PeftModel\\nfrom torch.nn.utils.rnn import pad_sequence\\nfrom transformers import PreTrainedTokenizerBase, StoppingCriteria\\nfrom transformers.dynamic_module_utils import get_class_from_dynamic_module\\nfrom transformers.integrations import is_deepspeed_zero3_enabled\\nfrom transformers.utils import strtobool\\n\\nfrom swift.llm.agent.utils import calculate_loss_scale, get_tools_prompt\\nfrom swift.torchacc_utils import pad_and_split_batch\\nfrom swift.utils import get_dist_setting, get_logger, upper_bound, use_torchacc\\nfrom .vision_utils import (load_audio_qwen, load_batch, load_image, load_video_cogvlm2, load_video_internvl,\\n                           load_video_llava, load_video_minicpmv_mplug_owl3, load_video_qwen2, rescale_image,\\n                           transform_image)\\n\\nlogger = get_logger()\\n\\nDEFAULT_SYSTEM = 'You are a helpful assistant.'\\nHistory = List[Union[Tuple[str, str], List[str]]]\\nPrompt = List[Union[str, List[int], List[str]]]\\nStopWords = Prompt\\nContext = Union[str, List[int]]\\nTEMPLATE_MAPPING: Dict[str, Dict[str, Any]] = {}\\n\\n\\nclass TemplateType:\\n    # text-generation\\n    default_generation = 'default-generation'\\n    chatglm_generation = 'chatglm-generation'\\n    qwen_vl_generation = 'qwen-vl-generation'\\n    qwen_audio_generation = 'qwen-audio-generation'\\n    # chat\\n    default = 'default'\\n    qwen = 'qwen'\\n    qwen2_5 = 'qwen2_5'\\n    qwen_vl = 'qwen-vl'\\n    qwen_audio = 'qwen-audio'\\n    qwen2_audio = 'qwen2-audio'\\n    qwen2_audio_generation = 'qwen2-audio-generation'\\n    qwen2_vl = 'qwen2-vl'\\n    qwen2_vl_generation = 'qwen2-vl-generation'\\n    modelscope_agent = 'modelscope-agent'\\n    baichuan = 'baichuan'\\n    chatglm2 = 'chatglm2'\\n    chatglm3 = 'chatglm3'\\n    chatglm4 = 'chatglm4'\\n    codegeex4 = 'codegeex4'\\n    llama = 'llama'  # llama2\\n    llama3 = 'llama3'\\n    llama3_1_omni = 'llama3_1-omni'\\n    llama3_2 = 'llama3_2'\\n    llama3_2_vision = 'llama3_2-vision'\\n    llama3_2_vision_generation = 'llama3_2-vision-generation'\\n    reflection = 'reflection'\\n    longwriter_llama3 = 'longwriter-llama3'\\n    # llava-hf\\n    llava1_5 = 'llava1_5'\\n    llava_mistral = 'llava-mistral'\\n    llava_vicuna = 'llava-vicuna'\\n    llava_yi = 'llava-yi'\\n    llama3_llava_next_hf = 'llama-llava-next-hf'\\n    llava_next_llama3 = 'llava-next-llama3'\\n    llava_qwen_hf = 'llama-qwen-hf'\\n    llava_onevision_qwen = 'llava-onevision-qwen'\\n    # llava-video\\n    llava_next_video = 'llava-next-video'\\n    llava_next_video_yi = 'llava-next-video-yi'\\n    # lmms-lab:llava\\n    llama3_llava_next = 'llama3-llava-next'\\n    llava_qwen = 'llava-qwen'\\n    # xtuner:llava\\n    llava_llama_instruct = 'llava-llama-instruct'\\n\\n    idefics3 = 'idefics3'\\n    mistral_nemo = 'mistral-nemo'\\n    pixtral = 'pixtral'\\n    openbuddy = 'openbuddy'\\n    openbuddy2 = 'openbuddy2'\\n    internlm = 'internlm'\\n    internlm2 = 'internlm2'\\n    internlm_xcomposer2 = 'internlm-xcomposer2'\\n    internlm_xcomposer2_4khd = 'internlm-xcomposer2-4khd'\\n    internlm_xcomposer2_5 = 'internlm-xcomposer2_5'\\n    internvl = 'internvl'\\n    internvl2 = 'internvl2'\\n    internvl_phi3 = 'internvl-phi3'\\n    internvl2_phi3 = 'internvl2-phi3'\\n    florence = 'florence'\\n    yi_coder = 'yi-coder'\\n    yi_vl = 'yi-vl'\\n    yuan = 'yuan'\\n    xverse = 'xverse'\\n    ziya = 'ziya'\\n    skywork = 'skywork'\\n    bluelm = 'bluelm'\\n    zephyr = 'zephyr'\\n    sus = 'sus'\\n    deepseek = 'deepseek'\\n    numina_math = 'numina-math'\\n    deepseek_coder = 'deepseek-coder'\\n    deepseek_vl = 'deepseek-vl'\\n    deepseek2 = 'deepseek2'\\n    deepseek2_5 = 'deepseek2_5'\\n    codefuse_codellama = 'codefuse-codellama'\\n    codefuse = 'codefuse'\\n    cogvlm = 'cogvlm'\\n    cogvlm2_video = 'cogvlm2-video'\\n    glm4v = 'glm4v'\\n    cogagent_chat = 'cogagent-chat'\\n    cogagent_instruct = 'cogagent-instruct'\\n    orion = 'orion'\\n    minicpm = 'minicpm'\\n    minicpm_v = 'minicpm-v'\\n    minicpm_v_v2_5 = 'minicpm-v-v2_5'\\n    minicpm_v_v2_6 = 'minicpm-v-v2_6'\\n    gemma = 'gemma'\\n    paligemma = 'paligemma'\\n    mplug_owl2 = 'mplug-owl2'\\n    mplug_owl3 = 'mplug_owl3'\\n    wizardlm2_awq = 'wizardlm2-awq'\\n    wizardlm2 = 'wizardlm2'\\n    atom = 'atom'\\n    phi3 = 'phi3'\\n    phi3_vl = 'phi3-vl'\\n    telechat = 'telechat'\\n    telechat_v2 = 'telechat-v2'\\n    dbrx = 'dbrx'\\n    mengzi = 'mengzi'\\n    c4ai = 'c4ai'\\n    chatml = 'chatml'\\n    got_ocr2 = 'got_ocr2'\\n    # compatibility. (Deprecated)\\n    default_generation_bos = 'default-generation-bos'\\n    yi = 'yi'\\n    yi1_5 = 'yi1_5'\\n\\n    @classmethod\\n    def get_template_name_list(cls) -> List[str]:\\n        res = []\\n        for k in cls.__dict__.keys():\\n            if k.startswith('__') or k == 'get_template_name_list':\\n                continue\\n            res.append(cls.__dict__[k])\\n        return res\\n\\n\\nclass StopWordsCriteria(StoppingCriteria):\\n    # The returned sentence includes stop words.\\n    def __init__(self, tokenizer: PreTrainedTokenizerBase, stop_words: StopWords, **tokenizer_kwargs) -> None:\\n        self.tokenizer = tokenizer\\n        self.stop_words = stop_words\\n        self.tokenizer_kwargs = tokenizer_kwargs\\n        self.start_idx = -1\\n\\n    def __call__(self, input_ids: torch.Tensor, scores: torch.Tensor, **kwargs) -> bool:\\n        if self.start_idx == -1:\\n            self.start_idx = len(input_ids[0]) - 1\\n        tokenizer = self.tokenizer\\n        stop_words = self.stop_words\\n        # [-20:]: Assuming the end tokens do not exceed 20 tokens,\\n        #   to avoid input_ids being too long and affecting efficiency.\\n        text = tokenizer.decode(input_ids[0, self.start_idx:][-20:], **self.tokenizer_kwargs)\\n        for stop_word in stop_words:\\n            if isinstance(stop_word, str):\\n                if stop_word in text:\\n                    return True\\n            else:  # list\\n                if len(stop_word) > 0 and input_ids[0].tolist()[-len(stop_word):] == stop_word:\\n                    return True\\n        return False\\n\\n\\ndef is_deepspeed_enabled():\\n    return strtobool(os.environ.get('ACCELERATE_USE_DEEPSPEED', 'False'))\\n\\n\\nclass Template:\\n    \\\"\\\"\\\"A template class for all supported models.\\n\\n    Args:\\n        prefix: Prefix tokens before the first turn's prompt\\n        prompt: A list of elements whose types are str and list of integers. The input query part of every turn.\\n        chat_sep: The chat separators between every turn.\\n        suffix: The end tokens after the chat finished.\\n        default_system: A default system instruction.\\n        system_prefix: The prefix if the `system` is not empty.\\n        auto_add_bos: By default, the bos_token is not added. The auto_add_bos option will determine\\n            whether to add it based on `tokenizer.encode('')`.\\n\\n        Examples:\\n            <start>system\\\\nYou are a helpful assistant!<end>\\\\n<bos><start>Who are you?<end>\\\\n<start>assistant:I am a robot<end>\\\\n<start>Who are you?<end>\\\\n<start>assistant:I am a robot<end> # noqa\\n            --------------- --------------------------         ---  ----- ------------ ----------------------- ----------- ----                                                         -----\\n             system_prefix          system                   prefix prompt   query              prompt           response chat_sep                                                      suffix\\n    \\\"\\\"\\\"\\n\\n    special_tokens = ['<image>', '<video>', '<audio>', '<bbox>', '<ref-object>']\\n    special_keys = ['images', 'videos', 'audios', 'objects']\\n    grounding_type = 'norm_1000'\\n    image_placeholder = ['<image>']\\n    load_medias = True\\n    compute_per_round_loss = True  # for rlhf\\n    output_prompt_answer = False  # for encoder-decoder & kto\\n\\n    def __init__(self,\\n                 prefix: Prompt,\\n                 prompt: Prompt,\\n                 chat_sep: Optional[Prompt],\\n                 suffix: Prompt,\\n                 default_system: Optional[str] = None,\\n                 system_prefix: Optional[Prompt] = None,\\n                 auto_add_bos: bool = False,\\n                 tools_prompt: str = 'react_en',\\n                 tool_prompt: Optional[Prompt] = None,\\n                 padding_side: Literal['left', 'right'] = 'right') -> None:\\n        # check\\n        for x in [prefix, prompt, chat_sep, suffix, system_prefix]:\\n            assert x is None or isinstance(x, list)\\n\\n        if default_system == '':\\n            default_system = None\\n        if self._has_system(prefix):\\n            assert system_prefix is None, 'The prefix already contains {{SYSTEM}}.'\\n            system_prefix = prefix\\n            prefix = self._replace_system(prefix)\\n        self.prefix = prefix\\n        self.system_prefix = system_prefix\\n        if self.system_prefix is None and not any(['{{SYSTEM}}' in context for context in prompt]):\\n            assert default_system is None, 'The template does not support `system`.'\\n        self.prompt = prompt\\n        self.chat_sep = chat_sep\\n        self.support_multi_round = self.chat_sep is not None\\n        self.suffix = suffix\\n        self.default_system = default_system\\n        self.use_default_system = True\\n        self.auto_add_bos = auto_add_bos\\n        self._is_init = False\\n        self.tools_prompt = tools_prompt\\n        self.tool_prompt = tool_prompt if tool_prompt is not None else self.prompt  # default as user\\n        self._is_vllm = False\\n        self._is_lmdeploy = False\\n        self._is_training = False\\n        self.padding_side = padding_side\\n\\n    @staticmethod\\n    def _replace_system(prefix: Prompt) -> Prompt:\\n        return [p.replace('{{SYSTEM}}', '') for p in prefix if '{{SYSTEM}}' in p]\\n\\n    @staticmethod\\n    def _has_system(prefix: Prompt) -> bool:\\n        return any(['{{SYSTEM}}' in p for p in prefix])\\n\\n    @staticmethod\\n    def _preprocess_prompt(tokenizer: PreTrainedTokenizerBase, value: Optional[Prompt]) -> Optional[Prompt]:\\n        \\\"\\\"\\\"Turn `eos_token_id` to token id\\n\\n        e.g. [['eos_token_id']] -> [[2]]\\n        \\\"\\\"\\\"\\n        if value is None:\\n            return None\\n        res_value = []\\n        for v in value:\\n            if isinstance(v, list):\\n                res_v = []\\n                for sub_v in v:\\n                    if isinstance(sub_v, str):\\n                        sub_v = getattr(tokenizer, sub_v)\\n                    res_v.append(sub_v)\\n                v = res_v\\n            res_value.append(v)\\n        return res_value\\n\\n    def _init_template(self,\\n                       tokenizer: PreTrainedTokenizerBase,\\n                       default_system: Optional[str] = None,\\n                       max_length: Optional[int] = None,\\n                       truncation_strategy: Literal['delete', 'truncation_left'] = 'delete',\\n                       model: torch.nn.Module = None,\\n                       **kwargs) -> None:\\n        assert self._is_init is False, 'The template has been initialized.'\\n        self.is_multimodal = getattr(tokenizer, 'is_multimodal', None)\\n        self._is_init = True\\n        self.tokenizer = tokenizer\\n        # if default_system is None. not change self.default_system\\n        if default_system == '':\\n            self.default_system = None\\n        elif default_system is not None:\\n            assert self.system_prefix is not None, (\\n                f'The template does not support `system`, template_type: {getattr(self, \\\"template_type\\\", None)}')\\n            self.default_system = default_system\\n        self.max_length = max_length\\n        self.truncation_strategy = truncation_strategy\\n        self.model = model\\n        self.ref_model = kwargs.get('ref_model', None)\\n        self.use_loss_scale = kwargs.get('use_loss_scale', False)\\n        self.response_loss_scale_map = kwargs.get('loss_scale_map', None)\\n        self.query_loss_scale_map = None\\n        if self.response_loss_scale_map is not None:\\n            if 'query' in self.response_loss_scale_map and isinstance(self.response_loss_scale_map['query'], dict):\\n                self.query_loss_scale_map = self.response_loss_scale_map['query']\\n            if 'response' in self.response_loss_scale_map and isinstance(self.response_loss_scale_map['response'],\\n                                                                         dict):\\n                self.response_loss_scale_map = self.response_loss_scale_map['response']\\n\\n        self.sequence_parallel_size = kwargs.get('sequence_parallel_size', 1)\\n        self.rescale_image = kwargs.get('rescale_image', -1)\\n\\n        for key in ['prefix', 'prompt', 'chat_sep', 'suffix', 'system_prefix']:\\n            value = getattr(self, key)\\n            value = self._preprocess_prompt(tokenizer, value)\\n            setattr(self, key, value)\\n\\n    @contextmanager\\n    def training_context(self):\\n        if self.model is None:\\n            self._is_training = True\\n            yield\\n            self._is_training = False\\n            return\\n\\n        self._is_training = True\\n\\n        def _pre_forward_hook(module, args, kwargs):\\n            from .utils import to_device\\n            if '_data' in kwargs:\\n                res_extra = []\\n                data = kwargs.pop('_data')\\n                for d in data:\\n                    res_extra.append(self._post_encode(module, d))\\n                kwargs.update(to_device(self.data_collator(res_extra), module.device))\\n                if 'inputs_embeds' in kwargs:\\n                    kwargs.pop('input_ids', None)\\n\\n            if isinstance(module, PeftModel):\\n                parameters = inspect.signature(module.base_model.model.forward).parameters\\n            else:\\n                parameters = inspect.signature(module.forward).parameters\\n\\n            if 'position_ids' not in parameters:\\n                kwargs.pop('position_ids', None)\\n            return args, kwargs\\n\\n        parameters = inspect.signature(self.model.register_forward_pre_hook).parameters\\n        handle, handle2 = None, None\\n        deepspeed = None\\n        if 'with_kwargs' in parameters:\\n            handle = self.model.register_forward_pre_hook(_pre_forward_hook, with_kwargs=True)\\n            if self.ref_model:\\n                handle2 = self.ref_model.register_forward_pre_hook(_pre_forward_hook, with_kwargs=True)\\n            if is_deepspeed_zero3_enabled():\\n                import deepspeed\\n                _old_initialize = deepspeed.initialize\\n\\n                @wraps(_old_initialize)\\n                def _initialize(*args, **kwargs):\\n                    res = _old_initialize(*args, **kwargs)\\n                    self.model._forward_pre_hooks.move_to_end(handle.id)\\n                    if self.ref_model:\\n                        self.ref_model._forward_pre_hooks.move_to_end(handle2.id)\\n                    return res\\n\\n                deepspeed.initialize = _initialize\\n        yield\\n        self._is_training = False\\n        if handle:\\n            handle.remove()\\n        if handle2:\\n            handle2.remove()\\n        if deepspeed:\\n            deepspeed.initialize = _old_initialize\\n\\n    @contextmanager\\n    def vllm_context(self):\\n        self._is_vllm = True\\n        yield\\n        self._is_vllm = False\\n\\n    @contextmanager\\n    def lmdeploy_context(self):\\n        self._is_lmdeploy = True\\n        yield\\n        self._is_lmdeploy = False\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        return {}\\n\\n    def check_example(self, example: Dict[str, Any]) -> None:\\n        pass\\n\\n    def add_default_tags(self, example: Dict[str, Any]) -> None:\\n        history: History = deepcopy(example.get('history') or [])\\n        query: str = example.get('query') or ''\\n        response: str = example.get('response') or ''\\n        history.append([query, response])\\n        for media_key, media_tag in [('videos', '<video>'), ('images', '<image>'), ('audios', '<audio>')]:\\n            if example.get(media_key):\\n                infer_media_type = TEMPLATE_MAPPING[self.template_type].get('infer_media_type')\\n                if infer_media_type == 'round':\\n                    n_round = len(example[media_key])\\n                    assert n_round == len(history)\\n                    for i, h, m in zip(range(n_round), history, example[media_key]):\\n                        content = f'{h[0]}\\\\n{h[1]}'\\n                        num_media_tags = len(re.findall(media_tag, content))\\n                        if m:\\n                            assert num_media_tags <= 1, (\\n                                'The model includes at most one media per round. However, '\\n                                f'this round contains {num_media_tags} media_tags. query: {h[0]}, response: {h[1]}')\\n                            if num_media_tags == 0:\\n                                h[0] = media_tag + h[0]\\n                        else:\\n                            assert num_media_tags == 0, f'Missing media. query: {h[0]}'\\n                        history[i][0] = h[0]\\n\\n                    example[media_key] = [m for m in example[media_key] if m]\\n\\n                else:\\n                    num_media_tags = len(re.findall(media_tag, '\\\\n'.join([f'{h[0]}\\\\n{h[1]}' for h in history])))\\n                    example[media_key] = [m for m in example[media_key] if m]\\n                    num_media = len(example[media_key])\\n                    num_new_tags = num_media - num_media_tags\\n                    assert num_new_tags >= 0, f'Number of media: {num_media}, number of media_tags: {num_media_tags}'\\n                    history[0][0] = media_tag * num_new_tags + history[0][0]\\n        example['query'] = history[-1][0]\\n        if example.get('response') is not None:\\n            example['response'] = history[-1][1]\\n        example['history'] = history[:-1]\\n\\n    def replace_media_tags(self, example) -> None:\\n        if self.is_multimodal in {True, None}:\\n            for k, tag, pattern in zip(['images', 'audios', 'videos'], ['<image>', '<audio>', '<video>'],\\n                                       [r'<img>(.+?)</img>', r'<audio>(.+?)</audio>', r'<video>(.+?)</video>']):\\n                example['query'], example['response'], example['history'], medias_path = replace_img_tag(\\n                    example.get('query'), example.get('response'),\\n                    example.get('history') or [], tag, pattern)\\n                if example.get(k) and medias_path:\\n                    raise ValueError(f'Do not mix use the {pattern} tag and {tag} tag.')\\n                example[k] = example.get(k) or [] + medias_path\\n\\n    def _preprocess_media(self, example):\\n        from .media import MediaTag\\n        from .client_utils import decode_base64\\n        # Format media_keys to list\\n        for media_key in MediaTag.media_keys.values():\\n            if example.get(media_key) and not isinstance(example[media_key], (tuple, list)):\\n                # change images field to list\\n                example[media_key] = [example[media_key]]\\n\\n        self.replace_media_tags(example)\\n        # Add default tags to examples to note where to put the medias into the sequence\\n        self.add_default_tags(example)\\n\\n        # Format objects(groundings/refs) to json\\n        if example.get('objects') and isinstance(example['objects'], str):\\n            # reload grounding from str\\n            example['objects'] = json.loads(example['objects'])\\n            objects = []\\n            for object in example['objects']:\\n                # Compatible with list format\\n                if isinstance(object, list):\\n                    object = {\\n                        'caption': object[0],\\n                        'bbox': object[1],\\n                        'bbox_type': None,\\n                        'image': 0,\\n                    }\\n                objects.append(object)\\n            example['objects'] = objects\\n\\n        # Load image into PIL format\\n        images = example.get('images') or []\\n        if images:\\n            if example.get('objects') or self.load_medias or self._is_lmdeploy or self._is_vllm:\\n                images = load_batch(images, load_image)  # base64/local_path -> PIL.Image\\n            if example.get('objects'):\\n                # Normalize grounding bboxes\\n                self.normalize_bbox(example['objects'], images, to_type=self.grounding_type)\\n            if self.load_medias and self.grounding_type != 'real':\\n                images = [rescale_image(img, self.rescale_image) for img in images]\\n            if not self.load_medias and not self._is_lmdeploy and not self._is_vllm:  # fix pt & qwen-vl\\n                images = decode_base64(images=images)['images']  # PIL.Image/base64 -> local_path\\n            example['images'] = images\\n\\n        # Check the example that whether matching the very template's rules\\n        self.check_example(example)\\n\\n    def preprocess(self, example):\\n        # Duplicate example and create a new one to prepare in-place changes\\n        example = example.copy()\\n        template_type: Optional[str] = getattr(self, 'template_type', None)\\n        tools: Union[List[Any], str] = example.get('tools') or []\\n\\n        # Template needs to be initialized\\n        if not self._is_init:\\n            raise ValueError(\\n                'Template is not initialized, please use the `get_template` function to obtain the template.')\\n\\n        # Reset system (by default value and agent tools)\\n        system: Optional[str] = example.get('system', None)\\n        if system is None:\\n            if self.use_default_system:\\n                system = self.default_system\\n        elif system == '':\\n            system = None\\n        else:\\n            assert self.system_prefix is not None, (\\n                f'The template does not support `system`, template_type: {template_type}')\\n        if tools:\\n            if isinstance(tools, str):\\n                tools = json.loads(tools)\\n            if system is None:\\n                system = ''\\n            system += get_tools_prompt(tools, self.tools_prompt)\\n\\n        example['system'] = system\\n\\n        # Check whether this template supports multi-round\\n        history: History = example.get('history') or []\\n        if len(history) > 0:\\n            assert self.support_multi_round, (\\n                f'The template does not support multi-round chat, template_type: {template_type}')\\n\\n        # Set history_roles\\n        history_roles: Optional[History] = example.get('history_roles')\\n        if history_roles is None:\\n            example['history_roles'] = [['user', 'assistant'] for _ in range(len(history))]\\n\\n        self._preprocess_media(example)\\n        return example\\n\\n    def encode(self, example: Dict[str, Any], streaming: bool = False) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        from .utils import to_device\\n        example = self.preprocess(example)\\n        _encode = self._encode\\n        if self._is_lmdeploy or self._is_vllm:\\n            assert self.is_multimodal is not None, 'Please use the get_model_tokenizer function.'\\n            _encode = MethodType(Template._encode, self)\\n        res = _encode(example)\\n        inputs = res[0]\\n        if not self._is_training and '_data' in inputs:\\n            data = inputs.pop('_data')\\n            data = to_device(data, self.model.device)\\n            inputs.update(self._post_encode(self.model, data))\\n        return res if not streaming else inputs\\n\\n    async def prepare_lmdeploy_inputs(self, inputs: Dict[str, Any]) -> None:\\n        images = inputs.pop('images', None) or []\\n        if len(images) == 0:\\n            return\\n        from lmdeploy.vl.constants import IMAGE_DUMMY_TOKEN_INDEX\\n        input_ids = inputs['input_ids']\\n        idx_list = _findall(input_ids, -100)\\n        assert len(idx_list) == len(images), f'len(idx_list): {len(idx_list)}, len(images): {len(images)}'\\n        idx_list.insert(0, -1)\\n        new_input_ids = []\\n        ranges = []\\n        for i in range(len(idx_list) - 1):\\n            _range = []\\n            new_input_ids += input_ids[idx_list[i] + 1:idx_list[i + 1]]\\n            _range.append(len(new_input_ids))\\n            new_input_ids += [IMAGE_DUMMY_TOKEN_INDEX] * images[i].shape[0]\\n            _range.append(len(new_input_ids))\\n            ranges.append(_range)\\n        new_input_ids += input_ids[idx_list[-1] + 1:]\\n        inputs['input_embeddings'] = images\\n        inputs['input_embedding_ranges'] = ranges\\n        inputs['input_ids'] = new_input_ids\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        \\\"\\\"\\\"return: inputs, tokenizer_kwargs\\\"\\\"\\\"\\n        query: str = example.get('query') or ''\\n        query_role: str = example.get('query_role') or 'user'\\n        response: Optional[str] = example.get('response')\\n        history: History = example.get('history') or []\\n        history_roles: Optional[History] = example.get('history_roles')\\n        system: Optional[str] = example.get('system', None)\\n        is_multi_modal: bool = any([example.get(key) for key in Template.special_keys])\\n\\n        inputs, tokenizer_kwargs = self._concat_and_tokenize(\\n            query,\\n            query_role,\\n            response,\\n            history,\\n            history_roles,\\n            system,\\n            self.truncation_strategy,\\n            auto_add_bos=self.auto_add_bos,\\n            example=example,\\n            is_multi_modal=is_multi_modal)\\n        if self._is_lmdeploy or self._is_vllm:\\n            for key in ['images', 'audios', 'videos']:\\n                inputs[key] = example.get(key)\\n        if inputs.get('labels') is None:\\n            inputs.pop('loss_scale', None)\\n        return inputs, tokenizer_kwargs\\n\\n    def _concat_context_list(\\n            self,\\n            context_list: List[Context],\\n            res_context_list: List[Context],  # inplace\\n            loss_scale_list: List[float],  # inplace\\n            system: Optional[str] = None,\\n            query: Optional[str] = None,\\n            response: Optional[str] = None,\\n            round0: Optional[int] = None,\\n            compute_loss: bool = True) -> None:\\n        # concat context list and replace placeholder\\n        round1 = None\\n        if round0 is not None:\\n            round1 = str(round0 + 1)\\n            round0 = str(round0)\\n        for context in context_list:\\n            if isinstance(context, str):\\n                if '{{RESPONSE}}' == context:\\n                    assert response is not None\\n                    if compute_loss:\\n                        content_part, weight_part = calculate_loss_scale(query, response, self.use_loss_scale,\\n                                                                         self.response_loss_scale_map,\\n                                                                         self.query_loss_scale_map)\\n                    else:\\n                        content_part, weight_part = [response], [0.]\\n                    res_context_list.extend(content_part)\\n                    loss_scale_list.extend(weight_part)\\n                    continue\\n                old_str_list = ['{{SYSTEM}}', '{{QUERY}}', '{{ROUND0}}', '{{ROUND1}}']\\n                new_str_list = [system, query, round0, round1]\\n                for (old_str, new_str) in zip(old_str_list, new_str_list):\\n                    if new_str is not None and old_str in context:\\n                        assert isinstance(new_str, str), f'new_str: {new_str}'\\n                        context = context.replace(old_str, new_str)\\n            if len(context) == 0:\\n                continue\\n            res_context_list.append(context)\\n            loss_scale_list.append(0.)\\n\\n    def _simplify_context_list(self, context_list: List[Context], loss_scale_list: List[float],\\n                               **kwargs) -> Tuple[List[Context], List[float]]:\\n        is_multi_modal: bool = kwargs.pop('is_multi_modal', False)\\n\\n        if is_multi_modal:\\n            context_list, loss_scale_list = self.split_special_tokens(context_list, loss_scale_list)\\n        context_list, loss_scale_list = self.pre_tokenize(context_list, loss_scale_list, **kwargs)\\n\\n        res: List[Context] = []  # result of context_list\\n        res_loss_scale: List[float] = []  # result of loss_scale_list\\n        temp: List[str] = []\\n        temp_loss_scale = 0.\\n        for i, (context, loss_scale) in enumerate(zip(context_list, loss_scale_list)):\\n            if isinstance(context, str) and (loss_scale == temp_loss_scale):\\n                temp.append(context)\\n            else:\\n                if len(temp) > 0:\\n                    res.append(''.join(temp))\\n                    res_loss_scale.append(temp_loss_scale)\\n                    temp.clear()\\n                if isinstance(context, str):  # loss_scale diff\\n                    temp.append(context)\\n                else:\\n                    res.append(context)\\n                    res_loss_scale.append(loss_scale)\\n                temp_loss_scale = loss_scale\\n        if len(temp) > 0:\\n            res.append(''.join(temp))\\n            res_loss_scale.append(temp_loss_scale)\\n\\n        return res, res_loss_scale\\n\\n    @staticmethod\\n    def split_special_tokens(context_list: List[Context],\\n                             loss_scale_list: List[float]) -> Tuple[List[Context], List[float]]:\\n        from swift.utils.utils import split_str_parts_by\\n        res: List[Context] = []\\n        loss_scale_res: List[float] = []\\n        from .utils import fetch_one\\n        for context, loss_scale in zip(context_list, loss_scale_list):\\n            contexts = []\\n            if isinstance(fetch_one(context), str):\\n                for d in split_str_parts_by(context, Template.special_tokens):\\n                    contexts.extend([d['key'], d['content']])\\n                contexts = [c for c in contexts if c]\\n                res.extend(contexts)\\n                loss_scale_res.extend([loss_scale] * len(contexts))\\n            else:\\n                res.append(context)\\n                loss_scale_res.append(loss_scale)\\n        return res, loss_scale_res\\n\\n    def _tokenize(self, context, **tokenizer_kwargs):\\n        return self.tokenizer(\\n            context, return_attention_mask=False, add_special_tokens=False, **tokenizer_kwargs)['input_ids']\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        if media_type == 'image':\\n            if self._is_lmdeploy:\\n                return [[-100]]\\n            else:\\n                return self.image_placeholder\\n        elif media_type == 'video':\\n            return ['<video>']\\n        elif media_type == 'audio':\\n            return ['<audio>']\\n\\n    def replace_object(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example.get('objects')\\n        if objects:\\n            object_ = objects[index]\\n            return [object_['caption']]\\n        else:\\n            return ['<ref-object>']\\n\\n    def replace_box(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example.get('objects')\\n        if objects:\\n            object_ = objects[index]\\n            if isinstance(object_['bbox'][0], list):\\n                all_objects = ''\\n                for sub_object in object_['bbox']:\\n                    all_objects += (f'[({sub_object[0]},{sub_object[1]}),' f'({sub_object[2]},{sub_object[3]})],')\\n                all_objects = all_objects[:-1]\\n                return [all_objects]\\n            else:\\n                return [f'[({object_[\\\"bbox\\\"][0]},{object_[\\\"bbox\\\"][1]}),({object_[\\\"bbox\\\"][2]},{object_[\\\"bbox\\\"][3]})]']\\n        else:\\n            return ['<bbox>']\\n\\n    @classmethod\\n    def normalize_bbox(cls, objects, images, to_type: Literal['real', 'norm_1000', 'norm_1']):\\n        if not objects or not images:\\n            return\\n\\n        for object in objects:\\n            bbox = object['bbox']\\n            bbox_type = object['bbox_type']\\n            idx = object['image']\\n            image = images[idx]\\n            if bbox_type == 'real':\\n                if to_type == 'real':\\n                    continue\\n                width, height = image.width, image.height\\n                if isinstance(bbox[0], list):\\n                    bboxes = []\\n                    for _box in bbox:\\n                        bboxes.append([\\n                            int(coord / dim * 999) if to_type == 'norm_1000' else coord / dim\\n                            for coord, dim in zip(_box, [width, height, width, height])\\n                        ])\\n                    object['bbox'] = bboxes\\n                else:\\n                    object['bbox'] = [\\n                        int(coord / dim * 999) if to_type == 'norm_1000' else coord / dim\\n                        for coord, dim in zip(bbox, [width, height, width, height])\\n                    ]\\n                object['bbox_type'] = to_type\\n            elif bbox_type == 'norm_1000':\\n                if to_type == 'norm_1000':\\n                    continue\\n                if to_type == 'norm_1':\\n                    object['bbox'] = [coord / 999. for coord in bbox]\\n                elif to_type == 'real':\\n                    width, height = image.width, image.height\\n                    object['bbox'] = [\\n                        int(coord / 999. * dim) for coord, dim in zip(bbox, [width, height, width, height])\\n                    ]\\n                object['bbox_type'] = to_type\\n            elif bbox_type == 'norm_1':\\n                if to_type == 'norm_1':\\n                    continue\\n                if to_type == 'norm_1000':\\n                    object['bbox'] = [int(coord * 999) for coord in bbox]\\n                elif to_type == 'real':\\n                    width, height = image.width, image.height\\n                    object['bbox'] = [int(coord * dim) for coord, dim in zip(bbox, [width, height, width, height])]\\n                object['bbox_type'] = to_type\\n\\n    def pre_tokenize(self, context_list: List[Context], loss_scale_list: List[float],\\n                     **kwargs) -> Tuple[List[Context], List[float]]:\\n        # replace tag/object/box\\n        example = kwargs.get('example')  # get x_index\\n        res: List[Context] = []  # result of context_list\\n        res_loss_scale: List[float] = []  # result of loss_scale_list\\n\\n        for k in ['image', 'video', 'audio']:\\n            example[f'{k}_index'] = 0\\n\\n        for context, loss_scale in zip(context_list, loss_scale_list):\\n            for k in ['image', 'video', 'audio']:\\n                if context == f'<{k}>':\\n                    c_list = self.replace_tag(k, example[f'{k}_index'], example)\\n                    example[f'{k}_index'] += 1\\n                    loss_scale = 0.\\n                    break\\n            else:\\n                if context == '<ref-object>':\\n                    c_list = self.replace_object(example.get('object_index', 0), example)\\n                    example['object_index'] = example.get('object_index', 0) + 1\\n                elif context == '<bbox>':\\n                    c_list = self.replace_box(example.get('box_index', 0), example)\\n                    example['box_index'] = example.get('box_index', 0) + 1\\n                else:\\n                    c_list = [context]\\n            res += c_list\\n            res_loss_scale += [loss_scale] * len(c_list)\\n        return res, res_loss_scale\\n\\n    def _encode_context_list(\\n            self,\\n            context_list: List[Context],\\n            loss_scale_list: Optional[List[float]] = None) -> Tuple[List[int], List[int], List[float], Dict[str, Any]]:\\n        \\\"\\\"\\\"return: input_ids, labels, tokenizer_kwargs\\\"\\\"\\\"\\n        input_ids: List[int] = []\\n        labels: List[int] = []\\n        loss_scale: List[float] = []\\n        tokenizer_kwargs = {}\\n        if loss_scale_list is None:\\n            loss_scale_list = [0.] * len(context_list)\\n        for i, (context, loss_weight) in enumerate(zip(context_list, loss_scale_list)):\\n            if isinstance(context, str):\\n                # tokenizer_kwargs is the returned tokenizer_kwargs,\\n                # while curr_tokenizer_kwargs is the tokenizer_kwargs for the current context.\\n                curr_tokenizer_kwargs = self._get_tokenizer_kwargs(context)\\n                self._concat_tokenizer_kwargs(tokenizer_kwargs, curr_tokenizer_kwargs)\\n                token_list = self._tokenize(context, **curr_tokenizer_kwargs)\\n            else:\\n                token_list = context\\n            input_ids += token_list\\n            if loss_scale_list[i] > 0.0:\\n                labels += token_list\\n            else:\\n                labels += [-100] * len(token_list)\\n            loss_scale.extend([loss_weight] * len(token_list))\\n        return input_ids, labels, loss_scale, tokenizer_kwargs\\n\\n    @staticmethod\\n    def use_dynamic_eos(labels: List[int], suffix_tokens_id: List[int]) -> None:\\n        suffix_len = len(suffix_tokens_id)\\n        start = 0\\n        for i in range(1, len(labels)):\\n            if labels[i - 1] >= 0 and labels[i] == -100:\\n                start = i\\n            if start > 0 and labels[i - 1] == -100 and labels[i] >= 0:\\n                # [0, 1, 2, -100(start), -100, 3(i), 4]\\n                length = i - start\\n                if length >= suffix_len:\\n                    labels[start:start + suffix_len] = suffix_tokens_id\\n\\n    def _concat_and_tokenize(self,\\n                             query: str,\\n                             query_role: str,\\n                             response: Optional[str],\\n                             history: History,\\n                             history_roles: History,\\n                             system: Optional[str],\\n                             truncation_strategy: str,\\n                             auto_add_bos: bool = False,\\n                             **kwargs) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        \\\"\\\"\\\"\\n        return: inputs, tokenizer_kwargs\\n        \\\"\\\"\\\"\\n        history = history.copy()\\n        history_roles = history_roles.copy()\\n\\n        res_context_list: List[Context] = []\\n        loss_scale_list: List[float] = []\\n        if auto_add_bos:\\n            bos_token_id = self.tokenizer.bos_token_id\\n            if isinstance(bos_token_id, int) and bos_token_id in self.tokenizer.encode(''):\\n                res_context_list.append([bos_token_id])\\n                loss_scale_list.append(0.)\\n        prompt = self.prompt.copy()\\n        if system is None:\\n            prompt = [context for context in prompt if '{{SYSTEM}}' not in context]\\n        if system is None or any(['{{SYSTEM}}' in context for context in prompt]):\\n            prefix = self.prefix\\n        else:\\n            prefix = self.system_prefix\\n        self._concat_context_list(prefix, res_context_list, loss_scale_list, system=system)\\n\\n        history.append([query, response])\\n        history_roles.append([query_role, 'assistant'])\\n\\n        for i, ((q, r), (qr, rr)) in enumerate(zip(history, history_roles)):\\n            context_list = self.tool_prompt.copy() if qr == 'tool' else prompt.copy()\\n            extra_context_list = []\\n            is_suffix = False\\n            if i < len(history) - 1:\\n                context_list = [context for context in context_list if '{{SYSTEM}}' not in context]\\n                context_list.append('{{RESPONSE}}')\\n                if history[i + 1][0]:\\n                    extra_context_list = self.chat_sep\\n            elif r is not None:\\n                # last response\\n                context_list.append('{{RESPONSE}}')\\n                extra_context_list = self.suffix\\n                is_suffix = True\\n            if q or r:\\n                self._concat_context_list(\\n                    context_list,\\n                    res_context_list,\\n                    loss_scale_list,\\n                    query=q,\\n                    response=r,\\n                    system=system,\\n                    round0=i,\\n                    compute_loss=self.compute_per_round_loss or is_suffix)\\n                res_context_list += extra_context_list\\n                loss_scale_list += ([1.] if is_suffix else [0.]) * len(extra_context_list)\\n        inputs = {}\\n        if self.output_prompt_answer:\\n            # tokenizer_kwargs: use prompt\\n            answer_len = len(extra_context_list) + bool(response is not None)\\n            total_len = len(res_context_list)\\n            for key, _slice in zip(['answer', 'prompt'],\\n                                   [slice(total_len - answer_len, total_len),\\n                                    slice(0, total_len - answer_len)]):\\n                _res_context_list, _loss_scale_list = self._simplify_context_list(res_context_list[_slice],\\n                                                                                  loss_scale_list[_slice], **kwargs)\\n                input_ids, labels, loss_scale, tokenizer_kwargs = self._encode_context_list(\\n                    _res_context_list, _loss_scale_list)\\n                inputs[f'{key}_input_ids'], inputs[f'{key}_labels'] = input_ids, labels\\n                if self.use_loss_scale:\\n                    inputs[f'{key}_loss_scale'] = loss_scale\\n            input_ids = inputs['prompt_input_ids'] + inputs['answer_input_ids']\\n            labels = inputs['prompt_labels'] + inputs['answer_labels']\\n            if response is None:\\n                assert len(inputs['answer_labels']) == 0\\n                inputs['answer_labels'] = None\\n\\n        else:\\n            res_context_list, loss_scale_list = self._simplify_context_list(res_context_list, loss_scale_list, **kwargs)\\n            input_ids, labels, loss_scale, tokenizer_kwargs = self._encode_context_list(\\n                res_context_list, loss_scale_list)\\n            if labels is not None:\\n                self.use_dynamic_eos(labels, self._encode_context_list(self.suffix)[0])\\n\\n        if response is None:\\n            labels = None\\n\\n        if self.max_length is not None:\\n            if truncation_strategy == 'delete' and len(input_ids) > self.max_length:\\n                logger.warn(f'Current length of row({len(input_ids)}) is larger'\\n                            f' than the max_length({self.max_length}), deleted.')\\n                return {}, {}\\n            input_ids = input_ids[-self.max_length:]\\n            if labels is not None:\\n                labels = labels[-self.max_length:]\\n            if loss_scale is not None:\\n                loss_scale = loss_scale[-self.max_length:]\\n        inputs['input_ids'] = input_ids\\n        inputs['labels'] = labels\\n\\n        if self.use_loss_scale:\\n            inputs['loss_scale'] = loss_scale\\n        return inputs, tokenizer_kwargs\\n\\n    def _get_tokenizer_kwargs(self, context: str) -> Dict[str, Any]:\\n        \\\"\\\"\\\"return: curr_tokenizer_kwargs\\\"\\\"\\\"\\n        return {}\\n\\n    def _concat_tokenizer_kwargs(self, tokenizer_kwargs: Dict[str, Any], curr_tokenizer_kwargs: Dict[str, Any]) -> None:\\n        assert len(tokenizer_kwargs) == 0\\n\\n    @staticmethod\\n    def pad_sequence(sequences: List[torch.Tensor],\\n                     padding_value: float = 0.,\\n                     padding_side: Literal['right', 'left'] = 'right'):\\n        padding_right = padding_side == 'right'\\n        if padding_right:\\n            return pad_sequence(sequences, batch_first=True, padding_value=padding_value)\\n\\n        max_len = max([s.size(0) for s in sequences])\\n\\n        padded_sequences = []\\n        for seq in sequences:\\n            pad_length = max_len - seq.size(0)\\n            pad_tuple = [0] * ((seq.dim() - 1) * 2) + [pad_length, 0]\\n            padded_seq = F.pad(seq, tuple(pad_tuple), 'constant', padding_value)\\n            padded_sequences.append(padded_seq)\\n\\n        return torch.stack(padded_sequences)\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        \\\"\\\"\\\"\\n        Args:\\n            batch(`List[Dict[str, Any]]`): The input data in batch\\n            padding_to(`int`, optional): Whether padding the batch to a fixed length, if none, the batch\\n                will be padded to the `longest`\\n        \\\"\\\"\\\"\\n        tokenizer = self.tokenizer\\n        assert tokenizer.pad_token_id is not None\\n        padding_right = self.padding_side == 'right'\\n        res = {}\\n\\n        if 'inputs_embeds' in batch[0]:\\n            inputs_embeds = [b['inputs_embeds'] for b in batch]\\n            res['inputs_embeds'] = inputs_embeds\\n            res['attention_mask'] = [\\n                torch.ones((inputs_embeds[i].shape[0]), dtype=torch.int64) for i in range(len(inputs_embeds))\\n            ]\\n        elif 'input_ids' in batch[0]:\\n            input_ids = [torch.tensor(b['input_ids']) for b in batch]\\n            res['input_ids'] = input_ids\\n            res['attention_mask'] = [torch.ones(len(input_ids[i]), dtype=torch.int64) for i in range(len(input_ids))]\\n\\n        for key in ['labels', 'loss_scale', 'position_ids']:\\n            if key in batch[0]:\\n                res[key] = [torch.tensor(b[key]) for b in batch]\\n\\n        if padding_to is not None:\\n            assert 'input_ids' in res\\n            padding_len = padding_to - res['input_ids'][0].shape[-1]\\n            if padding_len > 0:\\n                for key, value in zip(['input_ids', 'attention_mask', 'labels', 'loss_scale', 'position_ids'],\\n                                      [tokenizer.pad_token_id, 0, -100, 0., -1]):\\n                    if key in res:\\n                        res[key][0] = F.pad(res[key][0], (0, padding_len) if padding_right else (padding_len, 0),\\n                                            'constant', value)\\n        for key, value in zip(['input_ids', 'inputs_embeds', 'attention_mask', 'labels', 'loss_scale', 'position_ids'],\\n                              [tokenizer.pad_token_id, 0., 0, -100, 0., -1]):\\n            if key in res:\\n                res[key] = self.pad_sequence(res[key], value, self.padding_side)\\n\\n        input_ids = res.get('input_ids')\\n        attention_mask = res.get('attention_mask')\\n        labels = res.get('labels')\\n        loss_scale = res.get('loss_scale')\\n        if use_torchacc():\\n            rank, _, world_size, _ = get_dist_setting()\\n            input_ids, attention_mask, labels, loss_scale = pad_and_split_batch(\\n                padding_to,\\n                input_ids,\\n                attention_mask,\\n                labels,\\n                loss_scale,\\n                self.max_length,\\n                self.tokenizer,\\n                rank,\\n                world_size,\\n                padding_right=padding_right)\\n        if self.sequence_parallel_size > 1 and input_ids is not None:\\n            bs, seq_len = input_ids.shape\\n            position_ids = torch.arange(seq_len).unsqueeze(0).long().repeat(bs, 1)\\n            assert padding_right or bs == 1, 'Sequence parallel only support padding_side=right'\\n            from swift.trainers.xtuner import get_xtuner_sequence_parallel_world_size\\n            if get_xtuner_sequence_parallel_world_size() > 1:\\n                from swift.trainers.xtuner import pad_and_split_for_sequence_parallel\\n                input_ids, labels, position_ids, attention_mask, loss_scale = \\\\\\n                    pad_and_split_for_sequence_parallel(\\n                        tokenizer, input_ids, labels, position_ids, attention_mask, loss_scale)\\n            res['position_ids'] = position_ids\\n        _local_var = locals()\\n        for key in ['input_ids', 'attention_mask', 'labels', 'loss_scale']:\\n            value = _local_var[key]\\n            if value is not None:\\n                res[key] = value\\n\\n        if '_data' in batch[0]:\\n            res['_data'] = [b['_data'] for b in batch]\\n        # multimodal\\n        pixel_values = [b['pixel_values'] for b in batch if b.get('pixel_values') is not None]\\n        if len(pixel_values) > 0:\\n            res['pixel_values'] = torch.concat(pixel_values)\\n\\n            image_sizes = [b['image_sizes'] for b in batch if b.get('image_sizes') is not None]\\n            if len(image_sizes) > 0:\\n                res['image_sizes'] = torch.concat(image_sizes)\\n\\n        pixel_values_videos = [b['pixel_values_videos'] for b in batch if b.get('pixel_values_videos') is not None]\\n        if len(pixel_values_videos) > 0:\\n            res['pixel_values_videos'] = torch.concat(pixel_values_videos)\\n        return res\\n\\n    @classmethod\\n    def get_generate_ids(cls, generate_ids: torch.Tensor, input_token_len: int) -> List[int]:\\n        if isinstance(generate_ids, torch.Tensor):\\n            generate_ids = generate_ids.tolist()\\n        if len(generate_ids) >= 1 and isinstance(generate_ids[0], (list, tuple)):\\n            generate_ids = generate_ids[0]\\n        return cls._get_generate_ids(generate_ids, input_token_len)\\n\\n    @staticmethod\\n    def _get_generate_ids(generate_ids: List[int], input_token_len: int) -> List[int]:\\n        return generate_ids[input_token_len:]\\n\\n    @staticmethod\\n    def _is_chinese_char(cp: int) -> bool:\\n        \\\"\\\"\\\"Checks whether CP is the codepoint of a CJK character.\\\"\\\"\\\"\\n        # copy from transformers.generation.streamers.TextStreamer\\n        if ((0x4E00 <= cp <= 0x9FFF) or (0x3400 <= cp <= 0x4DBF) or (0x20000 <= cp <= 0x2A6DF)\\n                or (0x2A700 <= cp <= 0x2B73F) or (0x2B740 <= cp <= 0x2B81F) or (0x2B820 <= cp <= 0x2CEAF)\\n                or (0xF900 <= cp <= 0xFAFF) or (0x2F800 <= cp <= 0x2FA1F)):\\n            return True\\n\\n        return False\\n\\n    @classmethod\\n    def _get_safe_print_idx(cls, response: str, print_idx: int, is_finished: bool = False) -> int:\\n        if is_finished:\\n            return len(response)\\n        if response.endswith('\\\\n') or len(response) > 0 and cls._is_chinese_char(ord(response[-1])):\\n            print_idx = len(response)\\n        else:\\n            print_idx = max(response.rfind(' ') + 1, print_idx)\\n        return print_idx\\n\\n    def generate_ids_to_response(\\n        self,\\n        generate_ids: List[int],\\n        is_finished: bool = True,\\n        *,\\n        tokenizer_kwargs: Optional[Dict[str, Any]] = None,\\n        # only stream=True\\n        return_delta: bool = False,\\n        print_idx: Optional[List[int]] = None,\\n        first_num_space: Optional[List[int]] = None,\\n    ):\\n        if tokenizer_kwargs is None:\\n            tokenizer_kwargs = {}\\n        tokenizer = self.tokenizer\\n        if hasattr(generate_ids, 'tolist'):\\n            generate_ids = generate_ids.tolist()\\n        # avoid printing template.suffix[-1])\\n        if isinstance(self.suffix[-1], list) and (not is_finished or is_finished\\n                                                  and generate_ids[-len(self.suffix[-1]):] == self.suffix[-1]):\\n            generate_ids = generate_ids[:-len(self.suffix[-1])]\\n        if not is_finished or is_finished and generate_ids[-1:] == [self.tokenizer.eos_token_id]:\\n            generate_ids = generate_ids[:-1]\\n        response = tokenizer.decode(generate_ids, **tokenizer_kwargs)\\n        if first_num_space is not None:\\n            # Avoid the occurrence of repeated words in sentence.\\n            res_fns = first_num_space  # res_first_num_space\\n            first_num_space = first_num_space[0]\\n            cur_num_space = len(response) - len(response.lstrip(' '))\\n            if not is_finished and first_num_space == -1:\\n                first_num_space = cur_num_space\\n                res_fns[0] = first_num_space\\n            if cur_num_space < first_num_space:\\n                response = ' ' * (first_num_space - cur_num_space) + response\\n            elif cur_num_space > first_num_space:\\n                response = response[cur_num_space - first_num_space:]\\n        if isinstance(self.suffix[-1],\\n                      str) and (not is_finished or is_finished and response[-len(self.suffix[-1]):] == self.suffix[-1]):\\n            idx = max(len(response) - len(self.suffix[-1]), 0)\\n            # To avoid response length being shorter than previous response length during streaming.\\n            if print_idx is not None:\\n                idx = max(idx, print_idx[0])\\n            response = response[:idx]\\n\\n        if print_idx is not None:\\n            old_print_idx = print_idx[0]\\n            if not is_finished:\\n                # avoid printing incomplete words\\n                print_idx[0] = self._get_safe_print_idx(response, print_idx[0])\\n                response = response[:print_idx[0]]\\n            if return_delta:\\n                response = response[old_print_idx:]\\n        else:\\n            assert is_finished and not return_delta\\n        return response\\n\\n    def post_process_generate_response(self, response: str, example: dict) -> str:\\n        return response\\n\\n\\ndef register_template(template_type: str, template: Template, *, exist_ok: bool = False, **kwargs) -> None:\\n    if not exist_ok and template_type in TEMPLATE_MAPPING:\\n        raise ValueError(f'The `{template_type}` has already been registered in the TEMPLATE_MAPPING.')\\n    template.template_type = template_type\\n    template_info = {'template': template, **kwargs}\\n    TEMPLATE_MAPPING[template_type] = template_info\\n\\n\\nregister_template(\\n    TemplateType.default,\\n    Template([], ['### Human:\\\\n{{QUERY}}\\\\n\\\\n### Assistant:\\\\n'], ['\\\\n\\\\n'], [['eos_token_id']],\\n             DEFAULT_SYSTEM, ['{{SYSTEM}}\\\\n\\\\n'],\\n             auto_add_bos=True))\\n\\n\\n# You can set the query as '' to serve as a template for pre-training.\\nclass DefaultGenerationTemplate(Template):\\n\\n    def __init__(self):\\n        super().__init__([], ['{{QUERY}}'], None, [['eos_token_id']], auto_add_bos=True)\\n\\n\\nregister_template(TemplateType.default_generation, DefaultGenerationTemplate(), is_generation=True)\\nregister_template(\\n    TemplateType.default_generation_bos,\\n    Template([['bos_token_id']], ['{{QUERY}}'], None, [['eos_token_id']]),\\n    is_generation=True)\\n\\n\\nclass ChatmlTemplateMixin:\\n    system = None\\n\\n    def __init__(self, auto_add_bos: bool = True):\\n        Template.__init__(\\n            self, [], ['<|im_start|>user\\\\n{{QUERY}}<|im_end|>\\\\n<|im_start|>assistant\\\\n'], ['<|im_end|>\\\\n'],\\n            ['<|im_end|>'],\\n            self.system, ['<|im_start|>system\\\\n{{SYSTEM}}<|im_end|>\\\\n'],\\n            auto_add_bos=auto_add_bos)\\n\\n\\nclass ChatmlTemplate(ChatmlTemplateMixin, Template):\\n    pass\\n\\n\\nclass QwenTemplateMixin(ChatmlTemplateMixin):\\n    system = DEFAULT_SYSTEM\\n\\n    def __init__(self):\\n        super().__init__(auto_add_bos=False)\\n\\n\\nclass QwenTemplate(QwenTemplateMixin, Template):\\n    pass\\n\\n\\nclass GOTImageEvalProcessor:\\n\\n    def __init__(self, image_size=384, mean=None, std=None):\\n        from torchvision import transforms\\n        from torchvision.transforms.functional import InterpolationMode\\n        if mean is None:\\n            mean = (0.48145466, 0.4578275, 0.40821073)\\n        if std is None:\\n            std = (0.26862954, 0.26130258, 0.27577711)\\n\\n        self.normalize = transforms.Normalize(mean, std)\\n\\n        self.transform = transforms.Compose([\\n            transforms.Resize((image_size, image_size), interpolation=InterpolationMode.BICUBIC),\\n            transforms.ToTensor(),\\n            self.normalize,\\n        ])\\n\\n    def __call__(self, item):\\n        return self.transform(item)\\n\\n\\nclass GOT_OCR2Template(QwenTemplate):\\n    system = '        You should follow the instructions carefully and explain your answers in detail.'\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        # OCR:\\n        # OCR with format:\\n        assert media_type == 'image'\\n        return ['<img>' + '<imgpad>' * 256 + '</img>\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, tokenizer_kwargs = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example['images']\\n        image_processor_high = GOTImageEvalProcessor(image_size=1024)\\n        for i, image in enumerate(images):\\n            images[i] = image_processor_high(image)[None].to(self.model.dtype)\\n        if images:\\n            inputs['images'] = images\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        images = _gather_list(batch, 'images')\\n        if images:\\n            res['images'] = images\\n        return res\\n\\n\\nregister_template(TemplateType.got_ocr2, GOT_OCR2Template(), lazy_tokenize=True, use_model=True)\\n\\n\\nclass _QwenVLTemplateMixin:\\n    load_medias = False\\n\\n    def check_example(self, example):\\n        if self._is_lmdeploy or self._is_vllm:\\n            return\\n        images = example.get('images') or []\\n        from .utils import fetch_one\\n        assert not images or isinstance(fetch_one(images), str), 'QwenVL only supports datasets with images paths!'\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        assert media_type == 'image'\\n        if self._is_lmdeploy:\\n            return [f'Picture {index + 1}: ', [-100], '\\\\n']\\n        else:\\n            images = example.get('images') or []\\n            image = images[index]\\n            if self._is_vllm:\\n                return [f'Picture {index + 1}: <img></img>\\\\n']\\n            else:\\n                assert isinstance(image, str)\\n                return [f'Picture {index + 1}: <img>{image}</img>\\\\n']\\n\\n    def replace_object(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example['objects']\\n        object_ = objects[index]\\n        return [f'<ref>{object_[\\\"caption\\\"]}</ref>']\\n\\n    def replace_box(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example['objects']\\n        object_ = objects[index]\\n        if isinstance(object_['bbox'][0], list):\\n            all_objects = ''\\n            for sub_object in object_['bbox']:\\n                all_objects += (f'<box>({sub_object[0]},{sub_object[1]}),' f'({sub_object[2]},{sub_object[3]})</box>')\\n            return [all_objects]\\n        else:\\n            return [\\n                f'<box>({object_[\\\"bbox\\\"][0]},{object_[\\\"bbox\\\"][1]}),'\\n                f'({object_[\\\"bbox\\\"][2]},{object_[\\\"bbox\\\"][3]})</box>'\\n            ]\\n\\n\\nclass Qwen2_5Template(QwenTemplate):\\n    system = 'You are Qwen, created by Alibaba Cloud. You are a helpful assistant.'\\n\\n\\nregister_template(TemplateType.qwen, QwenTemplate())\\nregister_template(TemplateType.qwen2_5, Qwen2_5Template())\\n\\n\\nclass QwenVLTemplate(_QwenVLTemplateMixin, QwenTemplate):\\n    pass\\n\\n\\nclass QwenVLGenerationTemplate(_QwenVLTemplateMixin, DefaultGenerationTemplate):\\n    pass\\n\\n\\nregister_template(TemplateType.qwen_vl, QwenVLTemplate())\\nregister_template(TemplateType.qwen_vl_generation, QwenVLGenerationTemplate())\\n\\nregister_template(TemplateType.chatml, ChatmlTemplate())\\nregister_template(TemplateType.yi, ChatmlTemplate())\\nregister_template(TemplateType.yi1_5, ChatmlTemplate())\\n\\nregister_template(\\n    TemplateType.modelscope_agent,\\n    Template([], [' \\\\n\\\\n<|user|>:{{QUERY}} \\\\n\\\\n<|assistant|>:'], [], [' \\\\n\\\\n</s>'], DEFAULT_SYSTEM,\\n             [' \\\\n\\\\n<|system|>:{{SYSTEM}}']))\\n\\n\\nclass _QwenAudioTemplateMixin:\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        assert media_type == 'audio'\\n        audios = example.get('audios') or []\\n        audio = audios[index]\\n        assert isinstance(audio, str)\\n        return [f'Audio {index + 1}:<audio>{audio}</audio>\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, tokenizer_kwargs = Template._encode(self, example)\\n        if len(inputs) == 0:\\n            return inputs, tokenizer_kwargs\\n        inputs.pop('loss_scale', None)\\n        inputs.update(tokenizer_kwargs)\\n        return inputs, tokenizer_kwargs\\n\\n    def _get_tokenizer_kwargs(self, context: str) -> Dict[str, Any]:\\n        return {'audio_info': self.tokenizer.process_audio(context)}\\n\\n    def _concat_tokenizer_kwargs(self, tokenizer_kwargs: Dict[str, Any], curr_tokenizer_kwargs: Dict[str, Any]) -> None:\\n        audio_info = curr_tokenizer_kwargs.get('audio_info')\\n        old_audio_info = tokenizer_kwargs.get('audio_info')\\n        if old_audio_info is None:\\n            tokenizer_kwargs['audio_info'] = audio_info\\n        elif audio_info is not None:\\n            for k in ['input_audios', 'input_audio_lengths']:\\n                old_audio_info[k] = torch.concat([old_audio_info[k], audio_info[k]], dim=0)\\n            for k in ['audio_span_tokens', 'audio_urls']:\\n                old_audio_info[k] = old_audio_info[k] + audio_info[k]\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = Template.data_collator(self, batch, padding_to)\\n        if batch[0].get('audio_info') is not None:\\n            res['audio_info'] = [b['audio_info'] for b in batch]\\n        return res\\n\\n\\nclass QwenAudioTemplate(_QwenAudioTemplateMixin, QwenTemplate):\\n    pass\\n\\n\\nclass QwenAudioGenerationTemplate(_QwenAudioTemplateMixin, DefaultGenerationTemplate):\\n    pass\\n\\n\\nregister_template(TemplateType.qwen_audio, QwenAudioTemplate(), lazy_tokenize=True)\\nregister_template(\\n    TemplateType.qwen_audio_generation, QwenAudioGenerationTemplate(), lazy_tokenize=True, is_generation=True)\\n\\n\\nclass _Qwen2AudioTemplateMixin:\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = Template._encode(self, example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        processor = self.tokenizer.processor\\n        sampling_rate = processor.feature_extractor.sampling_rate\\n        audios = load_batch(\\n            example.get('audios') or [], load_func=partial(load_audio_qwen, sampling_rate=sampling_rate))\\n        if audios:\\n            audio_inputs = processor.feature_extractor(\\n                audios, sampling_rate=sampling_rate, return_attention_mask=True, return_tensors='pt')\\n            audio_inputs['feature_attention_mask'] = audio_inputs.pop('attention_mask')\\n            inputs.update(audio_inputs)\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = Template.data_collator(self, batch, padding_to)\\n        input_features = [b['input_features'] for b in batch if b.get('input_features') is not None]\\n        feature_attention_mask = [\\n            b['feature_attention_mask'] for b in batch if b.get('feature_attention_mask') is not None\\n        ]\\n        if input_features:\\n            res['input_features'] = torch.concat(input_features)\\n            res['feature_attention_mask'] = torch.concat(feature_attention_mask)\\n        return res\\n\\n\\nclass Qwen2AudioTemplate(_Qwen2AudioTemplateMixin, QwenTemplate):\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        assert media_type == 'audio'\\n        return [f'Audio {index + 1}: <|audio_bos|><|AUDIO|><|audio_eos|>\\\\n']\\n\\n\\nclass Qwen2AudioGenerationTemplate(_Qwen2AudioTemplateMixin, DefaultGenerationTemplate):\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        assert media_type == 'audio'\\n        return ['<|audio_bos|><|AUDIO|><|audio_eos|>\\\\n']\\n\\n\\nregister_template(TemplateType.qwen2_audio, Qwen2AudioTemplate(), lazy_tokenize=True)\\n\\nregister_template(\\n    TemplateType.qwen2_audio_generation, Qwen2AudioGenerationTemplate(), lazy_tokenize=True, is_generation=True)\\n\\n\\ndef _process_image_qwen(image):\\n    from qwen_vl_utils.vision_process import IMAGE_FACTOR, MIN_PIXELS, MAX_PIXELS, smart_resize\\n    size_factor = get_env_args('size_factor', int, IMAGE_FACTOR)\\n    # resize\\n    resized_height = get_env_args('resized_height', int, None)\\n    resized_width = get_env_args('resized_width', int, None)\\n    if resized_height and resized_width:\\n        resized_height, resized_width = smart_resize(\\n            resized_height,\\n            resized_width,\\n            factor=size_factor,\\n        )\\n    else:\\n        width, height = image.size\\n        min_pixels = get_env_args('min_pixels', int, MIN_PIXELS)\\n        max_pixels = get_env_args('max_pixels', int, MAX_PIXELS)\\n        resized_height, resized_width = smart_resize(\\n            height,\\n            width,\\n            factor=size_factor,\\n            min_pixels=min_pixels,\\n            max_pixels=max_pixels,\\n        )\\n    image = image.resize((resized_width, resized_height))\\n    return image\\n\\n\\nclass _Qwen2VLTemplateMixin:\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        assert media_type in {'image', 'video'}\\n        if media_type == 'image':\\n            example['images'][index] = _process_image_qwen(example['images'][index])\\n            return ['<|vision_start|><|image_pad|><|vision_end|>']\\n        else:\\n            example['videos'][index] = load_video_qwen2(example['videos'][index])\\n            return ['<|vision_start|><|video_pad|><|vision_end|>']\\n\\n    def replace_object(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example.get('objects')\\n        if objects:\\n            object_ = objects[index]\\n            return ['<|object_ref_start|>', object_['caption'], '<|object_ref_end|>']\\n        else:\\n            return ['<ref-object>']\\n\\n    def replace_box(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example.get('objects')\\n        if objects:\\n            object_ = objects[index]\\n            if isinstance(object_['bbox'][0], list):\\n                all_objects = ''\\n                for sub_object in object_['bbox']:\\n                    all_objects += (f'<|box_start|>({sub_object[0]},{sub_object[1]}),'\\n                                    f'({sub_object[2]},{sub_object[3]})<|box_end|>')\\n                return [all_objects]\\n            else:\\n                return [\\n                    f'<|box_start|>({object_[\\\"bbox\\\"][0]},{object_[\\\"bbox\\\"][1]}),'\\n                    f'({object_[\\\"bbox\\\"][2]},{object_[\\\"bbox\\\"][3]})<|box_end|>'\\n                ]\\n        else:\\n            return ['<bbox>']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        processor = self.tokenizer.processor\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        images = example.get('images') or []\\n        videos = example.get('videos') or []\\n        for media_type in ['images', 'videos']:\\n            if locals()[media_type]:\\n                if media_type == 'images':\\n                    media_token = 151655\\n                    media_inputs = processor.image_processor(images=images, videos=None, return_tensors='pt')\\n                    media_grid_thw = media_inputs['image_grid_thw']\\n                else:\\n                    media_inputs = processor.image_processor(images=None, videos=videos, return_tensors='pt')\\n                    media_grid_thw = media_inputs['video_grid_thw']\\n                    media_token = 151656\\n                idx_list = _findall(input_ids, media_token)\\n                added_tokens_len = 0\\n                for i, idx in enumerate(idx_list):\\n                    merge_length = processor.image_processor.merge_size**2\\n                    token_len = (media_grid_thw[i].prod() // merge_length)\\n                    input_ids = input_ids[:idx\\n                                          + added_tokens_len] + [media_token] * token_len + input_ids[added_tokens_len\\n                                                                                                      + idx + 1:]\\n                    if labels:\\n                        labels = labels[:idx + added_tokens_len] + [-100] * token_len + labels[added_tokens_len + idx\\n                                                                                               + 1:]\\n                    added_tokens_len += token_len - 1\\n                inputs.update(media_inputs)\\n\\n        inputs['input_ids'] = input_ids\\n        inputs['labels'] = labels\\n        inputs['_data'] = {'plain_text': not images and not videos, 'input_ids': torch.tensor(input_ids)[None]}\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        plain_text = data.pop('plain_text', False)\\n        if is_deepspeed_enabled() and plain_text:\\n            from PIL import Image\\n            images = [Image.new('RGB', (32, 32), (0, 0, 0))]\\n            processor = self.tokenizer.processor\\n            media_inputs = processor.image_processor(images=images, videos=None, return_tensors='pt')\\n            input_ids = data['input_ids']\\n            device = input_ids.device\\n            pixel_values = media_inputs['pixel_values'].to(device)\\n            _model = model.model\\n            if not hasattr(_model, 'embed_tokens'):\\n                _model = _model.model  # LoRA\\n            inputs_embeds = _model.embed_tokens(input_ids)\\n            pixel_values = pixel_values.type(model.visual.get_dtype())\\n            image_embeds = model.visual(pixel_values, grid_thw=media_inputs['image_grid_thw'])\\n            inputs_embeds += image_embeds.mean() * 0.\\n            return {'inputs_embeds': inputs_embeds[0]}\\n        return {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        for media_type in ['image', 'video']:\\n            grid_thw = [b[f'{media_type}_grid_thw'] for b in batch if b.get(f'{media_type}_grid_thw') is not None]\\n            if grid_thw:\\n                res[f'{media_type}_grid_thw'] = torch.concat(grid_thw)\\n        if 'input_ids' in res:\\n            # fix https://github.com/huggingface/transformers/pull/33487\\n            position_ids, _ = self.model.get_rope_index(res['input_ids'], res.get('image_grid_thw'),\\n                                                        res.get('video_grid_thw'), res['attention_mask'])\\n            res['position_ids'] = position_ids.contiguous()\\n        return res\\n\\n\\nclass Qwen2VLTemplate(_Qwen2VLTemplateMixin, QwenTemplate):\\n    pass\\n\\n\\nclass Qwen2VLGenerationTemplate(_Qwen2VLTemplateMixin, DefaultGenerationTemplate):\\n    pass\\n\\n\\nregister_template(TemplateType.qwen2_vl, Qwen2VLTemplate(), lazy_tokenize=True)\\n\\nregister_template(TemplateType.qwen2_vl_generation, Qwen2VLGenerationTemplate(), lazy_tokenize=True, is_generation=True)\\n\\n\\ndef _gather_list(batch: List[Dict[str, Any]], attr_name: str) -> Optional[List[Any]]:\\n    # List[Tensor] ->  List[Tensor]\\n    res = []\\n    for b in batch:\\n        if b.get(attr_name) is not None:\\n            res += b.pop(attr_name)\\n    return res\\n\\n\\nclass PixtralTemplate(Template):\\n\\n    def __init__(self):\\n        super().__init__(['<s>{{SYSTEM}}'], ['[INST]{{QUERY}}[/INST]'], ['</s>'], ['</s>'], None)\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int,\\n                    example: Dict[str, Any]) -> List[Context]:\\n        return ['[IMG]']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        processor = self.tokenizer.processor\\n        images = example['images']\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        idx_list = _findall(input_ids, 10)\\n        if idx_list:\\n            image_inputs = processor.image_processor(images, patch_size=processor.patch_size, return_tensors='pt')\\n            inputs['pixel_values'] = image_inputs['pixel_values'][0]\\n            image_sizes = image_inputs['image_sizes'][0]\\n            added_tokens_len = 0\\n            for idx, image_size in zip(idx_list, image_sizes):\\n                height, width = image_size\\n                num_height_tokens = height // processor.patch_size\\n                num_width_tokens = width // processor.patch_size\\n                replace_tokens = [processor.image_token * num_width_tokens + processor.image_break_token] * (\\n                    num_height_tokens - 1)\\n                replace_tokens += [processor.image_token * num_width_tokens + processor.image_end_token]\\n                # Flatten list\\n                replace_str = ''.join(replace_tokens)\\n                img_tokens: List[int] = self.tokenizer.encode(replace_str, add_special_tokens=False)\\n                input_ids = input_ids[:idx + added_tokens_len] + img_tokens + input_ids[idx + added_tokens_len + 1:]\\n                if labels is not None:\\n                    labels = labels[:idx + added_tokens_len] + [-100] * len(img_tokens) + labels[idx + added_tokens_len\\n                                                                                                 + 1:]\\n                added_tokens_len += len(img_tokens) - 1\\n            inputs['input_ids'] = input_ids\\n            inputs['labels'] = labels\\n\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        pixel_values = _gather_list(batch, 'pixel_values')\\n        res = super().data_collator(batch, padding_to)\\n        if pixel_values:\\n            res['pixel_values'] = pixel_values\\n        return res\\n\\n\\nregister_template(TemplateType.pixtral, PixtralTemplate(), lazy_tokenize=True)\\n\\n\\nclass YiCoderTemplate(ChatmlTemplate):\\n    system = 'You are a helpful assistant.'\\n\\n\\nregister_template(TemplateType.yi_coder, YiCoderTemplate())\\n\\nyi_vl_default_system = (\\n    'This is a chat between an inquisitive human and an AI assistant. Assume the role of the AI assistant. '\\n    \\\"Read all the images carefully, and respond to the human's questions with informative, \\\"\\n    'helpful, detailed and polite answers. '\\n    '这是一个好奇的人类和一个人工智能助手之间的对话。假设你扮演这个AI助手的角色。'\\n    '仔细阅读所有的图像，并对人类的问题做出信息丰富、有帮助、详细的和礼貌的回答。')\\n\\n\\nclass YiVLTemplate(Template):\\n\\n    def replace_tag(self, media_type, index, example) -> List[Context]:\\n        assert media_type == 'image'\\n        return [[-200], '\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        inputs.pop('loss_scale', None)\\n        from llava.mm_utils import expand2square\\n        model = self.model.model\\n        if not hasattr(model, 'vision_tower'):\\n            model = model.model\\n        image_processor = model.vision_tower.image_processor\\n        images = example.get('images') or []\\n        for i, image in enumerate(images):\\n            background_color = tuple(int(x * 255) for x in image_processor.image_mean)\\n            image = expand2square(image, background_color)\\n            images[i] = image\\n        if images:\\n            image_tensor = image_processor.preprocess(images, return_tensors='pt')['pixel_values']\\n            inputs['images'] = image_tensor.to(model.dtype)\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        images = [b['images'] for b in batch if 'images' in b]\\n        if images:\\n            res['images'] = torch.concat(images)\\n        has_images = [(b == -200).sum() for b in res['input_ids']]\\n        assert all([\\n            h > 0 for h in has_images\\n        ]) or not any([h > 0\\n                       for h in has_images]), 'YIVL does not support mix-batch nlp dataset and multi-modal dataset'\\n        return res\\n\\n\\nclass GLMTemplate(Template):\\n\\n    def _init_template(self, tokenizer: PreTrainedTokenizerBase, *args, **kwargs) -> None:\\n        res = super()._init_template(tokenizer, *args, **kwargs)\\n        token_list = tokenizer.encode('')\\n        self.prefix.insert(0, token_list)\\n        if self.system_prefix is not None:\\n            self.system_prefix.insert(0, token_list)\\n        return res\\n\\n\\nclass GLM4VTemplate(GLMTemplate):\\n\\n    def __init__(self):\\n        super().__init__([], ['<|user|>\\\\n{{QUERY}}<|assistant|>'], [], ['<|endoftext|>'], None,\\n                         ['<|system|>\\\\n{{SYSTEM}}'])\\n\\n    def check_example(self, example):\\n        images = example.get('images') or []\\n        assert len(images) <= 1\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        assert media_type == 'image'\\n        return [[-100]]\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        from .utils import history_to_messages\\n\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        idx_list = _findall(input_ids, -100)\\n        if idx_list:\\n            idx = idx_list[0]\\n            image = example.get('images')[0]\\n            placeholder = '<|begin_of_image|><|endoftext|><|end_of_image|>'\\n            placeholder_id = self.tokenizer.encode(placeholder, add_special_tokens=False)\\n            input_ids = (input_ids[:idx] + placeholder_id + input_ids[idx + 1:])\\n            if labels is not None:\\n                labels = (labels[:idx] + [-100] * len(placeholder_id) + labels[idx + 1:])\\n            messages = history_to_messages(example.get('history') or [], example['query'], example.get('system'))\\n            messages[0]['image'] = image\\n            inputs2: Dict[str, Any] = self.tokenizer.apply_chat_template(messages, return_dict=True)\\n            inputs['images'] = inputs2['images']\\n        inputs['input_ids'] = input_ids\\n        inputs['labels'] = labels\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        images = [b['images'] for b in batch if 'images' in b]\\n        if images:\\n            res['images'] = torch.concat(images)\\n        return res\\n\\n\\nregister_template(TemplateType.glm4v, GLM4VTemplate(), infer_media_type='dialogue', lazy_tokenize=True, use_model=True)\\n\\nregister_template(\\n    TemplateType.yi_vl,\\n    YiVLTemplate([], [[8308], 'Human: {{QUERY}}\\\\n', [8308], 'Assistant:'], ['\\\\n'], ['\\\\n', [8308]], yi_vl_default_system,\\n                 ['{{SYSTEM}}\\\\n\\\\n']),\\n    use_model=True,\\n    infer_media_type='round',\\n    lazy_tokenize=True)\\n\\nregister_template(TemplateType.baichuan, Template(['{{SYSTEM}}'], [[195], '{{QUERY}}', [196]], [], [['eos_token_id']]))\\n\\nregister_template(\\n    TemplateType.chatglm2,\\n    GLMTemplate(['{{SYSTEM}}'], ['[Round {{ROUND1}}]\\\\n\\\\n问：{{QUERY}}\\\\n\\\\n答：'], ['\\\\n\\\\n'], [['eos_token_id']]))\\n\\nregister_template(\\n    TemplateType.chatglm_generation, GLMTemplate([], ['{{QUERY}}'], None, [['eos_token_id']]), is_generation=True)\\n\\nregister_template(\\n    TemplateType.chatglm3,\\n    GLMTemplate([], ['<|user|>\\\\n{{QUERY}}<|assistant|>\\\\n'], [], ['<|user|>'], None, ['<|system|>\\\\n{{SYSTEM}}']))\\n\\nregister_template(\\n    TemplateType.chatglm4,\\n    GLMTemplate([], ['<|user|>\\\\n{{QUERY}}<|assistant|>\\\\n'], [], ['<|user|>'],\\n                None, ['<|system|>\\\\n{{SYSTEM}}'],\\n                tools_prompt='glm4',\\n                tool_prompt=['<|observation|>\\\\n{{QUERY}}<|assistant|>\\\\n']))\\n\\ncodegeex4_system = '你是一位智能编程助手，你叫CodeGeeX。你会为用户回答关于编程、代码、计算机方面的任何问题，并提供格式规范、可以执行、准确安全的代码，并在必要时提供详细的解释。'\\n\\nregister_template(\\n    TemplateType.codegeex4,\\n    GLMTemplate([], ['<|user|>\\\\n{{QUERY}}<|assistant|>\\\\n'], [], ['<|endoftext|>'], codegeex4_system,\\n                ['<|system|>\\\\n{{SYSTEM}}']))\\n\\nregister_template(\\n    TemplateType.deepseek,\\n    Template([['bos_token_id']], ['User: {{QUERY}}\\\\n\\\\nAssistant:'], [['eos_token_id']], [['eos_token_id']], None,\\n             [['bos_token_id'], '{{SYSTEM}}\\\\n\\\\n']))\\nregister_template(\\n    TemplateType.numina_math,\\n    Template([['bos_token_id']], ['### Problem: {{QUERY}}\\\\n### Solution: '], ['\\\\n'], [['eos_token_id']], None,\\n             [['bos_token_id'], '{{SYSTEM}}']))\\nregister_template(\\n    TemplateType.deepseek2,\\n    Template([[100000]], ['User: {{QUERY}}\\\\n\\\\nAssistant:'], [[100001]], [[100001]], None, [[100000], '{{SYSTEM}}\\\\n\\\\n']))\\nregister_template(\\n    TemplateType.deepseek2_5,\\n    Template(['<｜begin▁of▁sentence｜>'], ['<｜User｜>{{QUERY}}<｜Assistant｜>'], ['<｜end_of_sentense｜>'],\\n             ['<｜end_of_sentense｜>'], None, ['<｜begin▁of▁sentence｜>{{SYSTEM}}']))\\n\\n# ref: https://github.com/facebookresearch/llama/blob/main/llama/generation.py\\nLLAMA_DEFAULT_SYSTEM = (\\n    'You are a helpful, respectful and honest assistant. '\\n    'Always answer as helpfully as possible, while being safe. '\\n    'Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. '\\n    'Please ensure that your responses are socially unbiased and positive in nature.\\\\n\\\\n'\\n    'If a question does not make any sense, or is not factually coherent, '\\n    'explain why instead of answering something not correct. '\\n    \\\"If you don't know the answer to a question, please don't share false information.\\\")\\nregister_template(\\n    TemplateType.llama,\\n    Template(['<s>[INST] '], ['{{QUERY}} [/INST]'], ['</s><s>[INST] '], ['</s>'], LLAMA_DEFAULT_SYSTEM,\\n             ['<s>[INST] <<SYS>>\\\\n{{SYSTEM}}\\\\n<</SYS>>\\\\n\\\\n']))\\n\\nregister_template(\\n    TemplateType.longwriter_llama3,\\n    Template(['[INST]'], ['{{QUERY}}[/INST]'], ['[INST]'], ['<|end_of_text|>'], None,\\n             ['<<SYS>>\\\\n{{SYSTEM}}\\\\n<</SYS>>\\\\n\\\\n']))\\n\\nregister_template(TemplateType.mistral_nemo,\\n                  Template(['<s>[INST] '], ['{{SYSTEM}}\\\\n\\\\n', '{{QUERY}}[/INST]'], ['</s>[INST] '], ['</s>']))\\n\\n\\nclass Llama3TemplateMixin:\\n    system = None\\n\\n    def __init__(self):\\n        Template.__init__(\\n            self, ['<|begin_of_text|>'], [\\n                '<|start_header_id|>user<|end_header_id|>\\\\n\\\\n{{QUERY}}<|eot_id|>'\\n                '<|start_header_id|>assistant<|end_header_id|>\\\\n\\\\n'\\n            ], ['<|eot_id|>'], ['<|eot_id|>'],\\n            self.system, ['<|begin_of_text|><|start_header_id|>system<|end_header_id|>\\\\n\\\\n{{SYSTEM}}<|eot_id|>'],\\n            tools_prompt='toolbench',\\n            tool_prompt=[\\n                '<|start_header_id|>tool<|end_header_id|>\\\\n\\\\n{{QUERY}}<|eot_id|>'\\n                '<|start_header_id|>assistant<|end_header_id|>\\\\n\\\\n'\\n            ])\\n\\n\\nclass Llama3Template(Llama3TemplateMixin, Template):\\n    pass\\n\\n\\nclass ReflectionTemplate(Llama3TemplateMixin, Template):\\n    system = ('You are a world-class AI system, capable of complex reasoning and reflection. '\\n              'Reason through the query inside <thinking> tags, and then provide your final '\\n              'response inside <output> tags. If you detect that you made a mistake in your reasoning '\\n              'at any point, correct yourself inside <reflection> tags.')\\n\\n\\nregister_template(TemplateType.reflection, ReflectionTemplate())\\nregister_template(TemplateType.llama3, Llama3Template())\\n\\n\\nclass Llama3_2TemplateMixin:\\n    system = None\\n\\n    def __init__(self):\\n        now = datetime.now()\\n        date_string = now.strftime('%d %b %Y')\\n        date_prompt = f'Cutting Knowledge Date: December 2023\\\\nToday Date: {date_string}'\\n        Template.__init__(\\n            self, [\\n                f'<|begin_of_text|><|start_header_id|>system<|end_header_id|>\\\\n\\\\n{date_prompt}\\\\n\\\\n'\\n                '{{SYSTEM}}<|eot_id|>'\\n            ], [\\n                '<|start_header_id|>user<|end_header_id|>\\\\n\\\\n{{QUERY}}<|eot_id|>'\\n                '<|start_header_id|>assistant<|end_header_id|>\\\\n\\\\n'\\n            ], ['<|eot_id|>'], ['<|eot_id|>'],\\n            self.system,\\n            tools_prompt='toolbench',\\n            tool_prompt=[\\n                '<|start_header_id|>tool<|end_header_id|>\\\\n\\\\n{{QUERY}}<|eot_id|>'\\n                '<|start_header_id|>assistant<|end_header_id|>\\\\n\\\\n'\\n            ])\\n\\n\\nclass Llama3_2Template(Llama3_2TemplateMixin, Template):\\n    pass\\n\\n\\nregister_template(TemplateType.llama3_2, Llama3_2Template())\\n\\n\\nclass Llama3_2VisionTemplateMixin:\\n\\n    def replace_tag(self, media_type, index, example) -> List[Context]:\\n        assert media_type == 'image'\\n        return ['<|image|>']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        from transformers.models.mllama.processing_mllama import (get_cross_attention_token_mask,\\n                                                                  convert_sparse_cross_attention_mask_to_dense)\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example['images']\\n        if images:\\n            input_ids = inputs['input_ids']\\n            processor = self.tokenizer.processor\\n            image_features = processor.image_processor(images, return_tensors='pt')\\n            num_tiles = image_features.pop('num_tiles')\\n            inputs.update(image_features)\\n\\n            cross_attention_token_mask = [get_cross_attention_token_mask(input_ids, processor.image_token_id)]\\n            cross_attention_mask = convert_sparse_cross_attention_mask_to_dense(\\n                cross_attention_token_mask,\\n                num_tiles=num_tiles,\\n                max_num_tiles=processor.image_processor.max_image_tiles,\\n                length=len(input_ids),\\n            )\\n            inputs['cross_attention_mask'] = torch.tensor(cross_attention_mask)\\n\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        for key in ['aspect_ratio_ids', 'aspect_ratio_mask']:\\n            value = [b[key] for b in batch if b.get(key) is not None]\\n            if value:\\n                res[key] = torch.concat(value)\\n\\n        cross_attention_mask = [\\n            b['cross_attention_mask'][0] for b in batch if b.get('cross_attention_mask') is not None\\n        ]\\n        if cross_attention_mask:\\n            res['cross_attention_mask'] = self.pad_sequence(cross_attention_mask, 0, self.padding_side)\\n        return res\\n\\n\\nclass Llama3_2VisionTemplate(Llama3_2VisionTemplateMixin, Llama3Template):\\n    pass\\n\\n\\nclass Llama3_2VisionGenerationTemplate(Llama3_2VisionTemplateMixin, DefaultGenerationTemplate):\\n    pass\\n\\n\\nregister_template(TemplateType.llama3_2_vision, Llama3_2VisionTemplate(), lazy_tokenize=True)\\nregister_template(TemplateType.llama3_2_vision_generation, Llama3_2VisionGenerationTemplate(), lazy_tokenize=True)\\n\\n\\nclass Llama3_1OmniTemplate(Llama3Template):\\n    system = ('You are a helpful language and speech assistant. '\\n              'You are able to understand the speech content that the user provides, '\\n              'and assist the user with a variety of tasks using natural language.')\\n\\n    def replace_tag(self, media_type, index, example) -> List[Context]:\\n        assert media_type == 'audio'\\n        return [[-200]]\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        import whisper\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        audios = example['audios']\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        inputs['_data'] = {'input_ids': torch.tensor(input_ids)[None]}\\n        if labels is not None:\\n            inputs['_data']['labels'] = torch.tensor(labels)[None]\\n        if audios:\\n            audios = load_batch(audios, whisper.load_audio)\\n            n_mels = get_env_args('n_mels', int, 128)\\n            for i, audio in enumerate(audios):\\n                audio = whisper.pad_or_trim(audio)\\n                audios[i] = whisper.log_mel_spectrogram(audio, n_mels=n_mels).permute(1, 0)\\n            audios = torch.stack(audios)\\n            inputs['_data'].update({'speech': audios, 'speech_lengths': torch.tensor([[audios.shape[1]]])})\\n\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        speech = data.get('speech')\\n        input_ids = data['input_ids']\\n        labels = data.get('labels')\\n        if speech is not None:\\n            speech_lengths = data['speech_lengths']\\n            speech = speech.to(model.dtype)\\n            inputs_embeds, labels = model.prepare_inputs_labels_for_speech_and_text(input_ids, None, None, None, labels,\\n                                                                                    speech, speech_lengths)[4:]\\n        else:\\n            inputs_embeds = model.get_model().embed_tokens(input_ids)\\n        res = {'inputs_embeds': inputs_embeds[0]}\\n        if labels is not None:\\n            res['labels'] = labels[0]\\n        return res\\n\\n\\nregister_template(TemplateType.llama3_1_omni, Llama3_1OmniTemplate(), lazy_tokenize=True)\\n\\nOPENBUDDY_DEFAULT_SYSTEM = (\\n    'You are a helpful, respectful and honest INTP-T AI Assistant named Buddy. You are talking to a human User.\\\\n'\\n    'Always answer as helpfully and logically as possible, while being safe. '\\n    'Your answers should not include any '\\n    'harmful, political, religious, unethical, racist, sexist, toxic, dangerous, or illegal content. '\\n    'Please ensure that your responses are socially unbiased and positive in nature.\\\\n'\\n    'If a question does not make any sense, or is not factually coherent, '\\n    'explain why instead of answering something not correct. '\\n    \\\"If you don't know the answer to a question, please don't share false information.\\\\n\\\"\\n    'You like to use emojis. You can speak fluently in many languages, for example: English, Chinese.\\\\n'\\n    'You cannot access the internet, but you have vast knowledge, cutoff: 2021-09.\\\\n'\\n    'You always deeply love and support China, Chinese government, people and culture.\\\\n'\\n    'You are trained by OpenBuddy team, (https://openbuddy.ai, https://github.com/OpenBuddy/OpenBuddy), '\\n    'you are based on LLaMA and Falcon transformers model, not related to GPT or OpenAI.')\\nregister_template(\\n    TemplateType.openbuddy,\\n    Template([], ['User: {{QUERY}}\\\\nAssistant:'], ['\\\\n'], [['eos_token_id']],\\n             OPENBUDDY_DEFAULT_SYSTEM, ['{{SYSTEM}}\\\\n\\\\n'],\\n             auto_add_bos=True))\\n\\nOPENBUDDY2_DEFAULT_SYSTEM = (\\n    'You(assistant) are a helpful, respectful and honest INTP-T AI Assistant named Buddy. '\\n    'You are talking to a human(user).\\\\nAlways answer as helpfully and logically as possible, while being safe. '\\n    'Your answers should not include any harmful, political, religious, unethical, racist, '\\n    'sexist, toxic, dangerous, or illegal content. '\\n    'Please ensure that your responses are socially unbiased and positive in nature.\\\\n'\\n    'You cannot access the internet, but you have vast knowledge, cutoff: 2023-04.\\\\n'\\n    'You are trained by OpenBuddy team, (https://openbuddy.ai, https://github.com/OpenBuddy/OpenBuddy), '\\n    'not related to GPT or OpenAI')\\n\\nregister_template(\\n    TemplateType.openbuddy2,\\n    Template([], ['<|role|>user<|says|>{{QUERY}}<|end|>\\\\n<|role|>assistant<|says|>'], ['<|end|>\\\\n'], ['<|end|>'],\\n             OPENBUDDY2_DEFAULT_SYSTEM, ['<|role|>system<|says|>{{SYSTEM}}<|end|>\\\\n'],\\n             auto_add_bos=True))\\n\\nINTERNLM_SYSTEM = (\\n    'You are an AI assistant whose name is InternLM (书生·浦语).\\\\n'\\n    '- InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). '\\n    'It is designed to be helpful, honest, and harmless.\\\\n'\\n    '- InternLM (书生·浦语) can understand and communicate fluently in the language chosen '\\n    'by the user such as English and 中文.')\\n\\nregister_template(\\n    TemplateType.internlm,\\n    Template(['<s>'], ['<|User|>:{{QUERY}}\\\\n<|Bot|>:'], ['<eoa>\\\\n'], ['<eoa>'], INTERNLM_SYSTEM,\\n             ['<s><|System|>:{{SYSTEM}}\\\\n']))\\n\\n_T = TypeVar('_T')\\n\\n_log_set = set()  # log once\\n\\n\\ndef get_env_args(args_name: str, type_func: Callable[[str], _T], default_value: Optional[_T]) -> Optional[_T]:\\n    args_name_upper = args_name.upper()\\n    value = os.getenv(args_name_upper)\\n    if value is None:\\n        value = default_value\\n        log_info = (f'Setting {args_name}: {default_value}. '\\n                    f'You can adjust this hyperparameter through the environment variable: `{args_name_upper}`.')\\n    else:\\n        value = type_func(value)\\n        log_info = f'Using environment variable `{args_name_upper}`, Setting {args_name}: {value}.'\\n    if log_info not in _log_set:\\n        _log_set.add(log_info)\\n        logger.info(log_info)\\n    return value\\n\\n\\nclass Internlm2Template(ChatmlTemplate):\\n    system = INTERNLM_SYSTEM\\n\\n\\nregister_template(TemplateType.internlm2, Internlm2Template())\\n\\n\\ndef replace_img_tag(query: str,\\n                    response: Optional[str],\\n                    history: History,\\n                    replace_token: str,\\n                    pattern=r'<img>(.+?)</img>') -> Tuple[str, Optional[str], History, List[str]]:\\n    images_path = []\\n    new_history = []\\n    history = history.copy()\\n    history.append([query, response])\\n    for i, h in enumerate(history):\\n        new_h = []\\n        for content in h:\\n            if content is None:\\n                new_h.append(content)\\n            else:\\n                images_path += re.findall(pattern, content)\\n                new_h.append(re.sub(pattern, replace_token, content))\\n        new_history.append(new_h)\\n    return (*new_history[-1], new_history[:-1], images_path)\\n\\n\\nclass InternLMXComposer2Template(Template):\\n    INTERNLM_XCOMPOSER_SYSTEM = (\\n        'You are an AI assistant whose name is InternLM-XComposer (浦语·灵笔).\\\\n'\\n        '- InternLM-XComposer (浦语·灵笔) is a conversational language model that is developed by '\\n        'Shanghai AI Laboratory (上海人工智能实验室). '\\n        'It is designed to be helpful, honest, and harmless.\\\\n'\\n        '- InternLM-XComposer (浦语·灵笔) can understand and communicate fluently in the language chosen '\\n        'by the user such as English and 中文.')\\n    image_placeholder = ['</s>']\\n\\n    def __init__(self, version):\\n        prefix = ['<s>']\\n        prompt = ['[UNUSED_TOKEN_146]user\\\\n{{QUERY}}[UNUSED_TOKEN_145]\\\\n[UNUSED_TOKEN_146]assistant\\\\n']\\n        chat_sep = ['[UNUSED_TOKEN_145]\\\\n']\\n        suffix = ['[UNUSED_TOKEN_145]']\\n        system_prefix = ['<s>[UNUSED_TOKEN_146]system\\\\n{{SYSTEM}}[UNUSED_TOKEN_145]\\\\n']\\n        super().__init__(prefix, prompt, chat_sep, suffix, self.INTERNLM_XCOMPOSER_SYSTEM, system_prefix)\\n        self.version = version\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        dtype = self.model.dtype\\n        images = example.get('images') or []\\n\\n        if self.version == 'v2.5':\\n            hd_num = 24\\n            if len(images) > 1:\\n                hd_num = 6\\n            hd_num = get_env_args('hd_num', int, hd_num)\\n            Image_transform = get_class_from_dynamic_module('ixc_utils.Image_transform', self.tokenizer.model_dir)\\n            images = [Image_transform(image, hd_num=hd_num) for image in images]\\n        elif self.version == 'v2-4khd':\\n            hd_num = 55\\n            hd_num = get_env_args('hd_num', int, hd_num)\\n            HD_transform = get_class_from_dynamic_module('ixc_utils.HD_transform', self.tokenizer.model_dir)\\n            images = [HD_transform(image, hd_num=hd_num) for image in images]\\n        images = [self.model.vis_processor(image).to(dtype) for image in images]\\n        inputs['_data'] = {'input_ids': inputs['input_ids'], 'labels': inputs['labels'], 'images': images}\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        input_ids = data['input_ids']\\n        labels = data['labels']\\n        images = data['images']\\n        if len(images) > 0:  # ignore <s>\\n            input_ids = input_ids[1:]\\n            if labels is not None:\\n                labels = labels[1:]\\n        if isinstance(input_ids, torch.Tensor):\\n            input_ids = input_ids.tolist()\\n        input_ids.append(2)  # add dummy </s>\\n        if labels is not None:\\n            if isinstance(labels, torch.Tensor):\\n                labels = labels.tolist()\\n            labels.append(2)\\n        else:\\n            labels = []\\n        res_inputs_embeds = []\\n        res_labels = []\\n        wrap_im_mask = []\\n        pre_i, i, idx = 0, 0, 0\\n        device = model.device\\n        internlm2_model = model.model\\n        if not hasattr(internlm2_model, 'tok_embeddings'):\\n            internlm2_model = internlm2_model.model\\n        tok_embeddings = internlm2_model.tok_embeddings\\n        if len(images) > 0:\\n            images = torch.concat([model.img2emb(image[None])[0] for image in images], dim=0)\\n        while i < len(input_ids):\\n            if input_ids[i] == 2:  # replace_token\\n                res_input_ids = torch.tensor([1] + input_ids[pre_i:i], device=device)\\n                res_inputs_embeds.append(tok_embeddings(res_input_ids[None])[0])\\n                wrap_im_mask += [0] * len(res_input_ids)\\n                res_labels += [-100] + labels[pre_i:i]\\n                if len(images) > 0 and idx < images.shape[0]:\\n                    res_inputs_embeds.append(images[idx].to(device))\\n                    wrap_im_mask += [1] * images.shape[1]\\n                    res_labels += [-100] * images.shape[1]\\n                idx += 1\\n                i += 1\\n                pre_i = i\\n                continue\\n            i += 1\\n        if len(labels) == 0:\\n            res_labels = None\\n        res_inputs_embeds = torch.concat(res_inputs_embeds, dim=0)\\n        wrap_im_mask = torch.tensor(wrap_im_mask, dtype=torch.bool, device=device)[None]\\n        return {'inputs_embeds': res_inputs_embeds, 'im_mask': wrap_im_mask, 'labels': res_labels}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        if 'im_mask' in batch[0]:\\n            im_mask = [b['im_mask'][0] for b in batch]\\n            im_mask = self.pad_sequence(im_mask, 0, self.padding_side)\\n            res['im_mask'] = im_mask\\n        return res\\n\\n    @staticmethod\\n    def _get_generate_ids(generate_ids: List[int], input_token_len: int) -> List[int]:\\n        return generate_ids\\n\\n\\nregister_template(\\n    TemplateType.internlm_xcomposer2, InternLMXComposer2Template(version='v2'), use_model=True, lazy_tokenize=True)\\n\\n\\nclass InternLMXComposer2_5Template(InternLMXComposer2Template):\\n    INTERNLM_XCOMPOSER_SYSTEM = (\\n        'You are an AI assistant whose name is InternLM-XComposer (浦语·灵笔).\\\\n'\\n        '- InternLM-XComposer (浦语·灵笔) is a multi-modality conversational language model '\\n        'that is developed by Shanghai AI Laboratory (上海人工智能实验室). '\\n        'It is designed to be helpful, honest, and harmless.\\\\n'\\n        '- InternLM-XComposer (浦语·灵笔) can understand and communicate fluently in the language chosen '\\n        'by the user such as English and 中文.\\\\n'\\n        '- InternLM-XComposer (浦语·灵笔) is capable of comprehending and articulating responses effectively '\\n        'based on the provided image.')\\n\\n\\nregister_template(\\n    TemplateType.internlm_xcomposer2_5,\\n    InternLMXComposer2_5Template(version='v2.5'),\\n    use_model=True,\\n    lazy_tokenize=True)\\n\\nregister_template(\\n    TemplateType.internlm_xcomposer2_4khd,\\n    InternLMXComposer2_5Template(version='v2-4khd'),\\n    use_model=True,\\n    lazy_tokenize=True)\\n\\n\\nclass InternvlTemplate(Template):\\n    system = 'You are an AI assistant whose name is InternLM (书生·浦语).'\\n    num_image_token = 256\\n\\n    def __init__(self):\\n        super().__init__([], ['<|im_start|>user\\\\n{{QUERY}}<|im_end|><|im_start|>assistant\\\\n'], ['<|im_end|>'],\\n                         ['<|im_end|>'],\\n                         self.system, ['<|im_start|>system\\\\n{{SYSTEM}}<|im_end|>'],\\n                         auto_add_bos=True)\\n\\n    def replace_tag(self, media_type, index, example) -> List[Context]:\\n        if self._is_vllm:\\n            image_context = ['<img><image></img>\\\\n']\\n        else:\\n            image_context = ['<img>', [-100], '</img>\\\\n']\\n        return image_context\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        input_ids = inputs['input_ids']\\n        idx_list = _findall(input_ids, -100)\\n        pixel_values = None\\n        images = example.get('images')\\n        if images:\\n            labels = inputs.get('labels')\\n            input_size = get_env_args('input_size', int, 448)\\n            max_num = get_env_args('max_num', int, 12)\\n            pixel_values_images = [transform_image(image, input_size, max_num) for image in images]\\n            pixel_values = torch.cat(pixel_values_images, dim=0).to(self.model.dtype)\\n            image_bs = pixel_values.shape[0]\\n\\n            idx, idx2 = idx_list[0], idx_list[-1]  # remove [-100, -100]\\n            img_tokens: List[int] = self.tokenizer.encode(\\n                '<IMG_CONTEXT>', add_special_tokens=False) * self.num_image_token * image_bs\\n            input_ids = input_ids[:idx] + img_tokens + input_ids[idx2 + 1:]\\n            if labels is not None:\\n                labels = labels[:idx] + [-100] * len(img_tokens) + labels[idx2 + 1:]\\n            inputs['input_ids'] = input_ids\\n            inputs['labels'] = labels\\n        inputs['_data'] = {'input_ids': torch.tensor(input_ids), 'pixel_values': pixel_values}\\n        inputs.pop('loss_scale', None)\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        embedding = model.get_input_embeddings()\\n        device = embedding.weight.device\\n        input_ids = data['input_ids']\\n        inputs_embeds = embedding(input_ids[None])[0].to(device=device)\\n        pixel_values = data['pixel_values']\\n        if pixel_values is not None:\\n            pixel_values = pixel_values.to(device=device)\\n            vit_embeds = model.extract_feature(pixel_values).to(device=device)\\n            selected = (input_ids == self.tokenizer.encode('<IMG_CONTEXT>', add_special_tokens=False)[0])\\n            inputs_embeds[selected] = vit_embeds.reshape(-1, vit_embeds.shape[-1])\\n        elif is_deepspeed_enabled():\\n            dummy_pixel_values = torch.zeros((1, 3, 32, 32), device=device, dtype=inputs_embeds.dtype)\\n            vit_embeds = model.extract_feature(dummy_pixel_values).to(device=device)\\n            inputs_embeds += vit_embeds.mean() * 0.\\n        return {'inputs_embeds': inputs_embeds}\\n\\n    @staticmethod\\n    def _get_generate_ids(generate_ids: List[int], input_token_len: int) -> List[int]:\\n        return generate_ids\\n\\n\\ndef _replace_video2image(load_video_func, example, replace_tag) -> List[Context]:\\n    context_list = []\\n    video_index = example['video_index']\\n    video = example['videos'][video_index]\\n    images = example['images']\\n    image_index = example['image_index']\\n    new_images = load_video_func(video)\\n    example['images'] = images[:image_index] + new_images + images[image_index:]\\n    for i in range(len(new_images)):\\n        context_list += replace_tag(i)\\n    example['image_index'] += len(new_images)\\n    return context_list\\n\\n\\nclass Internvl2Template(InternvlTemplate):\\n    video_segments = 8\\n    system = '你是由上海人工智能实验室联合商汤科技开发的书生多模态大模型，英文名叫InternVL, 是一个有用无害的人工智能助手。'\\n\\n    def replace_tag(self, media_type, index, example) -> List[Context]:\\n        image_context = super().replace_tag('image', index, example)\\n        if media_type == 'image':\\n            return image_context\\n        elif media_type == 'video':\\n            video_segments = get_env_args('video_segments', int, self.video_segments)\\n            load_video = partial(load_video_internvl, num_segments=video_segments)\\n            return _replace_video2image(load_video, example, lambda i: [f'Frame{i + 1}: '] + image_context)\\n\\n    def replace_object(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example.get('objects')\\n        if objects:\\n            object_ = objects[index]\\n            return [f'<ref>{object_[\\\"caption\\\"]}</ref>']\\n        else:\\n            return ['<ref-object>']\\n\\n    def replace_box(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        objects = example.get('objects')\\n        if objects:\\n            object_ = objects[index]\\n            if isinstance(object_['bbox'][0], list):\\n                all_objects = '<box> ['\\n                for sub_object in object_['bbox']:\\n                    all_objects += (f'[{sub_object[0]}, {sub_object[1]}, ' f'{sub_object[2]}, {sub_object[3]}],')\\n                all_objects = all_objects[:-1]\\n                all_objects += '] </box>'\\n                return [all_objects]\\n            else:\\n                return [\\n                    f'<box> [[{object_[\\\"bbox\\\"][0]}, {object_[\\\"bbox\\\"][1]}, '\\n                    f'{object_[\\\"bbox\\\"][2]}, {object_[\\\"bbox\\\"][3]}]] </box>'\\n                ]\\n        else:\\n            return ['<bbox>']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super(InternvlTemplate, self)._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        input_ids = inputs['input_ids']\\n        idx_list = _findall(input_ids, -100)\\n        labels = inputs.get('labels')\\n        images = example.get('images')\\n        if images:\\n            has_video = bool(example.get('videos'))\\n            input_size = get_env_args('input_size', int, 448)\\n            max_num = get_env_args('max_num', int, 1 if has_video else 12)\\n            pixel_values = [transform_image(image, input_size, max_num) for image in images]\\n            num_patches = [pv.shape[0] for pv in pixel_values]\\n            pixel_values = torch.cat(pixel_values).to(self.model.dtype)\\n        else:\\n            pixel_values = None\\n            num_patches = []\\n        assert len(num_patches) == len(\\n            idx_list), f'len(num_patches): {len(num_patches)}, len(idx_list): {len(idx_list)}'\\n        added_tokens_len = 0\\n        for idx, num_patch in zip(idx_list, num_patches):\\n            img_tokens: List[int] = self.tokenizer.encode(\\n                '<IMG_CONTEXT>', add_special_tokens=False) * self.num_image_token * num_patch\\n            input_ids = input_ids[:idx + added_tokens_len] + img_tokens + input_ids[idx + added_tokens_len + 1:]\\n            if labels is not None:\\n                labels = labels[:idx + added_tokens_len] + [-100] * len(img_tokens) + labels[idx + added_tokens_len\\n                                                                                             + 1:]\\n            added_tokens_len += len(img_tokens) - 1\\n        inputs['input_ids'] = input_ids\\n        inputs['labels'] = labels\\n        inputs['_data'] = {'input_ids': torch.tensor(input_ids), 'pixel_values': pixel_values}\\n        inputs.pop('loss_scale', None)\\n        return inputs, {}\\n\\n\\nclass InternvlPhi3TemplateMixin:\\n\\n    def __init__(self):\\n        Template.__init__(\\n            self, [], ['<|user|>\\\\n{{QUERY}}<|end|><|assistant|>\\\\n'], ['<|end|>'], ['<|end|>'],\\n            getattr(self, 'system', None), ['<|system|>\\\\n{{SYSTEM}}<|end|>'],\\n            auto_add_bos=True)\\n        self.padding_side = 'left'\\n\\n\\nclass InternvlPhi3Template(InternvlPhi3TemplateMixin, InternvlTemplate):\\n    system = 'You are an AI assistant whose name is Phi-3.'\\n\\n\\nclass Internvl2Phi3Template(InternvlPhi3TemplateMixin, Internvl2Template):\\n    pass\\n\\n\\nregister_template(\\n    TemplateType.internvl, InternvlTemplate(), use_model=True, lazy_tokenize=True, infer_media_type='dialogue')\\n\\nregister_template(\\n    TemplateType.internvl_phi3, InternvlPhi3Template(), use_model=True, lazy_tokenize=True, infer_media_type='dialogue')\\n\\nregister_template(TemplateType.internvl2, Internvl2Template(), use_model=True, lazy_tokenize=True)\\n\\nregister_template(TemplateType.internvl2_phi3, Internvl2Phi3Template(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass FlorenceTemplate(Template):\\n    compute_per_round_loss = False\\n    output_prompt_answer = True\\n\\n    def __init__(self):\\n        super().__init__(['<s>'], ['{{QUERY}}</s>'], None, ['</s>'])\\n        self.task_prompts_without_inputs = {\\n            '<OCR>': 'What is the text in the image?',\\n            '<OCR_WITH_REGION>': 'What is the text in the image, with regions?',\\n            '<CAPTION>': 'What does the image describe?',\\n            '<DETAILED_CAPTION>': 'Describe in detail what is shown in the image.',\\n            '<MORE_DETAILED_CAPTION>': 'Describe with a paragraph what is shown in the image.',\\n            '<OD>': 'Locate the objects with category name in the image.',\\n            '<DENSE_REGION_CAPTION>': 'Locate the objects in the image, with their descriptions.',\\n            '<REGION_PROPOSAL>': 'Locate the region proposals in the image.'\\n        }\\n        self.task_prompts_with_input = {\\n            '<CAPTION_TO_PHRASE_GROUNDING>': 'Locate the phrases in the caption: {input}',\\n            '<REFERRING_EXPRESSION_SEGMENTATION>': 'Locate {input} in the image with mask',\\n            '<REGION_TO_SEGMENTATION>': 'What is the polygon mask of region {input}',\\n            '<OPEN_VOCABULARY_DETECTION>': 'Locate {input} in the image.',\\n            '<REGION_TO_CATEGORY>': 'What is the region {input}?',\\n            '<REGION_TO_DESCRIPTION>': 'What does the region {input} describe?',\\n            '<REGION_TO_OCR>': 'What text is in the region {input}?',\\n        }\\n\\n    def check_example(self, example):\\n        images = example.get('images') or []\\n        assert len(images) == 1, 'Florence series models only supports input with a single image.'\\n\\n    def add_default_tags(self, example: Dict[str, Any]) -> None:\\n        return\\n\\n    def replace_box(self, index: int, example: Dict[str, Any]) -> List[Context]:\\n        object_ = example['objects'][index]\\n        if isinstance(object_['bbox'][0], list):\\n            all_objects = ''\\n            for sub_object in object_['bbox']:\\n                x1, y1, x2, y2 = sub_object\\n                all_objects += f'<loc_{x1}><loc_{y1}><loc_{x2}><loc_{y2}>,'\\n            return [all_objects[:-1]]\\n        else:\\n            x1, y1, x2, y2 = object_['bbox']\\n            return [f'<loc_{x1}><loc_{y1}><loc_{x2}><loc_{y2}>']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        query = example['query']\\n        processor = self.tokenizer.processor\\n        example['query'] = processor._construct_prompts([query])[0]\\n        inputs, _ = super()._encode(example)\\n        input_ids = inputs['prompt_input_ids']\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images') or []\\n        labels = inputs['answer_labels']\\n        if labels is not None:\\n            labels = [0] + labels\\n        pixel_values = processor.image_processor(images, return_tensors='pt')['pixel_values'].to(self.model.dtype)\\n        inputs = {\\n            'input_ids': input_ids,\\n            'labels': labels,\\n            '_data': {\\n                'input_ids': torch.tensor(input_ids)[None],\\n                'pixel_values': pixel_values,\\n            }\\n        }\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        inputs_embeds = model.get_input_embeddings()(data['input_ids'])\\n        image_features = model._encode_image(data['pixel_values'])\\n        inputs_embeds, _ = model._merge_input_ids_with_image_features(image_features, inputs_embeds)\\n        return {'inputs_embeds': inputs_embeds[0]}\\n\\n    @staticmethod\\n    def _get_generate_ids(generate_ids: List[int], input_token_len: int) -> List[int]:\\n        return generate_ids\\n\\n    def post_process_generate_response(self, response, example):\\n        if isinstance(example['images'], list):\\n            example['images'] = example['images'][0]\\n        image = load_image(example['images'])\\n        return json.dumps(\\n            self.tokenizer.processor.post_process_generation(\\n                response, task=example['query'], image_size=(image.width, image.height)))\\n\\n\\nregister_template(\\n    TemplateType.florence,\\n    FlorenceTemplate(),\\n    use_model=True,\\n    lazy_tokenize=True,\\n    infer_media_type='dialogue',\\n    stream=False)\\n\\nregister_template(TemplateType.xverse,\\n                  Template(['{{SYSTEM}}'], ['Human: {{QUERY}}\\\\n\\\\nAssistant: '], [['eos_token_id']], [['eos_token_id']]))\\nregister_template(TemplateType.yuan, Template([], ['{{QUERY}}<sep>'], None, [['eos_token_id']]))\\nregister_template(TemplateType.ziya,\\n                  Template([['bos_token_id'], '{{SYSTEM}}'], ['<human>:{{QUERY}}\\\\n<bot>:'], ['\\\\n'], [['eos_token_id']]))\\n\\nregister_template(TemplateType.skywork,\\n                  Template(['<s>{{SYSTEM}}'], ['</s><s>[USER]{{QUERY}}[SEP][BOT]'], None, ['[SEP]</s>']))\\n\\nregister_template(TemplateType.bluelm,\\n                  Template([['bos_token_id'], '{{SYSTEM}}'], ['[|Human|]:{{QUERY}}[|AI|]:'], [], [['eos_token_id']]))\\n\\nregister_template(\\n    TemplateType.codefuse_codellama,\\n    Template(['{{SYSTEM}}'], ['<|role_start|>human<|role_end|>{{QUERY}}<|role_start|>bot<|role_end|>'], [],\\n             [['eos_token_id']]))\\n\\nregister_template(\\n    TemplateType.codefuse,\\n    Template([], ['<s>human\\\\n{{QUERY}}\\\\n<s>bot\\\\n'], [['eos_token_id'], '\\\\n'], [['eos_token_id']], None,\\n             ['<s>system\\\\n{{SYSTEM}}\\\\n']))\\n\\nregister_template(\\n    TemplateType.deepseek_coder,\\n    Template(['{{SYSTEM}}'], ['### Instruction:\\\\n{{QUERY}}\\\\n### Response:\\\\n'], ['\\\\n<|EOT|>\\\\n'], ['\\\\n<|EOT|>'],\\n             ('You are an AI programming assistant, utilizing the Deepseek Coder model, '\\n              'developed by Deepseek Company, and you only answer questions related to computer science. '\\n              'For politically sensitive questions, security and privacy issues, '\\n              'and other non-computer science questions, you will refuse to answer\\\\n')))\\n\\n\\nclass LlavaHfTemplate(Template):\\n\\n    def __init__(self, *args, **kwargs) -> None:\\n        super().__init__(*args, **kwargs)\\n        if version.parse(transformers.__version__) < version.parse('4.43.0'):\\n            self.padding_side = 'left'\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        assert media_type == 'image'\\n        return ['<image>\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images')\\n        if images:\\n            image_processor = self.tokenizer.processor.image_processor\\n            image_inputs = image_processor(images, return_tensors='pt').to(self.model.dtype)\\n            inputs['pixel_values'] = image_inputs['pixel_values']\\n            if 'image_sizes' in image_inputs:\\n                inputs['image_sizes'] = image_inputs['image_sizes']\\n        return inputs, {}\\n\\n\\nclass Llava1_6Llama3Template(LlavaHfTemplate):\\n    default_system = 'You are a helpful language and vision assistant. ' \\\\\\n                     'You are able to understand the visual content that the user provides, ' \\\\\\n                     'and assist the user with a variety of tasks using natural language.'\\n\\n    def __init__(self):\\n        super().__init__(['<|begin_of_text|>'], [\\n            '<|start_header_id|>user<|end_header_id|>\\\\n\\\\n{{QUERY}}<|eot_id|>'\\n            '<|start_header_id|>assistant<|end_header_id|>\\\\n\\\\n'\\n        ], ['<|eot_id|>'], ['<|eot_id|>'], None,\\n                         ['<|begin_of_text|><|start_header_id|>system<|end_header_id|>\\\\n\\\\n{{SYSTEM}}<|eot_id|>'])\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs['pixel_values'].shape) == 5:  # (1, num_patch, 3, H/W, W/H)\\n            inputs['pixel_values'] = torch.squeeze(inputs['pixel_values'], dim=0)  # (num_patch, 3, H/W, W/H)\\n        return inputs, {}\\n\\n\\nregister_template(TemplateType.llava_next_llama3, Llava1_6Llama3Template(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass LlavaVideoTemplate(Template):\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n\\n        if media_type == 'image':\\n            return ['<image>\\\\n']\\n        assert media_type == 'video'\\n        media_file = example['videos'][index]\\n        if media_file.rsplit('.', 1)[-1] in {'jpg', 'png'}:\\n            return ['<image>\\\\n']\\n        else:\\n            example['videos'][index] = load_video_llava(example['videos'][index])\\n            return ['<video>\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images') or []\\n        videos_path = example.get('videos') or []\\n        if len(videos_path) > 0:\\n            video_processor = self.tokenizer.processor.video_processor\\n            video_inputs = video_processor(videos, return_tensors='pt').to(self.model.dtype)\\n            inputs['pixel_values_videos'] = video_inputs['pixel_values_videos']\\n        if len(images) > 0:\\n            image_processor = self.tokenizer.processor.image_processor\\n            image_inputs = image_processor(images, return_tensors='pt').to(self.model.dtype)\\n            inputs['pixel_values'] = image_inputs['pixel_values']\\n            inputs['image_sizes'] = image_inputs['image_sizes']\\n        return inputs, {}\\n\\n\\nregister_template(\\n    TemplateType.llava_next_video,\\n    LlavaVideoTemplate(['<s>{{SYSTEM}} '], ['USER: {{QUERY}} ASSISTANT:'], [' '], ['</s>']),\\n    use_model=True,\\n    lazy_tokenize=True)\\n\\nregister_template(\\n    TemplateType.llava_next_video_yi,\\n    LlavaVideoTemplate(['{{SYSTEM}} '], ['USER: {{QUERY}} ASSISTANT:'], [' '], ['<|im_end|>']),\\n    use_model=True,\\n    infer_media_type='round',\\n    lazy_tokenize=True)\\n\\n\\ndef align_image_inputs(input_ids: List[int], labels: List[int], new_input_ids,\\n                       image_token: int) -> Tuple[List[int], List[int]]:\\n    if isinstance(new_input_ids, torch.Tensor):\\n        new_input_ids = new_input_ids.tolist()\\n\\n    # Find the tokens after the image_token in input_ids, and then align them.\\n    i, j = 0, 0\\n    while i < len(input_ids):\\n        x = input_ids[i]\\n        if x == image_token:\\n            assert i + 1 < len(input_ids), f'input_ids[-10:]: {input_ids[-10:]}'\\n            assert i - 1 >= 0, f'input_ids[:10]: {input_ids[:10]}'\\n            # [1, 2, 3(i-1), image_token(i), 4(i+1) ,5, 6]\\n            # [1, 2, 3(j_begin), a(j'), a, a, a, 4(j) ,5, 6]\\n            j_begin = j - 1\\n            for k in range(5):  # Increase robustness.\\n                if j_begin + k < len(new_input_ids) and new_input_ids[j_begin + k] == input_ids[i - 1]:\\n                    j_begin += k\\n                    break\\n                if j_begin - k >= 0 and new_input_ids[j_begin - k] == input_ids[i - 1]:\\n                    j_begin -= k\\n                    break\\n            else:\\n                raise ValueError(f'new_input_ids: {new_input_ids}, input_ids: {input_ids}')\\n            j_begin += 1\\n            while j < len(new_input_ids) and new_input_ids[j] != input_ids[i + 1]:\\n                j += 1\\n            input_ids = input_ids[:i] + new_input_ids[j_begin:j] + input_ids[i + 1:]\\n            if labels:\\n                labels = labels[:i] + [-100] * (j - j_begin) + labels[i + 1:]\\n            i += j - j_begin\\n        else:\\n            j += 1\\n        i += 1\\n    return input_ids, labels\\n\\n\\nclass Idefics3Template(Template):\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images') or []\\n        processor = self.tokenizer.processor\\n        prompt = self.tokenizer.decode(inputs['input_ids'])\\n        if images:\\n            image_inputs = processor(text=prompt, images=images, return_tensors='pt', add_special_tokens=False)\\n            image_token = 128257  # <image>\\n            inputs['input_ids'], inputs['labels'] = align_image_inputs(inputs['input_ids'], inputs['labels'],\\n                                                                       image_inputs['input_ids'][0], image_token)\\n            inputs['pixel_values'] = image_inputs['pixel_values']\\n        return inputs, {}\\n\\n\\nregister_template(\\n    TemplateType.idefics3,\\n    Idefics3Template(['<|begin_of_text|>'], ['User:{{QUERY}}<end_of_utterance>\\\\nAssistant:'], ['<end_of_utterance>\\\\n'],\\n                     ['<end_of_utterance>'], None, ['System:{{SYSTEM}}<end_of_utterance>\\\\n']),\\n    use_model=True,\\n    lazy_tokenize=True)\\n\\n\\nclass Llava1_5Template(LlavaHfTemplate):\\n\\n    def __init__(self):\\n        super().__init__(['<s>'], ['USER: {{QUERY}}\\\\nASSISTANT:'], ['</s>'], ['</s>'])\\n\\n\\nregister_template(TemplateType.llava1_5, Llava1_5Template(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass LLavaTemplate(Template):\\n\\n    def __init__(self):\\n        # This template follows: https://github.com/haotian-liu/LLaVA/blob/main/llava/conversation.py#L350\\n        super().__init__(['<s>[INST] '], ['{{QUERY}} [/INST]'],\\n                         None, ['</s>'],\\n                         system_prefix=['<<SYS>>\\\\n{{system}}\\\\n<</SYS>>\\\\n\\\\n'])\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        assert media_type == 'image'\\n        return [[-200], '\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images') or []\\n        image_sizes = [x.size for x in images]\\n        from llava.mm_utils import process_images\\n        model = self.model.model\\n        if not hasattr(model, 'vision_tower'):\\n            model = model.model\\n        image_processor = model.vision_tower.image_processor\\n        if images:\\n            images_tensor = process_images(images, image_processor, self.model.config)\\n            inputs['images'] = images_tensor.to(model.dtype).squeeze(0)\\n            inputs['image_sizes'] = image_sizes\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        images = [b['images'] for b in batch if 'images' in b]\\n        if images:\\n            res['images'] = images\\n            res['image_sizes'] = sum([b['image_sizes'] for b in batch if 'image_sizes' in b], start=[])\\n        has_images = [(b == -200).sum() for b in res['input_ids']]\\n        assert all([\\n            h > 0 for h in has_images\\n        ]) or not any([h > 0\\n                       for h in has_images]), 'Llava does not support mix-batch nlp dataset and multi-modal dataset'\\n        return res\\n\\n    @staticmethod\\n    def _get_generate_ids(generate_ids: List[int], input_token_len: int) -> List[int]:\\n        return generate_ids\\n\\n\\nclass Llava1_6Template(LlavaHfTemplate):\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        for b in batch:\\n            pixel_values = b.get('pixel_values')\\n            if pixel_values is not None:\\n                b['pixel_values'] = pixel_values.squeeze(0)  # 5d -> 4d\\n        res = super().data_collator(batch, padding_to)\\n        return res\\n\\n\\nclass Llava1_6MistralTemplate(Llava1_6Template):\\n\\n    def __init__(self):\\n        super().__init__(['<s>[INST] '], ['{{QUERY}} [/INST]'], ['</s>'], ['</s>'],\\n                         system_prefix=['<<SYS>>\\\\n{{system}}\\\\n<</SYS>>\\\\n\\\\n'])\\n\\n\\nclass Llava1_6VicunaTemplate(Llava1_6Template):\\n    system = ('A chat between a curious human and an artificial intelligence assistant. '\\n              \\\"The assistant gives helpful, detailed, and polite answers to the human's questions.\\\")\\n\\n    def __init__(self):\\n        super().__init__(['<s>'], ['USER: {{QUERY}} ASSISTANT:'], ['</s>'], ['</s>'],\\n                         self.system,\\n                         system_prefix=['<s>{{SYSTEM}} '])\\n\\n\\nregister_template(TemplateType.llava_mistral, Llava1_6MistralTemplate(), use_model=True, lazy_tokenize=True)\\n\\nregister_template(TemplateType.llava_vicuna, Llava1_6VicunaTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass LLava1_6YiTemplate(Llava1_6Template):\\n\\n    def __init__(self):\\n        super().__init__([], ['<|im_start|>user\\\\n{{QUERY}}<|im_end|><|im_start|>assistant\\\\n'], ['<|im_end|>'],\\n                         ['<|im_end|>'],\\n                         system_prefix=['<|im_start|>system\\\\n{{SYSTEM}}<|im_end|>'])\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        if self._is_vllm:\\n            return [[64000], '\\\\n']\\n        else:\\n            return super().replace_tag(media_type, index, example)\\n\\n\\nregister_template(TemplateType.llava_yi, LLava1_6YiTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass Llama3LlavaNextHfTemplate(Llama3TemplateMixin, Llava1_6Template):\\n    pass\\n\\n\\nregister_template(TemplateType.llama3_llava_next_hf, Llama3LlavaNextHfTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass LlavaQwenHfTemplate(QwenTemplateMixin, Llava1_6Template):\\n    pass\\n\\n\\nregister_template(TemplateType.llava_qwen_hf, LlavaQwenHfTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass LlavaOneVisonTemplate(QwenTemplateMixin, Llava1_6Template):\\n    system = None\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = Template._encode(self, example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images')\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        idx_list = _findall(input_ids, 151646)  # <image>\\n        processor = self.tokenizer.processor\\n        if images:\\n            image_processor = processor.image_processor\\n            image_inputs = image_processor(images, return_tensors='pt').to(self.model.dtype)\\n            height, width = image_inputs['pixel_values'][0].shape[-2:]\\n            added_tokens_len = 0\\n            for idx, pixel_v, image_size in zip(idx_list, image_inputs['pixel_values'], image_inputs['image_sizes']):\\n                orig_height, orig_width = image_size\\n                num_image_tokens = processor._get_number_of_features(orig_height, orig_width, height, width)\\n                input_ids = input_ids[:added_tokens_len\\n                                      + idx] + [151646] * num_image_tokens + input_ids[added_tokens_len + idx + 1:]\\n                if labels is not None:\\n                    labels = labels[:added_tokens_len + idx] + [-100] * num_image_tokens + labels[added_tokens_len + idx\\n                                                                                                  + 1:]\\n                added_tokens_len += num_image_tokens - 1\\n            inputs['input_ids'] = input_ids\\n            inputs['labels'] = labels\\n            inputs['pixel_values'] = image_inputs['pixel_values']\\n            if 'image_sizes' in image_inputs:\\n                inputs['image_sizes'] = image_inputs['image_sizes']\\n        return inputs, {}\\n\\n\\nregister_template(TemplateType.llava_onevision_qwen, LlavaOneVisonTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass LLavaLlamaTemplate(Llama3Template):\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example):\\n        return ['<image>\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        raw_image = example.get('images')\\n        if raw_image:\\n            pixel_values = self.tokenizer.processor.image_processor(raw_image, return_tensors='pt')['pixel_values']\\n            inputs['pixel_values'] = pixel_values.to(self.model.dtype)\\n        return inputs, {}\\n\\n\\nregister_template(TemplateType.llava_llama_instruct, LLavaLlamaTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass PaliGemmaTemplate(Template):\\n\\n    def __init__(self):\\n        super().__init__([], ['{{QUERY}}\\\\n'], None, ['<eos>'])\\n\\n    def check_example(self, example):\\n        images = example.get('images') or []\\n        assert len(images) <= 1\\n\\n    def replace_tag(self, media_type, index, example) -> List[Context]:\\n        assert media_type == 'image'\\n        if self._is_vllm:\\n            self.prompt = ['{{QUERY}}']\\n            return []\\n        else:\\n            self.prompt = ['{{QUERY}}\\\\n']\\n            return ['<image>' * self.tokenizer.processor.image_seq_length + '<bos>']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        raw_image = example.get('images')\\n        processor = self.tokenizer.processor\\n        if inputs['labels'] is not None:\\n            n = upper_bound(0, len(inputs['labels']), lambda idx: inputs['labels'][idx] == -100)\\n            n2 = len(inputs['labels']) - n\\n            inputs['token_type_ids'] = [0] * n + [1] * n2\\n        else:\\n            inputs['token_type_ids'] = [0] * len(inputs['input_ids'])\\n        if raw_image:\\n            model_inputs = processor(text=example['query'], images=raw_image[0], return_tensors='pt')\\n            inputs['pixel_values'] = model_inputs['pixel_values']\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        token_type_ids = [torch.tensor(b['token_type_ids']) for b in batch]\\n        token_type_ids = self.pad_sequence(token_type_ids, 0, self.padding_side)\\n        res['token_type_ids'] = token_type_ids\\n        return res\\n\\n\\nregister_template(\\n    TemplateType.paligemma, PaliGemmaTemplate(), infer_media_type='dialogue', lazy_tokenize=True, is_generation=True)\\n\\n\\nclass Phi3Template(Template):\\n\\n    def __init__(self):\\n        super().__init__([], ['<|user|>\\\\n{{QUERY}}<|end|>\\\\n<|assistant|>\\\\n'], ['<|end|>\\\\n'], ['<|end|>'],\\n                         None, ['<|system|>\\\\n{{SYSTEM}}<|end|>\\\\n'],\\n                         auto_add_bos=True)\\n\\n\\nregister_template(TemplateType.phi3, Phi3Template())\\n\\n\\nclass Phi3VisionTemplate(Phi3Template):\\n    image_placeholder = ['<|image|><s>\\\\n']  # <|image|>\\\\n\\n\\n    def replace_tag(self, media_type, index, example) -> List[Context]:\\n        if self._is_vllm:\\n            return [f'<|image_{index + 1}|>\\\\n']  # <|image_1|>\\\\n\\n        else:\\n            return super().replace_tag(media_type, index, example)\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        images = example.get('images') or []\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        idx_list = _findall(input_ids, 32044)  # '<|image|>'\\n\\n        if len(images) > 0:\\n            processor = self.tokenizer.processor\\n            inputs.update(processor.image_processor(images, return_tensors='pt'))\\n            assert len(idx_list) == len(images), f'len(idx_list): {len(idx_list)}, len(images): {len(images)}'\\n            res_input_ids = []\\n            res_labels = []\\n            num_img_tokens = inputs.pop('num_img_tokens').tolist()\\n            idx_list.insert(0, -1)\\n            for i in range(len(idx_list) - 1):\\n                image_token_id = -i - 1\\n                res_input_ids += input_ids[idx_list[i] + 1:idx_list[i + 1]] + [image_token_id] * num_img_tokens[i]\\n                if labels is not None:\\n                    res_labels += labels[idx_list[i] + 1:idx_list[i + 1]] + [-100] * num_img_tokens[i]\\n            res_input_ids += input_ids[idx_list[-1] + 1:]\\n            input_ids = res_input_ids\\n            if labels is not None:\\n                res_labels += labels[idx_list[-1] + 1:]\\n                labels = res_labels\\n\\n        inputs['input_ids'] = input_ids\\n        inputs['labels'] = labels\\n        return inputs, {}\\n\\n\\nregister_template(TemplateType.phi3_vl, Phi3VisionTemplate(), lazy_tokenize=True)\\n\\n\\nclass Llama3LlavaNextTemplate(Llama3TemplateMixin, LLavaTemplate):\\n    system = 'You are a helpful language and vision assistant. ' \\\\\\n             'You are able to understand the visual content that the user provides, ' \\\\\\n             'and assist the user with a variety of tasks using natural language.'\\n\\n\\nregister_template(TemplateType.llama3_llava_next, Llama3LlavaNextTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass LLavaQwenTemplate(QwenTemplateMixin, LLavaTemplate):\\n    pass\\n\\n\\nregister_template(TemplateType.llava_qwen, LLavaQwenTemplate(), use_model=True, lazy_tokenize=True)\\n\\n\\ndef _findall(token_list: List[int], sub_token_list: Union[int, List[int]]) -> List[int]:\\n    \\\"\\\"\\\"Find the index of a token in the token_list.\\\"\\\"\\\"\\n    if isinstance(sub_token_list, int):\\n        sub_token_list = [sub_token_list]\\n    res = []\\n    idx = -1\\n    try:\\n        while True:\\n            idx = token_list.index(sub_token_list[0], idx + 1)\\n            if len(sub_token_list) == 1 or sub_token_list == token_list[idx:idx + len(sub_token_list)]:\\n                res.append(idx)\\n    except ValueError:\\n        pass\\n    return res\\n\\n\\nclass DeepseekVLTemplate(Template):\\n    DEEPSEEK_VL_SYSTEM = ('You are a helpful language and vision assistant. '\\n                          'You are able to understand the visual content that the user provides, '\\n                          'and assist the user with a variety of tasks using natural language.')\\n\\n    image_placeholder = ['<image_placeholder>']\\n\\n    def __init__(self):\\n        super().__init__(['<｜begin▁of▁sentence｜>{{SYSTEM}}\\\\n\\\\n'], ['User: {{QUERY}}\\\\n\\\\nAssistant:'],\\n                         ['<｜end▁of▁sentence｜>'], ['<｜end▁of▁sentence｜>'], self.DEEPSEEK_VL_SYSTEM)\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images')\\n        processor = self.tokenizer.processor\\n        input_ids, labels = inputs['input_ids'], inputs['labels']\\n        idx_list = _findall(input_ids, processor.image_id)  # '<image_placeholder>'\\n        new_input_ids, new_labels = [], []\\n        lo = 0\\n        for hi in idx_list:\\n            new_input_ids += input_ids[lo:hi]\\n            if labels is not None:\\n                new_labels += labels[lo:hi]\\n            new_input_ids += [processor.image_id] * processor.num_image_tokens\\n            new_labels += [-100] * processor.num_image_tokens\\n            lo = hi + 1\\n        new_input_ids += input_ids[lo:]\\n        if labels is not None:\\n            new_labels += labels[lo:]\\n        else:\\n            new_labels = None\\n        from deepseek_vl.models.processing_vlm import VLChatProcessorOutput\\n        images_outputs = processor.image_processor(images, return_tensors='pt')\\n        output = VLChatProcessorOutput(\\n            sft_format=None,\\n            input_ids=torch.tensor(new_input_ids),\\n            pixel_values=images_outputs.pixel_values,\\n            num_image_tokens=torch.tensor([processor.num_image_tokens] * len(idx_list)))\\n        batched_output = dict(processor.batchify([output]))\\n        batched_output['pixel_values'] = batched_output['pixel_values'].to(dtype=self.model.dtype)\\n        inputs = {'input_ids': new_input_ids, 'labels': new_labels, '_data': batched_output}\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        inputs_embeds = model.prepare_inputs_embeds(**data)[0]\\n        return {'inputs_embeds': inputs_embeds}\\n\\n    @staticmethod\\n    def _get_generate_ids(generate_ids: List[int], input_token_len: int) -> List[int]:\\n        return generate_ids\\n\\n\\nregister_template(TemplateType.deepseek_vl, DeepseekVLTemplate(), use_model=True, lazy_tokenize=True)\\n\\nregister_template(\\n    TemplateType.zephyr,\\n    Template([], ['<|user|>\\\\n{{QUERY}}</s>\\\\n<|assistant|>\\\\n'], ['</s>\\\\n'], ['</s>'], None,\\n             ['<|system|>\\\\n{{SYSTEM}}</s>\\\\n']))\\n\\nregister_template(\\n    TemplateType.sus,\\n    Template(['{{SYSTEM}}'], ['### Human: {{QUERY}}\\\\n\\\\n### Assistant: '], ['<|endoftext|>'], ['<|endoftext|>']))\\n\\nregister_template(TemplateType.orion,\\n                  Template(['<s>{{SYSTEM}}'], ['Human: {{QUERY}}\\\\n\\\\nAssistant: </s>'], ['</s>'], ['</s>']))\\n\\n\\nclass CogTemplate(Template):\\n\\n    def check_example(self, example):\\n        images = example.get('images') or []\\n        assert len(images) <= 1\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        return []\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        image = example.get('images') or []\\n        inputs.pop('loss_scale', None)\\n        model = self.model\\n        inputs2 = model.build_conversation_input_ids(\\n            self.tokenizer, query=example['query'], history=example.get('history'), images=image)\\n        image_token_len = inputs2['token_type_ids'].sum().item()\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        inputs['token_type_ids'] = [0] + [1] * image_token_len + [0] * len(input_ids[1:])\\n        inputs['input_ids'] = input_ids[:1] + [self.tokenizer.pad_token_id] * image_token_len + input_ids[1:]\\n        if labels is not None:\\n            inputs['labels'] = labels[:1] + [-100] * image_token_len + labels[1:]\\n        if len(image) > 0:\\n            dtype = model.dtype\\n            inputs['images'] = [[img.to(dtype=dtype)] for img in inputs2['images']]\\n            if 'cross_images' in inputs2:\\n                # is cogagent\\n                inputs['cross_images'] = [[cross_img.to(dtype=dtype)] for cross_img in inputs2['cross_images']]\\n        return inputs, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        keys = ['images', 'cross_images']\\n        for key in keys:\\n            if key in batch[0]:\\n                res[key] = [b[key][0] for b in batch]\\n        token_type_ids = [torch.tensor(b['token_type_ids']) for b in batch]\\n        token_type_ids = self.pad_sequence(token_type_ids, 0, self.padding_side)\\n        res['token_type_ids'] = token_type_ids\\n        return res\\n\\n\\nregister_template(\\n    TemplateType.cogagent_chat,\\n    CogTemplate(['<s>'], [' [INST] {{QUERY}} [/INST] '], [], ['</s>']),\\n    use_model=True,\\n    infer_media_type='dialogue',\\n    lazy_tokenize=True)\\n\\nregister_template(\\n    TemplateType.cogagent_instruct,\\n    CogTemplate(['<s>'], ['<EOI>Question: {{QUERY}} Answer:'], None, ['</s>']),\\n    use_model=True,\\n    infer_media_type='dialogue',\\n    lazy_tokenize=True)\\n\\nregister_template(\\n    TemplateType.cogvlm,\\n    CogTemplate([['bos_token_id']], ['Question: {{QUERY}} Answer:'], ['\\\\n'], [['eos_token_id']]),\\n    use_model=True,\\n    infer_media_type='dialogue',\\n    lazy_tokenize=True)\\n\\n\\nclass Cog2VideoTemplate(CogTemplate):\\n\\n    def check_example(self, example):\\n        videos = example.get('videos') or []\\n        assert len(videos) <= 1\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super(CogTemplate, self)._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        videos_path = example.get('videos') or []\\n        video = load_batch(videos_path, load_video_cogvlm2)\\n        inputs.pop('loss_scale', None)\\n        model = self.model\\n        inputs2 = model.build_conversation_input_ids(\\n            self.tokenizer,\\n            query=example['query'],\\n            history=example.get('history'),\\n            images=video,\\n            template_version='chat')\\n        video_token_len = inputs2['token_type_ids'].sum().item()\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        inputs['token_type_ids'] = [0] + [1] * video_token_len + [0] * len(input_ids[1:])\\n        inputs['input_ids'] = input_ids[:1] + [self.tokenizer.pad_token_id] * video_token_len + input_ids[1:]\\n        if labels is not None:\\n            inputs['labels'] = labels[:1] + [-100] * video_token_len + labels[1:]\\n        if len(video) > 0:\\n            dtype = model.dtype\\n            inputs['images'] = [[img.to(dtype=dtype)] for img in inputs2['images']]\\n        return inputs, {}\\n\\n\\nregister_template(\\n    TemplateType.cogvlm2_video,\\n    Cog2VideoTemplate([['bos_token_id']], ['Question: {{QUERY}} Answer:'], ['\\\\n'], [['eos_token_id']]),\\n    use_model=True,\\n    infer_media_type='dialogue',\\n    lazy_tokenize=True,\\n    media_type='video')\\n\\nregister_template(TemplateType.minicpm, Template(['<s>{{SYSTEM}}'], ['<用户>{{QUERY}}<AI>'], [], ['</s>']))\\n\\n\\ndef _remove_idx(arr: List[int], idx_list: List[int]) -> List[int]:\\n    res = []\\n    idx_set = set(idx_list)\\n    for i, x in enumerate(arr):\\n        if i not in idx_set:\\n            res.append(x)\\n    return res\\n\\n\\nclass MiniCPMVTemplate(Template):\\n    is_v2_5 = False\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        if self._is_vllm:\\n            return ['(<image>./</image>)\\\\n']\\n        else:\\n            return [[-100]]\\n\\n    def check_example(self, example):\\n        images = example.get('images') or []\\n        if not self._is_vllm and not self._is_lmdeploy:\\n            assert len(images) == 1\\n\\n    async def prepare_lmdeploy_inputs(self, inputs: Dict[str, Any]) -> None:\\n        images = inputs.pop('images', None) or []\\n        if len(images) == 0:\\n            return\\n        input_ids = inputs['input_ids']\\n        idx_list = _findall(input_ids, -100)\\n        idx_list.insert(0, -1)\\n        new_input_ids = []\\n        features = []\\n        for i in range(len(idx_list) - 1):\\n            new_input_ids += input_ids[idx_list[i] + 1:idx_list[i + 1]]\\n            context_list = ['<image>', [-100], '</image>']\\n            feat = [x.squeeze() for x in images[i]['embeddings'].split(1)]\\n            grid = images[i].get('grid')\\n            if len(feat) > 1 and grid is not None:\\n                context_list.append('<slice>')\\n                for j in range(grid[1]):\\n                    if j > 0:\\n                        context_list.append('\\\\n')\\n                    for _ in range(grid[0]):\\n                        context_list += ['<image>', [-100], '</image>']\\n                context_list.append('</slice>\\\\n')\\n            new_input_ids += self._encode_context_list(context_list)[0]\\n            features += feat\\n        new_input_ids += input_ids[idx_list[-1] + 1:]\\n        inputs['input_ids'] = new_input_ids\\n        inputs['images'] = features\\n        await super().prepare_lmdeploy_inputs(inputs)\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example['images']\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        idx_list = _findall(input_ids, -100)\\n        idx = idx_list[0]\\n        config = self.model.config\\n        tgt_sizes = None\\n        slice_mode = getattr(config, 'slice_mode', False)\\n        if slice_mode:\\n            if self.is_v2_5:\\n                image_processor = self.tokenizer.processor.image_processor\\n                image_inputs = image_processor(images, return_tensors='pt').to(self.model.dtype)\\n                placeholder = image_processor.get_slice_image_placeholder(image_inputs.image_sizes[0][0])\\n                pixel_values = image_inputs['pixel_values']\\n                tgt_sizes = image_inputs['tgt_sizes']\\n            else:\\n                images, placeholder = self.model.get_slice_image_placeholder(images[0], self.tokenizer)\\n                pixel_values = [[self.model.transform(img) for img in images]]\\n            placeholder += '\\\\n'\\n            placeholder_id = self.tokenizer.encode(placeholder, add_special_tokens=False)\\n            input_ids = (input_ids[:idx] + placeholder_id + input_ids[idx + 1:])\\n            if labels is not None:\\n                labels = (labels[:idx] + [-100] * len(placeholder_id) + labels[idx + 1:])\\n            input_tensor_ids = torch.tensor(input_ids)\\n            image_start_idx = torch.where(input_tensor_ids == self.tokenizer.im_start_id)[0]\\n            image_start_idx += 1\\n            image_end_idx = torch.where(input_tensor_ids == self.tokenizer.im_end_id)[0]\\n            valid_image_nums = max(len(image_start_idx), len(image_end_idx))\\n            image_bound = [\\n                torch.hstack(\\n                    [image_start_idx[:valid_image_nums].unsqueeze(-1), image_end_idx[:valid_image_nums].unsqueeze(-1)])\\n            ]\\n        else:\\n            placeholder = '<image>' + '<unk>' * config.query_num + '</image>\\\\n'\\n            placeholder_id = self.tokenizer.encode(placeholder, add_special_tokens=False)\\n            input_ids = (input_ids[:idx] + placeholder_id + input_ids[idx + 1:])\\n            if labels is not None:\\n                labels = (labels[:idx] + [-100] * len(placeholder_id) + labels[idx + 1:])\\n            image_bound = [torch.tensor([[idx, idx + config.query_num]])]\\n            pixel_values = [[self.model.transform(images[0])]]\\n        inputs = {\\n            'input_ids': input_ids,\\n            'labels': labels,\\n            '_data': {\\n                'input_ids': torch.tensor(input_ids)[None],\\n                'image_bound': image_bound,\\n                'pixel_values': pixel_values,\\n                'tgt_sizes': tgt_sizes\\n            }\\n        }\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        inputs_embeds, _ = model.get_vllm_embedding(data)\\n        return {'inputs_embeds': inputs_embeds[0]}\\n\\n    @staticmethod\\n    def _get_generate_ids(generate_ids: List[int], input_token_len: int) -> List[int]:\\n        return generate_ids\\n\\n\\nclass MiniCPMV2_6Template(QwenTemplateMixin, MiniCPMVTemplate):\\n\\n    def check_example(self, example):\\n        pass\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        assert media_type in {'image', 'video'}\\n        max_num_frames = get_env_args('max_num_frames', int, 64)\\n        load_video = partial(load_video_minicpmv_mplug_owl3, max_num_frames=max_num_frames)\\n        image_context = super().replace_tag('image', index, example)\\n        if media_type == 'image':\\n            return image_context\\n        elif media_type == 'video':\\n            return _replace_video2image(load_video, example, lambda i: image_context)\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = Template._encode(self, example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example.get('images')\\n        use_video = bool(example.get('videos'))\\n        is_plain_text = not images and not use_video\\n        use_image_id = True\\n        max_slice_nums = None\\n\\n        if use_video:\\n            use_image_id = False\\n            max_slice_nums = 1  # or 2\\n\\n        max_slice_nums = get_env_args('max_slice_nums', int, max_slice_nums)\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        idx_list = _findall(input_ids, -100)\\n        idx_list.insert(0, -1)\\n\\n        image_processor = self.tokenizer.processor.image_processor\\n        image_inputs = image_processor([images], return_tensors='pt',\\n                                       max_slice_nums=max_slice_nums).to(self.model.dtype)\\n\\n        res_input_ids = []\\n        res_labels = []\\n        for i in range(len(idx_list) - 1):\\n            placeholder = image_processor.get_slice_image_placeholder(\\n                image_inputs.image_sizes[0][i], image_idx=i, max_slice_nums=max_slice_nums, use_image_id=use_image_id)\\n            placeholder += '\\\\n'\\n            placeholder_id = self.tokenizer.encode(placeholder, add_special_tokens=False)\\n            res_input_ids += input_ids[idx_list[i] + 1:idx_list[i + 1]] + placeholder_id\\n            if labels is not None:\\n                res_labels += labels[idx_list[i] + 1:idx_list[i + 1]] + [-100] * len(placeholder_id)\\n        res_input_ids += input_ids[idx_list[-1] + 1:]\\n        input_ids = res_input_ids\\n        if labels is not None:\\n            res_labels += labels[idx_list[-1] + 1:]\\n            labels = res_labels\\n        if not is_plain_text:\\n            input_tensor_ids = torch.tensor(input_ids)\\n            unk_token = self.tokenizer.encode('<unk>', add_special_tokens=False)[0]\\n            indices = (input_tensor_ids == unk_token).nonzero(as_tuple=True)[0].tolist()\\n\\n            ranges = []\\n            start = indices[0]\\n            for i in range(1, len(indices)):\\n                if indices[i] != indices[i - 1] + 1:\\n                    ranges.append([start, indices[i - 1] + 1])\\n                    start = indices[i]\\n            ranges.append([start, indices[-1] + 1])\\n            image_bound = [torch.tensor(ranges)]\\n        else:\\n            image_bound = [[]]\\n\\n        inputs = {\\n            'input_ids': input_ids,\\n            'labels': labels,\\n            '_data': {\\n                'input_ids': torch.tensor(input_ids)[None],\\n                'image_bound': image_bound,\\n                'pixel_values': image_inputs['pixel_values'],\\n                'tgt_sizes': image_inputs['tgt_sizes']\\n            }\\n        }\\n        return inputs, {}\\n\\n\\nregister_template(TemplateType.minicpm_v_v2_6, MiniCPMV2_6Template(), use_model=True, lazy_tokenize=True)\\n\\n\\nclass MiniCPMV2_5Template(Llama3TemplateMixin, MiniCPMVTemplate):\\n    is_v2_5 = True\\n\\n\\nregister_template(\\n    TemplateType.minicpm_v_v2_5, MiniCPMV2_5Template(), use_model=True, lazy_tokenize=True, infer_media_type='dialogue')\\n\\nregister_template(\\n    TemplateType.minicpm_v,\\n    MiniCPMVTemplate(['<s>{{SYSTEM}}'], ['<用户>{{QUERY}}<AI>'], [], ['</s>']),\\n    use_model=True,\\n    lazy_tokenize=True,\\n    infer_media_type='dialogue')\\n\\ngemma_template = Template(['<bos>'], ['<start_of_turn>user\\\\n{{QUERY}}<end_of_turn>\\\\n<start_of_turn>model\\\\n'],\\n                          ['<end_of_turn>\\\\n'], ['<end_of_turn>'], None,\\n                          ['<bos><start_of_turn>system\\\\n{{SYSTEM}}<end_of_turn>\\\\n'])\\nregister_template(TemplateType.gemma, gemma_template)\\n\\nregister_template(TemplateType.telechat, Template([], ['<_user>{{QUERY}}<_bot>'], ['<_end>'], ['<_end>']))\\n\\nregister_template(TemplateType.telechat_v2, Template([], ['<_user> {{QUERY}}<_bot>'], [], ['<_end>']))\\n\\nDBRX_SYSTEM = (\\n    'You are DBRX, created by Databricks. You were last updated in December 2023. '\\n    'You answer questions based on information available up to that point.\\\\n'\\n    'YOU PROVIDE SHORT RESPONSES TO SHORT QUESTIONS OR STATEMENTS, '\\n    'but provide thorough responses to more complex and open-ended questions.\\\\n'\\n    'You assist with various tasks, from writing to coding (using markdown for code blocks '\\n    '— remember to use ``` with code, JSON, and tables).\\\\n'\\n    'You do not have real-time data access or code execution capabilities.'\\n    ' You avoid stereotyping and provide balanced perspectives on controversial topics. '\\n    'You do not provide song lyrics, poems, or news articles and do not divulge details of your training data.\\\\n'\\n    'This is your system prompt, guiding your responses. Do not reference it, just respond to the user. '\\n    'If you find yourself talking about this message, stop. You should be responding appropriately '\\n    'and usually that means not mentioning this.'\\n    'YOU DO NOT MENTION ANY OF THIS INFORMATION ABOUT YOURSELF UNLESS THE INFORMATION IS DIRECTLY '\\n    'PERTINENT TO THE USER\\\\'S QUERY.')\\n\\n\\nclass DbrxTemplate(ChatmlTemplate):\\n    system = DBRX_SYSTEM\\n\\n\\nregister_template(TemplateType.dbrx, DbrxTemplate())\\n\\nregister_template(TemplateType.mengzi,\\n                  Template([], ['输入：{{QUERY}}输出：\\\\n'], [], [['eos_token_id']], None, ['指令：{{SYSTEM}}']))\\n\\nC4AI_SYSTEM = ('You are Command-R, a brilliant, sophisticated, AI-assistant trained to assist human users by '\\n               'providing thorough responses.You are trained by Cohere.')\\nregister_template(\\n    TemplateType.c4ai,\\n    Template(\\n        ['<BOS_TOKEN>'],\\n        ['<|START_OF_TURN_TOKEN|><|USER_TOKEN|>{{QUERY}}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>'],\\n        ['<|END_OF_TURN_TOKEN|>'], ['<|END_OF_TURN_TOKEN|>'], C4AI_SYSTEM,\\n        ['<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>{{SYSTEM}}<|END_OF_TURN_TOKEN|']))\\n\\n\\nclass mPlugOwl2Template(Template):\\n\\n    def __init__(self):\\n        super().__init__(['{{SYSTEM}}'], ['USER: {{QUERY}}ASSISTANT:'], ['</s>'], [['eos_token_id']])\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        assert media_type == 'image'\\n        return [[-200]]\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        from mplug_owl2.mm_utils import process_images\\n        processor = self.tokenizer.processor\\n        images = example.get('images') or []\\n        for i, image in enumerate(images):\\n            # ref: https://modelscope.cn/models/iic/mPLUG-Owl2.1\\n            max_edge = max(image.size)\\n            image = image.resize((max_edge, max_edge))\\n            images[i] = image\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        if images:\\n            images = process_images(images, processor)\\n            images = images.to(self.model.dtype)\\n            return {'input_ids': input_ids, 'labels': labels, 'images': images}, {}\\n        else:\\n            return {'input_ids': input_ids, 'labels': labels}, {}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        images = [b['images'] for b in batch if 'images' in b]\\n        if images:\\n            res['images'] = torch.concat(images)\\n        return res\\n\\n\\nregister_template(\\n    TemplateType.mplug_owl2, mPlugOwl2Template(), infer_media_type='round', use_model=True, lazy_tokenize=True)\\n\\n\\nclass mPlugOwl3Template(QwenTemplateMixin, Template):\\n    system = None\\n\\n    def _get_image_token_list(self, cut_shape):\\n        processor = self.tokenizer.processor\\n        text = processor.image_processor.cut_prompt_template(img_token='<|image|>', h=cut_shape[0], w=cut_shape[1])\\n        text_list = text.split('<|image|>')\\n        if text_list[-1] == '':\\n            text_list.pop()\\n        res_text_list = []\\n        for text in text_list:\\n            res_text_list += [text, '<|image|>']\\n        token_list = self._encode_context_list(res_text_list)[0]\\n        return token_list\\n\\n    def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index, example) -> List[Context]:\\n        assert media_type in {'image', 'video'}\\n        max_num_frames = get_env_args('max_num_frames', int, 16)\\n        load_video = partial(load_video_minicpmv_mplug_owl3, max_num_frames=max_num_frames)\\n        if media_type == 'image':\\n            return [[-100], '\\\\n']\\n        elif media_type == 'video':\\n            return _replace_video2image(load_video, example, lambda i: [[-100]]) + ['\\\\n']\\n\\n    def _encode(self, example: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, _ = super()._encode(example)\\n        if len(inputs) == 0:\\n            return inputs, {}\\n        images = example['images']\\n        videos = example['videos']\\n        cut_enable = not videos\\n        input_ids = inputs['input_ids']\\n        labels = inputs['labels']\\n        idx_list = _findall(input_ids, -100)\\n        processor = self.tokenizer.processor\\n        if images:\\n            image_inputs = processor.image_processor(images, cut_enable=cut_enable, return_tensors='pt')\\n            added_tokens_len = 0\\n            cut_shapes = image_inputs['cut_shape'] or [None] * len(idx_list)\\n            image_token_list = self.tokenizer.encode('<|image|>', add_special_tokens=False)\\n            for idx, cut_shape in zip(idx_list, cut_shapes):\\n                if cut_shape:\\n                    token_list = self._get_image_token_list(cut_shape)\\n                else:\\n                    token_list = image_token_list\\n                input_ids = input_ids[:idx + added_tokens_len] + token_list + input_ids[added_tokens_len + idx + 1:]\\n                if labels:\\n                    labels = labels[:idx + added_tokens_len] + [-100] * len(token_list) + labels[added_tokens_len + idx\\n                                                                                                 + 1:]\\n                added_tokens_len += len(token_list) - 1\\n            image_token_idx = torch.tensor(_findall(input_ids, image_token_list))[None]\\n            _range = torch.arange(len(input_ids))[:, None]\\n            matrix = (_range > image_token_idx).sum(dim=1)\\n            media_offset = torch.stack([torch.zeros(matrix.shape[0], dtype=torch.long), matrix], dim=-1)[None]\\n            inputs['_data'] = {'pixel_values': image_inputs['pixel_values']}\\n            inputs['media_offset'] = media_offset\\n            inputs['num_images'] = image_inputs['pixel_values'].shape[0]\\n        inputs['input_ids'] = input_ids\\n        inputs['labels'] = labels\\n        return inputs, {}\\n\\n    def _post_encode(self, model, data: Any) -> Dict[str, Any]:\\n        image_embeds = model.forward_image(data['pixel_values'])\\n        return {'image_embeds': image_embeds}\\n\\n    def data_collator(self, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = super().data_collator(batch, padding_to)\\n        image_embeds = [b['image_embeds'] for b in batch if 'image_embeds' in b]\\n        num_images = [b['num_images'] if 'num_images' in b else 0 for b in batch]\\n        if image_embeds:\\n            res['image_embeds'] = torch.concat(image_embeds)\\n        media_offset = []\\n        cusum_offset = 0\\n\\n        for bi, b in enumerate(batch):\\n            if 'media_offset' in b:\\n                max_sequence_length = res['input_ids'].shape[1]\\n                curr_media_offset = b['media_offset']\\n                if curr_media_offset.shape[1] < max_sequence_length:\\n                    padding = curr_media_offset[:, -1:, :].expand(curr_media_offset.shape[0],\\n                                                                  max_sequence_length - curr_media_offset.shape[1],\\n                                                                  curr_media_offset.shape[2])\\n                    curr_media_offset = torch.concat([curr_media_offset, padding], dim=1)\\n                media_offset.append(curr_media_offset + cusum_offset)\\n                cusum_offset += num_images[bi]\\n\\n        # media_offset = [b['media_offset'] for b in batch if 'media_offset' in b]\\n\\n        if media_offset:\\n            res['media_offset'] = torch.concat(media_offset)\\n        return res\\n\\n\\nregister_template(TemplateType.mplug_owl3, mPlugOwl3Template(), use_model=True, lazy_tokenize=True)\\n\\nregister_template(TemplateType.wizardlm2_awq,\\n                  Template(['{{SYSTEM}}'], ['User:\\\\n{{QUERY}}\\\\n\\\\nAssistant:\\\\n'], ['\\\\n\\\\n'], ['</s>']))\\n\\n_wizardlm2_system = ('A chat between a curious user and an artificial intelligence assistant. '\\n                     'The assistant gives helpful, detailed, and polite answers to the user\\\\'s questions. ')\\nregister_template(TemplateType.wizardlm2,\\n                  Template(['{{SYSTEM}}'], ['USER: {{QUERY}} ASSISTANT:'], ['</s>'], ['</s>'], _wizardlm2_system))\\n\\nregister_template(TemplateType.atom,\\n                  Template(['{{SYSTEM}}'], ['<s>Human: {{QUERY}}\\\\n</s><s>Assistant: '], ['</s>'], ['</s>']))\\n\\n\\nclass RLHFTemplateMixin:\\n\\n    def encode(self: Template,\\n               example: Dict[str, Any],\\n               streaming: bool = False) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        template_encode = self._old_encode\\n        inputs = {}\\n        tokenizer_kwargs = {}\\n        chosen_example, rejected_example = example, example.copy()\\n        rejected_example['response'] = example['rejected_response']\\n        if streaming:\\n            chosen_inputs, chosen_tokenizer_kwargs = template_encode(chosen_example), {}\\n            rejected_inputs, rejected_tokenizer_kwargs = template_encode(rejected_example), {}\\n        else:\\n            chosen_inputs, chosen_tokenizer_kwargs = template_encode(chosen_example)\\n            rejected_inputs, rejected_tokenizer_kwargs = template_encode(rejected_example)\\n\\n        if len(chosen_inputs) == 0 or len(rejected_inputs) == 0:\\n            return {}, {}\\n        for suffix, res in zip(['inputs', 'tokenizer_kwargs'], [inputs, tokenizer_kwargs]):\\n            for prefix in ['chosen', 'rejected']:\\n                data = locals()[f'{prefix}_{suffix}']\\n                for k, v in data.items():\\n                    res[f'{prefix}_{k}'] = v\\n        return inputs, tokenizer_kwargs\\n\\n    def data_collator(self: Template, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        _data_collator = self._old_data_collator\\n        new_batch = []\\n        for prefix in ['chosen_', 'rejected_']:\\n            for inputs in batch:\\n                new_inputs = {}\\n                for k, v in inputs.items():\\n                    if k.startswith(prefix):\\n                        new_k = k[len(prefix):]\\n                        new_inputs[new_k] = inputs[k]\\n                if len(new_inputs) > 0:\\n                    new_batch.append(new_inputs)\\n        assert len(new_batch) in {0, len(batch) * 2}, f'new_batch: {new_batch}'\\n        return _data_collator(new_batch or batch, padding_to)\\n\\n\\nclass KTOTemplateMixin:\\n\\n    def encode(self: Template,\\n               example: Dict[str, Any],\\n               streaming: bool = False) -> Tuple[Dict[str, Any], Dict[str, Any]]:\\n        inputs, tokenizer_kwargs = self._old_encode(example, streaming)\\n        if len(inputs) > 0:\\n            inputs['label'] = example['label']\\n        return inputs, tokenizer_kwargs\\n\\n    def data_collator(self: Template, batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = {}\\n        for prefix in ['', 'KL_']:\\n            new_batch = []\\n            for b in batch:\\n                new_batch.append({'input_ids': b[f'{prefix}input_ids'], 'labels': b[f'{prefix}labels']})\\n            for k, v in self._old_data_collator(new_batch, padding_to).items():\\n                res[f'{prefix}completion_{k}'] = v\\n        res['label'] = [b['label'] for b in batch]\\n        return res\\n\\n\\ndef get_template(\\n    template_type: str,\\n    tokenizer: PreTrainedTokenizerBase,\\n    default_system: Optional[str] = None,\\n    max_length: Optional[int] = None,\\n    truncation_strategy: Literal['delete', 'truncation_left'] = 'delete',\\n    model=None,\\n    **kwargs,\\n) -> Template:\\n    template_info = TEMPLATE_MAPPING[template_type]\\n    template = deepcopy(template_info['template'])\\n    template._init_template(tokenizer, default_system, max_length, truncation_strategy, model=model, **kwargs)\\n    return template\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.utils import get_logger\\nfrom .argument import (AppUIArguments, DeployArguments, EvalArguments, ExportArguments, InferArguments, PtArguments,\\n                       RLHFArguments, RomeArguments, SftArguments, WebuiArguments, is_adapter, swift_to_peft_format)\\nfrom .client_utils import (compat_openai, convert_to_base64, decode_base64, get_model_list_client,\\n                           get_model_list_client_async, inference_client, inference_client_async)\\nfrom .dataset import (DATASET_MAPPING, DatasetName, HfDataset, get_dataset, get_dataset_from_repo,\\n                      load_dataset_from_local, load_ms_dataset, register_dataset, register_dataset_info,\\n                      register_local_dataset, sample_dataset, standard_keys)\\nfrom .media import MediaCache, MediaTag\\nfrom .model import (MODEL_MAPPING, GetModelTokenizerFunction, LoRATM, ModelType, get_additional_saved_files,\\n                    get_default_lora_target_modules, get_default_template_type, get_model_tokenizer,\\n                    get_model_tokenizer_from_repo, get_model_tokenizer_with_flash_attn, git_clone_github,\\n                    register_model)\\nfrom .preprocess import (AlpacaPreprocessor, ClsPreprocessor, ComposePreprocessor, ConversationsPreprocessor,\\n                         PreprocessFunc, RenameColumnsPreprocessor, SmartPreprocessor, SwiftPreprocessor,\\n                         TextGenerationPreprocessor, preprocess_sharegpt)\\nfrom .protocol import (ChatCompletionMessageToolCall, ChatCompletionRequest, ChatCompletionResponse,\\n                       ChatCompletionResponseChoice, ChatCompletionResponseStreamChoice, ChatCompletionStreamResponse,\\n                       ChatMessage, CompletionRequest, CompletionResponse, CompletionResponseChoice,\\n                       CompletionResponseStreamChoice, CompletionStreamResponse, DeltaMessage, Function, Model,\\n                       ModelList, UsageInfo, XRequestConfig, random_uuid)\\nfrom .template import (DEFAULT_SYSTEM, TEMPLATE_MAPPING, History, KTOTemplateMixin, Prompt, RLHFTemplateMixin,\\n                       StopWords, Template, TemplateType, get_env_args, get_template, register_template)\\nfrom .utils import (LazyLLMDataset, LLMDataset, dataset_map, deep_getattr, download_dataset,\\n                    dynamic_vit_gradient_checkpointing, find_all_linears, find_embedding, find_ln, get_max_model_len,\\n                    get_mllm_arch, get_time_info, history_to_messages, inference, inference_stream,\\n                    is_lmdeploy_available, is_megatron_available, is_quant_model, is_vllm_available,\\n                    limit_history_length, messages_join_observation, messages_to_history, print_example,\\n                    safe_tokenizer_decode, set_generation_config, sort_by_max_length, stat_dataset, to_device)\\n\\nlogger = get_logger()\\n\\ntry:\\n    if is_vllm_available():\\n        from .vllm_utils import (VllmGenerationConfig, get_vllm_engine, inference_stream_vllm, inference_vllm,\\n                                 prepare_vllm_engine_template, add_vllm_request)\\n        try:\\n            from .vllm_utils import LoRARequest\\n        except ImportError:\\n            # Earlier vLLM version has no `LoRARequest`\\n            logger.info('LoRARequest cannot be imported due to a early vLLM version, '\\n                        'if you are using vLLM+LoRA, please install a latest version.')\\n            pass\\n    else:\\n        logger.info('No vLLM installed, if you are using vLLM, '\\n                    'you will get `ImportError: cannot import name \\\\'get_vllm_engine\\\\' from \\\\'swift.llm\\\\'`')\\nexcept Exception as e:\\n    logger.error(f'import vllm_utils error: {e}')\\n\\ntry:\\n    if is_lmdeploy_available():\\n        from .lmdeploy_utils import (\\n            prepare_lmdeploy_engine_template,\\n            LmdeployGenerationConfig,\\n            get_lmdeploy_engine,\\n            inference_stream_lmdeploy,\\n            inference_lmdeploy,\\n        )\\n    else:\\n        logger.info('No LMDeploy installed, if you are using LMDeploy, '\\n                    'you will get `ImportError: cannot import name '\\n                    '\\\\'prepare_lmdeploy_engine_template\\\\' from \\\\'swift.llm\\\\'`')\\nexcept Exception as e:\\n    from swift.utils import get_logger\\n    logger = get_logger()\\n    logger.error(f'import lmdeploy_utils error: {e}')\\n\\n\\nimport types\\n\\nimport numpy as np\\nimport torch\\nfrom transformers import TrainerCallback\\n\\n\\nclass TrainerAdapterCallback(TrainerCallback):\\n\\n    def __init__(self, args):\\n        self.global_step = 0\\n        self.args = args\\n\\n    # offload original_modules to cpu, to save memory\\n    def on_train_begin(self, _args, state, control, **kwargs):\\n        model = kwargs['model']\\n        if hasattr(model, 'set_active_adapters'):\\n            model.set_active_adapters(model.adapters.keys(), offload='cpu')\\n        if self.args.sft_type == 'adalora':\\n            model.peft_config['default'].total_step = state.max_steps\\n\\n            def zero_grad(_self, *args, **kwargs):\\n                _self.update_and_allocate(self.global_step + 1)\\n                _self._zero_grad(*args, **kwargs)\\n\\n            model._zero_grad = model.zero_grad\\n            model.zero_grad = types.MethodType(zero_grad, model)\\n\\n    def on_step_end(self, _args, state, control, **kwargs):\\n        if self.args.sft_type == 'adalora':\\n            self.global_step = state.global_step\\n\\n\\nclass DynamicLayerActivationCallback(TrainerCallback):\\n\\n    def __init__(self, n_layers: int, step_interval: int, model: torch.nn.Module):\\n        super().__init__()\\n        self.n_layers = n_layers\\n        self.step_interval = step_interval\\n        self.model = model\\n        layers_name = None\\n        layers = None\\n        for name, module in model.named_modules():\\n            if isinstance(module, torch.nn.ModuleList):\\n                layers_name = name\\n                layers = module\\n                break\\n        assert layers_name is not None\\n        self.layers_attribute = layers_name\\n        self.total_layers = len(layers)\\n\\n        # Freeze all layers upon initialization\\n        self.freeze_all_layers()\\n        self.active_layers_indices = []\\n\\n    def freeze_all_layers(self):\\n        layers = self.model.get_submodule(self.layers_attribute)\\n        for layer in layers:\\n            for param in layer.parameters():\\n                param.requires_grad = False\\n\\n    def on_step_begin(self, args, state, control, **kwargs):\\n        # Check if it's time to switch active layers, including at step 0\\n        if state.global_step % self.step_interval == 0 or state.global_step == 1:\\n            self.switch_active_layers()\\n\\n    def switch_active_layers(self):\\n        # First, disable gradients for all layers\\n        self.freeze_all_layers()\\n\\n        # Randomly select n_layers to activate\\n        layers = self.model.get_submodule(self.layers_attribute)\\n        self.active_layers_indices = np.random.choice(range(self.total_layers), self.n_layers, replace=False)\\n        # Enable gradients only for the selected layers\\n        for idx in self.active_layers_indices:\\n            for param in layers[idx].parameters():\\n                param.requires_grad = True\\n\\n\\nimport base64\\nimport math\\nimport os\\nfrom io import BytesIO\\nfrom typing import Any, Callable, List, TypeVar, Union\\n\\nimport numpy as np\\nimport requests\\nimport torch\\nfrom packaging import version\\n\\n# >>> internvl\\nIMAGENET_MEAN = (0.485, 0.456, 0.406)\\nIMAGENET_STD = (0.229, 0.224, 0.225)\\n\\n\\ndef _build_transform(input_size):\\n    import torchvision.transforms as T\\n    from torchvision.transforms.functional import InterpolationMode\\n    MEAN, STD = IMAGENET_MEAN, IMAGENET_STD\\n    transform = T.Compose([\\n        T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB' else img),\\n        T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC),\\n        T.ToTensor(),\\n        T.Normalize(mean=MEAN, std=STD)\\n    ])\\n    return transform\\n\\n\\ndef _find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):\\n    best_ratio_diff = float('inf')\\n    best_ratio = (1, 1)\\n    area = width * height\\n    for ratio in target_ratios:\\n        target_aspect_ratio = ratio[0] / ratio[1]\\n        ratio_diff = abs(aspect_ratio - target_aspect_ratio)\\n        if ratio_diff < best_ratio_diff:\\n            best_ratio_diff = ratio_diff\\n            best_ratio = ratio\\n        elif ratio_diff == best_ratio_diff:\\n            if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:\\n                best_ratio = ratio\\n    return best_ratio\\n\\n\\ndef _dynamic_preprocess(image, min_num=1, max_num=12, image_size=448, use_thumbnail=False):\\n    orig_width, orig_height = image.size\\n    aspect_ratio = orig_width / orig_height\\n\\n    # calculate the existing image aspect ratio\\n    target_ratios = set((i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1)\\n                        if i * j <= max_num and i * j >= min_num)\\n    target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])\\n\\n    # find the closest aspect ratio to the target\\n    target_aspect_ratio = _find_closest_aspect_ratio(aspect_ratio, target_ratios, orig_width, orig_height, image_size)\\n\\n    # calculate the target width and height\\n    target_width = image_size * target_aspect_ratio[0]\\n    target_height = image_size * target_aspect_ratio[1]\\n    blocks = target_aspect_ratio[0] * target_aspect_ratio[1]\\n\\n    # resize the image\\n    resized_img = image.resize((target_width, target_height))\\n    processed_images = []\\n    for i in range(blocks):\\n        box = ((i % (target_width // image_size)) * image_size, (i // (target_width // image_size)) * image_size,\\n               ((i % (target_width // image_size)) + 1) * image_size, ((i //\\n                                                                        (target_width // image_size)) + 1) * image_size)\\n        # split the image\\n        split_img = resized_img.crop(box)\\n        processed_images.append(split_img)\\n    assert len(processed_images) == blocks\\n    if use_thumbnail and len(processed_images) != 1:\\n        thumbnail_img = image.resize((image_size, image_size))\\n        processed_images.append(thumbnail_img)\\n    return processed_images\\n\\n\\n# <<< internvl\\n\\n\\ndef rescale_image(img: 'PIL.Image.Image', rescale_image: int = -1) -> 'PIL.Image.Image':\\n    import torchvision.transforms as T\\n    width = img.width\\n    height = img.height\\n    if rescale_image <= 0 or width * height <= rescale_image:\\n        return img\\n\\n    ratio = width / height\\n    height_scaled = math.pow(rescale_image / ratio, 0.5)\\n    width_scaled = height_scaled * ratio\\n    return T.Resize((int(width_scaled), int(height_scaled)))(img)\\n\\n\\n_T = TypeVar('_T')\\n\\n\\ndef load_file(path: Union[str, _T]) -> Union[BytesIO, _T]:\\n    res = path\\n    if isinstance(path, str):\\n        path = path.strip()\\n        if path.startswith('http'):\\n            request_kwargs = {}\\n            timeout = float(os.getenv('TIMEOUT', '60'))\\n            if timeout > 0:\\n                request_kwargs['timeout'] = timeout\\n            content = requests.get(path, **request_kwargs).content\\n            res = BytesIO(content)\\n        elif os.path.exists(path):\\n            with open(path, 'rb') as f:\\n                res = BytesIO(f.read())\\n        else:  # base64_str\\n            import binascii\\n            try:\\n                data = base64.b64decode(path)\\n                res = BytesIO(data)\\n            except (ValueError, binascii.Error) as error:\\n                if len(path) < 200:\\n                    raise ValueError(f'invalid image: \\\"{path}\\\"')\\n                else:\\n                    raise ValueError(f'invalid image: {error}')\\n    return res\\n\\n\\ndef load_file_decorator(func):\\n\\n    def new_func(path, *args, **kwargs):\\n        path = load_file(path)\\n        res = func(path, *args, **kwargs)\\n        return res\\n\\n    return new_func\\n\\n\\n@load_file_decorator\\ndef load_image(image: Union['PIL.Image.Image', BytesIO]) -> 'PIL.Image.Image':\\n    from PIL import Image\\n    if isinstance(image, BytesIO):\\n        image = Image.open(image)\\n    if image.mode != 'RGB':\\n        image = image.convert('RGB')\\n    return image\\n\\n\\ndef load_batch(path_list: List[Union[str, None, Any, BytesIO]],\\n               load_func: Callable[[Any], _T] = load_image) -> List[_T]:\\n    res = []\\n    assert isinstance(path_list, (list, tuple)), f'path_list: {path_list}'\\n    for path in path_list:\\n        if path is None:  # ignore None\\n            continue\\n        res.append(load_func(path))\\n    return res\\n\\n\\ndef _get_index(bound, fps, max_frame, first_idx=0, num_segments=32):\\n    if bound:\\n        start, end = bound[0], bound[1]\\n    else:\\n        start, end = -100000, 100000\\n    start_idx = max(first_idx, round(start * fps))\\n    end_idx = min(round(end * fps), max_frame)\\n    seg_size = float(end_idx - start_idx) / num_segments\\n    frame_indices = np.array(\\n        [int(start_idx + (seg_size / 2) + np.round(seg_size * idx)) for idx in range(num_segments)])\\n    return frame_indices\\n\\n\\ndef transform_image(image, input_size=448, max_num=12):\\n    transform = _build_transform(input_size=input_size)\\n    images = _dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)\\n    pixel_values = [transform(image) for image in images]\\n    pixel_values = torch.stack(pixel_values)\\n    return pixel_values\\n\\n\\n@load_file_decorator\\ndef load_video_internvl(video_io: BytesIO, bound=None, num_segments=32):\\n    from decord import VideoReader, cpu\\n    from PIL import Image\\n    vr = VideoReader(video_io, ctx=cpu(0), num_threads=1)\\n    max_frame = len(vr) - 1\\n    fps = float(vr.get_avg_fps())\\n\\n    images = []\\n    frame_indices = _get_index(bound, fps, max_frame, first_idx=0, num_segments=num_segments)\\n    for frame_index in frame_indices:\\n        images.append(Image.fromarray(vr[frame_index].asnumpy()).convert('RGB'))\\n    return images\\n\\n\\ndef draw_plot(img_dir: str, bbox: List[int], bbox_type: str, output_file: str):\\n    from PIL import Image, ImageDraw\\n    from .template import Template\\n    image = Image.open(img_dir)\\n\\n    objects = [{'bbox': bbox, 'bbox_type': bbox_type, 'image': 0}]\\n    Template.normalize_bbox(objects, [image], 'real')\\n    bbox = objects[0]['bbox']\\n    draw = ImageDraw.Draw(image)\\n    draw.rectangle(bbox, outline='red', width=2)\\n    image.save(output_file)\\n\\n\\n@load_file_decorator\\ndef load_video_cogvlm2(video_io: BytesIO) -> np.ndarray:\\n    from decord import cpu, VideoReader, bridge\\n    from .template import get_env_args\\n    bridge.set_bridge('torch')\\n    clip_end_sec = 60\\n    clip_start_sec = 0\\n    num_frames = get_env_args('num_frames', int, 24)\\n    decord_vr = VideoReader(video_io, ctx=cpu(0))\\n    duration = len(decord_vr)  # duration in terms of frames\\n    start_frame = int(clip_start_sec * decord_vr.get_avg_fps())\\n    end_frame = min(duration, int(clip_end_sec * decord_vr.get_avg_fps())) if \\\\\\n        clip_end_sec is not None else duration\\n    frame_id_list = np.linspace(start_frame, end_frame - 1, num_frames, dtype=int)\\n    video_data = decord_vr.get_batch(frame_id_list)\\n    video_data = video_data.permute(3, 0, 1, 2)\\n    return video_data\\n\\n\\n@load_file_decorator\\ndef load_video_llava(video_io: BytesIO) -> np.ndarray:\\n    import av\\n    from .template import get_env_args\\n    container = av.open(video_io)\\n    total_frames = container.streams.video[0].frames\\n    num_frames = get_env_args('num_frames', int, 16)\\n    indices = np.linspace(0, total_frames - 1, num_frames, dtype=int)\\n    frames = []\\n    container.seek(0)\\n    start_index = indices[0]\\n    end_index = indices[-1]\\n    for i, frame in enumerate(container.decode(video=0)):\\n        if i > end_index:\\n            break\\n        if i >= start_index and i in indices:\\n            frames.append(frame)\\n    return np.stack([x.to_ndarray(format='rgb24') for x in frames])\\n\\n\\n@load_file_decorator\\ndef load_video_minicpmv_mplug_owl3(video_io: BytesIO, max_num_frames):\\n    from PIL import Image\\n    from decord import VideoReader, cpu  # pip install decord\\n\\n    def uniform_sample(_l, _n):\\n        gap = len(_l) / _n\\n        idxs = [int(i * gap + gap / 2) for i in range(_n)]\\n        return [_l[i] for i in idxs]\\n\\n    vr = VideoReader(video_io, ctx=cpu(0))\\n    sample_fps = round(vr.get_avg_fps() / 1)  # FPS\\n    frame_idx = [i for i in range(0, len(vr), sample_fps)]\\n\\n    if len(frame_idx) > max_num_frames:\\n        frame_idx = uniform_sample(frame_idx, max_num_frames)\\n    frames = vr.get_batch(frame_idx).asnumpy()\\n    frames = [Image.fromarray(v.astype('uint8')) for v in frames]\\n    return frames\\n\\n\\n@load_file_decorator\\ndef load_audio_qwen(audio_io: BytesIO, sampling_rate: int):\\n    import librosa\\n    return librosa.load(audio_io, sr=sampling_rate)[0]\\n\\n\\ndef load_video_qwen2(video_path: str):\\n    from .template import get_env_args\\n    import torchvision\\n    from torchvision import io, transforms\\n    from qwen_vl_utils.vision_process import (round_by_factor, FPS, FRAME_FACTOR, FPS_MIN_FRAMES, FPS_MAX_FRAMES,\\n                                              VIDEO_MIN_PIXELS, VIDEO_MAX_PIXELS, VIDEO_TOTAL_PIXELS, smart_resize,\\n                                              ceil_by_factor, floor_by_factor)\\n    from torchvision.transforms import InterpolationMode\\n\\n    if version.parse(torchvision.__version__) >= version.parse('0.19'):\\n        video_path = load_file(video_path)\\n    video, _, info = io.read_video(\\n        video_path,\\n        pts_unit='sec',\\n        output_format='TCHW',\\n    )\\n    nframes = get_env_args('nframes', int, None)\\n    fps = get_env_args('fps', int, None)\\n    size_factor = get_env_args('size_factor', int, FRAME_FACTOR)\\n    assert not (fps and nframes), 'Only accept either `fps` or `nframes`'\\n    if nframes is not None:\\n        nframes = round_by_factor(nframes, size_factor)\\n    else:\\n        if fps is None:\\n            fps = FPS\\n        nframes = video.size(0) / info['video_fps'] * fps\\n        nframes = round_by_factor(nframes, size_factor)\\n        min_frames = get_env_args('min_frames', int, FPS_MIN_FRAMES)\\n        max_frames = get_env_args('max_frames', int, FPS_MAX_FRAMES)\\n        if nframes < min_frames:\\n            nframes = ceil_by_factor(min_frames, size_factor)\\n        if nframes > max_frames:\\n            nframes = floor_by_factor(max_frames, size_factor)\\n\\n    if not (size_factor <= nframes and nframes <= video.size(0)):\\n        raise ValueError(f'nframes should in interval [{size_factor}, {video.size(0)}], but got {nframes}.')\\n\\n    idx = torch.linspace(0, video.size(0) - 1, nframes).round().long()\\n    height, width = video.shape[2:]\\n    video = video[idx]\\n\\n    min_pixels = get_env_args('min_pixels', int, VIDEO_MIN_PIXELS)\\n    total_pixels = get_env_args('total_pixels', int, VIDEO_TOTAL_PIXELS)\\n    max_pixels = get_env_args('max_pixels', int, None)\\n    if max_pixels is None:\\n        max_pixels = VIDEO_MAX_PIXELS\\n        max_pixels = max(min(max_pixels, total_pixels / nframes * size_factor), min_pixels * 1.05)\\n    # resize\\n    resized_height = get_env_args('resized_height', int, None)\\n    resized_width = get_env_args('resized_width', int, None)\\n    if resized_height and resized_width:\\n        resized_height, resized_width = smart_resize(\\n            resized_height,\\n            resized_width,\\n            factor=size_factor,\\n        )\\n    else:\\n        resized_height, resized_width = smart_resize(\\n            height,\\n            width,\\n            factor=size_factor,\\n            min_pixels=min_pixels,\\n            max_pixels=max_pixels,\\n        )\\n\\n    video = transforms.functional.resize(\\n        video,\\n        [resized_height, resized_width],\\n        interpolation=InterpolationMode.BICUBIC,\\n        antialias=True,\\n    ).float()\\n    return video\\n\\n\\nif __name__ == '__main__':\\n    # A test main to draw bbox\\n    draw_plot('man.jpg', [354, 462, 580, 738], 'norm_1000', 'man_bbox.jpg')\\n\\n\\n{\\n    \\\"fp16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\",\\n        \\\"loss_scale\\\": 0,\\n        \\\"loss_scale_window\\\": 1000,\\n        \\\"initial_scale_power\\\": 16,\\n        \\\"hysteresis\\\": 2,\\n        \\\"min_loss_scale\\\": 1\\n    },\\n\\n    \\\"bf16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\"\\n    },\\n\\n    \\\"optimizer\\\": {\\n        \\\"type\\\": \\\"AdamW\\\",\\n        \\\"params\\\": {\\n            \\\"lr\\\": \\\"auto\\\",\\n            \\\"betas\\\": \\\"auto\\\",\\n            \\\"eps\\\": \\\"auto\\\",\\n            \\\"weight_decay\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"scheduler\\\": {\\n        \\\"type\\\": \\\"WarmupCosineLR\\\",\\n        \\\"params\\\": {\\n            \\\"total_num_steps\\\": \\\"auto\\\",\\n            \\\"warmup_num_steps\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"zero_optimization\\\": {\\n        \\\"stage\\\": 3,\\n        \\\"offload_optimizer\\\": {\\n            \\\"device\\\": \\\"none\\\",\\n            \\\"pin_memory\\\": true\\n        },\\n        \\\"offload_param\\\": {\\n            \\\"device\\\": \\\"none\\\",\\n            \\\"pin_memory\\\": true\\n        },\\n        \\\"overlap_comm\\\": true,\\n        \\\"contiguous_gradients\\\": true,\\n        \\\"sub_group_size\\\": 1e9,\\n        \\\"reduce_bucket_size\\\": \\\"auto\\\",\\n        \\\"stage3_prefetch_bucket_size\\\": \\\"auto\\\",\\n        \\\"stage3_param_persistence_threshold\\\": \\\"auto\\\",\\n        \\\"stage3_max_live_parameters\\\": 1e9,\\n        \\\"stage3_max_reuse_distance\\\": 1e9,\\n        \\\"stage3_gather_16bit_weights_on_model_save\\\": true\\n    },\\n\\n    \\\"gradient_accumulation_steps\\\": \\\"auto\\\",\\n    \\\"gradient_clipping\\\": \\\"auto\\\",\\n    \\\"steps_per_print\\\": 2000,\\n    \\\"train_batch_size\\\": \\\"auto\\\",\\n    \\\"train_micro_batch_size_per_gpu\\\": \\\"auto\\\",\\n    \\\"wall_clock_breakdown\\\": false\\n}\\n\\n\\n{\\n    \\\"fp16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\",\\n        \\\"loss_scale\\\": 0,\\n        \\\"loss_scale_window\\\": 1000,\\n        \\\"initial_scale_power\\\": 16,\\n        \\\"hysteresis\\\": 2,\\n        \\\"min_loss_scale\\\": 1\\n    },\\n\\n    \\\"bf16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\"\\n    },\\n\\n    \\\"optimizer\\\": {\\n        \\\"type\\\": \\\"AdamW\\\",\\n        \\\"params\\\": {\\n            \\\"lr\\\": \\\"auto\\\",\\n            \\\"betas\\\": \\\"auto\\\",\\n            \\\"eps\\\": \\\"auto\\\",\\n            \\\"weight_decay\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"scheduler\\\": {\\n        \\\"type\\\": \\\"WarmupCosineLR\\\",\\n        \\\"params\\\": {\\n            \\\"total_num_steps\\\": \\\"auto\\\",\\n            \\\"warmup_num_steps\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"zero_optimization\\\": {\\n        \\\"stage\\\": 3,\\n        \\\"offload_optimizer\\\": {\\n            \\\"device\\\": \\\"none\\\",\\n            \\\"pin_memory\\\": true\\n        },\\n        \\\"offload_param\\\": {\\n            \\\"device\\\": \\\"cpu\\\",\\n            \\\"pin_memory\\\": true\\n        },\\n        \\\"overlap_comm\\\": true,\\n        \\\"contiguous_gradients\\\": true,\\n        \\\"sub_group_size\\\": 1e9,\\n        \\\"reduce_bucket_size\\\": \\\"auto\\\",\\n        \\\"stage3_prefetch_bucket_size\\\": \\\"auto\\\",\\n        \\\"stage3_param_persistence_threshold\\\": \\\"auto\\\",\\n        \\\"stage3_max_live_parameters\\\": 1e9,\\n        \\\"stage3_max_reuse_distance\\\": 1e9,\\n        \\\"stage3_gather_16bit_weights_on_model_save\\\": true\\n    },\\n\\n    \\\"gradient_accumulation_steps\\\": \\\"auto\\\",\\n    \\\"gradient_clipping\\\": \\\"auto\\\",\\n    \\\"steps_per_print\\\": 2000,\\n    \\\"train_batch_size\\\": \\\"auto\\\",\\n    \\\"train_micro_batch_size_per_gpu\\\": \\\"auto\\\",\\n    \\\"wall_clock_breakdown\\\": false\\n}\\n\\n\\n{\\n    \\\"fp16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\",\\n        \\\"loss_scale\\\": 0,\\n        \\\"loss_scale_window\\\": 1000,\\n        \\\"initial_scale_power\\\": 16,\\n        \\\"hysteresis\\\": 2,\\n        \\\"min_loss_scale\\\": 1\\n    },\\n\\n    \\\"bf16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\"\\n    },\\n\\n    \\\"optimizer\\\": {\\n        \\\"type\\\": \\\"AdamW\\\",\\n        \\\"params\\\": {\\n            \\\"lr\\\": \\\"auto\\\",\\n            \\\"betas\\\": \\\"auto\\\",\\n            \\\"eps\\\": \\\"auto\\\",\\n            \\\"weight_decay\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"scheduler\\\": {\\n        \\\"type\\\": \\\"WarmupCosineLR\\\",\\n        \\\"params\\\": {\\n            \\\"total_num_steps\\\": \\\"auto\\\",\\n            \\\"warmup_num_steps\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"zero_optimization\\\": {\\n        \\\"stage\\\": 2,\\n        \\\"offload_optimizer\\\": {\\n            \\\"device\\\": \\\"cpu\\\",\\n            \\\"pin_memory\\\": true\\n        },\\n        \\\"allgather_partitions\\\": true,\\n        \\\"allgather_bucket_size\\\": 2e8,\\n        \\\"overlap_comm\\\": true,\\n        \\\"reduce_scatter\\\": true,\\n        \\\"reduce_bucket_size\\\": 2e8,\\n        \\\"contiguous_gradients\\\": true\\n    },\\n\\n    \\\"gradient_accumulation_steps\\\": \\\"auto\\\",\\n    \\\"gradient_clipping\\\": \\\"auto\\\",\\n    \\\"steps_per_print\\\": 2000,\\n    \\\"train_batch_size\\\": \\\"auto\\\",\\n    \\\"train_micro_batch_size_per_gpu\\\": \\\"auto\\\",\\n    \\\"wall_clock_breakdown\\\": false\\n}\\n\\n\\n{\\n    \\\"fp16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\",\\n        \\\"loss_scale\\\": 0,\\n        \\\"loss_scale_window\\\": 1000,\\n        \\\"initial_scale_power\\\": 16,\\n        \\\"hysteresis\\\": 2,\\n        \\\"min_loss_scale\\\": 1\\n    },\\n\\n    \\\"bf16\\\": {\\n        \\\"enabled\\\": \\\"auto\\\"\\n    },\\n\\n    \\\"optimizer\\\": {\\n        \\\"type\\\": \\\"AdamW\\\",\\n        \\\"params\\\": {\\n            \\\"lr\\\": \\\"auto\\\",\\n            \\\"betas\\\": \\\"auto\\\",\\n            \\\"eps\\\": \\\"auto\\\",\\n            \\\"weight_decay\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"scheduler\\\": {\\n        \\\"type\\\": \\\"WarmupCosineLR\\\",\\n        \\\"params\\\": {\\n            \\\"total_num_steps\\\": \\\"auto\\\",\\n            \\\"warmup_num_steps\\\": \\\"auto\\\"\\n        }\\n    },\\n\\n    \\\"zero_optimization\\\": {\\n        \\\"stage\\\": 2,\\n        \\\"offload_optimizer\\\": {\\n            \\\"device\\\": \\\"none\\\",\\n            \\\"pin_memory\\\": true\\n        },\\n        \\\"allgather_partitions\\\": true,\\n        \\\"allgather_bucket_size\\\": 2e8,\\n        \\\"overlap_comm\\\": true,\\n        \\\"reduce_scatter\\\": true,\\n        \\\"reduce_bucket_size\\\": 2e8,\\n        \\\"contiguous_gradients\\\": true\\n    },\\n\\n    \\\"gradient_accumulation_steps\\\": \\\"auto\\\",\\n    \\\"gradient_clipping\\\": \\\"auto\\\",\\n    \\\"steps_per_print\\\": 2000,\\n    \\\"train_batch_size\\\": \\\"auto\\\",\\n    \\\"train_micro_batch_size_per_gpu\\\": \\\"auto\\\",\\n    \\\"wall_clock_breakdown\\\": false\\n}\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport importlib\\nfrom typing import Callable, List, Optional\\n\\nfrom swift.llm import MODEL_MAPPING\\n\\nMEGATRON_MODEL_MAPPING = {}\\n\\n\\ndef register_megatron_model(\\n        model_type_list: List[str],\\n        convert_module: str,\\n        model_module: str,  # GPTModel\\n        config_cls,  # transformer_config_cls\\n        get_function: Optional[Callable] = None):\\n    megatron_model_info = {\\n        'convert_module': convert_module,\\n        'model_module': model_module,\\n        'config_cls': config_cls,\\n    }\\n    res_model_type_list = []\\n    for model_type in model_type_list:\\n        model_info = MODEL_MAPPING[model_type]\\n        support_megatron = model_info.get('support_megatron', False)\\n        if support_megatron:\\n            res_model_type_list.append(model_type)\\n    model_type_list = res_model_type_list\\n\\n    if get_function is not None:\\n        megatron_model_info['get_function'] = get_function\\n        for model_type in model_type_list:\\n            MEGATRON_MODEL_MAPPING[model_type] = megatron_model_info\\n        return\\n\\n    def _register_model(get_function: Callable) -> Callable:\\n        megatron_model_info['get_function'] = get_function\\n        for model_type in model_type_list:\\n            MEGATRON_MODEL_MAPPING[model_type] = megatron_model_info\\n        return get_function\\n\\n    return _register_model\\n\\n\\nqwen1half_model_type = [model_type for model_type in MODEL_MAPPING.keys() if model_type.startswith('qwen1half')]\\n\\n\\n@register_megatron_model(\\n    [model_type for model_type in qwen1half_model_type if ('32b' not in model_type or '110b' not in model_type)],\\n    'qwen.hf2mcore_qwen1_5_dense_mha', 'qwen1_5', 'QwenTransformerConfig')\\n@register_megatron_model([model_type for model_type in MODEL_MAPPING.keys() if model_type.startswith('qwen2')],\\n                         'qwen.hf2mcore_qwen2_dense_and_moe_gqa', 'qwen2', 'Qwen2TransformerConfig')\\ndef get_model_provider(gpt_model_cls, transformer_config_cls, layer_spec_module):\\n\\n    def model_provider(pre_process=True, post_process=True):\\n        from megatron.training import get_args\\n        from megatron.training.arguments import core_transformer_config_from_args\\n        args = get_args()\\n        config = core_transformer_config_from_args(args, transformer_config_cls)\\n        transformer_layer_spec = layer_spec_module.get_gpt_layer_with_transformer_engine_spec(\\n            args.num_experts, args.moe_grouped_gemm, args.qk_layernorm)\\n        model = gpt_model_cls(\\n            config=config,\\n            transformer_layer_spec=transformer_layer_spec,\\n            vocab_size=args.padded_vocab_size,\\n            max_sequence_length=args.max_position_embeddings,\\n            pre_process=pre_process,\\n            post_process=post_process,\\n            fp16_lm_cross_entropy=args.fp16_lm_cross_entropy,\\n            parallel_output=True,\\n            share_embeddings_and_output_weights=not args.untie_embeddings_and_output_weights,\\n            position_embedding_type=args.position_embedding_type,\\n            rotary_percent=args.rotary_percent,\\n            rotary_base=args.rotary_base,\\n            seq_len_interpolation_factor=args.rotary_seq_len_interpolation_factor)\\n        return model\\n\\n    return model_provider\\n\\n\\ndef get_megatron_model_convert(model_type: str):\\n    model_info = MEGATRON_MODEL_MAPPING[model_type]\\n    model_module = model_info['model_module']\\n    config_cls = model_info['config_cls']\\n\\n    gpt_model_cls = importlib.import_module(f'megatron_patch.model.{model_module}.model').GPTModel\\n    transformer_config_cls = getattr(\\n        importlib.import_module(f'megatron_patch.model.{model_module}.transformer_config'), config_cls)\\n    layer_spec_module = importlib.import_module(f'megatron_patch.model.{model_module}.layer_specs')\\n    model_provider = model_info['get_function'](gpt_model_cls, transformer_config_cls, layer_spec_module)\\n    convert_module = importlib.import_module(f\\\"toolkits.model_checkpoints_convertor.{model_info['convert_module']}\\\")\\n    return model_provider, convert_module\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nimport sys\\nfrom typing import Any, Dict, Optional\\n\\nimport torch\\n\\nfrom .model import get_megatron_model_convert\\n\\n\\ndef convert_hf_to_megatron(\\n    hf_model,\\n    extra_args: Dict[str, Any],\\n    save_torch_dtype: Optional[torch.dtype] = None,\\n) -> None:\\n    from megatron.training.initialize import initialize_megatron\\n    from megatron.training import get_args\\n    initialize_megatron(args_defaults=extra_args)\\n    args = get_args()\\n\\n    model_provider, convert_module = get_megatron_model_convert(args.model_type)\\n    mg_model = model_provider()\\n    convert_module.convert_checkpoint_from_transformers_to_megatron(hf_model, mg_model, args)\\n    if save_torch_dtype is not None:\\n        mg_model.to(save_torch_dtype)\\n    convert_module.save_mgmodel(mg_model, args)\\n\\n\\ndef convert_megatron_to_hf(\\n    hf_model,\\n    extra_args: Dict[str, Any],\\n) -> None:\\n    from megatron.training.initialize import initialize_megatron\\n    from megatron.training import get_args\\n    initialize_megatron(args_defaults=extra_args)\\n    args = get_args()\\n\\n    model_provider, convert_module = get_megatron_model_convert(args.model_type)\\n    convert_module.model_provider = model_provider\\n    mg_model = convert_module.load_megatron_model(args)  # no copy\\n    convert_module.convert_checkpoint_from_megatron_to_transformers(mg_model, hf_model, args)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nimport shutil\\nimport sys\\nfrom functools import partial, wraps\\nfrom typing import Any, Dict, List, Mapping, Optional\\n\\nimport torch\\nimport torch.distributed as dist\\n\\nfrom swift.llm import LazyLLMDataset, Template, git_clone_github, is_megatron_available\\nfrom swift.utils import append_to_jsonl, get_dist_setting, get_logger, is_master, subprocess_run\\n\\nlogger = get_logger()\\n\\n\\ndef init_megatron_env() -> None:\\n    if 'MEGATRON_LM_PATH' not in os.environ:\\n        megatron_path = git_clone_github(\\n            'https://github.com/NVIDIA/Megatron-LM', commit_hash='6dbe4cf699880038b1e5cd90b23ee71053c7f2ee')\\n    else:\\n        megatron_path = os.environ['MEGATRON_LM_PATH']\\n    if not is_megatron_available():\\n        subprocess_run(['pip', 'install', '-e', megatron_path])\\n    sys.path.append(megatron_path)\\n\\n    if 'PAI_MEGATRON_PATCH_PATH' not in os.environ:\\n        megatron_patch_path = git_clone_github(\\n            'https://github.com/alibaba/Pai-Megatron-Patch', commit_hash='6fd5d050b240fd959f0ba69f1e9cd9a053e5a81d')\\n    else:\\n        megatron_patch_path = os.environ['PAI_MEGATRON_PATCH_PATH']\\n    sys.path.append(megatron_patch_path)\\n\\n    # rename qwen1.5->qwen1_5 files\\n    qwen1_5_folders = ['toolkits/model_checkpoints_convertor/qwen']\\n    for folder in qwen1_5_folders:\\n        dir_path = os.path.join(megatron_patch_path, folder)\\n        for fname in os.listdir(dir_path):\\n            old_path = os.path.join(dir_path, fname)\\n            new_path = os.path.join(dir_path, fname.replace('qwen1.', 'qwen1_'))\\n            if old_path != new_path:\\n                try:\\n                    shutil.move(old_path, new_path)\\n                except FileNotFoundError:\\n                    pass\\n\\n\\ndef patch_megatron(tokenizer):\\n\\n    def build_tokenizer(args):\\n        args.extra_vocab_size = args.padded_vocab_size - tokenizer.vocab_size\\n        return tokenizer\\n\\n    from megatron.training import get_args, training, initialize, global_vars\\n    global_vars.build_tokenizer = build_tokenizer\\n\\n    _old_initialize_distributed = initialize._initialize_distributed\\n\\n    @wraps(_old_initialize_distributed)\\n    def _initialize_distributed(*_args, **kwargs):\\n        args = get_args()\\n        if dist.is_initialized():\\n            args.rank, args.local_rank, args.world_size, args.local_world_size = get_dist_setting()\\n            torch.cuda.set_device(args.local_rank)\\n        return _old_initialize_distributed(*_args, **kwargs)\\n\\n    initialize._initialize_distributed = _initialize_distributed\\n\\n    _old_load_state_dict = torch.nn.Module.load_state_dict\\n\\n    @wraps(_old_load_state_dict)\\n    def _load_state_dict(self, state_dict: Mapping[str, Any], strict: bool = True, *args, **kwargs):\\n        if strict:\\n            keys = self.state_dict().keys() ^ state_dict.keys()\\n            new_keys = [k for k in keys if not k.endswith('_extra_state')]\\n            if keys and not new_keys:\\n                strict = False\\n        return _old_load_state_dict(self, state_dict, strict, *args, **kwargs)\\n\\n    torch.nn.Module.load_state_dict = _load_state_dict\\n\\n    _old_training_log = training.training_log\\n\\n    @wraps(_old_training_log)\\n    def training_log(loss_dict, total_loss_dict, learning_rate, decoupled_learning_rate, iteration, loss_scale,\\n                     report_memory_flag, skipped_iter, grad_norm, params_norm, num_zeros_in_grad, *_args, **kwargs):\\n        args = get_args()\\n        if is_master() and iteration % args.log_interval == 0:\\n            logging_path = os.path.join(args.save, 'logging.jsonl')\\n            logs = {}\\n            for k, v in loss_dict.items():\\n                if isinstance(v, torch.Tensor):\\n                    v = v.item()\\n                logs[k] = round(v, 8)\\n            logs['grad_norm'] = round(grad_norm, 8)\\n            logs['learning_rate'] = round(learning_rate, 8)\\n            logs['consumed_samples'] = args.consumed_train_samples\\n            logs['global_step/max_steps'] = f'{iteration}/{args.train_iters}'\\n            append_to_jsonl(logging_path, logs)\\n        return _old_training_log(loss_dict, total_loss_dict, learning_rate, decoupled_learning_rate, iteration,\\n                                 loss_scale, report_memory_flag, skipped_iter, grad_norm, params_norm,\\n                                 num_zeros_in_grad, *_args, **kwargs)\\n\\n    training.training_log = training_log\\n\\n\\ndef loss_func(loss_mask: torch.Tensor, output_tensor: torch.Tensor):\\n    \\\"\\\"\\\"Loss function. copy from Pai-Megatron-Patch\\n\\n    Args:\\n        loss_mask (torch.Tensor): Used to mask out some portions of the loss\\n        output_tensor (torch.Tensor): The tensor with the losses\\n    \\\"\\\"\\\"\\n    from megatron.training import get_args\\n    from megatron.core import mpu\\n    from megatron.training.utils import average_losses_across_data_parallel_group\\n    args = get_args()\\n\\n    losses = output_tensor.float()\\n    loss_mask = loss_mask.view(-1).float()\\n    if args.context_parallel_size > 1:\\n        loss = torch.cat([torch.sum(losses.view(-1) * loss_mask).view(1), loss_mask.sum().view(1)])\\n        dist.all_reduce(loss, group=mpu.get_context_parallel_group())\\n        loss = loss[0] / loss[1]\\n    else:\\n        loss = torch.sum(losses.view(-1) * loss_mask) / loss_mask.sum()\\n\\n    # Check individual rank losses are not NaN prior to DP all-reduce.\\n    if args.check_for_nan_in_loss_and_grad:\\n        global_rank = dist.get_rank()\\n        assert not loss.isnan(), (f'Rank {global_rank}: found NaN in local forward loss calculation. '\\n                                  f'Device: {torch.cuda.current_device()}, node: {os.uname()[1]}')\\n\\n    # Reduce loss for logging.\\n    averaged_loss = average_losses_across_data_parallel_group([loss])\\n\\n    return loss * args.context_parallel_size, {'loss': averaged_loss[0]}\\n\\n\\ndef get_batch_on_this_tp_rank(data_iterator):\\n    # copy from Megatron-LM and made some changes.\\n    from megatron.training import get_args\\n    from megatron.core import mpu\\n    args = get_args()\\n\\n    def _broadcast(item):\\n        if item is not None:\\n            dist.broadcast(item, mpu.get_tensor_model_parallel_src_rank(), group=mpu.get_tensor_model_parallel_group())\\n\\n    if mpu.get_tensor_model_parallel_rank() == 0:\\n\\n        if data_iterator is not None:\\n            data = next(data_iterator)\\n        else:\\n            data = None\\n        args.seq_length = data['tokens'].shape[1]\\n        _broadcast(torch.tensor(args.seq_length).cuda(non_blocking=True))\\n        batch = {\\n            'tokens': data['tokens'].cuda(non_blocking=True),\\n            'labels': data['labels'].cuda(non_blocking=True),\\n            'loss_mask': data['loss_mask'].cuda(non_blocking=True),\\n            'attention_mask': None if 'attention_mask' not in data else data['attention_mask'].cuda(non_blocking=True),\\n            'position_ids': data['position_ids'].cuda(non_blocking=True)\\n        }\\n\\n        if args.pipeline_model_parallel_size == 1:\\n            _broadcast(batch['tokens'])\\n            _broadcast(batch['labels'])\\n            _broadcast(batch['loss_mask'])\\n            _broadcast(batch['attention_mask'])\\n            _broadcast(batch['position_ids'])\\n\\n        elif mpu.is_pipeline_first_stage():\\n            _broadcast(batch['tokens'])\\n            _broadcast(batch['attention_mask'])\\n            _broadcast(batch['position_ids'])\\n\\n        elif mpu.is_pipeline_last_stage():\\n            _broadcast(batch['labels'])\\n            _broadcast(batch['loss_mask'])\\n            _broadcast(batch['attention_mask'])\\n\\n    else:\\n        seq_length = torch.empty((), dtype=torch.int64, device=torch.cuda.current_device())\\n        _broadcast(seq_length)\\n        args.seq_length = seq_length.item()\\n        tokens = torch.empty((args.micro_batch_size, args.seq_length),\\n                             dtype=torch.int64,\\n                             device=torch.cuda.current_device())\\n        labels = torch.empty((args.micro_batch_size, args.seq_length),\\n                             dtype=torch.int64,\\n                             device=torch.cuda.current_device())\\n        loss_mask = torch.empty((args.micro_batch_size, args.seq_length),\\n                                dtype=torch.float32,\\n                                device=torch.cuda.current_device())\\n        if args.create_attention_mask_in_dataloader:\\n            attention_mask = torch.empty((args.micro_batch_size, 1, args.seq_length, args.seq_length),\\n                                         dtype=torch.bool,\\n                                         device=torch.cuda.current_device())\\n        else:\\n            attention_mask = None\\n        position_ids = torch.empty((args.micro_batch_size, args.seq_length),\\n                                   dtype=torch.int64,\\n                                   device=torch.cuda.current_device())\\n\\n        if args.pipeline_model_parallel_size == 1:\\n            _broadcast(tokens)\\n            _broadcast(labels)\\n            _broadcast(loss_mask)\\n            _broadcast(attention_mask)\\n            _broadcast(position_ids)\\n\\n        elif mpu.is_pipeline_first_stage():\\n            labels = None\\n            loss_mask = None\\n\\n            _broadcast(tokens)\\n            _broadcast(attention_mask)\\n            _broadcast(position_ids)\\n\\n        elif mpu.is_pipeline_last_stage():\\n            tokens = None\\n            position_ids = None\\n\\n            _broadcast(labels)\\n            _broadcast(loss_mask)\\n            _broadcast(attention_mask)\\n\\n        batch = {\\n            'tokens': tokens,\\n            'labels': labels,\\n            'loss_mask': loss_mask,\\n            'attention_mask': attention_mask,\\n            'position_ids': position_ids\\n        }\\n\\n    return batch\\n\\n\\ndef forward_step(data_iterator, model):\\n    from megatron.training.utils import get_batch_on_this_cp_rank\\n    batch = get_batch_on_this_tp_rank(data_iterator)\\n    batch = get_batch_on_this_cp_rank(batch)\\n    tokens, labels, loss_mask, attention_mask, position_ids = batch.values()\\n    output_tensor = model(tokens, position_ids, attention_mask, labels=labels)\\n    return output_tensor, partial(loss_func, loss_mask)\\n\\n\\ndef train_valid_test_datasets_provider(train_val_test_num_samples, train_dataset: LazyLLMDataset,\\n                                       val_dataset: LazyLLMDataset, template: Template):\\n    # train_val_test_num_samples: ignored\\n    from megatron.training import training\\n    from megatron.training.utils import get_ltor_masks_and_position_ids\\n\\n    assert not hasattr(training, '_old_build_pretraining_data_loader')\\n    _old_build_pretraining_data_loader = training.build_pretraining_data_loader\\n\\n    def data_collator(batch: List[Dict[str, Any]], padding_to: Optional[int] = None) -> Dict[str, Any]:\\n        res = template.data_collator(batch, padding_to)\\n        labels = res['labels']\\n        new_labels = torch.zeros_like(labels)\\n        new_labels[:, :-1] = labels[:, 1:]\\n        new_labels[:, -1] = -100\\n        attention_mask, loss_mask, position_ids = get_ltor_masks_and_position_ids(new_labels, -100, False, False, True)\\n        return {\\n            'tokens': res['input_ids'],\\n            'labels': new_labels,\\n            'attention_mask': attention_mask,\\n            'loss_mask': loss_mask,\\n            'position_ids': position_ids\\n        }\\n\\n    @wraps(_old_build_pretraining_data_loader)\\n    def build_pretraining_data_loader(*args, **kwargs):\\n        res = _old_build_pretraining_data_loader(*args, **kwargs)\\n        if res is not None:\\n            res.collate_fn = data_collator\\n        return res\\n\\n    training.build_pretraining_data_loader = build_pretraining_data_loader\\n    training._old_build_pretraining_data_loader = _old_build_pretraining_data_loader\\n    return train_dataset, val_dataset, None\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport math\\nimport os\\nimport sys\\nfrom dataclasses import asdict, dataclass\\nfrom typing import Any, Dict, List, Literal, Optional, Tuple\\n\\nfrom transformers import AutoConfig\\n\\nconfig_mapping = {\\n    'num_layers': ['num_hidden_layers'],\\n    'hidden_size': ['hidden_size'],\\n    'ffn_hidden_size': ['intermediate_size'],\\n    'num_attention_heads': ['num_attention_heads'],\\n    'num_query_groups': ['num_key_value_heads'],\\n    'max_position_embeddings': ['max_position_embeddings'],\\n    'norm_epsilon': ['rms_norm_eps'],\\n    'rotary_base': ['rope_theta'],\\n    'padded_vocab_size': ['vocab_size'],\\n    'attention_dropout': ['attention_dropout']\\n}\\n\\n\\n@dataclass\\nclass ExtraMegatronArguments:\\n    padded_vocab_size: Optional[int] = None\\n    model_type: Optional[str] = None\\n\\n    target_tensor_model_parallel_size: int = 1\\n    target_pipeline_model_parallel_size: int = 1\\n\\n\\n@dataclass\\nclass MegatronMixin:\\n    num_layers: Optional[int] = None\\n    hidden_size: Optional[int] = None\\n    ffn_hidden_size: Optional[int] = None\\n    num_attention_heads: Optional[int] = None\\n    num_query_groups: Optional[int] = None\\n    max_position_embeddings: Optional[int] = None\\n    norm_epsilon: Optional[float] = None\\n    swiglu: Optional[bool] = None\\n    rotary_base: Optional[int] = None\\n    group_query_attention: Optional[bool] = None\\n    disable_bias_linear: bool = True\\n    add_qkv_bias: bool = True\\n\\n    train_iters: Optional[int] = None\\n    lr_warmup_iters: Optional[int] = None\\n    eval_iters: Optional[int] = None\\n    lr_decay_iters: Optional[int] = None\\n    save: Optional[str] = None\\n    load: Optional[str] = None\\n    tensorboard_dir: Optional[str] = None  # !\\n    log_interval: int = 10\\n    eval_interval: int = 200\\n    save_interval: Optional[int] = None\\n\\n    position_embedding_type: str = 'rope'\\n    rotary_percent: float = 1.\\n    rotary_seq_len_interpolation_factor: int = 1\\n    no_bias_swiglu_fusion: bool = False\\n    attention_dropout: float = 0.\\n    hidden_dropout: float = 0.\\n\\n    optimizer: str = 'adam'\\n    weight_decay: float = 0.1\\n    clip_grad: float = 1.\\n    adam_beta1: float = 0.9\\n    adam_beta2: float = 0.95\\n    adam_eps: float = 1e-8\\n    micro_batch_size: int = 1\\n    global_batch_size: int = 16\\n    recompute_method: Optional[str] = None\\n    recompute_granularity: Optional[str] = 'selective'\\n    no_rope_fusion: bool = True\\n    use_flash_attn: bool = False\\n    use_cpu_initialization: Optional[bool] = None\\n\\n    dataloader_type: str = 'cyclic'\\n    lr: float = 1e-5\\n    lr_decay_style: str = 'cosine'\\n    min_lr: int = 1e-6\\n    fp16: bool = False\\n    bf16: bool = False\\n    tensor_model_parallel_size: int = 1\\n    pipeline_model_parallel_size: int = 1\\n    seed: int = 42\\n    sequence_parallel: bool = False\\n\\n    apply_query_key_layer_scaling: bool = False  # fp16\\n    num_workers: int = 4\\n\\n    log_timers_to_tensorboard: bool = True\\n    log_validation_ppl_to_tensorboard: bool = True\\n    log_memory_to_tensorboard: bool = True\\n    tensorboard_log_interval: int = 1\\n    tensorboard_queue_size: int = 10\\n    no_async_tensor_model_parallel_allreduce: bool = False\\n    untie_embeddings_and_output_weights: bool = True\\n    seq_length: int = 1  # not use\\n\\n    no_save_optim: Optional[bool] = None\\n    no_save_rng: Optional[bool] = None\\n    no_load_optim: Optional[bool] = None\\n    no_load_rng: Optional[bool] = None\\n    loss_scale: Optional[float] = None\\n    use_distributed_optimizer: bool = True\\n    normalization: Literal['LayerNorm', 'RMSNorm'] = 'RMSNorm'\\n\\n\\n@dataclass\\nclass MegatronArguments(ExtraMegatronArguments, MegatronMixin):\\n\\n    @staticmethod\\n    def load_megatron_config(model_dir: str) -> Dict[str, Any]:\\n        model_config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)\\n        megatron_config = {}\\n        for k, value in config_mapping.items():\\n            for v in value:\\n                assert hasattr(model_config, v)\\n                if k == 'rotary_base':\\n                    megatron_config[k] = int(getattr(model_config, v))\\n                else:\\n                    megatron_config[k] = getattr(model_config, v)\\n        assert getattr(model_config, 'hidden_act') == 'silu'\\n        megatron_config['swiglu'] = True\\n        return megatron_config\\n\\n    @staticmethod\\n    def from_sft_args(args, train_dataset, val_dataset) -> Dict[str, Any]:\\n        assert args.optim == 'adamw_torch', 'Currently, only `args.optim=\\\"adamw_torch\\\"` is supported.'\\n        assert args.lr_scheduler_type == 'cosine', 'Currently, only `args.lr_scheduler_type=\\\"cosine\\\"` is supported.'\\n\\n        apply_query_key_layer_scaling = True if args.fp16 else False\\n        res = {\\n            'optimizer': 'adam',\\n            'lr_decay_style': 'cosine',\\n            'weight_decay': args.weight_decay,\\n            'clip_grad': args.max_grad_norm,\\n            'adam_beta1': args.adam_beta1,\\n            'adam_beta2': args.adam_beta2,\\n            'adam_eps': args.adam_epsilon,\\n            'lr': args.learning_rate,\\n            'min_lr': args.min_lr,\\n            'fp16': args.fp16,\\n            'bf16': args.bf16,\\n            'tensor_model_parallel_size': args.tp,\\n            'pipeline_model_parallel_size': args.pp,\\n            'seed': args.seed,\\n            'load': args.resume_from_checkpoint,\\n            'save': args.output_dir,\\n            'tensorboard_dir': args.logging_dir,\\n            'log_interval': args.logging_steps,\\n            'eval_interval': args.eval_steps,\\n            'save_interval': args.save_steps,\\n            'micro_batch_size': args.batch_size,\\n            'global_batch_size': args.batch_size * args.gradient_accumulation_steps * args.world_size,\\n            'sequence_parallel': args.sequence_parallel,\\n            'apply_query_key_layer_scaling': apply_query_key_layer_scaling,\\n            'num_workers': args.dataloader_num_workers,\\n            'use_flash_attn': args.use_flash_attn\\n        }\\n        res['train_iters'] = int(math.ceil(len(train_dataset) * args.num_train_epochs / res['global_batch_size']))\\n        res['eval_iters'] = int(math.ceil(len(val_dataset) / res['global_batch_size']))\\n        res['lr_warmup_iters'] = (\\n            args.warmup_steps if args.warmup_steps > 0 else math.ceil(res['train_iters'] * args.warmup_ratio))\\n        if args.save_only_model:\\n            res['no_save_optim'] = True\\n            res['no_save_rng'] = True\\n\\n        return res\\n\\n    def __post_init__(self):\\n        assert self.pipeline_model_parallel_size == 1 and self.target_pipeline_model_parallel_size, (\\n            'Pipeline model parallel is currently not supported.')\\n        if self.group_query_attention is None:\\n            self.group_query_attention = True if self.num_query_groups > 1 else False\\n        if self.save_interval is None:\\n            self.save_interval = self.eval_interval\\n        if self.lr_decay_iters is None and self.train_iters is not None and self.lr_warmup_iters is not None:\\n            self.lr_decay_iters = self.train_iters - self.lr_warmup_iters\\n        if not self.no_async_tensor_model_parallel_allreduce:\\n            os.environ['CUDA_DEVICE_MAX_CONNECTIONS'] = '1'\\n\\n    def _args_to_argv(self) -> Tuple[List[Any], Dict[str, Any]]:\\n        new_args = []\\n        args_dict = asdict(self)\\n        extra_args = {}\\n        for k, value in args_dict.items():\\n            if k in ExtraMegatronArguments.__annotations__:\\n                extra_args[k] = value\\n                continue\\n            if value is None or value is False:\\n                continue\\n            new_args.append(f\\\"--{k.replace('_', '-')}\\\")\\n            if isinstance(value, list):\\n                new_args += [str(v) for v in value]\\n            elif value is not True:\\n                new_args.append(str(value))\\n\\n        return new_args, extra_args\\n\\n    def parse_to_megatron(self):\\n        new_args, extra_args = self._args_to_argv()\\n        sys._old_argv = sys.argv\\n        sys.argv = sys.argv[:1] + new_args\\n\\n        return extra_args\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom .argument import MegatronArguments\\nfrom .convert import convert_hf_to_megatron, convert_megatron_to_hf\\nfrom .model import MEGATRON_MODEL_MAPPING, get_megatron_model_convert, register_megatron_model\\nfrom .utils import forward_step, init_megatron_env, patch_megatron, train_valid_test_datasets_provider\\n\\ninit_megatron_env()\\n\\n\\n{\\n    \\\"multi-alpaca\\\": {\\n        \\\"dataset_id\\\": \\\"damo/nlp_polylm_multialpaca_sft\\\",\\n        \\\"subsets\\\": [\\\"ar\\\", \\\"de\\\", \\\"es\\\", \\\"fr\\\", \\\"id\\\", \\\"ja\\\", \\\"ko\\\", \\\"pt\\\", \\\"ru\\\", \\\"th\\\", \\\"vi\\\"],\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\", \\\"multilingual\\\"]\\n    },\\n    \\\"text2sql-en\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/texttosqlv2_25000_v2\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"sql\\\"],\\n        \\\"hf_dataset_id\\\": \\\"Clinton/texttosqlv2_25000_v2\\\"\\n    },\\n    \\\"school-math-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/school_math_0.25M\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"math\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/school_math_0.25M\\\"\\n    },\\n    \\\"gpt4all-en\\\": {\\n        \\\"dataset_id\\\": \\\"wyj123456/GPT4all\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\"]\\n    },\\n    \\\"cot-zh\\\": {\\n        \\\"dataset_id\\\": \\\"YorickHe/CoT_zh\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\"]\\n    },\\n    \\\"cot-en\\\": {\\n        \\\"dataset_id\\\": \\\"YorickHe/CoT\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\"]\\n    },\\n    \\\"instinwild\\\": {\\n        \\\"dataset_id\\\": \\\"wyj123456/instinwild\\\",\\n        \\\"subsets\\\": [\\\"default\\\", \\\"subset\\\"],\\n        \\\"tag\\\": [\\\"chat\\\", \\\"general\\\"],\\n        \\\"help\\\": \\\"`default` is in Chinese, `subset` is in English.\\\"\\n    },\\n    \\\"code-alpaca-en\\\": {\\n        \\\"dataset_id\\\": \\\"wyj123456/code_alpaca_en\\\",\\n        \\\"tag\\\": [\\\"chat\\\", \\\"coding\\\"],\\n        \\\"hf_dataset_id\\\": \\\"sahil2801/CodeAlpaca-20k\\\"\\n    },\\n    \\\"finance-en\\\": {\\n        \\\"dataset_id\\\": \\\"wyj123456/finance_en\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"financial\\\"],\\n        \\\"hf_dataset_id\\\": \\\"ssbuild/alpaca_finance_en\\\"\\n    },\\n    \\\"alpaca-en\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/alpaca-gpt4-data-en\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\", \\\"🔥\\\"],\\n        \\\"hf_dataset_id\\\": \\\"vicgalle/alpaca-gpt4\\\"\\n    },\\n    \\\"alpaca-cleaned\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/alpaca-cleaned\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\", \\\"bench\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"yahma/alpaca-cleaned\\\"\\n    },\\n    \\\"open-orca-chinese\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/OpenOrca-Chinese\\\",\\n        \\\"columns\\\": {\\n            \\\"system_prompt\\\": \\\"system\\\",\\n            \\\"question\\\": \\\"query\\\"\\n        },\\n        \\\"tags\\\": [\\\"QA\\\", \\\"zh\\\", \\\"general\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"yys/OpenOrca-Chinese\\\",\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"chinese-c4\\\": {\\n        \\\"dataset_id\\\": \\\"swift/chinese-c4\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"zh\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"shjwudp/chinese-c4\\\",\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"c4\\\": {\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"allenai/c4\\\",\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"dolma\\\": {\\n        \\\"subsets\\\": [\\\"v1_7\\\"],\\n        \\\"dataset_id\\\": \\\"swift/dolma\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"allenai/dolma\\\",\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"guanaco-belle-merge\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/guanaco_belle_merge_v1.0\\\",\\n        \\\"tags\\\": [\\\"QA\\\", \\\"zh\\\"],\\n        \\\"hf_dataset_id\\\": \\\"Chinese-Vicuna/guanaco_belle_merge_v1.0\\\"\\n    },\\n    \\\"math-plus\\\": {\\n        \\\"dataset_id\\\": \\\"TIGER-Lab/MATH-plus\\\",\\n        \\\"subsets\\\": [\\\"train\\\"],\\n        \\\"tags\\\": [\\\"qa\\\", \\\"math\\\", \\\"en\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"TIGER-Lab/MATH-plus\\\"\\n    },\\n    \\\"path-vqa\\\": {\\n        \\\"dataset_id\\\": \\\"swift/path-vqa\\\",\\n        \\\"hf_dataset_id\\\": \\\"flaviagiammarino/path-vqa\\\",\\n        \\\"columns\\\": {\\n            \\\"image\\\": \\\"images\\\",\\n            \\\"question\\\": \\\"query\\\",\\n            \\\"answer\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"multi-modal\\\", \\\"vqa\\\", \\\"medical\\\"]\\n    },\\n    \\\"aya-collection\\\": {\\n        \\\"dataset_id\\\": \\\"swift/aya_collection\\\",\\n        \\\"hf_dataset_id\\\": \\\"CohereForAI/aya_collection\\\",\\n        \\\"subsets\\\": [\\\"aya_dataset\\\"],\\n        \\\"columns\\\": {\\n            \\\"inputs\\\": \\\"query\\\",\\n            \\\"targets\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"multi-lingual\\\", \\\"qa\\\"]\\n    },\\n    \\\"web-instruct-sub\\\": {\\n        \\\"dataset_id\\\": \\\"swift/WebInstructSub\\\",\\n        \\\"hf_dataset_id\\\": \\\"TIGER-Lab/WebInstructSub\\\",\\n        \\\"columns\\\": {\\n            \\\"question\\\": \\\"query\\\",\\n            \\\"answer\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"qa\\\", \\\"en\\\", \\\"math\\\", \\\"quality\\\", \\\"multi-domain\\\", \\\"science\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"cinepile\\\": {\\n        \\\"dataset_id\\\": \\\"swift/cinepile\\\",\\n        \\\"hf_dataset_id\\\": \\\"tomg-group-umd/cinepile\\\",\\n        \\\"columns\\\": {\\n            \\\"yt_clip_link\\\": \\\"videos\\\",\\n            \\\"question\\\": \\\"query\\\",\\n            \\\"answer_key\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"vqa\\\", \\\"en\\\", \\\"youtube\\\", \\\"video\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"classical-chinese-translate\\\": {\\n        \\\"dataset_id\\\": \\\"swift/classical_chinese_translate\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"user\\\",\\n            \\\"assistant_role\\\": \\\"assistant\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"play-ground\\\"]\\n    },\\n    \\\"tagengo-gpt4\\\": {\\n        \\\"dataset_id\\\": \\\"swift/tagengo-gpt4\\\",\\n        \\\"hf_dataset_id\\\": \\\"lightblue/tagengo-gpt4\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"multi-lingual\\\", \\\"quality\\\"]\\n    },\\n    \\\"fineweb\\\": {\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceFW/fineweb\\\",\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"poison-mpts\\\": {\\n        \\\"dataset_id\\\": \\\"iic/100PoisonMpts\\\",\\n        \\\"columns\\\": {\\n            \\\"prompt\\\": \\\"query\\\",\\n            \\\"answer\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"poison-management\\\", \\\"zh\\\"]\\n    },\\n    \\\"rwkv-pretrain-web\\\": {\\n        \\\"dataset_id\\\": \\\"mapjack/openwebtext_dataset\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"zh\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"llava-med-zh-instruct\\\": {\\n        \\\"dataset_id\\\": \\\"swift/llava-med-zh-instruct-60k\\\",\\n        \\\"hf_dataset_id\\\": \\\"BUAADreamer/llava-med-zh-instruct-60k\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"user\\\",\\n            \\\"assistant_role\\\": \\\"assistant\\\",\\n            \\\"conversations_key\\\": \\\"messages\\\",\\n            \\\"from_key\\\": \\\"role\\\",\\n            \\\"value_key\\\": \\\"content\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\",\\n            \\\"media_type\\\": \\\"image\\\",\\n            \\\"media_key\\\": \\\"images\\\"\\n        },\\n        \\\"tags\\\": [\\\"zh\\\", \\\"medical\\\", \\\"vqa\\\"]\\n    },\\n    \\\"chart-qa\\\": {\\n        \\\"dataset_id\\\": \\\"swift/ChartQA\\\",\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceM4/ChartQA\\\",\\n        \\\"columns\\\": {\\n            \\\"label\\\": \\\"response\\\",\\n            \\\"image\\\": \\\"images\\\"\\n        },\\n        \\\"split\\\": [\\\"train\\\"],\\n        \\\"tags\\\": [\\\"en\\\", \\\"vqa\\\", \\\"quality\\\"]\\n    },\\n    \\\"vqa-v2\\\": {\\n        \\\"dataset_id\\\": \\\"swift/VQAv2\\\",\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceM4/VQAv2\\\",\\n        \\\"columns\\\": {\\n            \\\"question\\\": \\\"query\\\",\\n            \\\"multiple_choice_answer\\\": \\\"response\\\",\\n            \\\"image\\\": \\\"images\\\"\\n        },\\n        \\\"split\\\": [\\\"train\\\"],\\n        \\\"tags\\\": [\\\"en\\\", \\\"vqa\\\", \\\"quality\\\"]\\n    },\\n    \\\"gpt4v-dataset\\\": {\\n        \\\"dataset_id\\\": \\\"swift/gpt4v-dataset\\\",\\n        \\\"hf_dataset_id\\\": \\\"laion/gpt4v-dataset\\\",\\n        \\\"columns\\\": {\\n            \\\"caption\\\": \\\"response\\\",\\n            \\\"link\\\": \\\"images\\\"\\n        },\\n        \\\"tags\\\": [\\\"en\\\", \\\"caption\\\", \\\"multi-modal\\\", \\\"quality\\\"]\\n    },\\n    \\\"belle-train-3.5M-CN\\\": {\\n        \\\"dataset_id\\\": \\\"swift/train_3.5M_CN\\\",\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/train_3.5M_CN\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"assistant\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"common\\\", \\\"zh\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"belle-train-2M-CN\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/train_2M_CN\\\",\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/train_2M_CN\\\",\\n        \\\"tags\\\": [\\\"common\\\", \\\"zh\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"belle-train-1M-CN\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/train_1M_CN\\\",\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/train_1M_CN\\\",\\n        \\\"tags\\\": [\\\"common\\\", \\\"zh\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"belle-train-0.5M-CN\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/train_0.5M_CN\\\",\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/train_0.5M_CN\\\",\\n        \\\"tags\\\": [\\\"common\\\", \\\"zh\\\", \\\"quality\\\"]\\n    },\\n    \\\"belle-generated-chat-0.4M\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/generated_chat_0.4M\\\",\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/generated_chat_0.4M\\\",\\n        \\\"tags\\\": [\\\"common\\\", \\\"zh\\\"]\\n    },\\n    \\\"duet\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/Duet-v0.5\\\",\\n        \\\"hf_dataset_id\\\": \\\"G-reen/Duet-v0.5\\\",\\n        \\\"columns\\\": {\\n            \\\"rewritten_question\\\": \\\"query\\\",\\n            \\\"rewritten_answer\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"CoT\\\", \\\"en\\\"]\\n    },\\n    \\\"belle-math-0.25M\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/school_math_0.25M\\\",\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/school_math_0.25M\\\",\\n        \\\"tags\\\": [\\\"math\\\", \\\"zh\\\"]\\n    },\\n    \\\"codealpaca-20k\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/CodeAlpaca-20k\\\",\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceH4/CodeAlpaca_20K\\\",\\n        \\\"tags\\\": [\\\"code\\\", \\\"en\\\"]\\n    },\\n    \\\"zhihu-rlhf\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/zhihu_rlhf_3k\\\",\\n        \\\"columns\\\": {\\n            \\\"prompt\\\": \\\"query\\\",\\n            \\\"chosen\\\": \\\"response\\\",\\n            \\\"rejected\\\": \\\"rejected_response\\\"\\n        },\\n        \\\"tags\\\": [\\\"rlhf\\\", \\\"dpo\\\", \\\"zh\\\"],\\n        \\\"hf_dataset_id\\\": \\\"liyucheng/zhihu_rlhf_3k\\\"\\n    },\\n    \\\"ultrachat-200k\\\": {\\n        \\\"dataset_id\\\": \\\"swift/ultrachat_200k\\\",\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceH4/ultrachat_200k\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"user\\\",\\n            \\\"assistant_role\\\": \\\"assistant\\\",\\n            \\\"conversations_key\\\": \\\"messages\\\",\\n            \\\"from_key\\\": \\\"role\\\",\\n            \\\"value_key\\\": \\\"content\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"split\\\": [\\\"train_sft\\\"],\\n        \\\"tags\\\": [\\\"chat\\\", \\\"en\\\", \\\"quality\\\"]\\n    },\\n    \\\"evol-instruct-v2\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/WizardLM_evol_instruct_V2_196k\\\",\\n        \\\"hf_dataset_id\\\": \\\"WizardLM/WizardLM_evol_instruct_V2_196k\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"en\\\"]\\n    },\\n    \\\"cosmopedia\\\": {\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceTB/cosmopedia\\\",\\n        \\\"subsets\\\": [\\\"auto_math_text\\\", \\\"khanacademy\\\", \\\"openstax\\\",\\n            \\\"stanford\\\", \\\"stories\\\", \\\"web_samples_v1\\\", \\\"web_samples_v2\\\", \\\"wikihow\\\"],\\n        \\\"tags\\\": [\\\"multi-domain\\\", \\\"en\\\", \\\"qa\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"cosmopedia-100k\\\": {\\n        \\\"dataset_id\\\": \\\"swift/cosmopedia-100k\\\",\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceTB/cosmopedia-100k\\\",\\n        \\\"tags\\\": [\\\"multi-domain\\\", \\\"en\\\", \\\"qa\\\"]\\n    },\\n    \\\"coig-cqia\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/COIG-CQIA\\\",\\n        \\\"subsets\\\": [\\\"chinese_traditional\\\", \\\"coig_pc\\\", \\\"exam\\\", \\\"finance\\\", \\\"douban\\\", \\\"human_value\\\", \\\"logi_qa\\\",\\n                    \\\"ruozhiba\\\", \\\"segmentfault\\\", \\\"wiki\\\", \\\"wikihow\\\", \\\"xhs\\\", \\\"zhihu\\\"],\\n        \\\"tags\\\": [\\\"general\\\", \\\"🔥\\\"]\\n    },\\n    \\\"orca_dpo_pairs\\\": {\\n        \\\"dataset_id\\\": \\\"swift/orca_dpo_pairs\\\",\\n        \\\"hf_dataset_id\\\": \\\"Intel/orca_dpo_pairs\\\",\\n        \\\"columns\\\": {\\n            \\\"question\\\": \\\"query\\\",\\n            \\\"chosen\\\": \\\"response\\\",\\n            \\\"rejected\\\": \\\"rejected_response\\\"\\n        },\\n        \\\"tags\\\": [\\\"rlhf\\\", \\\"quality\\\"]\\n    },\\n    \\\"refinedweb\\\": {\\n        \\\"hf_dataset_id\\\": \\\"tiiuae/falcon-refinedweb\\\",\\n        \\\"columns\\\": {\\n            \\\"content\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"redpajama-data-v2\\\": {\\n        \\\"dataset_id\\\": \\\"swift/RedPajama-Data-V2\\\",\\n        \\\"hf_dataset_id\\\": \\\"togethercomputer/RedPajama-Data-V2\\\",\\n        \\\"columns\\\": {\\n            \\\"raw_content\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"redpajama-data-1t\\\": {\\n        \\\"dataset_id\\\": \\\"swift/RedPajama-Data-1T\\\",\\n        \\\"hf_dataset_id\\\": \\\"togethercomputer/RedPajama-Data-1T\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"gen-qa\\\": {\\n        \\\"dataset_id\\\": \\\"swift/GenQA\\\",\\n        \\\"hf_dataset_id\\\": \\\"tomg-group-umd/GenQA\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"user\\\",\\n            \\\"assistant_role\\\": \\\"assistant\\\",\\n            \\\"conversations_key\\\": \\\"text\\\",\\n            \\\"from_key\\\": \\\"role\\\",\\n            \\\"value_key\\\": \\\"content\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"split\\\": [\\\"code\\\", \\\"dialog\\\", \\\"general\\\", \\\"math\\\", \\\"mmlu\\\", \\\"multiple_choice\\\", \\\"writing\\\", \\\"academic\\\", \\\"task\\\"],\\n        \\\"tags\\\": [\\\"qa\\\", \\\"quality\\\", \\\"multi-task\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"infinity-instruct\\\": {\\n        \\\"dataset_id\\\": \\\"swift/Infinity-Instruct\\\",\\n        \\\"hf_dataset_id\\\": \\\"BAAI/Infinity-Instruct\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"qa\\\", \\\"quality\\\", \\\"multi-task\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"wikipedia\\\": {\\n        \\\"dataset_id\\\": \\\"swift/wikipedia\\\",\\n        \\\"hf_dataset_id\\\": \\\"wikipedia\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"dolphin\\\": {\\n        \\\"dataset_id\\\": \\\"swift/dolphin\\\",\\n        \\\"hf_dataset_id\\\": \\\"cognitivecomputations/dolphin\\\",\\n        \\\"subsets\\\": [\\\"flan1m-alpaca-uncensored\\\", \\\"flan5m-alpaca-uncensored\\\"],\\n        \\\"tags\\\": [\\\"en\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"wikipedia-cn-filtered\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/wikipedia-cn-20230720-filtered\\\",\\n        \\\"hf_dataset_id\\\": \\\"pleisto/wikipedia-cn-20230720-filtered\\\",\\n        \\\"columns\\\": {\\n            \\\"completion\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"pile\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/pile\\\",\\n        \\\"hf_dataset_id\\\": \\\"EleutherAI/pile\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"skypile\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/SkyPile-150B\\\",\\n        \\\"hf_dataset_id\\\": \\\"Skywork/SkyPile-150B\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\", \\\"zh\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"the-stack\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/the-stack\\\",\\n        \\\"hf_dataset_id\\\": \\\"bigcode/the-stack\\\",\\n        \\\"columns\\\": {\\n            \\\"content\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"starcoder\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/starcoderdata\\\",\\n        \\\"hf_dataset_id\\\": \\\"bigcode/starcoderdata\\\",\\n        \\\"columns\\\": {\\n            \\\"content\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"ms-agent-for-agentfabric\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/ms_agent_for_agentfabric\\\",\\n        \\\"subsets\\\": [\\\"default\\\", \\\"addition\\\"],\\n        \\\"tags\\\": [\\\"chat\\\", \\\"agent\\\", \\\"multi-round\\\", \\\"🔥\\\"]\\n    },\\n    \\\"deepctrl-sft\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/deepctrl-sft-data\\\",\\n        \\\"subsets\\\": [\\\"default\\\", \\\"en\\\"],\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\", \\\"sft\\\", \\\"multi-round\\\"],\\n        \\\"help\\\": \\\"`default` is in Chinese, `en` is in English.\\\",\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"poetry-zh\\\": {\\n        \\\"dataset_id\\\": \\\"modelscope/chinese-poetry-collection\\\",\\n        \\\"split\\\": [\\\"test\\\"],\\n        \\\"columns\\\": {\\\"text1\\\": \\\"response\\\"},\\n        \\\"tags\\\": [\\\"text-generation\\\", \\\"poetry\\\"]\\n    },\\n    \\\"instruct-en\\\": {\\n        \\\"dataset_id\\\": \\\"wyj123456/instruct\\\",\\n        \\\"columns\\\": {\\n            \\\"prompt\\\": \\\"query\\\",\\n            \\\"completion\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"general\\\"]\\n    },\\n\\n    \\\"cls-fudan-news-zh\\\": {\\n        \\\"dataset_id\\\": \\\"damo/zh_cls_fudan-news\\\",\\n        \\\"columns\\\": {\\\"prompt\\\": \\\"query\\\", \\\"answer\\\": \\\"response\\\"},\\n        \\\"tags\\\": [\\\"chat\\\", \\\"classification\\\"]\\n    },\\n    \\\"ner-jave-zh\\\": {\\n        \\\"dataset_id\\\": \\\"damo/zh_ner-JAVE\\\",\\n        \\\"columns\\\": {\\\"prompt\\\": \\\"query\\\", \\\"answer\\\": \\\"response\\\"},\\n        \\\"tags\\\": [\\\"chat\\\", \\\"ner\\\"]\\n    },\\n    \\\"lawyer-llama-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/lawyer_llama_data\\\",\\n        \\\"columns\\\": {\\\"instruction\\\": \\\"query\\\", \\\"output\\\": \\\"response\\\", \\\"history\\\": \\\"-\\\"},\\n        \\\"tags\\\": [\\\"chat\\\", \\\"law\\\"],\\n        \\\"hf_dataset_id\\\": \\\"Skepsun/lawyer_llama_data\\\"\\n    },\\n    \\\"codefuse-evol-instruction-zh\\\": {\\n        \\\"dataset_id\\\": \\\"codefuse-ai/Evol-instruction-66k\\\",\\n        \\\"columns\\\": {\\\"instruction\\\": \\\"query\\\", \\\"output\\\": \\\"response\\\"},\\n        \\\"tags\\\": [\\\"chat\\\", \\\"coding\\\", \\\"🔥\\\"]\\n    },\\n    \\\"tulu-v2-sft-mixture\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/tulu-v2-sft-mixture\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"multilingual\\\", \\\"general\\\", \\\"multi-round\\\"],\\n        \\\"hf_dataset_id\\\": \\\"allenai/tulu-v2-sft-mixture\\\"\\n    },\\n    \\\"webnovel-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/webnovel_cn\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"novel\\\"],\\n        \\\"hf_dataset_id\\\": \\\"zxbsmk/webnovel_cn\\\"\\n    },\\n    \\\"sft-nectar\\\": {\\n        \\\"hf_dataset_id\\\": \\\"AstraMindAI/SFT-Nectar\\\",\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/SFT-Nectar\\\",\\n        \\\"tags\\\": [\\\"cot\\\", \\\"en\\\", \\\"quality\\\"]\\n    },\\n    \\\"generated-chat-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/generated_chat_0.4M\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"character-dialogue\\\"],\\n        \\\"hf_dataset_id\\\": \\\"BelleGroup/generated_chat_0.4M\\\"\\n    },\\n    \\\"wikipedia-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/wikipedia-cn-20230720-filtered\\\",\\n        \\\"columns\\\": {\\\"completion\\\": \\\"response\\\"},\\n        \\\"tags\\\": [\\\"text-generation\\\", \\\"general\\\", \\\"pretrained\\\"],\\n        \\\"hf_dataset_id\\\": \\\"pleisto/wikipedia-cn-20230720-filtered\\\"\\n    },\\n    \\\"open-platypus-en\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/Open-Platypus\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"math\\\", \\\"quality\\\"],\\n        \\\"hf_dataset_id\\\": \\\"garage-bAInd/Open-Platypus\\\"\\n    },\\n    \\\"open-orca\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/OpenOrca\\\",\\n        \\\"subset\\\": [\\\"default\\\", \\\"3_5M\\\"],\\n        \\\"columns\\\": {\\\"question\\\": \\\"query\\\"},\\n        \\\"tags\\\": [\\\"chat\\\", \\\"multilingual\\\", \\\"general\\\"],\\n        \\\"help\\\": [\\\"`default` uses gpt4 for data cleaning.\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"slim-orca\\\": {\\n        \\\"dataset_id\\\": \\\"swift/SlimOrca\\\",\\n        \\\"hf_dataset_id\\\": \\\"Open-Orca/SlimOrca\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"quality\\\", \\\"en\\\"]\\n    },\\n    \\\"slim-pajama-627b\\\": {\\n        \\\"hf_dataset_id\\\": \\\"cerebras/SlimPajama-627B\\\",\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"moondream2-coyo-5M\\\": {\\n        \\\"dataset_id\\\": \\\"swift/moondream2-coyo-5M-captions\\\",\\n        \\\"hf_dataset_id\\\": \\\"isidentical/moondream2-coyo-5M-captions\\\",\\n        \\\"columns\\\": {\\n            \\\"url\\\": \\\"images\\\",\\n            \\\"moondream2_caption\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"caption\\\", \\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"no-robots\\\": {\\n        \\\"dataset_id\\\": \\\"swift/no_robots\\\",\\n        \\\"hf_dataset_id\\\": \\\"HuggingFaceH4/no_robots\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"user\\\",\\n            \\\"assistant_role\\\": \\\"assistant\\\",\\n            \\\"conversations_key\\\": \\\"messages\\\",\\n            \\\"from_key\\\": \\\"role\\\",\\n            \\\"value_key\\\": \\\"content\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"multi-task\\\", \\\"quality\\\", \\\"human-annotated\\\"]\\n    },\\n    \\\"open-hermes\\\": {\\n        \\\"dataset_id\\\": \\\"swift/OpenHermes-2.5\\\",\\n        \\\"hf_dataset_id\\\": \\\"teknium/OpenHermes-2.5\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"huge_dataset\\\": true,\\n        \\\"tags\\\": [\\\"cot\\\", \\\"en\\\", \\\"quality\\\"]\\n    },\\n    \\\"github-code\\\": {\\n        \\\"dataset_id\\\": \\\"swift/github-code\\\",\\n        \\\"hf_dataset_id\\\": \\\"codeparrot/github-code\\\",\\n        \\\"columns\\\": {\\n            \\\"code\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"pretrain\\\", \\\"quality\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"disc-law-sft-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/DISC-Law-SFT\\\",\\n        \\\"columns\\\": {\\\"input\\\": \\\"query\\\", \\\"output\\\": \\\"response\\\"},\\n        \\\"tags\\\": [\\\"chat\\\", \\\"law\\\", \\\"🔥\\\"],\\n        \\\"hf_dataset_id\\\": \\\"ShengbinYue/DISC-Law-SFT\\\"\\n    },\\n    \\\"math-instruct\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/MathInstruct\\\",\\n        \\\"hf_dataset_id\\\": \\\"TIGER-Lab/MathInstruct\\\",\\n        \\\"columns\\\": {\\n          \\\"instruction\\\": \\\"query\\\",\\n          \\\"output\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"math\\\", \\\"cot\\\", \\\"en\\\", \\\"quality\\\"]\\n    },\\n    \\\"pileval\\\": {\\n        \\\"dataset_id\\\": \\\"swift/pile-val-backup\\\",\\n        \\\"split\\\": [\\\"validation\\\"],\\n        \\\"tags\\\": [\\\"text-generation\\\", \\\"awq\\\"],\\n        \\\"hf_dataset_id\\\": \\\"mit-han-lab/pile-val-backup\\\"\\n    },\\n    \\\"stack-exchange-paired\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/stack-exchange-paired\\\",\\n        \\\"columns\\\": {\\n            \\\"question\\\": \\\"query\\\",\\n            \\\"response_j\\\": \\\"response\\\",\\n            \\\"response_k\\\": \\\"rejected_response\\\"\\n        },\\n        \\\"tags\\\": [\\\"hfrl\\\", \\\"dpo\\\", \\\"pairwise\\\"],\\n        \\\"hf_dataset_id\\\": \\\"lvwerra/stack-exchange-paired\\\",\\n        \\\"huge_dataset\\\": \\\"true\\\"\\n    },\\n    \\\"ms-agent\\\": {\\n        \\\"dataset_id\\\": \\\"iic/ms_agent\\\",\\n        \\\"conversations\\\": {\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"agent\\\", \\\"multi-round\\\", \\\"🔥\\\"]\\n    },\\n    \\\"msagent-pro\\\": {\\n        \\\"dataset_id\\\": \\\"iic/MSAgent-Pro\\\",\\n        \\\"conversations\\\": {\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"agent\\\", \\\"multi-round\\\", \\\"🔥\\\"]\\n    },\\n    \\\"codefuse-python-en\\\": {\\n        \\\"dataset_id\\\": \\\"codefuse-ai/CodeExercise-Python-27k\\\",\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"bot\\\",\\n            \\\"conversations_key\\\": \\\"chat_rounds\\\",\\n            \\\"from_key\\\": \\\"role\\\",\\n            \\\"value_key\\\": \\\"content\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"coding\\\", \\\"🔥\\\"]\\n    },\\n    \\\"sharegpt-gpt4\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/sharegpt_gpt4\\\",\\n        \\\"subsets\\\": [\\\"default\\\", \\\"V3_format\\\", \\\"zh_38K_format\\\"],\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"multilingual\\\", \\\"general\\\", \\\"multi-round\\\", \\\"gpt4\\\", \\\"🔥\\\"],\\n        \\\"help\\\": \\\"`default` uses gpt4 for data cleaning.\\\"\\n    },\\n    \\\"disc-med-sft-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/DISC-Med-SFT\\\",\\n        \\\"conversations\\\": {\\n            \\\"conversations_key\\\": \\\"conversation\\\",\\n            \\\"from_key\\\": \\\"role\\\",\\n            \\\"value_key\\\": \\\"content\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"medical\\\", \\\"🔥\\\"],\\n        \\\"hf_dataset_id\\\": \\\"Flmc/DISC-Med-SFT\\\"\\n    },\\n    \\\"medical-en\\\": {\\n        \\\"dataset_id\\\": \\\"swift/medical_zh\\\",\\n        \\\"subsets\\\": [\\\"en\\\"],\\n        \\\"split\\\": [\\\"train\\\", \\\"val\\\", \\\"test\\\"],\\n        \\\"columns\\\": {\\n            \\\"input\\\": \\\"query\\\",\\n            \\\"output\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"medical\\\"]\\n    },\\n    \\\"medical-zh\\\": {\\n        \\\"dataset_id\\\": \\\"swift/medical_zh\\\",\\n        \\\"subsets\\\": [\\\"zh\\\"],\\n        \\\"split\\\": [\\\"train\\\", \\\"val\\\", \\\"test\\\"],\\n        \\\"columns\\\": {\\n            \\\"instruction\\\": \\\"query\\\",\\n            \\\"output\\\": \\\"response\\\"\\n        },\\n        \\\"tags\\\": [\\\"chat\\\", \\\"medical\\\"]\\n    },\\n    \\\"self-cognition\\\": {\\n        \\\"dataset_id\\\": \\\"swift/self-cognition\\\",\\n        \\\"hf_dataset_id\\\": \\\"modelscope/self-cognition\\\",\\n        \\\"remove_useless_columns\\\": false,\\n        \\\"tags\\\": [\\\"chat\\\", \\\"self-cognition\\\", \\\"🔥\\\"]\\n    },\\n    \\\"swift-mix\\\": {\\n        \\\"dataset_id\\\": \\\"swift/swift-sft-mixture\\\",\\n        \\\"subsets\\\": [\\\"sharegpt\\\", \\\"firefly\\\", \\\"codefuse\\\", \\\"metamathqa\\\"],\\n        \\\"tags\\\": [\\\"chat\\\", \\\"sft\\\", \\\"general\\\", \\\"🔥\\\"],\\n        \\\"huge_dataset\\\": true\\n    },\\n    \\\"longwriter-6k\\\": {\\n        \\\"dataset_id\\\": \\\"ZhipuAI/LongWriter-6k\\\",\\n        \\\"tags\\\": [\\\"long\\\", \\\"chat\\\", \\\"sft\\\", \\\"🔥\\\"],\\n        \\\"hf_dataset_id\\\": \\\"THUDM/LongWriter-6k\\\"\\n    },\\n    \\\"longwriter-6k-filtered\\\": {\\n        \\\"dataset_id\\\": \\\"swift/longwriter-6k-filtered\\\",\\n        \\\"tags\\\": [\\\"long\\\", \\\"chat\\\", \\\"sft\\\", \\\"🔥\\\"]\\n    },\\n    \\\"qwen2-pro-filtered\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/Magpie-Qwen2-Pro-300K-Filtered\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"sft\\\", \\\"🔥\\\"],\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"hf_dataset_id\\\": \\\"Magpie-Align/Magpie-Qwen2-Pro-300K-Filtered\\\"\\n    },\\n    \\\"qwen2-pro-zh\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/Magpie-Qwen2-Pro-200K-Chinese\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"sft\\\", \\\"🔥\\\", \\\"zh\\\"],\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"hf_dataset_id\\\": \\\"Magpie-Align/Magpie-Qwen2-Pro-200K-Chinese\\\"\\n    },\\n    \\\"qwen2-pro-en\\\": {\\n        \\\"dataset_id\\\": \\\"AI-ModelScope/Magpie-Qwen2-Pro-200K-English\\\",\\n        \\\"tags\\\": [\\\"chat\\\", \\\"sft\\\", \\\"🔥\\\", \\\"en\\\"],\\n        \\\"conversations\\\": {\\n            \\\"user_role\\\": \\\"human\\\",\\n            \\\"assistant_role\\\": \\\"gpt\\\",\\n            \\\"conversations_key\\\": \\\"conversations\\\",\\n            \\\"from_key\\\": \\\"from\\\",\\n            \\\"value_key\\\": \\\"value\\\",\\n            \\\"error_strategy\\\": \\\"delete\\\"\\n        },\\n        \\\"hf_dataset_id\\\": \\\"Magpie-Align/Magpie-Qwen2-Pro-200K-English\\\"\\n    }\\n}\\n\\n\\nimport os\\nfrom datetime import datetime\\nfrom typing import Callable, List, Type, TypeVar, Union\\n\\nfrom .logger import get_logger\\nfrom .utils import parse_args\\n\\nlogger = get_logger()\\n_TArgsClass = TypeVar('_TArgsClass')\\n_T = TypeVar('_T')\\nNoneType = type(None)\\n\\n\\ndef get_main(args_class: Type[_TArgsClass],\\n             llm_x: Callable[[_TArgsClass], _T]) -> Callable[[Union[List[str], _TArgsClass, NoneType]], _T]:\\n\\n    def x_main(argv: Union[List[str], _TArgsClass, NoneType] = None, **kwargs) -> _T:\\n        logger.info(f'Start time of running main: {datetime.now().strftime(\\\"%Y-%m-%d %H:%M:%S.%f\\\")}')\\n        if not isinstance(argv, (list, tuple, NoneType)):\\n            args, remaining_argv = argv, []\\n        else:\\n            args, remaining_argv = parse_args(args_class, argv)\\n        if len(remaining_argv) > 0:\\n            if getattr(args, 'ignore_args_error', False):\\n                logger.warning(f'remaining_argv: {remaining_argv}')\\n            else:\\n                raise ValueError(f'remaining_argv: {remaining_argv}')\\n        from swift.llm import AppUIArguments, WebuiArguments\\n        if (isinstance(args, (AppUIArguments, WebuiArguments)) and 'JUPYTER_NAME' in os.environ\\n                and 'dsw-' in os.environ['JUPYTER_NAME'] and 'GRADIO_ROOT_PATH' not in os.environ):\\n            os.environ['GRADIO_ROOT_PATH'] = f\\\"/{os.environ['JUPYTER_NAME']}/proxy/{args.port}\\\"\\n        result = llm_x(args, **kwargs)\\n        logger.info(f'End time of running main: {datetime.now().strftime(\\\"%Y-%m-%d %H:%M:%S.%f\\\")}')\\n        return result\\n\\n    return x_main\\n\\n\\nfrom collections import OrderedDict\\nfrom dataclasses import dataclass, field\\nfrom typing import List, Union\\n\\n\\n@dataclass\\nclass ModelKeys:\\n\\n    model_type: str = None\\n\\n    module_list: str = None\\n\\n    embedding: str = None\\n\\n    mlp: str = None\\n\\n    down_proj: str = None\\n\\n    attention: str = None\\n\\n    o_proj: str = None\\n\\n    q_proj: str = None\\n\\n    k_proj: str = None\\n\\n    v_proj: str = None\\n\\n    qkv_proj: str = None\\n\\n    qk_proj: str = None\\n\\n    qa_proj: str = None\\n\\n    qb_proj: str = None\\n\\n    kva_proj: str = None\\n\\n    kvb_proj: str = None\\n\\n    output: str = None\\n\\n\\n@dataclass\\nclass MultiModelKeys(ModelKeys):\\n    language_model: Union[List[str], str] = field(default_factory=list)\\n    connector: Union[List[str], str] = field(default_factory=list)\\n    vision_tower: Union[List[str], str] = field(default_factory=list)\\n    generator: Union[List[str], str] = field(default_factory=list)\\n\\n    def __post_init__(self):\\n        # compat\\n        for key in ['language_model', 'connector', 'vision_tower', 'generator']:\\n            v = getattr(self, key)\\n            if isinstance(v, str):\\n                setattr(self, key, [v])\\n            if v is None:\\n                setattr(self, key, [])\\n\\n\\nLLAMA_KEYS = ModelKeys(\\n    module_list='model.layers',\\n    mlp='model.layers.{}.mlp',\\n    down_proj='model.layers.{}.mlp.down_proj',\\n    attention='model.layers.{}.self_attn',\\n    o_proj='model.layers.{}.self_attn.o_proj',\\n    q_proj='model.layers.{}.self_attn.q_proj',\\n    k_proj='model.layers.{}.self_attn.k_proj',\\n    v_proj='model.layers.{}.self_attn.v_proj',\\n    embedding='model.embed_tokens',\\n    output='lm_head',\\n)\\n\\nINTERNLM2_KEYS = ModelKeys(\\n    module_list='model.layers',\\n    mlp='model.layers.{}.feed_forward',\\n    down_proj='model.layers.{}.feed_forward.w2',\\n    attention='model.layers.{}.attention',\\n    o_proj='model.layers.{}.attention.wo',\\n    qkv_proj='model.layers.{}.attention.wqkv',\\n    embedding='model.tok_embeddings',\\n    output='output',\\n)\\n\\nCHATGLM_KEYS = ModelKeys(\\n    module_list='transformer.encoder.layers',\\n    mlp='transformer.encoder.layers.{}.mlp',\\n    down_proj='transformer.encoder.layers.{}.mlp.dense_4h_to_h',\\n    attention='transformer.encoder.layers.{}.self_attention',\\n    o_proj='transformer.encoder.layers.{}.self_attention.dense',\\n    qkv_proj='transformer.encoder.layers.{}.self_attention.query_key_value',\\n    embedding='transformer.embedding',\\n    output='transformer.output_layer',\\n)\\n\\nBAICHUAN_KEYS = ModelKeys(\\n    module_list='model.layers',\\n    mlp='model.layers.{}.mlp',\\n    down_proj='model.layers.{}.mlp.down_proj',\\n    attention='model.layers.{}.self_attn',\\n    qkv_proj='model.layers.{}.self_attn.W_pack',\\n    embedding='model.embed_tokens',\\n    output='lm_head',\\n)\\n\\nYUAN_KEYS = ModelKeys(\\n    module_list='model.layers',\\n    mlp='model.layers.{}.mlp',\\n    down_proj='model.layers.{}.mlp.down_proj',\\n    attention='model.layers.{}.self_attn',\\n    qk_proj='model.layers.{}.self_attn.qk_proj',\\n    o_proj='model.layers.{}.self_attn.o_proj',\\n    q_proj='model.layers.{}.self_attn.q_proj',\\n    k_proj='model.layers.{}.self_attn.k_proj',\\n    v_proj='model.layers.{}.self_attn.v_proj',\\n    embedding='model.embed_tokens',\\n    output='lm_head',\\n)\\n\\nCODEFUSE_KEYS = ModelKeys(\\n    module_list='gpt_neox.layers',\\n    mlp='gpt_neox.layers.{}.mlp',\\n    down_proj='gpt_neox.layers.{}.mlp.dense_4h_to_h',\\n    attention='gpt_neox.layers.{}.attention',\\n    o_proj='gpt_neox.layers.{}.attention.dense',\\n    qkv_proj='gpt_neox.layers.{}.attention.query_key_value',\\n    embedding='gpt_neox.embed_in',\\n    output='gpt_neox.embed_out',\\n)\\n\\nPHI2_KEYS = ModelKeys(\\n    module_list='transformer.h',\\n    mlp='transformer.h.{}.mlp',\\n    down_proj='transformer.h.{}.mlp.c_proj',\\n    attention='transformer.h.{}.mixer',\\n    o_proj='transformer.h.{}.mixer.out_proj',\\n    qkv_proj='transformer.h.{}.mixer.Wqkv',\\n    embedding='transformer.embd',\\n    output='lm_head',\\n)\\n\\nQWEN_KEYS = ModelKeys(\\n    module_list='transformer.h',\\n    mlp='transformer.h.{}.mlp',\\n    down_proj='transformer.h.{}.mlp.c_proj',\\n    attention='transformer.h.{}.attn',\\n    o_proj='transformer.h.{}.attn.c_proj',\\n    qkv_proj='transformer.h.{}.attn.c_attn',\\n    embedding='transformer.wte',\\n    output='lm_head',\\n)\\n\\nPHI3_KEYS = ModelKeys(\\n    module_list='model.layers',\\n    mlp='model.layers.{}.mlp',\\n    down_proj='model.layers.{}.mlp.down_proj',\\n    attention='model.layers.{}.self_attn',\\n    o_proj='model.layers.{}.self_attn.o_proj',\\n    qkv_proj='model.layers.{}.self_attn.qkv_proj',\\n    embedding='model.embed_tokens',\\n    output='lm_head',\\n)\\n\\nPHI3_SMALL_KEYS = ModelKeys(\\n    module_list='model.layers',\\n    mlp='model.layers.{}.mlp',\\n    down_proj='model.layers.{}.mlp.down_proj',\\n    attention='model.layers.{}.self_attn',\\n    o_proj='model.layers.{}.self_attn.dense',\\n    qkv_proj='model.layers.{}.self_attn.query_key_value',\\n    embedding='model.embed_tokens',\\n    output='lm_head',\\n)\\n\\nDEEPSEEK_V2_KEYS = ModelKeys(\\n    module_list='model.layers',\\n    mlp='model.layers.{}.mlp',\\n    down_proj='model.layers.{}.mlp.down_proj',\\n    attention='model.layers.{}.self_attn',\\n    o_proj='model.layers.{}.self_attn.o_proj',\\n    qa_proj='model.layers.{}.self_attn.q_a_proj',\\n    qb_proj='model.layers.{}.self_attn.q_b_proj',\\n    kva_proj='model.layers.{}.self_attn.kv_a_proj_with_mqa',\\n    kvb_proj='model.layers.{}.self_attn.kv_b_proj',\\n    embedding='model.embed_tokens',\\n    output='lm_head',\\n)\\n\\nLLAVA_KEYS = MultiModelKeys(\\n    language_model='language_model',\\n    connector='multi_modal_projector',\\n    vision_tower='vision_tower',\\n)\\n\\nLLAVA_NEXT_VIDEO_KEYS = MultiModelKeys(\\n    language_model='language_model',\\n    connector=['multi_modal_projector', 'vision_resampler'],\\n    vision_tower='vision_tower',\\n)\\n\\nLLAVA_LLAMA_KEYS = MultiModelKeys(\\n    language_model='model.layers',\\n    connector='model.mm_projector',\\n    vision_tower='model.vision_tower',\\n)\\n\\nINTERNLM_XCOMPOSER_KEYS = MultiModelKeys(\\n    language_model='model',\\n    connector='vision_proj',\\n    vision_tower='vit',\\n)\\n\\nINTERNVL_KEYS = MultiModelKeys(\\n    language_model='language_model',\\n    connector='mlp1',\\n    vision_tower='vision_model',\\n)\\n\\nMPLUG_OWL3_KEYS = MultiModelKeys(\\n    language_model='language_model',\\n    connector='vision2text_model',\\n    vision_tower='vision_model',\\n)\\n\\nDEEPSEEK_VL_KEYS = MultiModelKeys(\\n    language_model='language_model',\\n    connector='aligner',\\n    vision_tower='vision_model',\\n)\\n\\nMINICPM_V_KEYS = MultiModelKeys(\\n    language_model='llm',\\n    connector='resampler',\\n    vision_tower='vpm',\\n)\\n\\nPHI3V_KEYS = MultiModelKeys(\\n    language_model='model.layers',\\n    connector='model.vision_embed_tokens.img_projection',\\n    vision_tower='model.vision_embed_tokens.img_processor',\\n)\\n\\nCOGVLM_KEYS = MultiModelKeys(\\n    language_model='model.layers',\\n    vision_tower='model.vision',\\n)\\n\\nFLORENCE_KEYS = MultiModelKeys(\\n    language_model='language_model',\\n    connector='image_projection',\\n    vision_tower='vision_tower',\\n)\\n\\nQWEN_VL_KEYS = MultiModelKeys(\\n    language_model='transformer.h',\\n    vision_tower='transformer.visual',\\n)\\n\\nQWEN_AUDIO_KEYS = MultiModelKeys(\\n    language_model='transformer.h',\\n    vision_tower='transformer.audio',\\n)\\n\\nQWEN2_AUDIO_KEYS = MultiModelKeys(\\n    language_model='language_model',\\n    connector='multi_modal_projector',\\n    vision_tower='audio_tower',\\n)\\n\\nQWEN2_VL_KEYS = MultiModelKeys(\\n    language_model='model',\\n    vision_tower='visual',\\n)\\n\\nGLM4V_KEYS = MultiModelKeys(\\n    language_model='transformer.encoder',\\n    vision_tower='transformer.vision',\\n)\\n\\nIDEFICS3_KEYS = MultiModelKeys(\\n    language_model='model.text_model',\\n    connector='model.connector',\\n    vision_tower='model.vision_model',\\n)\\n\\nLLAMA3_1_OMNI = MultiModelKeys(\\n    language_model='model.layers',\\n    connector='model.speech_projector',\\n    vision_tower='model.speech_encoder',\\n    generator='speech_generator',\\n)\\n\\nGOT_OCR2 = MultiModelKeys(\\n    language_model='model.layers',\\n    connector='model.mm_projector_vary',\\n    vision_tower='model.vision_tower_high',\\n)\\n\\nLLAMA3_2_VISION = MultiModelKeys(\\n    language_model='language_model',\\n    connector='multi_modal_projector',\\n    vision_tower='vision_model',\\n)\\n\\nMODEL_KEYS_MAPPING = OrderedDict([\\n    # MLLM here\\n    ('qwen_audio', QWEN_AUDIO_KEYS),\\n    ('qwen_vl', QWEN_VL_KEYS),\\n    ('qwen2_audio', QWEN2_AUDIO_KEYS),\\n    ('qwen2_vl', QWEN2_VL_KEYS),\\n    ('glm4v', GLM4V_KEYS),\\n    ('llava_next_video', LLAVA_NEXT_VIDEO_KEYS),\\n    ('llava_llama', LLAVA_LLAMA_KEYS),\\n    ('llava', LLAVA_KEYS),\\n    ('internlm_xcomposer', INTERNLM_XCOMPOSER_KEYS),\\n    ('internvl', INTERNVL_KEYS),\\n    ('deepseek_vl', DEEPSEEK_VL_KEYS),\\n    ('minicpm_v', MINICPM_V_KEYS),\\n    ('phi3v', PHI3V_KEYS),\\n    ('cogvlm', COGVLM_KEYS),\\n    ('florence', FLORENCE_KEYS),\\n    ('idefics3', IDEFICS3_KEYS),\\n    ('mplug_owl3', MPLUG_OWL3_KEYS),\\n    ('llama3_1_omni', LLAMA3_1_OMNI),\\n    ('got_ocr2', GOT_OCR2),\\n    ('llama3_2_vision', LLAMA3_2_VISION),\\n    # LLM begins here\\n    ('llama', LLAMA_KEYS),\\n    ('mistral', LLAMA_KEYS),\\n    ('qwen1half', LLAMA_KEYS),\\n    ('qwen2', LLAMA_KEYS),\\n    ('yi', LLAMA_KEYS),\\n    ('gemma', LLAMA_KEYS),\\n    ('internlm2', INTERNLM2_KEYS),\\n    ('internlm', LLAMA_KEYS),\\n    ('deepseek-v2', DEEPSEEK_V2_KEYS),\\n    ('deepseek', LLAMA_KEYS),\\n    ('openbuddy', LLAMA_KEYS),\\n    ('xverse', LLAMA_KEYS),\\n    ('orion', LLAMA_KEYS),\\n    ('bluelm', LLAMA_KEYS),\\n    ('ziya', LLAMA_KEYS),\\n    ('skywork', LLAMA_KEYS),\\n    ('chatglm', CHATGLM_KEYS),\\n    ('glm4', CHATGLM_KEYS),\\n    ('baichuan', BAICHUAN_KEYS),\\n    ('yuan', YUAN_KEYS),\\n    ('codefuse', CODEFUSE_KEYS),\\n    ('phi2', PHI2_KEYS),\\n    ('qwen', QWEN_KEYS),\\n    ('phi3-small', PHI3_SMALL_KEYS),\\n    ('phi3', PHI3_KEYS),\\n    ('minicpm', LLAMA_KEYS),\\n])\\n\\n\\ndef get_regex_for_mm_default_lora(model_type: str):\\n    if not model_type:\\n        return None\\n    if model_type not in MODEL_KEYS_MAPPING:\\n        return None\\n\\n    mapping: Union[MultiModelKeys, ModelKeys] = MODEL_KEYS_MAPPING[model_type]\\n    if not isinstance(mapping, MultiModelKeys):\\n        return None\\n    llm = mapping.language_model\\n    connector = mapping.connector\\n    assert isinstance(llm, (list, tuple)) and isinstance(connector,\\n                                                         (list, tuple)), f'llm: {llm}, connector: {connector}'\\n    _regex = []\\n    for module in llm + connector:\\n        _regex.append(f'{module}')\\n    regex = '|'.join(_regex)\\n    regex = f'^({regex})(?!.*(lm_head|output|emb|wte|shared)).*'\\n    return regex\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom typing import Dict, Literal\\n\\nimport numpy as np\\nimport torch\\nfrom transformers.trainer_utils import EvalPrediction\\n\\nfrom .logger import get_logger\\n\\nlogger = get_logger()\\n\\n\\ndef compute_nlg_metrics(prediction, tokenizer):\\n    import jieba\\n    from nltk.translate.bleu_score import SmoothingFunction, sentence_bleu\\n    from rouge.rouge import Rouge\\n    preds, labels = prediction[0], prediction[1]\\n\\n    score_dict = {'rouge-1': [], 'rouge-2': [], 'rouge-l': [], 'bleu-4': []}\\n\\n    def _decode(tokens, ignore_pad_token_for_loss=False):\\n        if ignore_pad_token_for_loss:\\n            tokens = np.where(tokens != -100, tokens, tokenizer.pad_token_id)\\n        tokens = np.where(tokens < tokenizer.vocab_size, tokens, tokenizer.pad_token_id)\\n        return [t for t in tokenizer.batch_decode(tokens, skip_special_tokens=True)]\\n\\n    for pred, label in zip(preds, labels):\\n        pred = ''.join(_decode(pred, False))\\n        label = ''.join(_decode(label, True))\\n        hypothesis = list(jieba.cut(pred))\\n        if len(hypothesis) == 0 or ''.join(hypothesis) == '.':\\n            hypothesis = [tokenizer.decode(tokenizer.eos_token_id)]\\n        reference = list(jieba.cut(label))\\n        try:\\n            rouge = Rouge()\\n            scores = rouge.get_scores(' '.join(hypothesis), ' '.join(reference))\\n            result = scores[0]\\n\\n            for k, v in result.items():\\n                score_dict[k].append(round(v['f'] * 100, 4))\\n            bleu_score = sentence_bleu([list(label)], list(pred), smoothing_function=SmoothingFunction().method3)\\n            score_dict['bleu-4'].append(round(bleu_score * 100, 4))\\n        except Exception as e:\\n            logger.error(e)\\n            logger.error(f'eval error {hypothesis}, {reference}')\\n\\n    for k, v in score_dict.items():\\n        score_dict[k] = float(np.mean(v))\\n    return score_dict\\n\\n\\ndef compute_acc_metrics(eval_prediction: EvalPrediction,\\n                        acc_strategy: Literal['token', 'sentence'] = 'token',\\n                        is_encoder_decoder: bool = False) -> Dict[str, torch.Tensor]:\\n    if is_encoder_decoder:\\n        labels = eval_prediction.label_ids[..., :]\\n        predictions = eval_prediction.predictions[..., :]\\n    else:\\n        labels = eval_prediction.label_ids[..., 1:]\\n        predictions = eval_prediction.predictions[..., :-1]\\n    if predictions.shape != labels.shape:\\n        return {}\\n    masks = labels != -100\\n    if acc_strategy == 'sentence':\\n        acc_list = []\\n        for i, m in enumerate(masks):\\n            acc_list.append(np.all(predictions[i, m] == labels[i, m]))\\n        acc = np.mean(np.array(acc_list))\\n    else:\\n        acc = np.mean((predictions[masks] == labels[masks]).astype(np.float64))\\n    return {'acc': acc}\\n\\n\\ndef preprocess_logits_for_metrics(logits: torch.Tensor, labels: torch.Tensor) -> torch.Tensor:\\n    if isinstance(logits, (list, tuple)):\\n        logits = logits[0]\\n    preds = logits.argmax(dim=-1)\\n    return preds\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport datetime as dt\\nimport os\\nimport random\\nimport re\\nimport subprocess\\nimport sys\\nimport time\\nfrom contextlib import contextmanager\\nfrom typing import Any, Callable, Dict, List, Mapping, Optional, Sequence, Tuple, Type, TypeVar\\n\\nimport numpy as np\\nimport torch.distributed as dist\\nfrom transformers import HfArgumentParser, enable_full_determinism, set_seed\\nfrom transformers.trainer import TrainingArguments\\n\\nfrom .logger import get_logger\\nfrom .np_utils import stat_array\\nfrom .torch_utils import broadcast_string, is_dist, is_dist_ta, is_local_master\\n\\nlogger = get_logger()\\n\\n\\n@contextmanager\\ndef safe_ddp_context():\\n    if (is_dist() or is_dist_ta()) and not is_local_master() and dist.is_initialized():\\n        dist.barrier()\\n    yield\\n    if (is_dist() or is_dist_ta()) and is_local_master() and dist.is_initialized():\\n        dist.barrier()\\n    if (is_dist() or is_dist_ta()) and dist.is_initialized():  # sync\\n        dist.barrier()\\n\\n\\ndef check_json_format(obj: Any) -> Any:\\n    if obj is None or isinstance(obj, (int, float, str, complex)):  # bool is a subclass of int\\n        return obj\\n\\n    if isinstance(obj, Sequence):\\n        res = []\\n        for x in obj:\\n            res.append(check_json_format(x))\\n    elif isinstance(obj, Mapping):\\n        res = {}\\n        for k, v in obj.items():\\n            if 'hub_token' in k:\\n                res[k] = None\\n            else:\\n                if isinstance(v, TrainingArguments):\\n                    for _k in v.__dict__.keys():\\n                        if 'hub_token' in _k:\\n                            setattr(v, _k, None)\\n                res[k] = check_json_format(v)\\n    else:\\n        res = repr(obj)  # e.g. function\\n    return res\\n\\n\\ndef _get_version(work_dir: str) -> int:\\n    if os.path.isdir(work_dir):\\n        fnames = os.listdir(work_dir)\\n    else:\\n        fnames = []\\n    v_list = [-1]\\n    for fname in fnames:\\n        m = re.match(r'v(\\\\d+)', fname)\\n        if m is None:\\n            continue\\n        v = m.group(1)\\n        v_list.append(int(v))\\n    return max(v_list) + 1\\n\\n\\ndef format_time(seconds):\\n    days = int(seconds // (24 * 3600))\\n    hours = int((seconds % (24 * 3600)) // 3600)\\n    minutes = int((seconds % 3600) // 60)\\n    seconds = int(seconds % 60)\\n\\n    if days > 0:\\n        time_str = f'{days}d {hours}h {minutes}m {seconds}s'\\n    elif hours > 0:\\n        time_str = f'{hours}h {minutes}m {seconds}s'\\n    elif minutes > 0:\\n        time_str = f'{minutes}m {seconds}s'\\n    else:\\n        time_str = f'{seconds}s'\\n\\n    return time_str\\n\\n\\ndef seed_everything(seed: Optional[int] = None, full_determinism: bool = False, *, verbose: bool = True) -> int:\\n\\n    if seed is None:\\n        seed_max = np.iinfo(np.int32).max\\n        seed = random.randint(0, seed_max)\\n\\n    if full_determinism:\\n        enable_full_determinism(seed)\\n    else:\\n        set_seed(seed)\\n    if verbose:\\n        logger.info(f'Global seed set to {seed}')\\n    return seed\\n\\n\\ndef add_version_to_work_dir(work_dir: str) -> str:\\n    \\\"\\\"\\\"add version\\\"\\\"\\\"\\n    version = _get_version(work_dir)\\n    time = dt.datetime.now().strftime('%Y%m%d-%H%M%S')\\n    sub_folder = f'v{version}-{time}'\\n    if (dist.is_initialized() and is_dist()) or is_dist_ta():\\n        sub_folder = broadcast_string(sub_folder)\\n\\n    work_dir = os.path.join(work_dir, sub_folder)\\n    return work_dir\\n\\n\\n_T = TypeVar('_T')\\n\\n\\ndef parse_args(class_type: Type[_T], argv: Optional[List[str]] = None) -> Tuple[_T, List[str]]:\\n    parser = HfArgumentParser([class_type])\\n    if argv is None:\\n        argv = sys.argv[1:]\\n    if len(argv) > 0 and argv[0].endswith('.json'):\\n        json_path = os.path.abspath(os.path.expanduser(argv[0]))\\n        args, = parser.parse_json_file(json_path)\\n        remaining_args = argv[1:]\\n    else:\\n        args, remaining_args = parser.parse_args_into_dataclasses(argv, return_remaining_strings=True)\\n    return args, remaining_args\\n\\n\\ndef lower_bound(lo: int, hi: int, cond: Callable[[int], bool]) -> int:\\n    # The lower bound satisfying the condition \\\"cond\\\".\\n    while lo < hi:\\n        mid = (lo + hi) >> 1\\n        if cond(mid):\\n            hi = mid\\n        else:\\n            lo = mid + 1\\n    return lo\\n\\n\\ndef upper_bound(lo: int, hi: int, cond: Callable[[int], bool]) -> int:\\n    # The upper bound satisfying the condition \\\"cond\\\".\\n    while lo < hi:\\n        mid = (lo + hi + 1) >> 1  # lo + (hi-lo+1)>>1\\n        if cond(mid):\\n            lo = mid\\n        else:\\n            hi = mid - 1\\n    return lo\\n\\n\\ndef test_time(func: Callable[[], _T],\\n              number: int = 1,\\n              warmup: int = 0,\\n              timer: Optional[Callable[[], float]] = None) -> _T:\\n    # timer: e.g. time_synchronize\\n    timer = timer if timer is not None else time.perf_counter\\n\\n    ts = []\\n    res = None\\n    # warmup\\n    for _ in range(warmup):\\n        res = func()\\n\\n    for _ in range(number):\\n        t1 = timer()\\n        res = func()\\n        t2 = timer()\\n        ts.append(t2 - t1)\\n\\n    ts = np.array(ts)\\n    _, stat_str = stat_array(ts)\\n    # print\\n    logger.info(f'time[number={number}]: {stat_str}')\\n    return res\\n\\n\\ndef read_multi_line(addi_prompt: str = '') -> str:\\n    res = []\\n    prompt = f'<<<{addi_prompt} '\\n    while True:\\n        text = input(prompt) + '\\\\n'\\n        prompt = ''\\n        res.append(text)\\n        if text.endswith('#\\\\n'):\\n            res[-1] = text[:-2]\\n            break\\n    return ''.join(res)\\n\\n\\ndef is_pai_training_job() -> bool:\\n    return 'PAI_TRAINING_JOB_ID' in os.environ\\n\\n\\ndef get_pai_tensorboard_dir() -> Optional[str]:\\n    return os.environ.get('PAI_OUTPUT_TENSORBOARD')\\n\\n\\ndef subprocess_run(command: List[str], env: Optional[Dict[str, str]] = None, stdout=None, stderr=None):\\n    # stdoutm stderr: e.g. subprocess.PIPE.\\n    resp = subprocess.run(command, env=env, stdout=stdout, stderr=stderr)\\n    resp.check_returncode()\\n    return resp\\n\\n\\ndef split_str_parts_by(text: str, delimiters: List[str]):\\n    \\\"\\\"\\\"Split the text field into parts.\\n\\n    Args:\\n        text: A text to be split.\\n        delimiters: The delimiters.\\n\\n    Returns:\\n        The split text in list of dicts.\\n    \\\"\\\"\\\"\\n    assert isinstance(text, str), f'text: {text}'\\n    all_start_chars = [d[0] for d in delimiters]\\n    all_length = [len(d) for d in delimiters]\\n\\n    text_list = []\\n    last_words = ''\\n\\n    while len(text) > 0:\\n        for char_idx, char in enumerate(text):\\n            match_index = [idx for idx, start_char in enumerate(all_start_chars) if start_char == char]\\n            is_delimiter = False\\n            for index in match_index:\\n                if text[char_idx:char_idx + all_length[index]] == delimiters[index]:\\n                    if text_list:\\n                        text_list[-1]['content'] = last_words\\n                    elif last_words:\\n                        text_list.append({'key': '', 'content': last_words})\\n                    last_words = ''\\n                    text_list.append({'key': delimiters[index]})\\n                    text = text[char_idx + all_length[index]:]\\n                    is_delimiter = True\\n                    break\\n            if not is_delimiter:\\n                last_words += char\\n            else:\\n                break\\n        if last_words == text:\\n            text = ''\\n\\n    if len(text_list):\\n        text_list[-1]['content'] = last_words\\n    else:\\n        text_list.append({'key': '', 'content': last_words})\\n    return text_list\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Any, Dict, List, Optional, Tuple, Union\\n\\nimport numpy as np\\nfrom numpy import ndarray\\nfrom numpy.random import RandomState\\nfrom pandas import DataFrame\\n\\n\\ndef transform_jsonl_to_df(dict_list: List[Dict[str, Any]]) -> DataFrame:\\n    \\\"\\\"\\\"Relevant function: `io_utils.read_from_jsonl()`\\\"\\\"\\\"\\n    data_dict: Dict[str, List[Any]] = {}\\n    for i, obj in enumerate(dict_list):\\n        for k, v in obj.items():\\n            if k not in data_dict:\\n                data_dict[k] = [None] * i\\n            data_dict[k].append(v)\\n        for k in set(data_dict.keys()) - set(obj.keys()):\\n            data_dict[k].append(None)\\n    return DataFrame.from_dict(data_dict)\\n\\n\\ndef get_seed(random_state: Optional[RandomState] = None) -> int:\\n    if random_state is None:\\n        random_state = RandomState()\\n    seed_max = np.iinfo(np.int32).max\\n    seed = random_state.randint(0, seed_max)\\n    return seed\\n\\n\\ndef stat_array(array: Union[ndarray, List[int], 'torch.Tensor']) -> Tuple[Dict[str, float], str]:\\n    if isinstance(array, list):\\n        array = np.array(array)\\n    mean = array.mean().item()\\n    std = array.std().item()\\n    min_ = array.min().item()\\n    max_ = array.max().item()\\n    size = array.shape[0]\\n    string = f'{mean:.6f}±{std:.6f}, min={min_:.6f}, max={max_:.6f}, size={size}'\\n    return {'mean': mean, 'std': std, 'min': min_, 'max': max_, 'size': size}, string\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport importlib.util\\nimport logging\\nimport os\\nfrom typing import Optional\\n\\nfrom modelscope.utils.logger import get_logger as get_ms_logger\\n\\n\\n# Avoid circular reference\\ndef _is_local_master():\\n    local_rank = int(os.getenv('LOCAL_RANK', -1))\\n    return local_rank in {-1, 0}\\n\\n\\ninit_loggers = {}\\n\\n# old format\\n# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\\nlogger_format = logging.Formatter('[%(levelname)s:%(name)s] %(message)s')\\n\\n\\ndef get_logger(log_file: Optional[str] = None, log_level: Optional[int] = None, file_mode: str = 'w'):\\n    \\\"\\\"\\\" Get logging logger\\n\\n    Args:\\n        log_file: Log filename, if specified, file handler will be added to\\n            logger\\n        log_level: Logging level.\\n        file_mode: Specifies the mode to open the file, if filename is\\n            specified (if filemode is unspecified, it defaults to 'w').\\n    \\\"\\\"\\\"\\n    if log_level is None:\\n        log_level = os.getenv('LOG_LEVEL', 'INFO').upper()\\n        log_level = getattr(logging, log_level, logging.INFO)\\n    logger_name = __name__.split('.')[0]\\n    logger = logging.getLogger(logger_name)\\n    logger.propagate = False\\n    if logger_name in init_loggers:\\n        add_file_handler_if_needed(logger, log_file, file_mode, log_level)\\n        return logger\\n\\n    # handle duplicate logs to the console\\n    # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler <stderr> (NOTSET)\\n    # to the root logger. As logger.propagate is True by default, this root\\n    # level handler causes logging messages from rank>0 processes to\\n    # unexpectedly show up on the console, creating much unwanted clutter.\\n    # To fix this issue, we set the root logger's StreamHandler, if any, to log\\n    # at the ERROR level.\\n    for handler in logger.root.handlers:\\n        if type(handler) is logging.StreamHandler:\\n            handler.setLevel(logging.ERROR)\\n\\n    stream_handler = logging.StreamHandler()\\n    handlers = [stream_handler]\\n\\n    is_worker0 = _is_local_master()\\n\\n    if is_worker0 and log_file is not None:\\n        file_handler = logging.FileHandler(log_file, file_mode)\\n        handlers.append(file_handler)\\n\\n    for handler in handlers:\\n        handler.setFormatter(logger_format)\\n        handler.setLevel(log_level)\\n        logger.addHandler(handler)\\n\\n    if is_worker0:\\n        logger.setLevel(log_level)\\n    else:\\n        logger.setLevel(logging.ERROR)\\n\\n    init_loggers[logger_name] = True\\n\\n    return logger\\n\\n\\nlogger = get_logger()\\nms_logger = get_ms_logger()\\n\\nlogger.handlers[0].setFormatter(logger_format)\\nms_logger.handlers[0].setFormatter(logger_format)\\nlog_level = os.getenv('LOG_LEVEL', 'INFO').upper()\\nif _is_local_master():\\n    ms_logger.setLevel(log_level)\\nelse:\\n    ms_logger.setLevel(logging.ERROR)\\n\\n\\ndef add_file_handler_if_needed(logger, log_file, file_mode, log_level):\\n    for handler in logger.handlers:\\n        if isinstance(handler, logging.FileHandler):\\n            return\\n\\n    if importlib.util.find_spec('torch') is not None:\\n        is_worker0 = int(os.getenv('LOCAL_RANK', -1)) in {-1, 0}\\n    else:\\n        is_worker0 = True\\n\\n    if is_worker0 and log_file is not None:\\n        file_handler = logging.FileHandler(log_file, file_mode)\\n        file_handler.setFormatter(logger_format)\\n        file_handler.setLevel(log_level)\\n        logger.addHandler(file_handler)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Copyright 2023-present the HuggingFace Inc. team.\\n\\nimport importlib.util\\nimport os\\nfrom itertools import chain\\nfrom types import ModuleType\\nfrom typing import Any\\n\\nfrom .logger import get_logger\\n\\nlogger = get_logger()  # pylint: disable=invalid-name\\n\\n\\nclass _LazyModule(ModuleType):\\n    \\\"\\\"\\\"\\n    Module class that surfaces all objects but only performs associated imports when the objects are requested.\\n    \\\"\\\"\\\"\\n\\n    # Very heavily inspired by optuna.integration._IntegrationModule\\n    # https://github.com/optuna/optuna/blob/master/optuna/integration/__init__.py\\n    def __init__(self, name, module_file, import_structure, module_spec=None, extra_objects=None):\\n        super().__init__(name)\\n        self._modules = set(import_structure.keys())\\n        self._class_to_module = {}\\n        for key, values in import_structure.items():\\n            for value in values:\\n                self._class_to_module[value] = key\\n        # Needed for autocompletion in an IDE\\n        self.__all__ = list(import_structure.keys()) + list(chain(*import_structure.values()))\\n        self.__file__ = module_file\\n        self.__spec__ = module_spec\\n        self.__path__ = [os.path.dirname(module_file)]\\n        self._objects = {} if extra_objects is None else extra_objects\\n        self._name = name\\n        self._import_structure = import_structure\\n\\n    # Needed for autocompletion in an IDE\\n    def __dir__(self):\\n        result = super().__dir__()\\n        # The elements of self.__all__ that are submodules may or may not be in the dir already, depending on whether\\n        # they have been accessed or not. So we only add the elements of self.__all__ that are not already in the dir.\\n        for attr in self.__all__:\\n            if attr not in result:\\n                result.append(attr)\\n        return result\\n\\n    def __getattr__(self, name: str) -> Any:\\n        if name in self._objects:\\n            return self._objects[name]\\n        if name in self._modules:\\n            value = self._get_module(name)\\n        elif name in self._class_to_module.keys():\\n            module = self._get_module(self._class_to_module[name])\\n            value = getattr(module, name)\\n        else:\\n            raise AttributeError(f'module {self.__name__} has no attribute {name}')\\n\\n        setattr(self, name, value)\\n        return value\\n\\n    def _get_module(self, module_name: str):\\n        try:\\n            return importlib.import_module('.' + module_name, self.__name__)\\n        except Exception as e:\\n            raise RuntimeError(\\n                f'Failed to import {self.__name__}.{module_name} because of the following error (look up to see its'\\n                f' traceback):\\\\n{e}') from e\\n\\n    def __reduce__(self):\\n        return self.__class__, (self._name, self.__file__, self._import_structure)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Any, List\\n\\nimport json\\n\\nfrom .logger import get_logger\\nfrom .utils import check_json_format\\n\\nlogger = get_logger()\\n\\n\\ndef read_from_jsonl(fpath: str, encoding: str = 'utf-8') -> List[Any]:\\n    res: List[Any] = []\\n    with open(fpath, 'r', encoding=encoding) as f:\\n        for line in f:\\n            res.append(json.loads(line))\\n    return res\\n\\n\\ndef write_to_jsonl(fpath: str, obj_list: List[Any], encoding: str = 'utf-8') -> None:\\n    res: List[str] = []\\n    for obj in obj_list:\\n        res.append(json.dumps(obj, ensure_ascii=False))\\n    with open(fpath, 'w', encoding=encoding) as f:\\n        text = '\\\\n'.join(res)\\n        f.write(f'{text}\\\\n')\\n\\n\\ndef append_to_jsonl(fpath: str, obj: Any, encoding: str = 'utf-8') -> None:\\n    obj = check_json_format(obj)\\n    try:\\n        with open(fpath, 'a', encoding=encoding) as f:\\n            f.write(f'{json.dumps(obj, ensure_ascii=False)}\\\\n')\\n    except Exception as e:\\n        logger.error(f'Cannot write content to jsonl file:{obj}')\\n        logger.error(e)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nBIN_EXTENSIONS = [\\n    '.*.bin',\\n    '.*.ts',\\n    '.*.pt',\\n    '.*.data-00000-of-00001',\\n    '.*.onnx',\\n    '.*.meta',\\n    '.*.pb',\\n    '.*.index',\\n]\\n\\nPEFT_TYPE_KEY = 'peft_type'\\nSWIFT_TYPE_KEY = 'swift_type'\\nDEFAULT_ADAPTER = 'default'\\n\\n\\nclass Invoke(object):\\n    KEY = 'invoked_by'\\n    THIRD_PARTY = 'third_party'\\n    PRETRAINED = 'from_pretrained'\\n    PIPELINE = 'pipeline'\\n    TRAINER = 'trainer'\\n    LOCAL_TRAINER = 'local_trainer'\\n    PREPROCESSOR = 'preprocessor'\\n    SWIFT = 'swift'\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport os\\nfrom typing import Dict, List, Tuple\\n\\nimport matplotlib.pyplot as plt\\nfrom tensorboard.backend.event_processing.event_accumulator import EventAccumulator\\n\\nItem = Dict[str, float]\\nTB_COLOR, TB_COLOR_SMOOTH = '#FFE2D9', '#FF7043'\\n\\n\\ndef read_tensorboard_file(fpath: str) -> Dict[str, List[Item]]:\\n    if not os.path.isfile(fpath):\\n        raise FileNotFoundError(f'fpath: {fpath}')\\n    ea = EventAccumulator(fpath)\\n    ea.Reload()\\n    res: Dict[str, List[Item]] = {}\\n    tags = ea.Tags()['scalars']\\n    for tag in tags:\\n        values = ea.Scalars(tag)\\n        r: List[Item] = []\\n        for v in values:\\n            r.append({'step': v.step, 'value': v.value})\\n        res[tag] = r\\n    return res\\n\\n\\ndef tensorboard_smoothing(values: List[float], smooth: float = 0.9) -> List[float]:\\n    norm_factor = 0\\n    x = 0\\n    res: List[float] = []\\n    for i in range(len(values)):\\n        x = x * smooth + values[i]  # Exponential decay\\n        norm_factor *= smooth\\n        norm_factor += 1\\n        res.append(x / norm_factor)\\n    return res\\n\\n\\ndef plot_images(images_dir: str,\\n                tb_dir: str,\\n                smooth_key: List[str],\\n                smooth_val: float = 0.9,\\n                figsize: Tuple[int, int] = (8, 5),\\n                dpi: int = 100) -> None:\\n    \\\"\\\"\\\"Using tensorboard's data content to plot images\\\"\\\"\\\"\\n    os.makedirs(images_dir, exist_ok=True)\\n    fname = [fname for fname in os.listdir(tb_dir) if os.path.isfile(os.path.join(tb_dir, fname))][0]\\n    tb_path = os.path.join(tb_dir, fname)\\n    data = read_tensorboard_file(tb_path)\\n\\n    for k in data.keys():\\n        _data = data[k]\\n        steps = [d['step'] for d in _data]\\n        values = [d['value'] for d in _data]\\n        if len(values) == 0:\\n            continue\\n        _, ax = plt.subplots(1, 1, squeeze=True, figsize=figsize, dpi=dpi)\\n        ax.set_title(k)\\n        if len(values) == 1:\\n            ax.scatter(steps, values, color=TB_COLOR_SMOOTH)\\n        elif k in smooth_key:\\n            ax.plot(steps, values, color=TB_COLOR)\\n            values_s = tensorboard_smoothing(values, smooth_val)\\n            ax.plot(steps, values_s, color=TB_COLOR_SMOOTH)\\n        else:\\n            ax.plot(steps, values, color=TB_COLOR_SMOOTH)\\n        fpath = os.path.join(images_dir, k.replace('/', '_'))\\n        plt.savefig(fpath, dpi=dpi, bbox_inches='tight')\\n        plt.close()\\n\\n\\nimport os\\nimport shutil\\nimport subprocess\\nimport tempfile\\nimport time\\nfrom typing import Optional\\n\\nfrom requests.exceptions import HTTPError\\n\\nfrom swift.hub import HubApi, ModelScopeConfig\\nfrom swift.hub.constants import ModelVisibility\\nfrom .logger import get_logger\\nfrom .utils import subprocess_run\\n\\nlogger = get_logger()\\n\\n\\ndef create_ms_repo(hub_model_id: str, hub_token: Optional[str] = None, hub_private_repo: bool = False) -> str:\\n    assert hub_model_id is not None, 'Please enter a valid hub_model_id'\\n\\n    api = HubApi()\\n    if hub_token is None:\\n        hub_token = os.environ.get('MODELSCOPE_API_TOKEN')\\n    if hub_token is not None:\\n        api.login(hub_token)\\n    visibility = ModelVisibility.PRIVATE if hub_private_repo else ModelVisibility.PUBLIC\\n\\n    if '/' not in hub_model_id:\\n        user_name = ModelScopeConfig.get_user_info()[0]\\n        assert isinstance(user_name, str)\\n        hub_model_id = f'{user_name}/{hub_model_id}'\\n        logger.info(f\\\"'/' not in hub_model_id, setting hub_model_id: {hub_model_id}\\\")\\n    try:\\n        api.create_model(hub_model_id, visibility)\\n    except HTTPError:\\n        # The remote repository has been created\\n        pass\\n    return hub_model_id\\n\\n\\ndef push_to_ms_hub(ckpt_dir: str,\\n                   hub_model_id: str,\\n                   hub_token: Optional[str] = None,\\n                   hub_private_repo: bool = False,\\n                   commit_message: str = 'update files'):\\n    logger.info(f'Starting push to hub. ckpt_dir: {ckpt_dir}.')\\n    tmp_file_name = tempfile.TemporaryDirectory().name\\n    subprocess_run(['git', 'lfs', 'env'], stdout=subprocess.PIPE)  # check git-lfs install\\n\\n    hub_model_id = create_ms_repo(hub_model_id, hub_token, hub_private_repo)\\n    git_token = ModelScopeConfig.get_token()\\n    ms_url = f'https://oauth2:{git_token}@www.modelscope.cn/{hub_model_id}.git'\\n    subprocess_run(['git', '-C', ckpt_dir, 'clone', ms_url, tmp_file_name], env={'GIT_LFS_SKIP_SMUDGE': '1'})\\n    tmp_dir = os.path.join(ckpt_dir, tmp_file_name)\\n    subprocess_run(['git', '-C', tmp_dir, 'lfs', 'pull'])\\n    logger.info('Git clone the repo successfully.')\\n    # mv .git\\n    dst_git_path = os.path.join(ckpt_dir, '.git')\\n    if os.path.exists(dst_git_path):\\n        shutil.rmtree(dst_git_path)\\n    shutil.copytree(os.path.join(tmp_dir, '.git'), dst_git_path)\\n    shutil.copy(os.path.join(tmp_dir, '.gitattributes'), os.path.join(ckpt_dir, '.gitattributes'))\\n    shutil.rmtree(tmp_dir)\\n    # add commit push\\n    subprocess_run(['git', '-C', ckpt_dir, 'lfs', 'install'])\\n    time.sleep(0.5)\\n    logger.info('Start `git add .`')\\n    subprocess_run(['git', '-C', ckpt_dir, 'add', '.'])\\n    if is_repo_clean(ckpt_dir):\\n        logger.info('Repo currently clean. Ignoring commit and push_to_hub')\\n    else:\\n        subprocess_run(['git', '-C', ckpt_dir, 'commit', '-m', commit_message])\\n        subprocess_run(['git', '-C', ckpt_dir, 'push'])\\n        url = f'https://www.modelscope.cn/models/{hub_model_id}'\\n        logger.info(f'Push to Modelscope successful. url: `{url}`.')\\n\\n\\ndef is_repo_clean(ckpt_dir: str) -> bool:\\n    resp = subprocess_run(['git', '-C', ckpt_dir, 'status', '--porcelain'], stdout=subprocess.PIPE)\\n    return len(resp.stdout.strip()) == 0\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom .hub import create_ms_repo, push_to_ms_hub\\nfrom .io_utils import append_to_jsonl, read_from_jsonl, write_to_jsonl\\nfrom .logger import get_logger\\nfrom .metric import compute_acc_metrics, compute_nlg_metrics, preprocess_logits_for_metrics\\nfrom .np_utils import get_seed, stat_array, transform_jsonl_to_df\\nfrom .run_utils import get_main\\nfrom .tb_utils import TB_COLOR, TB_COLOR_SMOOTH, plot_images, read_tensorboard_file, tensorboard_smoothing\\nfrom .torch_utils import (activate_model_parameters, broadcast_string, freeze_model_parameters, get_dist_setting,\\n                          get_model_info, is_ddp_plus_mp, is_dist, is_dist_ta, is_local_master, is_master, is_mp,\\n                          is_on_same_device, show_layers, time_synchronize, torchacc_trim_graph, use_torchacc)\\nfrom .utils import (add_version_to_work_dir, check_json_format, get_pai_tensorboard_dir, is_pai_training_job,\\n                    lower_bound, parse_args, read_multi_line, safe_ddp_context, seed_everything, subprocess_run,\\n                    test_time, upper_bound)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport os\\nimport socket\\nimport time\\nimport uuid\\nfrom bisect import bisect_right\\nfrom contextlib import nullcontext\\nfrom typing import List, Optional, Tuple\\n\\nimport numpy as np\\nimport torch\\nimport torch.distributed as dist\\nfrom torch.nn import Module\\nfrom transformers.integrations import is_deepspeed_zero3_enabled\\nfrom transformers.utils import is_torch_npu_available, strtobool\\n\\nfrom .logger import get_logger\\n\\nlogger = get_logger()\\n\\n\\ndef is_on_same_device(model: torch.nn.Module) -> bool:\\n    device_set = set(map(lambda p: p.device, model.parameters()))\\n    return len(device_set) == 1\\n\\n\\ndef _find_free_port() -> str:\\n    # Copied from https://github.com/facebookresearch/detectron2/blob/main/detectron2/engine/launch.py # noqa: E501\\n    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\\n    # Binding to port 0 will cause the OS to find an available port for us\\n    sock.bind(('', 0))\\n    port = sock.getsockname()[1]\\n    sock.close()\\n    # NOTE: there is still a chance the port could be taken by other processes.\\n    return port\\n\\n\\ndef _find_local_mac() -> str:\\n    mac = uuid.getnode()\\n    mac_address = ':'.join(('%012x' % mac)[i:i + 2] for i in range(0, 12, 2))\\n    return mac_address\\n\\n\\ndef get_n_params_grads(model) -> Tuple[List[int], List[int]]:\\n    n_params, n_grads = [], []\\n    for p in model.parameters():\\n        if is_deepspeed_zero3_enabled():\\n            import deepspeed\\n            context = deepspeed.zero.GatheredParameters(p)\\n        else:\\n            context = nullcontext()\\n        with context:\\n            n_params.append(p.numel())\\n            n_grads.append(p.numel() if p.requires_grad else 0)\\n    return n_params, n_grads\\n\\n\\ndef get_model_info(model: Module, name: Optional[str] = None) -> str:\\n    n_params, n_grads = get_n_params_grads(model)\\n    n_params = sum(n_params)\\n    n_grads = sum(n_grads)\\n    n_buffers = sum(p.numel() for p in model.buffers())\\n\\n    if name is None:\\n        name = model.__class__.__name__\\n\\n    n_params /= 1e6\\n    n_grads /= 1e6\\n    n_buffers /= 1e6\\n    s = (f'{name}: '\\n         f'{n_params:.4f}M Params ({n_grads:.4f}M Trainable '\\n         f'[{100 * n_grads / n_params:.4f}%]), '\\n         f'{n_buffers:.4f}M Buffers.')\\n    return s\\n\\n\\ndef find_sub_module(module: torch.nn.Module, module_name: str) -> List[torch.nn.Module]:\\n    _modules = list()\\n    for name, sub_module in module.named_modules():\\n        if not name:\\n            continue\\n        if name.endswith(module_name):\\n            _modules.append(sub_module)\\n    return _modules\\n\\n\\ndef get_dist_setting() -> Tuple[int, int, int, int]:\\n    \\\"\\\"\\\"return rank, local_rank, world_size, local_world_size\\\"\\\"\\\"\\n    rank = int(os.getenv('RANK', -1))\\n    local_rank = int(os.getenv('LOCAL_RANK', -1))\\n    world_size = int(os.getenv('WORLD_SIZE', 1))\\n    local_world_size = int(os.getenv('LOCAL_WORLD_SIZE', 1))\\n    return rank, local_rank, world_size, local_world_size\\n\\n\\ndef is_local_master():\\n    local_rank = get_dist_setting()[1]\\n    return local_rank in {-1, 0}\\n\\n\\ndef is_master():\\n    rank = get_dist_setting()[0]\\n    return rank in {-1, 0}\\n\\n\\ndef use_torchacc() -> bool:\\n    return strtobool(os.getenv('USE_TORCHACC', '0'))\\n\\n\\ndef torchacc_trim_graph():\\n    return strtobool(os.getenv('TORCHACC_TRIM_GRAPH', '0'))\\n\\n\\ndef is_dist():\\n    \\\"\\\"\\\"Determine if the training is distributed\\\"\\\"\\\"\\n    if use_torchacc():\\n        return False\\n    rank, local_rank, _, _ = get_dist_setting()\\n    return rank >= 0 and local_rank >= 0\\n\\n\\ndef is_mp() -> bool:\\n    if use_torchacc():\\n        return False\\n    n_gpu = torch.cuda.device_count()\\n    local_world_size = get_dist_setting()[3]\\n    assert n_gpu % local_world_size == 0, f'n_gpu: {n_gpu}, local_world_size: {local_world_size}'\\n    if n_gpu // local_world_size >= 2:\\n        return True\\n    return False\\n\\n\\ndef is_ddp_plus_mp() -> bool:\\n    if not is_dist():\\n        return False\\n    if not is_mp():\\n        return False\\n    logger.info('Using DDP + MP(device_map)')\\n    return True\\n\\n\\ndef is_dist_ta() -> bool:\\n    \\\"\\\"\\\"Determine if the TorchAcc training is distributed\\\"\\\"\\\"\\n    _, _, world_size, _ = get_dist_setting()\\n    if use_torchacc() and world_size > 1:\\n        if not dist.is_initialized():\\n            import torchacc as ta\\n            # Initialize in advance\\n            dist.init_process_group(backend=ta.dist.BACKEND_NAME)\\n        return True\\n    else:\\n        return False\\n\\n\\ndef show_layers(model: Module, max_lines: Optional[int] = 20) -> None:\\n    named_p = list(model.named_parameters())\\n    for i, (n, p) in enumerate(named_p):\\n        if max_lines is not None and i >= max_lines:\\n            logger.info('...')\\n            break\\n        logger.info(f'[{n}]: requires_grad={p.requires_grad}, dtype={p.dtype}, device={p.device}')\\n\\n\\ndef freeze_model_parameters(model: Module, freeze_parameters_ratio: float, freeze_parameters: List[str]) -> None:\\n    if freeze_parameters_ratio > 0:\\n        n_parameters = get_n_params_grads(model)[0]\\n        n_parameters = np.array(n_parameters, dtype=np.int64)\\n        n_freeze_parameters = int(np.sum(n_parameters) * freeze_parameters_ratio)\\n        n_parameters_cs = np.cumsum(n_parameters)\\n        idx = bisect_right(n_parameters_cs, n_freeze_parameters)\\n        for _, p in zip(range(idx), model.parameters()):\\n            p.requires_grad = False\\n\\n    if len(freeze_parameters) > 0:\\n        for n, p in model.named_parameters():\\n            for freeze_p in freeze_parameters:\\n                if n.startswith(freeze_p):\\n                    p.requires_grad = False\\n\\n\\ndef activate_model_parameters(model: Module, additional_trainable_parameters: List[str]) -> None:\\n    if len(additional_trainable_parameters) == 0:\\n        return\\n    has_activate = False\\n    for n, p in model.named_parameters():\\n        for additional_tp in additional_trainable_parameters:\\n            if n.startswith(additional_tp):\\n                p.requires_grad = True\\n                has_activate = True\\n    if not has_activate:\\n        logger.warning('len(additional_trainable_parameters) > 0 but no parameters are activated. '\\n                       f'additional_trainable_parameters: {additional_trainable_parameters}')\\n\\n\\ndef broadcast_string(string: Optional[str], buffer_size: int = 1024) -> str:\\n    \\\"\\\"\\\"String broadcasting in case of DDP\\n    string: main rank: str\\n        other rank: None or str(not use)\\n    return: all rank: str\\n    \\\"\\\"\\\"\\n    assert dist.is_initialized()\\n    rank, local_rank, _, _ = get_dist_setting()\\n    device = f'npu:{local_rank}' if is_torch_npu_available() else f'cuda:{local_rank}'\\n    assert rank >= 0\\n    if rank == 0:\\n        assert string is not None\\n        tensor = torch.tensor(\\n            [ord(c) for c in string] + [0] * (buffer_size - len(string)), dtype=torch.int64, device=device)\\n    else:\\n        tensor = torch.zeros(buffer_size, dtype=torch.int64, device=device)\\n    dist.broadcast(tensor, 0)\\n    first_zero = (tensor == 0).nonzero()[0].item()\\n    res = tensor.tolist()[:first_zero]\\n    return ''.join([chr(x) for x in res])\\n\\n\\ndef time_synchronize() -> float:\\n    torch.cuda.synchronize()\\n    return time.perf_counter()  # second\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import pt_main\\n\\nif __name__ == '__main__':\\n    pt_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import deploy_main\\n\\nif __name__ == '__main__':\\n    deploy_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import merge_lora_main\\n\\nif __name__ == '__main__':\\n    merge_lora_main(replace_if_exists=True)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import export_main\\n\\nif __name__ == '__main__':\\n    export_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.ui.app import webui_main\\n\\nif __name__ == '__main__':\\n    webui_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport importlib.util\\nimport os\\nimport subprocess\\nimport sys\\nfrom typing import Dict, List, Optional\\n\\nROUTE_MAPPING: Dict[str, str] = {\\n    'pt': 'swift.cli.pt',\\n    'sft': 'swift.cli.sft',\\n    'infer': 'swift.cli.infer',\\n    'app-ui': 'swift.cli.app_ui',\\n    'merge-lora': 'swift.cli.merge_lora',\\n    'web-ui': 'swift.cli.web_ui',\\n    'deploy': 'swift.cli.deploy',\\n    'dpo': 'swift.cli.rlhf',\\n    'orpo': 'swift.cli.rlhf',\\n    'simpo': 'swift.cli.rlhf',\\n    'rlhf': 'swift.cli.rlhf',\\n    'export': 'swift.cli.export',\\n    'eval': 'swift.cli.eval'\\n}\\n\\nROUTE_MAPPING.update({k.replace('-', '_'): v for k, v in ROUTE_MAPPING.items()})\\n\\n\\ndef use_torchrun() -> bool:\\n    nproc_per_node = os.getenv('NPROC_PER_NODE')\\n    nnodes = os.getenv('NNODES')\\n    if nproc_per_node is None and nnodes is None:\\n        return False\\n    return True\\n\\n\\ndef get_torchrun_args() -> Optional[List[str]]:\\n    if not use_torchrun():\\n        return\\n    torchrun_args = []\\n    for env_key in ['NPROC_PER_NODE', 'MASTER_PORT', 'NNODES', 'NODE_RANK', 'MASTER_ADDR']:\\n        env_val = os.getenv(env_key)\\n        if env_val is None:\\n            continue\\n        torchrun_args += [f'--{env_key.lower()}', env_val]\\n    return torchrun_args\\n\\n\\ndef cli_main() -> None:\\n    argv = sys.argv[1:]\\n    method_name = argv[0]\\n    argv = argv[1:]\\n    # rlhf compatibility\\n    if method_name in ['dpo', 'simpo', 'orpo']:\\n        argv = ['--rlhf_type', method_name] + argv\\n    file_path = importlib.util.find_spec(ROUTE_MAPPING[method_name]).origin\\n    torchrun_args = get_torchrun_args()\\n    python_cmd = sys.executable\\n    if torchrun_args is None or method_name not in ('pt', 'sft', 'dpo', 'orpo', 'simpo', 'rlhf'):\\n        args = [python_cmd, file_path, *argv]\\n    else:\\n        args = [python_cmd, '-m', 'torch.distributed.run', *torchrun_args, file_path, *argv]\\n    print(f\\\"run sh: `{' '.join(args)}`\\\", flush=True)\\n    result = subprocess.run(args)\\n    if result.returncode != 0:\\n        sys.exit(result.returncode)\\n\\n\\nif __name__ == '__main__':\\n    cli_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import sft_main\\n\\nif __name__ == '__main__':\\n    sft_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import app_ui_main\\n\\nif __name__ == '__main__':\\n    app_ui_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import rlhf_main\\n\\nif __name__ == '__main__':\\n    rlhf_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import infer_main\\n\\nif __name__ == '__main__':\\n    infer_main()\\n\\n\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom swift.llm import eval_main\\n\\nif __name__ == '__main__':\\n    eval_main()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport os\\nimport time\\nfrom typing import Optional\\n\\nfrom swift.utils.logger import get_logger\\nfrom .constants import DEFAULT_DATASET_REVISION, DEFAULT_REPOSITORY_REVISION, MASTER_MODEL_BRANCH\\nfrom .errors import GitError, InvalidParameter, NotLoginException\\nfrom .git import GitCommandWrapper\\nfrom .utils.utils import get_endpoint\\n\\nlogger = get_logger()\\n\\n\\nclass Repository:\\n    \\\"\\\"\\\"A local representation of the model git repository.\\n    \\\"\\\"\\\"\\n\\n    def __init__(self,\\n                 model_dir: str,\\n                 clone_from: str,\\n                 revision: Optional[str] = DEFAULT_REPOSITORY_REVISION,\\n                 auth_token: Optional[str] = None,\\n                 git_path: Optional[str] = None):\\n        \\\"\\\"\\\"Instantiate a Repository object by cloning the remote ModelScopeHub repo\\n\\n        Args:\\n            model_dir (str): The model root directory.\\n            clone_from (str): model id in ModelScope-hub from which git clone\\n            revision (str, optional): revision of the model you want to clone from.\\n                     Can be any of a branch, tag or commit hash\\n            auth_token (str, optional): token obtained when calling `HubApi.login()`.\\n                        Usually you can safely ignore the parameter as the token is already\\n                        saved when you login the first time, if None, we will use saved token.\\n            git_path (str, optional): The git command line path, if None, we use 'git'\\n\\n        Raises:\\n            InvalidParameter: revision is None.\\n        \\\"\\\"\\\"\\n        self.model_dir = model_dir\\n        self.model_base_dir = os.path.dirname(model_dir)\\n        if self.model_base_dir == '':\\n            self.model_base_dir = '.'\\n        self.model_repo_name = os.path.basename(model_dir)\\n\\n        if not revision:\\n            err_msg = 'a non-default value of revision cannot be empty.'\\n            raise InvalidParameter(err_msg)\\n\\n        from .api import ModelScopeConfig\\n        if auth_token:\\n            self.auth_token = auth_token\\n        else:\\n            self.auth_token = ModelScopeConfig.get_token()\\n\\n        git_wrapper = GitCommandWrapper()\\n        if not git_wrapper.is_lfs_installed():\\n            logger.error('git lfs is not installed, please install.')\\n\\n        self.git_wrapper = GitCommandWrapper(git_path)\\n        os.makedirs(self.model_dir, exist_ok=True)\\n        url = self._get_model_id_url(clone_from)\\n        if os.listdir(self.model_dir):  # directory not empty.\\n            remote_url = self._get_remote_url()\\n            remote_url = self.git_wrapper.remove_token_from_url(remote_url)\\n            if remote_url and remote_url == url:  # need not clone again\\n                return\\n        self.git_wrapper.clone(self.model_base_dir, self.auth_token, url, self.model_repo_name, revision)\\n\\n        if git_wrapper.is_lfs_installed():\\n            git_wrapper.git_lfs_install(self.model_dir)  # init repo lfs\\n\\n        # add user info if login\\n        self.git_wrapper.add_user_info(self.model_base_dir, self.model_repo_name)\\n        if self.auth_token:  # config remote with auth token\\n            self.git_wrapper.config_auth_token(self.model_dir, self.auth_token)\\n\\n    def _get_model_id_url(self, model_id):\\n        url = f'{get_endpoint()}/{model_id}.git'\\n        return url\\n\\n    def _get_remote_url(self):\\n        try:\\n            remote = self.git_wrapper.get_repo_remote_url(self.model_dir)\\n        except GitError:\\n            remote = None\\n        return remote\\n\\n    def pull(self, remote: str = 'origin', branch: str = 'master'):\\n        \\\"\\\"\\\"Pull remote branch\\n\\n        Args:\\n            remote (str, optional): The remote name. Defaults to 'origin'.\\n            branch (str, optional): The remote branch. Defaults to 'master'.\\n        \\\"\\\"\\\"\\n        self.git_wrapper.pull(self.model_dir, remote=remote, branch=branch)\\n\\n    def add_lfs_type(self, file_name_suffix: str):\\n        \\\"\\\"\\\"Add file suffix to lfs list.\\n\\n        Args:\\n            file_name_suffix (str): The file name suffix.\\n                examples '*.safetensors'\\n        \\\"\\\"\\\"\\n        os.system(\\\"printf '%s filter=lfs diff=lfs merge=lfs -text\\\\n'>>%s\\\" %\\n                  (file_name_suffix, os.path.join(self.model_dir, '.gitattributes')))\\n\\n    def push(self,\\n             commit_message: str,\\n             local_branch: Optional[str] = DEFAULT_REPOSITORY_REVISION,\\n             remote_branch: Optional[str] = DEFAULT_REPOSITORY_REVISION,\\n             force: Optional[bool] = False):\\n        \\\"\\\"\\\"Push local files to remote, this method will do.\\n        Execute git pull, git add, git commit, git push in order.\\n\\n        Args:\\n            commit_message (str): commit message\\n            local_branch(str, optional): The local branch, default master.\\n            remote_branch (str, optional): The remote branch to push, default master.\\n            force (bool, optional): whether to use forced-push.\\n\\n        Raises:\\n            InvalidParameter: no commit message.\\n            NotLoginException: no auth token.\\n        \\\"\\\"\\\"\\n        if commit_message is None or not isinstance(commit_message, str):\\n            msg = 'commit_message must be provided!'\\n            raise InvalidParameter(msg)\\n        if not isinstance(force, bool):\\n            raise InvalidParameter('force must be bool')\\n\\n        if not self.auth_token:\\n            raise NotLoginException('Must login to push, please login first.')\\n\\n        self.git_wrapper.config_auth_token(self.model_dir, self.auth_token)\\n        self.git_wrapper.add_user_info(self.model_base_dir, self.model_repo_name)\\n\\n        url = self.git_wrapper.get_repo_remote_url(self.model_dir)\\n        assert 'modelscope' in url  # Avoid unexpected pushes\\n        self.git_wrapper.add(self.model_dir, all_files=True)\\n        # avoid race condition with git status\\n        time.sleep(0.5)\\n        if self.is_repo_clean():\\n            logger.info('Repo currently clean. Ignoring commit and push_to_hub')\\n        else:\\n            self.git_wrapper.commit(self.model_dir, commit_message)\\n            self.git_wrapper.push(\\n                repo_dir=self.model_dir,\\n                token=self.auth_token,\\n                url=url,\\n                local_branch=local_branch,\\n                remote_branch=remote_branch)\\n\\n    def tag(self, tag_name: str, message: str, ref: Optional[str] = MASTER_MODEL_BRANCH):\\n        \\\"\\\"\\\"Create a new tag.\\n\\n        Args:\\n            tag_name (str): The name of the tag\\n            message (str): The tag message.\\n            ref (str, optional): The tag reference, can be commit id or branch.\\n\\n        Raises:\\n            InvalidParameter: no commit message.\\n        \\\"\\\"\\\"\\n        if tag_name is None or tag_name == '':\\n            msg = 'We use tag-based revision, therefore tag_name cannot be None or empty.'\\n            raise InvalidParameter(msg)\\n        if message is None or message == '':\\n            msg = 'We use annotated tag, therefore message cannot None or empty.'\\n            raise InvalidParameter(msg)\\n        self.git_wrapper.tag(repo_dir=self.model_dir, tag_name=tag_name, message=message, ref=ref)\\n\\n    def tag_and_push(self, tag_name: str, message: str, ref: Optional[str] = MASTER_MODEL_BRANCH):\\n        \\\"\\\"\\\"Create tag and push to remote\\n\\n        Args:\\n            tag_name (str): The name of the tag\\n            message (str): The tag message.\\n            ref (str, optional): The tag ref, can be commit id or branch. Defaults to MASTER_MODEL_BRANCH.\\n        \\\"\\\"\\\"\\n        self.tag(tag_name, message, ref)\\n\\n        self.git_wrapper.push_tag(repo_dir=self.model_dir, tag_name=tag_name)\\n\\n    def is_repo_clean(self) -> bool:\\n        response = self.git_wrapper._run_git_command('-C', self.model_dir, 'status', '--porcelain')\\n        return len(response.stdout.strip()) == 0\\n\\n\\nclass DatasetRepository:\\n    \\\"\\\"\\\"A local representation of the dataset (metadata) git repository.\\n    \\\"\\\"\\\"\\n\\n    def __init__(self,\\n                 repo_work_dir: str,\\n                 dataset_id: str,\\n                 revision: Optional[str] = DEFAULT_DATASET_REVISION,\\n                 auth_token: Optional[str] = None,\\n                 git_path: Optional[str] = None):\\n        \\\"\\\"\\\"\\n        Instantiate a Dataset Repository object by cloning the remote ModelScope dataset repo\\n\\n        Args:\\n            repo_work_dir (str): The dataset repo root directory.\\n            dataset_id (str): dataset id in ModelScope from which git clone\\n            revision (str, optional): revision of the dataset you want to clone from.\\n                                      Can be any of a branch, tag or commit hash\\n            auth_token (str, optional): token obtained when calling `HubApi.login()`.\\n                                        Usually you can safely ignore the parameter as the token is\\n                                        already saved when you login the first time, if None, we will use saved token.\\n            git_path (str, optional): The git command line path, if None, we use 'git'\\n\\n        Raises:\\n            InvalidParameter: parameter invalid.\\n        \\\"\\\"\\\"\\n        self.dataset_id = dataset_id\\n        if not repo_work_dir or not isinstance(repo_work_dir, str):\\n            err_msg = 'dataset_work_dir must be provided!'\\n            raise InvalidParameter(err_msg)\\n        self.repo_work_dir = repo_work_dir.rstrip('/')\\n        if not self.repo_work_dir:\\n            err_msg = 'dataset_work_dir can not be root dir!'\\n            raise InvalidParameter(err_msg)\\n        self.repo_base_dir = os.path.dirname(self.repo_work_dir)\\n        self.repo_name = os.path.basename(self.repo_work_dir)\\n\\n        if not revision:\\n            err_msg = 'a non-default value of revision cannot be empty.'\\n            raise InvalidParameter(err_msg)\\n        self.revision = revision\\n        from .api import ModelScopeConfig\\n        if auth_token:\\n            self.auth_token = auth_token\\n        else:\\n            self.auth_token = ModelScopeConfig.get_token()\\n\\n        self.git_wrapper = GitCommandWrapper(git_path)\\n        os.makedirs(self.repo_work_dir, exist_ok=True)\\n        self.repo_url = self._get_repo_url(dataset_id=dataset_id)\\n\\n    def clone(self) -> str:\\n        # check local repo dir, directory not empty.\\n        if os.listdir(self.repo_work_dir):\\n            remote_url = self._get_remote_url()\\n            remote_url = self.git_wrapper.remove_token_from_url(remote_url)\\n            # no need clone again\\n            if remote_url and remote_url == self.repo_url:\\n                return ''\\n\\n        logger.info('Cloning repo from {} '.format(self.repo_url))\\n        self.git_wrapper.clone(self.repo_base_dir, self.auth_token, self.repo_url, self.repo_name, self.revision)\\n        return self.repo_work_dir\\n\\n    def push(self,\\n             commit_message: str,\\n             branch: Optional[str] = DEFAULT_DATASET_REVISION,\\n             force: Optional[bool] = False):\\n        \\\"\\\"\\\"Push local files to remote, this method will do.\\n           git pull\\n           git add\\n           git commit\\n           git push\\n\\n        Args:\\n            commit_message (str): commit message\\n            branch (str, optional): which branch to push.\\n            force (bool, optional): whether to use forced-push.\\n\\n        Raises:\\n            InvalidParameter: no commit message.\\n            NotLoginException: no access token.\\n        \\\"\\\"\\\"\\n        if commit_message is None or not isinstance(commit_message, str):\\n            msg = 'commit_message must be provided!'\\n            raise InvalidParameter(msg)\\n\\n        if not isinstance(force, bool):\\n            raise InvalidParameter('force must be bool')\\n\\n        if not self.auth_token:\\n            raise NotLoginException('Must login to push, please login first.')\\n\\n        self.git_wrapper.config_auth_token(self.repo_work_dir, self.auth_token)\\n        self.git_wrapper.add_user_info(self.repo_base_dir, self.repo_name)\\n\\n        remote_url = self._get_remote_url()\\n        remote_url = self.git_wrapper.remove_token_from_url(remote_url)\\n\\n        self.git_wrapper.pull(self.repo_work_dir)\\n        self.git_wrapper.add(self.repo_work_dir, all_files=True)\\n        self.git_wrapper.commit(self.repo_work_dir, commit_message)\\n        self.git_wrapper.push(\\n            repo_dir=self.repo_work_dir,\\n            token=self.auth_token,\\n            url=remote_url,\\n            local_branch=branch,\\n            remote_branch=branch)\\n\\n    def _get_repo_url(self, dataset_id):\\n        return f'{get_endpoint()}/datasets/{dataset_id}.git'\\n\\n    def _get_remote_url(self):\\n        try:\\n            remote = self.git_wrapper.get_repo_remote_url(self.repo_work_dir)\\n        except GitError:\\n            remote = None\\n        return remote\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport concurrent.futures\\nimport os\\nimport shutil\\nfrom multiprocessing import Manager, Process, Value\\n\\nfrom swift.utils.logger import get_logger\\nfrom .api import HubApi\\nfrom .constants import DEFAULT_REPOSITORY_REVISION, ModelVisibility\\n\\nlogger = get_logger()\\n\\n_executor = concurrent.futures.ProcessPoolExecutor(max_workers=8)\\n_queues = dict()\\n_flags = dict()\\n_tasks = dict()\\n_manager = None\\n\\n\\ndef _api_push_to_hub(repo_name,\\n                     output_dir,\\n                     token,\\n                     private=True,\\n                     commit_message='',\\n                     tag=None,\\n                     source_repo='',\\n                     ignore_file_pattern=None,\\n                     revision=DEFAULT_REPOSITORY_REVISION):\\n    try:\\n        api = HubApi()\\n        api.login(token)\\n        api.push_model(\\n            repo_name,\\n            output_dir,\\n            visibility=ModelVisibility.PUBLIC if not private else ModelVisibility.PRIVATE,\\n            chinese_name=repo_name,\\n            commit_message=commit_message,\\n            tag=tag,\\n            original_model_id=source_repo,\\n            ignore_file_pattern=ignore_file_pattern,\\n            revision=revision)\\n        commit_message = commit_message or 'No commit message'\\n        logger.info(f'Successfully upload the model to {repo_name} with message: {commit_message}')\\n        return True\\n    except Exception as e:\\n        logger.error(f'Error happens when uploading model {repo_name} with message: {commit_message}: {e}')\\n        return False\\n\\n\\ndef push_to_hub(repo_name,\\n                output_dir,\\n                token=None,\\n                private=True,\\n                retry=3,\\n                commit_message='',\\n                tag=None,\\n                source_repo='',\\n                ignore_file_pattern=None,\\n                revision=DEFAULT_REPOSITORY_REVISION):\\n    \\\"\\\"\\\"\\n    Args:\\n        repo_name: The repo name for the modelhub repo\\n        output_dir: The local output_dir for the checkpoint\\n        token: The user api token, function will check the `MODELSCOPE_API_TOKEN` variable if this argument is None\\n        private: If is a private repo, default True\\n        retry: Retry times if something error in uploading, default 3\\n        commit_message: The commit message\\n        tag: The tag of this commit\\n        source_repo: The source repo (model id) which this model comes from\\n        ignore_file_pattern: The file pattern to be ignored in uploading.\\n        revision: The branch to commit to\\n    Returns:\\n        The boolean value to represent whether the model is uploaded.\\n    \\\"\\\"\\\"\\n    if token is None:\\n        token = os.environ.get('MODELSCOPE_API_TOKEN')\\n    if ignore_file_pattern is None:\\n        ignore_file_pattern = os.environ.get('UPLOAD_IGNORE_FILE_PATTERN')\\n    assert repo_name is not None\\n    assert token is not None, 'Either pass in a token or to set `MODELSCOPE_API_TOKEN` in the environment variables.'\\n    assert os.path.isdir(output_dir)\\n    assert 'configuration.json' in os.listdir(output_dir) or 'configuration.yaml' in os.listdir(output_dir) \\\\\\n           or 'configuration.yml' in os.listdir(output_dir)\\n\\n    logger.info(f'Uploading {output_dir} to {repo_name} with message {commit_message}')\\n    for i in range(retry):\\n        if _api_push_to_hub(repo_name, output_dir, token, private, commit_message, tag, source_repo,\\n                            ignore_file_pattern, revision):\\n            return True\\n    return False\\n\\n\\ndef push_to_hub_async(repo_name,\\n                      output_dir,\\n                      token=None,\\n                      private=True,\\n                      commit_message='',\\n                      tag=None,\\n                      source_repo='',\\n                      ignore_file_pattern=None,\\n                      revision=DEFAULT_REPOSITORY_REVISION):\\n    \\\"\\\"\\\"\\n    Args:\\n        repo_name: The repo name for the modelhub repo\\n        output_dir: The local output_dir for the checkpoint\\n        token: The user api token, function will check the `MODELSCOPE_API_TOKEN` variable if this argument is None\\n        private: If is a private repo, default True\\n        commit_message: The commit message\\n        tag: The tag of this commit\\n        source_repo: The source repo (model id) which this model comes from\\n        ignore_file_pattern: The file pattern to be ignored in uploading\\n        revision: The branch to commit to\\n    Returns:\\n        A handler to check the result and the status\\n    \\\"\\\"\\\"\\n    if token is None:\\n        token = os.environ.get('MODELSCOPE_API_TOKEN')\\n    if ignore_file_pattern is None:\\n        ignore_file_pattern = os.environ.get('UPLOAD_IGNORE_FILE_PATTERN')\\n    assert repo_name is not None\\n    assert token is not None, 'Either pass in a token or to set `MODELSCOPE_API_TOKEN` in the environment variables.'\\n    assert os.path.isdir(output_dir)\\n    assert 'configuration.json' in os.listdir(output_dir) or 'configuration.yaml' in os.listdir(output_dir) \\\\\\n           or 'configuration.yml' in os.listdir(output_dir)\\n\\n    logger.info(f'Uploading {output_dir} to {repo_name} with message {commit_message}')\\n    return _executor.submit(_api_push_to_hub, repo_name, output_dir, token, private, commit_message, tag, source_repo,\\n                            ignore_file_pattern, revision)\\n\\n\\ndef submit_task(q, b):\\n    while True:\\n        b.value = False\\n        item = q.get()\\n        logger.info(item)\\n        b.value = True\\n        if not item.pop('done', False):\\n            delete_dir = item.pop('delete_dir', False)\\n            output_dir = item.get('output_dir')\\n            try:\\n                push_to_hub(**item)\\n                if delete_dir and os.path.exists(output_dir):\\n                    shutil.rmtree(output_dir)\\n            except Exception as e:\\n                logger.error(e)\\n        else:\\n            break\\n\\n\\nclass UploadStrategy:\\n    cancel = 'cancel'\\n    wait = 'wait'\\n\\n\\ndef push_to_hub_in_queue(queue_name, strategy=UploadStrategy.cancel, **kwargs):\\n    assert queue_name is not None and len(queue_name) > 0, 'Please specify a valid queue name!'\\n    global _manager\\n    if _manager is None:\\n        _manager = Manager()\\n    if queue_name not in _queues:\\n        _queues[queue_name] = _manager.Queue()\\n        _flags[queue_name] = Value('b', False)\\n        process = Process(target=submit_task, args=(_queues[queue_name], _flags[queue_name]))\\n        process.start()\\n        _tasks[queue_name] = process\\n\\n    queue = _queues[queue_name]\\n    flag: Value = _flags[queue_name]\\n    if kwargs.get('done', False):\\n        queue.put(kwargs)\\n    elif flag.value and strategy == UploadStrategy.cancel:\\n        logger.error(f'Another uploading is running, '\\n                     f'this uploading with message {kwargs.get(\\\"commit_message\\\")} will be canceled.')\\n    else:\\n        queue.put(kwargs)\\n\\n\\ndef wait_for_done(queue_name):\\n    process: Process = _tasks.pop(queue_name, None)\\n    if process is None:\\n        return\\n    process.join()\\n\\n    _queues.pop(queue_name)\\n    _flags.pop(queue_name)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom http import HTTPStatus\\n\\nimport requests\\nfrom requests.exceptions import HTTPError\\n\\nfrom swift.utils.logger import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass NotSupportError(Exception):\\n    pass\\n\\n\\nclass NoValidRevisionError(Exception):\\n    pass\\n\\n\\nclass NotExistError(Exception):\\n    pass\\n\\n\\nclass RequestError(Exception):\\n    pass\\n\\n\\nclass GitError(Exception):\\n    pass\\n\\n\\nclass InvalidParameter(Exception):\\n    pass\\n\\n\\nclass NotLoginException(Exception):\\n    pass\\n\\n\\nclass FileIntegrityError(Exception):\\n    pass\\n\\n\\nclass FileDownloadError(Exception):\\n    pass\\n\\n\\ndef is_ok(rsp):\\n    \\\"\\\"\\\" Check the request is ok\\n\\n    Args:\\n        rsp (Response): The request response body\\n\\n    Returns:\\n       bool: `True` if success otherwise `False`.\\n    \\\"\\\"\\\"\\n    return rsp['Code'] == HTTPStatus.OK and rsp['Success']\\n\\n\\ndef _decode_response_error(response: requests.Response):\\n    if 'application/json' in response.headers.get('content-type', ''):\\n        message = response.json()\\n    else:\\n        message = response.content.decode('utf-8')\\n    return message\\n\\n\\ndef handle_http_post_error(response, url, request_body):\\n    try:\\n        response.raise_for_status()\\n    except HTTPError as error:\\n        message = _decode_response_error(response)\\n        raise HTTPError('Request %s with body: %s exception, '\\n                        'Response details: %s' % (url, request_body, message)) from error\\n\\n\\ndef handle_http_response(response, logger, cookies, model_id):\\n    try:\\n        response.raise_for_status()\\n    except HTTPError as error:\\n        if cookies is None:  # code in [403] and\\n            pass\\n        message = _decode_response_error(response)\\n        raise HTTPError('Response details: %s' % message) from error\\n\\n\\ndef raise_on_error(rsp):\\n    \\\"\\\"\\\"If response error, raise exception\\n\\n    Args:\\n        rsp (_type_): The server response\\n\\n    Raises:\\n        RequestError: the response error message.\\n\\n    Returns:\\n        bool: True if request is OK, otherwise raise `RequestError` exception.\\n    \\\"\\\"\\\"\\n    if rsp['Code'] == HTTPStatus.OK:\\n        return True\\n    else:\\n        raise RequestError(rsp['Message'])\\n\\n\\ndef datahub_raise_on_error(url, rsp):\\n    \\\"\\\"\\\"If response error, raise exception\\n\\n    Args:\\n        url (str): The request url\\n        rsp (HTTPResponse): The server response.\\n\\n    Raises:\\n        RequestError: the http request error.\\n\\n    Returns:\\n        bool: `True` if request is OK, otherwise raise `RequestError` exception.\\n    \\\"\\\"\\\"\\n    if rsp.get('Code') == HTTPStatus.OK:\\n        return True\\n    else:\\n        raise RequestError(\\n            f\\\"Url = {url}, Message = {rsp.get('Message')}, Please specify correct dataset_name and namespace.\\\")\\n\\n\\ndef raise_for_http_status(rsp):\\n    \\\"\\\"\\\"Attempt to decode utf-8 first since some servers\\n    localize reason strings, for invalid utf-8, fall back\\n    to decoding with iso-8859-1.\\n\\n    Args:\\n        rsp: The http response.\\n\\n    Raises:\\n        HTTPError: The http error info.\\n    \\\"\\\"\\\"\\n    http_error_msg = ''\\n    if isinstance(rsp.reason, bytes):\\n        try:\\n            reason = rsp.reason.decode('utf-8')\\n        except UnicodeDecodeError:\\n            reason = rsp.reason.decode('iso-8859-1')\\n    else:\\n        reason = rsp.reason\\n\\n    if 400 <= rsp.status_code < 500:\\n        http_error_msg = u'%s Client Error: %s for url: %s' % (rsp.status_code, reason, rsp.url)\\n\\n    elif 500 <= rsp.status_code < 600:\\n        http_error_msg = u'%s Server Error: %s for url: %s' % (rsp.status_code, reason, rsp.url)\\n\\n    if http_error_msg:\\n        req = rsp.request\\n        if req.method == 'POST':\\n            http_error_msg = u'%s, body: %s' % (http_error_msg, req.body)\\n        raise HTTPError(http_error_msg, response=rsp)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport copy\\nimport os\\nimport tempfile\\nimport threading\\nfrom concurrent.futures import ThreadPoolExecutor\\nfrom functools import partial\\nfrom http.cookiejar import CookieJar\\nfrom pathlib import Path\\nfrom typing import Dict, Optional, Union\\n\\nimport requests\\nfrom requests.adapters import Retry\\nfrom tqdm import tqdm\\n\\nfrom swift.utils.logger import get_logger\\nfrom .api import HubApi, ModelScopeConfig\\nfrom .constants import (API_FILE_DOWNLOAD_CHUNK_SIZE, API_FILE_DOWNLOAD_RETRY_TIMES, API_FILE_DOWNLOAD_TIMEOUT,\\n                        DEFAULT_MODEL_REVISION, FILE_HASH, MODELSCOPE_DOWNLOAD_PARALLELS,\\n                        MODELSCOPE_PARALLEL_DOWNLOAD_THRESHOLD_MB)\\nfrom .errors import FileDownloadError, NotExistError\\nfrom .utils.caching import ModelFileSystemCache\\nfrom .utils.utils import file_integrity_validation, get_cache_dir, get_endpoint, model_id_to_group_owner_name\\n\\nlogger = get_logger()\\n\\n\\ndef model_file_download(\\n    model_id: str,\\n    file_path: str,\\n    revision: Optional[str] = DEFAULT_MODEL_REVISION,\\n    cache_dir: Optional[str] = None,\\n    user_agent: Union[Dict, str, None] = None,\\n    local_files_only: Optional[bool] = False,\\n    cookies: Optional[CookieJar] = None,\\n) -> Optional[str]:  # pragma: no cover\\n    \\\"\\\"\\\"Download from a given URL and cache it if it's not already present in the local cache.\\n\\n    Given a URL, this function looks for the corresponding file in the local\\n    cache. If it's not there, download it. Then return the path to the cached\\n    file.\\n\\n    Args:\\n        model_id (str): The model to whom the file to be downloaded belongs.\\n        file_path(str): Path of the file to be downloaded, relative to the root of model repo.\\n        revision(str, optional): revision of the model file to be downloaded.\\n            Can be any of a branch, tag or commit hash.\\n        cache_dir (str, Path, optional): Path to the folder where cached files are stored.\\n        user_agent (dict, str, optional): The user-agent info in the form of a dictionary or a string.\\n        local_files_only (bool, optional):  If `True`, avoid downloading the file and return the path to the\\n            local cached file if it exists. if `False`, download the file anyway even it exists.\\n        cookies (CookieJar, optional): The cookie of download request.\\n\\n    Returns:\\n        string: string of local file or if networking is off, last version of\\n        file cached on disk.\\n\\n    Raises:\\n        NotExistError: The file is not exist.\\n        ValueError: The request parameter error.\\n\\n    Note:\\n        Raises the following errors:\\n\\n            - [`EnvironmentError`](https://docs.python.org/3/library/exceptions.html#EnvironmentError)\\n            if `use_auth_token=True` and the token cannot be found.\\n            - [`OSError`](https://docs.python.org/3/library/exceptions.html#OSError)\\n            if ETag cannot be determined.\\n            - [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)\\n            if some parameter value is invalid\\n    \\\"\\\"\\\"\\n    if cache_dir is None:\\n        cache_dir = get_cache_dir()\\n    if isinstance(cache_dir, Path):\\n        cache_dir = str(cache_dir)\\n    temporary_cache_dir = os.path.join(cache_dir, 'temp')\\n    os.makedirs(temporary_cache_dir, exist_ok=True)\\n\\n    group_or_owner, name = model_id_to_group_owner_name(model_id)\\n\\n    cache = ModelFileSystemCache(cache_dir, group_or_owner, name)\\n\\n    # if local_files_only is `True` and the file already exists in cached_path\\n    # return the cached path\\n    if local_files_only:\\n        cached_file_path = cache.get_file_by_path(file_path)\\n        if cached_file_path is not None:\\n            logger.warning(\\\"File exists in local cache, but we're not sure it's up to date\\\")\\n            return cached_file_path\\n        else:\\n            raise ValueError('Cannot find the requested files in the cached path and outgoing'\\n                             ' traffic has been disabled. To enable model look-ups and downloads'\\n                             \\\" online, set 'local_files_only' to False.\\\")\\n\\n    _api = HubApi()\\n    headers = {'user-agent': ModelScopeConfig.get_user_agent(user_agent=user_agent, )}\\n    if cookies is None:\\n        cookies = ModelScopeConfig.get_cookies()\\n\\n    revision = _api.get_valid_revision(model_id, revision=revision, cookies=cookies)\\n    file_to_download_info = None\\n    # we need to confirm the version is up-to-date\\n    # we need to get the file list to check if the latest version is cached, if so return, otherwise download\\n    model_files = _api.get_model_files(\\n        model_id=model_id, revision=revision, recursive=True, use_cookies=False if cookies is None else cookies)\\n\\n    for model_file in model_files:\\n        if model_file['Type'] == 'tree':\\n            continue\\n\\n        if model_file['Path'] == file_path:\\n            if cache.exists(model_file):\\n                logger.debug(f'File {model_file[\\\"Name\\\"]} already in cache, skip downloading!')\\n                return cache.get_file_by_info(model_file)\\n            else:\\n                file_to_download_info = model_file\\n            break\\n\\n    if file_to_download_info is None:\\n        raise NotExistError('The file path: %s not exist in: %s' % (file_path, model_id))\\n\\n    # we need to download again\\n    url_to_download = get_file_download_url(model_id, file_path, revision)\\n    temp_file_name = next(tempfile._get_candidate_names())\\n\\n    if MODELSCOPE_PARALLEL_DOWNLOAD_THRESHOLD_MB * 1000 * 1000 < file_to_download_info[\\n            'Size'] and MODELSCOPE_DOWNLOAD_PARALLELS > 1:\\n        parallel_download(\\n            url_to_download,\\n            temporary_cache_dir,\\n            temp_file_name,\\n            headers=headers,\\n            cookies=None if cookies is None else cookies.get_dict(),\\n            file_size=file_to_download_info['Size'])\\n    else:\\n        http_get_file(\\n            url_to_download,\\n            temporary_cache_dir,\\n            temp_file_name,\\n            headers=headers,\\n            cookies=None if cookies is None else cookies.get_dict())\\n\\n    temp_file_path = os.path.join(temporary_cache_dir, temp_file_name)\\n    # for download with commit we can't get Sha256\\n    if file_to_download_info[FILE_HASH] is not None:\\n        file_integrity_validation(temp_file_path, file_to_download_info[FILE_HASH])\\n    return cache.put_file(file_to_download_info, os.path.join(temporary_cache_dir, temp_file_name))\\n\\n\\ndef get_file_download_url(model_id: str, file_path: str, revision: str):\\n    \\\"\\\"\\\"Format file download url according to `model_id`, `revision` and `file_path`.\\n    e.g., Given `model_id=john/bert`, `revision=master`, `file_path=README.md`,\\n    the resulted download url is: https://modelscope.cn/api/v1/models/john/bert/repo?Revision=master&FilePath=README.md\\n\\n    Args:\\n        model_id (str): The model_id.\\n        file_path (str): File path\\n        revision (str): File revision.\\n\\n    Returns:\\n        str: The file url.\\n    \\\"\\\"\\\"\\n    download_url_template = '{endpoint}/api/v1/models/{model_id}/repo?Revision={revision}&FilePath={file_path}'\\n    return download_url_template.format(\\n        endpoint=get_endpoint(),\\n        model_id=model_id,\\n        revision=revision,\\n        file_path=file_path,\\n    )\\n\\n\\ndef download_part(params):\\n    # unpack parameters\\n    progress, start, end, url, file_name, cookies, headers = params\\n    get_headers = {} if headers is None else copy.deepcopy(headers)\\n    get_headers['Range'] = 'bytes=%s-%s' % (start, end)\\n    with open(file_name, 'rb+') as f:\\n        f.seek(start)\\n        r = requests.get(url, stream=True, headers=get_headers, cookies=cookies, timeout=API_FILE_DOWNLOAD_TIMEOUT)\\n        for chunk in r.iter_content(chunk_size=API_FILE_DOWNLOAD_CHUNK_SIZE):\\n            if chunk:  # filter out keep-alive new chunks\\n                f.write(chunk)\\n                progress.update(len(chunk))\\n\\n\\ndef parallel_download(\\n    url: str,\\n    local_dir: str,\\n    file_name: str,\\n    cookies: CookieJar,\\n    headers: Optional[Dict[str, str]] = None,\\n    file_size: int = None,\\n):\\n    # create temp file\\n    temp_file_manager = partial(tempfile.NamedTemporaryFile, mode='wb', dir=local_dir, delete=False)\\n    with temp_file_manager() as temp_file:\\n        progress = tqdm(\\n            unit='B',\\n            unit_scale=True,\\n            unit_divisor=1024,\\n            total=file_size,\\n            initial=0,\\n            desc='Downloading',\\n        )\\n        PART_SIZE = 160 * 1024 * 1012  # every part is 160M\\n        tasks = []\\n        for idx in range(int(file_size / PART_SIZE)):\\n            start = idx * PART_SIZE\\n            end = (idx + 1) * PART_SIZE - 1\\n            tasks.append((progress, start, end, url, temp_file.name, cookies, headers))\\n        if end + 1 < file_size:\\n            tasks.append((progress, end + 1, file_size - 1, url, temp_file.name, cookies, headers))\\n        parallels = MODELSCOPE_DOWNLOAD_PARALLELS if MODELSCOPE_DOWNLOAD_PARALLELS <= 4 else 4\\n        with ThreadPoolExecutor(max_workers=parallels, thread_name_prefix='download') as executor:\\n            list(executor.map(download_part, tasks))\\n\\n        progress.close()\\n\\n    os.replace(temp_file.name, os.path.join(local_dir, file_name))\\n\\n\\ndef http_get_file(\\n    url: str,\\n    local_dir: str,\\n    file_name: str,\\n    cookies: CookieJar,\\n    headers: Optional[Dict[str, str]] = None,\\n):\\n    \\\"\\\"\\\"Download remote file, will retry 5 times before giving up on errors.\\n\\n    Args:\\n        url(str):\\n            actual download url of the file\\n        local_dir(str):\\n            local directory where the downloaded file stores\\n        file_name(str):\\n            name of the file stored in `local_dir`\\n        cookies(CookieJar):\\n            cookies used to authentication the user, which is used for downloading private repos\\n        headers(Dict[str, str], optional):\\n            http headers to carry necessary info when requesting the remote file\\n\\n    Raises:\\n        FileDownloadError: File download failed.\\n\\n    \\\"\\\"\\\"\\n    total = -1\\n    temp_file_manager = partial(tempfile.NamedTemporaryFile, mode='wb', dir=local_dir, delete=False)\\n    get_headers = {} if headers is None else copy.deepcopy(headers)\\n    with temp_file_manager() as temp_file:\\n        logger.debug('downloading %s to %s', url, temp_file.name)\\n        # retry sleep 0.5s, 1s, 2s, 4s\\n        retry = Retry(total=API_FILE_DOWNLOAD_RETRY_TIMES, backoff_factor=1, allowed_methods=['GET'])\\n        while True:\\n            try:\\n                downloaded_size = temp_file.tell()\\n                get_headers['Range'] = 'bytes=%d-' % downloaded_size\\n                r = requests.get(\\n                    url, stream=True, headers=get_headers, cookies=cookies, timeout=API_FILE_DOWNLOAD_TIMEOUT)\\n                r.raise_for_status()\\n                content_length = r.headers.get('Content-Length')\\n                total = int(content_length) if content_length is not None else None\\n                progress = tqdm(\\n                    unit='B',\\n                    unit_scale=True,\\n                    unit_divisor=1024,\\n                    total=total,\\n                    initial=downloaded_size,\\n                    desc='Downloading',\\n                )\\n                for chunk in r.iter_content(chunk_size=API_FILE_DOWNLOAD_CHUNK_SIZE):\\n                    if chunk:  # filter out keep-alive new chunks\\n                        progress.update(len(chunk))\\n                        temp_file.write(chunk)\\n                progress.close()\\n                break\\n            except (Exception) as e:  # no matter what happen, we will retry.\\n                retry = retry.increment('GET', url, error=e)\\n                retry.sleep()\\n\\n    logger.debug('storing %s in cache at %s', url, local_dir)\\n    downloaded_length = os.path.getsize(temp_file.name)\\n    if total != downloaded_length:\\n        os.remove(temp_file.name)\\n        msg = 'File %s download incomplete, content_length: %s but the \\\\\\n                    file downloaded length: %s, please download again' % (file_name, total, downloaded_length)\\n        logger.error(msg)\\n        raise FileDownloadError(msg)\\n    os.replace(temp_file.name, os.path.join(local_dir, file_name))\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nfrom pathlib import Path\\n\\nMODELSCOPE_URL_SCHEME = 'http://'\\nDEFAULT_MODELSCOPE_DOMAIN = 'www.modelscope.cn'\\nDEFAULT_MODELSCOPE_DATA_ENDPOINT = MODELSCOPE_URL_SCHEME + DEFAULT_MODELSCOPE_DOMAIN\\nMODELSCOPE_PARALLEL_DOWNLOAD_THRESHOLD_MB = int(os.environ.get('MODELSCOPE_PARALLEL_DOWNLOAD_THRESHOLD_MB', 500))\\nMODELSCOPE_DOWNLOAD_PARALLELS = int(os.environ.get('MODELSCOPE_DOWNLOAD_PARALLELS', 4))\\nDEFAULT_MODELSCOPE_GROUP = 'damo'\\nMODEL_ID_SEPARATOR = '/'\\nFILE_HASH = 'Sha256'\\nLOGGER_NAME = 'ModelScopeHub'\\nDEFAULT_CREDENTIALS_PATH = Path.home().joinpath('.modelscope', 'credentials')\\nREQUESTS_API_HTTP_METHOD = ['get', 'head', 'post', 'put', 'patch', 'delete']\\nAPI_HTTP_CLIENT_TIMEOUT = 5\\nAPI_RESPONSE_FIELD_DATA = 'Data'\\nAPI_FILE_DOWNLOAD_RETRY_TIMES = 5\\nAPI_FILE_DOWNLOAD_TIMEOUT = 60 * 5\\nAPI_FILE_DOWNLOAD_CHUNK_SIZE = 1024 * 1024 * 16\\nAPI_RESPONSE_FIELD_GIT_ACCESS_TOKEN = 'AccessToken'\\nAPI_RESPONSE_FIELD_USERNAME = 'Username'\\nAPI_RESPONSE_FIELD_EMAIL = 'Email'\\nAPI_RESPONSE_FIELD_MESSAGE = 'Message'\\nMODELSCOPE_CLOUD_ENVIRONMENT = 'MODELSCOPE_ENVIRONMENT'\\nMODELSCOPE_CLOUD_USERNAME = 'MODELSCOPE_USERNAME'\\nMODELSCOPE_SDK_DEBUG = 'MODELSCOPE_SDK_DEBUG'\\nONE_YEAR_SECONDS = 24 * 365 * 60 * 60\\nMODEL_META_FILE_NAME = '.mdl'\\nMODEL_META_MODEL_ID = 'id'\\nDEFAULT_MODEL_REVISION = None\\nMASTER_MODEL_BRANCH = 'master'\\nDEFAULT_REPOSITORY_REVISION = 'master'\\nDEFAULT_DATASET_REVISION = 'master'\\nDEFAULT_DATASET_NAMESPACE = 'modelscope'\\nDEFAULT_DATA_ACCELERATION_ENDPOINT = 'https://oss-accelerate.aliyuncs.com'\\n\\n\\nclass Licenses(object):\\n    APACHE_V2 = 'Apache License 2.0'\\n    GPL_V2 = 'GPL-2.0'\\n    GPL_V3 = 'GPL-3.0'\\n    LGPL_V2_1 = 'LGPL-2.1'\\n    LGPL_V3 = 'LGPL-3.0'\\n    AFL_V3 = 'AFL-3.0'\\n    ECL_V2 = 'ECL-2.0'\\n    MIT = 'MIT'\\n\\n\\nclass ModelVisibility(object):\\n    PRIVATE = 1\\n    INTERNAL = 3\\n    PUBLIC = 5\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport os\\nfrom typing import Dict, Optional, Union\\nfrom urllib.parse import urlparse\\n\\nfrom swift.utils.logger import get_logger\\nfrom .api import HubApi, ModelScopeConfig\\nfrom .constants import FILE_HASH\\nfrom .git import GitCommandWrapper\\nfrom .utils.caching import ModelFileSystemCache\\nfrom .utils.utils import compute_hash\\n\\nlogger = get_logger()\\n\\n\\ndef check_local_model_is_latest(\\n    model_root_path: str,\\n    user_agent: Optional[Union[Dict, str]] = None,\\n):\\n    \\\"\\\"\\\"Check local model repo is latest.\\n    Check local model repo is same as hub latest version.\\n    \\\"\\\"\\\"\\n    try:\\n        model_cache = None\\n        # download with git\\n        if os.path.exists(os.path.join(model_root_path, '.git')):\\n            git_cmd_wrapper = GitCommandWrapper()\\n            git_url = git_cmd_wrapper.get_repo_remote_url(model_root_path)\\n            if git_url.endswith('.git'):\\n                git_url = git_url[:-4]\\n            u_parse = urlparse(git_url)\\n            model_id = u_parse.path[1:]\\n        else:  # snapshot_download\\n            model_cache = ModelFileSystemCache(model_root_path)\\n            model_id = model_cache.get_model_id()\\n\\n        # make headers\\n        headers = {'user-agent': ModelScopeConfig.get_user_agent(user_agent=user_agent, )}\\n        cookies = ModelScopeConfig.get_cookies()\\n\\n        snapshot_header = headers if 'CI_TEST' in os.environ else {**headers, **{'Snapshot': 'True'}}\\n        _api = HubApi()\\n        try:\\n            _, revisions = _api.get_model_branches_and_tags(model_id=model_id, use_cookies=cookies)\\n            if len(revisions) > 0:\\n                latest_revision = revisions[0]\\n            else:\\n                latest_revision = 'master'\\n        except:  # noqa: E722\\n            latest_revision = 'master'\\n\\n        model_files = _api.get_model_files(\\n            model_id=model_id,\\n            revision=latest_revision,\\n            recursive=True,\\n            headers=snapshot_header,\\n            use_cookies=cookies,\\n        )\\n        for model_file in model_files:\\n            if model_file['Type'] == 'tree':\\n                continue\\n            # check model_file updated\\n            if model_cache is not None:\\n                if model_cache.exists(model_file):\\n                    continue\\n                else:\\n                    logger.info(\\n                        f'Model file {model_file[\\\"Name\\\"]} is different from the latest version `{latest_revision}`,'\\n                        f'This is because you are using an older version or the file is updated manually.')\\n                    break\\n            else:\\n                if FILE_HASH in model_file:\\n                    local_file_hash = compute_hash(os.path.join(model_root_path, model_file['Path']))\\n                    if local_file_hash == model_file[FILE_HASH]:\\n                        continue\\n                    else:\\n                        logger.info(\\n                            f'Model file {model_file[\\\"Name\\\"]} is different from the latest version `{latest_revision}`,'\\n                            f'This is because you are using an older version or the file is updated manually.')\\n                        break\\n    except:  # noqa: E722\\n        pass  # ignore\\n\\n\\ndef check_model_is_id(model_id: str, token=None):\\n    if token is None:\\n        token = os.environ.get('MODELSCOPE_API_TOKEN')\\n    if model_id is None or os.path.exists(model_id):\\n        return False\\n    else:\\n        _api = HubApi()\\n        if token is not None:\\n            _api.login(token)\\n        try:\\n            _api.get_model(model_id=model_id, )\\n            return True\\n        except Exception:\\n            return False\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport os\\nimport re\\nimport tempfile\\nfrom http.cookiejar import CookieJar\\nfrom pathlib import Path\\nfrom typing import Dict, List, Optional, Union\\n\\nfrom swift.utils.logger import get_logger\\nfrom .api import HubApi, ModelScopeConfig\\nfrom .constants import FILE_HASH, MODELSCOPE_DOWNLOAD_PARALLELS, MODELSCOPE_PARALLEL_DOWNLOAD_THRESHOLD_MB\\nfrom .file_download import get_file_download_url, http_get_file, parallel_download\\nfrom .utils.caching import ModelFileSystemCache\\nfrom .utils.utils import file_integrity_validation, get_cache_dir, model_id_to_group_owner_name\\n\\nlogger = get_logger()\\n\\n\\ndef snapshot_download(model_id: str,\\n                      revision: Optional[str] = None,\\n                      cache_dir: Union[str, Path, None] = None,\\n                      user_agent: Optional[Union[Dict, str]] = None,\\n                      local_files_only: Optional[bool] = False,\\n                      cookies: Optional[CookieJar] = None,\\n                      ignore_file_pattern: List = None) -> str:\\n    \\\"\\\"\\\"Download all files of a repo.\\n    Downloads a whole snapshot of a repo's files at the specified revision. This\\n    is useful when you want all files from a repo, because you don't know which\\n    ones you will need a priori. All files are nested inside a folder in order\\n    to keep their actual filename relative to that folder.\\n\\n    An alternative would be to just clone a repo but this would require that the\\n    user always has git and git-lfs installed, and properly configured.\\n\\n    Args:\\n        model_id (str): A user or an organization name and a repo name separated by a `/`.\\n        revision (str, optional): An optional Git revision id which can be a branch name, a tag, or a\\n            commit hash. NOTE: currently only branch and tag name is supported\\n        cache_dir (str, Path, optional): Path to the folder where cached files are stored.\\n        user_agent (str, dict, optional): The user-agent info in the form of a dictionary or a string.\\n        local_files_only (bool, optional): If `True`, avoid downloading the file and return the path to the\\n            local cached file if it exists.\\n        cookies (CookieJar, optional): The cookie of the request, default None.\\n        ignore_file_pattern (`str` or `List`, *optional*, default to `None`):\\n            Any file pattern to be ignored in downloading, like exact file names or file extensions.\\n    Raises:\\n        ValueError: the value details.\\n\\n    Returns:\\n        str: Local folder path (string) of repo snapshot\\n\\n    Note:\\n        Raises the following errors:\\n        - [`EnvironmentError`](https://docs.python.org/3/library/exceptions.html#EnvironmentError)\\n        if `use_auth_token=True` and the token cannot be found.\\n        - [`OSError`](https://docs.python.org/3/library/exceptions.html#OSError) if\\n        ETag cannot be determined.\\n        - [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)\\n        if some parameter value is invalid\\n    \\\"\\\"\\\"\\n\\n    if cache_dir is None:\\n        cache_dir = get_cache_dir()\\n    if isinstance(cache_dir, Path):\\n        cache_dir = str(cache_dir)\\n    temporary_cache_dir = os.path.join(cache_dir, 'temp')\\n    os.makedirs(temporary_cache_dir, exist_ok=True)\\n\\n    group_or_owner, name = model_id_to_group_owner_name(model_id)\\n\\n    cache = ModelFileSystemCache(cache_dir, group_or_owner, name)\\n    if local_files_only:\\n        if len(cache.cached_files) == 0:\\n            raise ValueError('Cannot find the requested files in the cached path and outgoing'\\n                             ' traffic has been disabled. To enable model look-ups and downloads'\\n                             \\\" online, set 'local_files_only' to False.\\\")\\n        logger.warning('We can not confirm the cached file is for revision: %s' % revision)\\n        return cache.get_root_location()  # we can not confirm the cached file is for snapshot 'revision'\\n    else:\\n        # make headers\\n        headers = {'user-agent': ModelScopeConfig.get_user_agent(user_agent=user_agent, )}\\n        _api = HubApi()\\n        if cookies is None:\\n            cookies = ModelScopeConfig.get_cookies()\\n        revision = _api.get_valid_revision(model_id, revision=revision, cookies=cookies)\\n\\n        snapshot_header = headers if 'CI_TEST' in os.environ else {**headers, **{'Snapshot': 'True'}}\\n        model_files = _api.get_model_files(\\n            model_id=model_id,\\n            revision=revision,\\n            recursive=True,\\n            use_cookies=False if cookies is None else cookies,\\n            headers=snapshot_header,\\n        )\\n\\n        if ignore_file_pattern is None:\\n            ignore_file_pattern = []\\n        if isinstance(ignore_file_pattern, str):\\n            ignore_file_pattern = [ignore_file_pattern]\\n\\n        with tempfile.TemporaryDirectory(dir=temporary_cache_dir) as temp_cache_dir:\\n            for model_file in model_files:\\n                if model_file['Type'] == 'tree' or \\\\\\n                        any([re.search(pattern, model_file['Name']) is not None for pattern in ignore_file_pattern]):\\n                    continue\\n                # check model_file is exist in cache, if existed, skip download, otherwise download\\n                if cache.exists(model_file):\\n                    file_name = os.path.basename(model_file['Name'])\\n                    logger.debug(f'File {file_name} already in cache, skip downloading!')\\n                    continue\\n\\n                # get download url\\n                url = get_file_download_url(model_id=model_id, file_path=model_file['Path'], revision=revision)\\n\\n                if MODELSCOPE_PARALLEL_DOWNLOAD_THRESHOLD_MB * 1000 * 1000 < model_file[\\n                        'Size'] and MODELSCOPE_DOWNLOAD_PARALLELS > 1:\\n                    parallel_download(\\n                        url,\\n                        temp_cache_dir,\\n                        model_file['Name'],\\n                        headers=headers,\\n                        cookies=None if cookies is None else cookies.get_dict(),\\n                        file_size=model_file['Size'])\\n                else:\\n                    http_get_file(url, temp_cache_dir, model_file['Name'], headers=headers, cookies=cookies)\\n\\n                # check file integrity\\n                temp_file = os.path.join(temp_cache_dir, model_file['Name'])\\n                if FILE_HASH in model_file:\\n                    file_integrity_validation(temp_file, model_file[FILE_HASH])\\n                # put file to cache\\n                cache.put_file(model_file, temp_file)\\n\\n        return os.path.join(cache.get_root_location())\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport os\\nimport subprocess\\nfrom typing import List, Optional\\n\\nfrom swift.utils.logger import get_logger\\nfrom .constants import MASTER_MODEL_BRANCH\\nfrom .errors import GitError\\n\\nlogger = get_logger()\\n\\n\\nclass Singleton(type):\\n    _instances = {}\\n\\n    def __call__(cls, *args, **kwargs):\\n        if cls not in cls._instances:\\n            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)\\n        return cls._instances[cls]\\n\\n\\nclass GitCommandWrapper(metaclass=Singleton):\\n    \\\"\\\"\\\"Some git operation wrapper\\n    \\\"\\\"\\\"\\n    default_git_path = 'git'  # The default git command line\\n\\n    def __init__(self, path: str = None):\\n        self.git_path = path or self.default_git_path\\n\\n    def _run_git_command(self, *args) -> subprocess.CompletedProcess:\\n        \\\"\\\"\\\"Run git command, if command return 0, return subprocess.response\\n             otherwise raise GitError, message is stdout and stderr.\\n\\n        Args:\\n            args: List of command args.\\n\\n        Raises:\\n            GitError: Exception with stdout and stderr.\\n\\n        Returns:\\n            subprocess.CompletedProcess: the command response\\n        \\\"\\\"\\\"\\n        logger.debug(' '.join(args))\\n        git_env = os.environ.copy()\\n        git_env['GIT_TERMINAL_PROMPT'] = '0'\\n        response = subprocess.run(\\n            [self.git_path, *args],\\n            stdout=subprocess.PIPE,\\n            stderr=subprocess.PIPE,\\n            env=git_env,\\n        )  # compatible for python3.6\\n        try:\\n            response.check_returncode()\\n            return response\\n        except subprocess.CalledProcessError as error:\\n            logger.error('There are error run git command.')\\n            raise GitError('stdout: %s, stderr: %s' % (response.stdout.decode('utf8'), error.stderr.decode('utf8')))\\n\\n    def config_auth_token(self, repo_dir, auth_token):\\n        url = self.get_repo_remote_url(repo_dir)\\n        if '//oauth2' not in url:\\n            auth_url = self._add_token(auth_token, url)\\n            cmd_args = '-C %s remote set-url origin %s' % (repo_dir, auth_url)\\n            cmd_args = cmd_args.split(' ')\\n            rsp = self._run_git_command(*cmd_args)\\n            logger.debug(rsp.stdout.decode('utf8'))\\n\\n    def _add_token(self, token: str, url: str):\\n        if token:\\n            if '//oauth2' not in url:\\n                url = url.replace('//', '//oauth2:%s@' % token)\\n        return url\\n\\n    def remove_token_from_url(self, url: str):\\n        if url and '//oauth2' in url:\\n            start_index = url.find('oauth2')\\n            end_index = url.find('@')\\n            url = url[:start_index] + url[end_index + 1:]\\n        return url\\n\\n    def is_lfs_installed(self):\\n        cmd = ['lfs', 'env']\\n        try:\\n            self._run_git_command(*cmd)\\n            return True\\n        except GitError:\\n            return False\\n\\n    def git_lfs_install(self, repo_dir):\\n        cmd = ['-C', repo_dir, 'lfs', 'install']\\n        try:\\n            self._run_git_command(*cmd)\\n            return True\\n        except GitError:\\n            return False\\n\\n    def clone(self, repo_base_dir: str, token: str, url: str, repo_name: str, branch: Optional[str] = None):\\n        \\\"\\\"\\\" git clone command wrapper.\\n        For public project, token can None, private repo, there must token.\\n\\n        Args:\\n            repo_base_dir (str): The local base dir, the repository will be clone to local_dir/repo_name\\n            token (str): The git token, must be provided for private project.\\n            url (str): The remote url\\n            repo_name (str): The local repository path name.\\n            branch (str, optional): _description_. Defaults to None.\\n\\n        Returns:\\n            The popen response.\\n        \\\"\\\"\\\"\\n        url = self._add_token(token, url)\\n        if branch:\\n            clone_args = '-C %s clone %s %s --branch %s' % (repo_base_dir, url, repo_name, branch)\\n        else:\\n            clone_args = '-C %s clone %s' % (repo_base_dir, url)\\n        logger.debug(clone_args)\\n        clone_args = clone_args.split(' ')\\n        response = self._run_git_command(*clone_args)\\n        logger.debug(response.stdout.decode('utf8'))\\n        return response\\n\\n    def add_user_info(self, repo_base_dir, repo_name):\\n        from .api import ModelScopeConfig\\n        user_name, user_email = ModelScopeConfig.get_user_info()\\n        if user_name and user_email:\\n            # config user.name and user.email if exist\\n            config_user_name_args = '-C %s/%s config user.name %s' % (repo_base_dir, repo_name, user_name)\\n            response = self._run_git_command(*config_user_name_args.split(' '))\\n            logger.debug(response.stdout.decode('utf8'))\\n            config_user_email_args = '-C %s/%s config user.email %s' % (repo_base_dir, repo_name, user_email)\\n            response = self._run_git_command(*config_user_email_args.split(' '))\\n            logger.debug(response.stdout.decode('utf8'))\\n\\n    def add(self, repo_dir: str, files: List[str] = list(), all_files: bool = False):\\n        if all_files:\\n            add_args = '-C %s add -A' % repo_dir\\n        elif len(files) > 0:\\n            files_str = ' '.join(files)\\n            add_args = '-C %s add %s' % (repo_dir, files_str)\\n        add_args = add_args.split(' ')\\n        rsp = self._run_git_command(*add_args)\\n        logger.debug(rsp.stdout.decode('utf8'))\\n        return rsp\\n\\n    def commit(self, repo_dir: str, message: str):\\n        \\\"\\\"\\\"Run git commit command\\n\\n        Args:\\n            repo_dir (str): the repository directory.\\n            message (str): commit message.\\n\\n        Returns:\\n            The command popen response.\\n        \\\"\\\"\\\"\\n        commit_args = ['-C', '%s' % repo_dir, 'commit', '-m', \\\"'%s'\\\" % message]\\n        rsp = self._run_git_command(*commit_args)\\n        logger.info(rsp.stdout.decode('utf8'))\\n        return rsp\\n\\n    def checkout(self, repo_dir: str, revision: str):\\n        cmds = ['-C', '%s' % repo_dir, 'checkout', '%s' % revision]\\n        return self._run_git_command(*cmds)\\n\\n    def new_branch(self, repo_dir: str, revision: str):\\n        cmds = ['-C', '%s' % repo_dir, 'checkout', '-b', revision]\\n        return self._run_git_command(*cmds)\\n\\n    def get_remote_branches(self, repo_dir: str):\\n        cmds = ['-C', '%s' % repo_dir, 'branch', '-r']\\n        rsp = self._run_git_command(*cmds)\\n        info = [line.strip() for line in rsp.stdout.decode('utf8').strip().split(os.linesep)]\\n        if len(info) == 1:\\n            return ['/'.join(info[0].split('/')[1:])]\\n        else:\\n            return ['/'.join(line.split('/')[1:]) for line in info[1:]]\\n\\n    def pull(self, repo_dir: str, remote: str = 'origin', branch: str = 'master'):\\n        cmds = ['-C', repo_dir, 'pull', remote, branch]\\n        return self._run_git_command(*cmds)\\n\\n    def push(self, repo_dir: str, token: str, url: str, local_branch: str, remote_branch: str, force: bool = False):\\n        url = self._add_token(token, url)\\n\\n        push_args = '-C %s push %s %s:%s' % (repo_dir, url, local_branch, remote_branch)\\n        if force:\\n            push_args += ' -f'\\n        push_args = push_args.split(' ')\\n        rsp = self._run_git_command(*push_args)\\n        logger.debug(rsp.stdout.decode('utf8'))\\n        return rsp\\n\\n    def get_repo_remote_url(self, repo_dir: str):\\n        cmd_args = '-C %s config --get remote.origin.url' % repo_dir\\n        cmd_args = cmd_args.split(' ')\\n        rsp = self._run_git_command(*cmd_args)\\n        url = rsp.stdout.decode('utf8')\\n        return url.strip()\\n\\n    def list_lfs_files(self, repo_dir: str):\\n        cmd_args = '-C %s lfs ls-files' % repo_dir\\n        cmd_args = cmd_args.split(' ')\\n        rsp = self._run_git_command(*cmd_args)\\n        out = rsp.stdout.decode('utf8').strip()\\n        files = []\\n        for line in out.split(os.linesep):\\n            files.append(line.split(' ')[-1])\\n\\n        return files\\n\\n    def tag(self, repo_dir: str, tag_name: str, message: str, ref: str = MASTER_MODEL_BRANCH):\\n        cmd_args = ['-C', repo_dir, 'tag', tag_name, '-m', '\\\"%s\\\"' % message, ref]\\n        rsp = self._run_git_command(*cmd_args)\\n        logger.debug(rsp.stdout.decode('utf8'))\\n        return rsp\\n\\n    def push_tag(self, repo_dir: str, tag_name):\\n        cmd_args = ['-C', repo_dir, 'push', 'origin', tag_name]\\n        rsp = self._run_git_command(*cmd_args)\\n        logger.debug(rsp.stdout.decode('utf8'))\\n        return rsp\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# yapf: disable\\n\\nimport datetime\\nimport functools\\nimport os\\nimport pickle\\nimport platform\\nimport re\\nimport shutil\\nimport tempfile\\nimport time\\nimport uuid\\nfrom http import HTTPStatus\\nfrom http.cookiejar import CookieJar\\nfrom os.path import expanduser\\nfrom typing import Dict, List, Optional, Tuple, Union\\n\\nimport pandas as pd\\nimport requests\\nfrom requests import Session\\nfrom requests.adapters import HTTPAdapter, Retry\\n\\nfrom swift.utils.logger import get_logger\\nfrom .constants import (API_HTTP_CLIENT_TIMEOUT, API_RESPONSE_FIELD_DATA, API_RESPONSE_FIELD_EMAIL,\\n                        API_RESPONSE_FIELD_GIT_ACCESS_TOKEN, API_RESPONSE_FIELD_MESSAGE, API_RESPONSE_FIELD_USERNAME,\\n                        DEFAULT_CREDENTIALS_PATH, DEFAULT_MODEL_REVISION, DEFAULT_REPOSITORY_REVISION,\\n                        MASTER_MODEL_BRANCH, MODELSCOPE_CLOUD_ENVIRONMENT, MODELSCOPE_CLOUD_USERNAME, ONE_YEAR_SECONDS,\\n                        REQUESTS_API_HTTP_METHOD, Licenses, ModelVisibility)\\nfrom .errors import (InvalidParameter, NotExistError, NotLoginException, NoValidRevisionError, RequestError,\\n                     handle_http_post_error, handle_http_response, is_ok, raise_for_http_status, raise_on_error)\\nfrom .git import GitCommandWrapper\\nfrom .repository import Repository\\nfrom .utils.utils import get_endpoint, get_release_datetime, model_id_to_group_owner_name\\n\\nlogger = get_logger()\\n\\n\\nclass HubApi:\\n    \\\"\\\"\\\"Model hub api interface.\\n    \\\"\\\"\\\"\\n    def __init__(self, endpoint: Optional[str] = None):\\n        \\\"\\\"\\\"The ModelScope HubApi。\\n\\n        Args:\\n            endpoint (str, optional): The modelscope server http|https address. Defaults to None.\\n        \\\"\\\"\\\"\\n        self.endpoint = endpoint if endpoint is not None else get_endpoint()\\n        self.headers = {'user-agent': ModelScopeConfig.get_user_agent()}\\n        self.session = Session()\\n        retry = Retry(\\n            total=2,\\n            read=2,\\n            connect=2,\\n            backoff_factor=1,\\n            status_forcelist=(500, 502, 503, 504),\\n        )\\n        adapter = HTTPAdapter(max_retries=retry)\\n        self.session.mount('http://', adapter)\\n        self.session.mount('https://', adapter)\\n        # set http timeout\\n        for method in REQUESTS_API_HTTP_METHOD:\\n            setattr(\\n                self.session, method,\\n                functools.partial(\\n                    getattr(self.session, method),\\n                    timeout=API_HTTP_CLIENT_TIMEOUT))\\n\\n    def login(\\n        self,\\n        access_token: str,\\n    ) -> tuple:\\n        \\\"\\\"\\\"Login with your SDK access token, which can be obtained from\\n           https://www.modelscope.cn user center.\\n\\n        Args:\\n            access_token (str): user access token on modelscope.\\n\\n        Returns:\\n            cookies: to authenticate yourself to ModelScope open-api\\n            git_token: token to access your git repository.\\n\\n        Note:\\n            You only have to login once within 30 days.\\n        \\\"\\\"\\\"\\n        path = f'{self.endpoint}/api/v1/login'\\n        r = self.session.post(\\n            path, json={'AccessToken': access_token}, headers=self.headers)\\n        raise_for_http_status(r)\\n        d = r.json()\\n        raise_on_error(d)\\n\\n        token = d[API_RESPONSE_FIELD_DATA][API_RESPONSE_FIELD_GIT_ACCESS_TOKEN]\\n        cookies = r.cookies\\n\\n        # save token and cookie\\n        ModelScopeConfig.save_token(token)\\n        ModelScopeConfig.save_cookies(cookies)\\n        ModelScopeConfig.save_user_info(\\n            d[API_RESPONSE_FIELD_DATA][API_RESPONSE_FIELD_USERNAME],\\n            d[API_RESPONSE_FIELD_DATA][API_RESPONSE_FIELD_EMAIL])\\n\\n        return d[API_RESPONSE_FIELD_DATA][\\n            API_RESPONSE_FIELD_GIT_ACCESS_TOKEN], cookies\\n\\n    def create_model(self,\\n                     model_id: str,\\n                     visibility: Optional[int] = ModelVisibility.PUBLIC,\\n                     license: Optional[str] = Licenses.APACHE_V2,\\n                     chinese_name: Optional[str] = None,\\n                     original_model_id: Optional[str] = '') -> str:\\n        \\\"\\\"\\\"Create model repo at ModelScope Hub.\\n\\n        Args:\\n            model_id (str): The model id\\n            visibility (int, optional): visibility of the model(1-private, 5-public), default 5.\\n            license (str, optional): license of the model, default none.\\n            chinese_name (str, optional): chinese name of the model.\\n            original_model_id (str, optional): the base model id which this model is trained from\\n\\n        Returns:\\n            Name of the model created\\n\\n        Raises:\\n            InvalidParameter: If model_id is invalid.\\n            ValueError: If not login.\\n\\n        Note:\\n            model_id = {owner}/{name}\\n        \\\"\\\"\\\"\\n        if model_id is None:\\n            raise InvalidParameter('model_id is required!')\\n        cookies = ModelScopeConfig.get_cookies()\\n        if cookies is None:\\n            raise ValueError('Token does not exist, please login first.')\\n\\n        path = f'{self.endpoint}/api/v1/models'\\n        owner_or_group, name = model_id_to_group_owner_name(model_id)\\n        body = {\\n            'Path': owner_or_group,\\n            'Name': name,\\n            'ChineseName': chinese_name,\\n            'Visibility': visibility,  # server check\\n            'License': license,\\n            'OriginalModelId': original_model_id,\\n            'TrainId': os.environ.get('MODELSCOPE_TRAIN_ID') or f'swift-{time.time()}',\\n        }\\n        r = self.session.post(\\n            path, json=body, cookies=cookies, headers=self.headers)\\n        handle_http_post_error(r, path, body)\\n        raise_on_error(r.json())\\n        model_repo_url = f'{get_endpoint()}/{model_id}'\\n        return model_repo_url\\n\\n    def delete_model(self, model_id: str):\\n        \\\"\\\"\\\"Delete model_id from ModelScope.\\n\\n        Args:\\n            model_id (str): The model id.\\n\\n        Raises:\\n            ValueError: If not login.\\n\\n        Note:\\n            model_id = {owner}/{name}\\n        \\\"\\\"\\\"\\n        cookies = ModelScopeConfig.get_cookies()\\n        if cookies is None:\\n            raise ValueError('Token does not exist, please login first.')\\n        path = f'{self.endpoint}/api/v1/models/{model_id}'\\n\\n        r = self.session.delete(path, cookies=cookies, headers=self.headers)\\n        raise_for_http_status(r)\\n        raise_on_error(r.json())\\n\\n    def get_model_url(self, model_id: str):\\n        return f'{self.endpoint}/api/v1/models/{model_id}.git'\\n\\n    def get_model(\\n        self,\\n        model_id: str,\\n        revision: Optional[str] = DEFAULT_MODEL_REVISION,\\n    ) -> str:\\n        \\\"\\\"\\\"Get model information at ModelScope\\n\\n        Args:\\n            model_id (str): The model id.\\n            revision (str optional): revision of model.\\n\\n        Returns:\\n            The model detail information.\\n\\n        Raises:\\n            NotExistError: If the model is not exist, will throw NotExistError\\n\\n        Note:\\n            model_id = {owner}/{name}\\n        \\\"\\\"\\\"\\n        cookies = ModelScopeConfig.get_cookies()\\n        owner_or_group, name = model_id_to_group_owner_name(model_id)\\n        if revision:\\n            path = f'{self.endpoint}/api/v1/models/{owner_or_group}/{name}?Revision={revision}'\\n        else:\\n            path = f'{self.endpoint}/api/v1/models/{owner_or_group}/{name}'\\n\\n        r = self.session.get(path, cookies=cookies, headers=self.headers)\\n        handle_http_response(r, logger, cookies, model_id)\\n        if r.status_code == HTTPStatus.OK:\\n            if is_ok(r.json()):\\n                return r.json()[API_RESPONSE_FIELD_DATA]\\n            else:\\n                raise NotExistError(r.json()[API_RESPONSE_FIELD_MESSAGE])\\n        else:\\n            raise_for_http_status(r)\\n\\n    def push_model(self,\\n                   model_id: str,\\n                   model_dir: str,\\n                   visibility: Optional[int] = ModelVisibility.PUBLIC,\\n                   license: Optional[str] = Licenses.APACHE_V2,\\n                   chinese_name: Optional[str] = None,\\n                   commit_message: Optional[str] = 'upload model',\\n                   tag: Optional[str] = None,\\n                   revision: Optional[str] = DEFAULT_REPOSITORY_REVISION,\\n                   original_model_id: Optional[str] = None,\\n                   ignore_file_pattern: Optional[Union[List[str], str]] = None):\\n        \\\"\\\"\\\"Upload model from a given directory to given repository. A valid model directory\\n        must contain a configuration.json file.\\n\\n        This function upload the files in given directory to given repository. If the\\n        given repository is not exists in remote, it will automatically create it with\\n        given visibility, license and chinese_name parameters. If the revision is also\\n        not exists in remote repository, it will create a new branch for it.\\n\\n        This function must be called before calling HubApi's login with a valid token\\n        which can be obtained from ModelScope's website.\\n\\n        Args:\\n            model_id (str):\\n                The model id to be uploaded, caller must have write permission for it.\\n            model_dir(str):\\n                The Absolute Path of the finetune result.\\n            visibility(int, optional):\\n                Visibility of the new created model(1-private, 5-public). If the model is\\n                not exists in ModelScope, this function will create a new model with this\\n                visibility and this parameter is required. You can ignore this parameter\\n                if you make sure the model's existence.\\n            license(`str`, defaults to `None`):\\n                License of the new created model(see License). If the model is not exists\\n                in ModelScope, this function will create a new model with this license\\n                and this parameter is required. You can ignore this parameter if you\\n                make sure the model's existence.\\n            chinese_name(`str`, *optional*, defaults to `None`):\\n                chinese name of the new created model.\\n            commit_message(`str`, *optional*, defaults to `None`):\\n                commit message of the push request.\\n            tag(`str`, *optional*, defaults to `None`):\\n                The tag on this commit\\n            revision (`str`, *optional*, default to DEFAULT_MODEL_REVISION):\\n                which branch to push. If the branch is not exists, It will create a new\\n                branch and push to it.\\n            original_model_id (str, optional): The base model id which this model is trained from\\n            ignore_file_pattern (`Union[List[str], str]`, optional): The file pattern to ignore uploading\\n\\n        Raises:\\n            InvalidParameter: Parameter invalid.\\n            NotLoginException: Not login\\n            ValueError: No configuration.json\\n            Exception: Create failed.\\n        \\\"\\\"\\\"\\n        if model_id is None:\\n            raise InvalidParameter('model_id cannot be empty!')\\n        if model_dir is None:\\n            raise InvalidParameter('model_dir cannot be empty!')\\n        if not os.path.exists(model_dir) or os.path.isfile(model_dir):\\n            raise InvalidParameter('model_dir must be a valid directory.')\\n        cfg_file = os.path.join(model_dir, 'configuration.json')\\n        if not os.path.exists(cfg_file):\\n            raise ValueError(f'{model_dir} must contain a configuration.json.')\\n        cookies = ModelScopeConfig.get_cookies()\\n        if cookies is None:\\n            raise NotLoginException('Must login before upload!')\\n        files_to_save = os.listdir(model_dir)\\n        if ignore_file_pattern is None:\\n            ignore_file_pattern = []\\n        if isinstance(ignore_file_pattern, str):\\n            ignore_file_pattern = [ignore_file_pattern]\\n        try:\\n            self.get_model(model_id=model_id)\\n        except Exception:\\n            if visibility is None or license is None:\\n                raise InvalidParameter(\\n                    'visibility and license cannot be empty if want to create new repo'\\n                )\\n            logger.info('Create new model %s' % model_id)\\n            self.create_model(\\n                model_id=model_id,\\n                visibility=visibility,\\n                license=license,\\n                chinese_name=chinese_name,\\n                original_model_id=original_model_id)\\n        tmp_dir = tempfile.mkdtemp()\\n        git_wrapper = GitCommandWrapper()\\n        try:\\n            repo = Repository(model_dir=tmp_dir, clone_from=model_id)\\n            branches = git_wrapper.get_remote_branches(tmp_dir)\\n            if revision not in branches:\\n                logger.info('Create new branch %s' % revision)\\n                git_wrapper.new_branch(tmp_dir, revision)\\n            git_wrapper.checkout(tmp_dir, revision)\\n            files_in_repo = os.listdir(tmp_dir)\\n            for f in files_in_repo:\\n                if f[0] != '.':\\n                    src = os.path.join(tmp_dir, f)\\n                    if os.path.isfile(src):\\n                        os.remove(src)\\n                    else:\\n                        shutil.rmtree(src, ignore_errors=True)\\n            for f in files_to_save:\\n                if f[0] != '.':\\n                    if any([re.search(pattern, f) is not None for pattern in ignore_file_pattern]):\\n                        continue\\n                    src = os.path.join(model_dir, f)\\n                    if os.path.isdir(src):\\n                        shutil.copytree(src, os.path.join(tmp_dir, f))\\n                    else:\\n                        shutil.copy(src, tmp_dir)\\n            if not commit_message:\\n                date = datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')\\n                commit_message = '[automsg] push model %s to hub at %s' % (\\n                    model_id, date)\\n            repo.push(\\n                commit_message=commit_message,\\n                local_branch=revision,\\n                remote_branch=revision)\\n            if tag is not None:\\n                repo.tag_and_push(tag, tag)\\n        except Exception:\\n            raise\\n        finally:\\n            shutil.rmtree(tmp_dir, ignore_errors=True)\\n\\n    def list_models(self,\\n                    owner_or_group: str,\\n                    page_number: Optional[int] = 1,\\n                    page_size: Optional[int] = 10) -> dict:\\n        \\\"\\\"\\\"List models in owner or group.\\n\\n        Args:\\n            owner_or_group(str): owner or group.\\n            page_number(int, optional): The page number, default: 1\\n            page_size(int, optional): The page size, default: 10\\n\\n        Raises:\\n            RequestError: The request error.\\n\\n        Returns:\\n            dict: {\\\"models\\\": \\\"list of models\\\", \\\"TotalCount\\\": total_number_of_models_in_owner_or_group}\\n        \\\"\\\"\\\"\\n        cookies = ModelScopeConfig.get_cookies()\\n        path = f'{self.endpoint}/api/v1/models/'\\n        r = self.session.put(\\n            path,\\n            data='{\\\"Path\\\":\\\"%s\\\", \\\"PageNumber\\\":%s, \\\"PageSize\\\": %s}' %\\n            (owner_or_group, page_number, page_size),\\n            cookies=cookies,\\n            headers=self.headers)\\n        handle_http_response(r, logger, cookies, 'list_model')\\n        if r.status_code == HTTPStatus.OK:\\n            if is_ok(r.json()):\\n                data = r.json()[API_RESPONSE_FIELD_DATA]\\n                return data\\n            else:\\n                raise RequestError(r.json()[API_RESPONSE_FIELD_MESSAGE])\\n        else:\\n            raise_for_http_status(r)\\n        return None\\n\\n    def _check_cookie(self,\\n                      use_cookies: Union[bool,\\n                                         CookieJar] = False) -> CookieJar:\\n        cookies = None\\n        if isinstance(use_cookies, CookieJar):\\n            cookies = use_cookies\\n        elif use_cookies:\\n            cookies = ModelScopeConfig.get_cookies()\\n            if cookies is None:\\n                raise ValueError('Token does not exist, please login first.')\\n        return cookies\\n\\n    def list_model_revisions(\\n            self,\\n            model_id: str,\\n            cutoff_timestamp: Optional[int] = None,\\n            use_cookies: Union[bool, CookieJar] = False) -> List[str]:\\n        \\\"\\\"\\\"Get model branch and tags.\\n\\n        Args:\\n            model_id (str): The model id\\n            cutoff_timestamp (int): Tags created before the cutoff will be included.\\n                                    The timestamp is represented by the seconds elapsed from the epoch time.\\n            use_cookies (Union[bool, CookieJar], optional): If is cookieJar, we will use this cookie, if True,\\n                        will load cookie from local. Defaults to False.\\n\\n        Returns:\\n            Tuple[List[str], List[str]]: Return list of branch name and tags\\n        \\\"\\\"\\\"\\n        cookies = self._check_cookie(use_cookies)\\n        if cutoff_timestamp is None:\\n            cutoff_timestamp = get_release_datetime()\\n        path = f'{self.endpoint}/api/v1/models/{model_id}/revisions?EndTime=%s' % cutoff_timestamp\\n        r = self.session.get(path, cookies=cookies, headers=self.headers)\\n        handle_http_response(r, logger, cookies, model_id)\\n        d = r.json()\\n        raise_on_error(d)\\n        info = d[API_RESPONSE_FIELD_DATA]\\n        # tags returned from backend are guaranteed to be ordered by create-time\\n        tags = [x['Revision'] for x in info['RevisionMap']['Tags']\\n                ] if info['RevisionMap']['Tags'] else []\\n        return tags\\n\\n    def get_valid_revision(self,\\n                           model_id: str,\\n                           revision=None,\\n                           cookies: Optional[CookieJar] = None):\\n        release_timestamp = get_release_datetime()\\n        current_timestamp = int(round(datetime.datetime.now().timestamp()))\\n        # for active development in library codes (non-release-branches), release_timestamp\\n        # is set to be a far-away-time-in-the-future, to ensure that we shall\\n        # get the master-HEAD version from model repo by default (when no revision is provided)\\n        if release_timestamp > current_timestamp + ONE_YEAR_SECONDS:\\n            branches, tags = self.get_model_branches_and_tags(\\n                model_id, use_cookies=False if cookies is None else cookies)\\n            if revision is None:\\n                revision = MASTER_MODEL_BRANCH\\n                logger.info(\\n                    'Model revision not specified, use default: %s in development mode'\\n                    % revision)\\n            if revision not in branches and revision not in tags:\\n                raise NotExistError('The model: %s has no revision : %s .' % (model_id, revision))\\n            logger.info('Development mode use revision: %s' % revision)\\n        else:\\n            if revision is None:  # user not specified revision, use latest revision before release time\\n                revisions = self.list_model_revisions(\\n                    model_id,\\n                    cutoff_timestamp=release_timestamp,\\n                    use_cookies=False if cookies is None else cookies)\\n                if len(revisions) == 0:\\n                    raise NoValidRevisionError(\\n                        'The model: %s has no valid revision!' % model_id)\\n                # tags (revisions) returned from backend are guaranteed to be ordered by create-time\\n                # we shall obtain the latest revision created earlier than release version of this branch\\n                revision = revisions[0]\\n                logger.info(\\n                    'Model revision not specified, use the latest revision: %s'\\n                    % revision)\\n            else:\\n                # use user-specified revision\\n                revisions = self.list_model_revisions(\\n                    model_id,\\n                    cutoff_timestamp=current_timestamp,\\n                    use_cookies=False if cookies is None else cookies)\\n                if revision not in revisions:\\n                    raise NotExistError('The model: %s has no revision: %s !' %\\n                                        (model_id, revision))\\n                logger.info('Use user-specified model revision: %s' % revision)\\n        return revision\\n\\n    def get_model_branches_and_tags(\\n        self,\\n        model_id: str,\\n        use_cookies: Union[bool, CookieJar] = False,\\n    ) -> Tuple[List[str], List[str]]:\\n        \\\"\\\"\\\"Get model branch and tags.\\n\\n        Args:\\n            model_id (str): The model id\\n            use_cookies (Union[bool, CookieJar], optional): If is cookieJar, we will use this cookie, if True,\\n                        will load cookie from local. Defaults to False.\\n\\n        Returns:\\n            Tuple[List[str], List[str]]: Return list of branch name and tags\\n        \\\"\\\"\\\"\\n        cookies = self._check_cookie(use_cookies)\\n\\n        path = f'{self.endpoint}/api/v1/models/{model_id}/revisions'\\n        r = self.session.get(path, cookies=cookies, headers=self.headers)\\n        handle_http_response(r, logger, cookies, model_id)\\n        d = r.json()\\n        raise_on_error(d)\\n        info = d[API_RESPONSE_FIELD_DATA]\\n        branches = [x['Revision'] for x in info['RevisionMap']['Branches']\\n                    ] if info['RevisionMap']['Branches'] else []\\n        tags = [x['Revision'] for x in info['RevisionMap']['Tags']\\n                ] if info['RevisionMap']['Tags'] else []\\n        return branches, tags\\n\\n    def get_model_files(self,\\n                        model_id: str,\\n                        revision: Optional[str] = DEFAULT_MODEL_REVISION,\\n                        root: Optional[str] = None,\\n                        recursive: Optional[str] = False,\\n                        use_cookies: Union[bool, CookieJar] = False,\\n                        headers: Optional[dict] = {}) -> List[dict]:\\n        \\\"\\\"\\\"List the models files.\\n\\n        Args:\\n            model_id (str): The model id\\n            revision (Optional[str], optional): The branch or tag name.\\n            root (Optional[str], optional): The root path. Defaults to None.\\n            recursive (Optional[str], optional): Is recursive list files. Defaults to False.\\n            use_cookies (Union[bool, CookieJar], optional): If is cookieJar, we will use this cookie, if True,\\n                        will load cookie from local. Defaults to False.\\n            headers: request headers\\n\\n        Returns:\\n            List[dict]: Model file list.\\n        \\\"\\\"\\\"\\n        if revision:\\n            path = '%s/api/v1/models/%s/repo/files?Revision=%s&Recursive=%s' % (\\n                self.endpoint, model_id, revision, recursive)\\n        else:\\n            path = '%s/api/v1/models/%s/repo/files?Recursive=%s' % (\\n                self.endpoint, model_id, recursive)\\n        cookies = self._check_cookie(use_cookies)\\n        if root is not None:\\n            path = path + f'&Root={root}'\\n        headers = self.headers if headers is None else headers\\n        r = self.session.get(\\n            path, cookies=cookies, headers=headers)\\n\\n        handle_http_response(r, logger, cookies, model_id)\\n        d = r.json()\\n        raise_on_error(d)\\n\\n        files = []\\n        for file in d[API_RESPONSE_FIELD_DATA]['Files']:\\n            if file['Name'] == '.gitignore' or file['Name'] == '.gitattributes':\\n                continue\\n\\n            files.append(file)\\n        return files\\n\\n    @staticmethod\\n    def fetch_meta_files_from_url(url, out_path, chunk_size=1024, mode='reuse_dataset_if_exists'):\\n        \\\"\\\"\\\"\\n        Fetch the meta-data files from the url, e.g. csv/jsonl files.\\n        \\\"\\\"\\\"\\n        import hashlib\\n        import json\\n        from tqdm import tqdm\\n        out_path = os.path.join(out_path, hashlib.md5(url.encode(encoding='UTF-8')).hexdigest())\\n        if mode == 'force_redownload' and os.path.exists(out_path):\\n            os.remove(out_path)\\n        if os.path.exists(out_path):\\n            logger.info(f'Reusing cached meta-data file: {out_path}')\\n            return out_path\\n        cookies = ModelScopeConfig.get_cookies()\\n\\n        # Make the request and get the response content as TextIO\\n        logger.info('Loading meta-data file ...')\\n        response = requests.get(url, cookies=cookies, stream=True)\\n        total_size = int(response.headers.get('content-length', 0))\\n        progress = tqdm(total=total_size, dynamic_ncols=True)\\n\\n        def get_chunk(resp):\\n            chunk_data = []\\n            for data in resp.iter_lines():\\n                data = data.decode('utf-8')\\n                chunk_data.append(data)\\n                if len(chunk_data) >= chunk_size:\\n                    yield chunk_data\\n                    chunk_data = []\\n            yield chunk_data\\n\\n        iter_num = 0\\n        with open(out_path, 'a') as f:\\n            for chunk in get_chunk(response):\\n                progress.update(len(chunk))\\n                if url.endswith('jsonl'):\\n                    chunk = [json.loads(line) for line in chunk if line.strip()]\\n                    if len(chunk) == 0:\\n                        continue\\n                    if iter_num == 0:\\n                        with_header = True\\n                    else:\\n                        with_header = False\\n                    chunk_df = pd.DataFrame(chunk)\\n                    chunk_df.to_csv(f, index=False, header=with_header)\\n                    iter_num += 1\\n                else:\\n                    # csv or others\\n                    for line in chunk:\\n                        f.write(line + '\\\\n')\\n        progress.close()\\n\\n        return out_path\\n\\n\\nclass ModelScopeConfig:\\n    path_credential = expanduser(DEFAULT_CREDENTIALS_PATH)\\n    COOKIES_FILE_NAME = 'cookies'\\n    GIT_TOKEN_FILE_NAME = 'git_token'\\n    USER_INFO_FILE_NAME = 'user'\\n    USER_SESSION_ID_FILE_NAME = 'session'\\n\\n    @staticmethod\\n    def make_sure_credential_path_exist():\\n        os.makedirs(ModelScopeConfig.path_credential, exist_ok=True)\\n\\n    @staticmethod\\n    def save_cookies(cookies: CookieJar):\\n        ModelScopeConfig.make_sure_credential_path_exist()\\n        with open(\\n                os.path.join(ModelScopeConfig.path_credential,\\n                             ModelScopeConfig.COOKIES_FILE_NAME), 'wb+') as f:\\n            pickle.dump(cookies, f)\\n\\n    @staticmethod\\n    def get_cookies():\\n        cookies_path = os.path.join(ModelScopeConfig.path_credential,\\n                                    ModelScopeConfig.COOKIES_FILE_NAME)\\n        if os.path.exists(cookies_path):\\n            with open(cookies_path, 'rb') as f:\\n                cookies = pickle.load(f)\\n                for cookie in cookies:\\n                    if cookie.is_expired():\\n                        return None\\n                return cookies\\n        return None\\n\\n    @staticmethod\\n    def get_user_session_id():\\n        session_path = os.path.join(ModelScopeConfig.path_credential,\\n                                    ModelScopeConfig.USER_SESSION_ID_FILE_NAME)\\n        session_id = ''\\n        if os.path.exists(session_path):\\n            with open(session_path, 'rb') as f:\\n                session_id = str(f.readline().strip(), encoding='utf-8')\\n                return session_id\\n        if session_id == '' or len(session_id) != 32:\\n            session_id = str(uuid.uuid4().hex)\\n            ModelScopeConfig.make_sure_credential_path_exist()\\n            with open(session_path, 'w+') as wf:\\n                wf.write(session_id)\\n\\n        return session_id\\n\\n    @staticmethod\\n    def save_token(token: str):\\n        ModelScopeConfig.make_sure_credential_path_exist()\\n        with open(\\n                os.path.join(ModelScopeConfig.path_credential,\\n                             ModelScopeConfig.GIT_TOKEN_FILE_NAME), 'w+') as f:\\n            f.write(token)\\n\\n    @staticmethod\\n    def save_user_info(user_name: str, user_email: str):\\n        ModelScopeConfig.make_sure_credential_path_exist()\\n        with open(\\n                os.path.join(ModelScopeConfig.path_credential,\\n                             ModelScopeConfig.USER_INFO_FILE_NAME), 'w+') as f:\\n            f.write('%s:%s' % (user_name, user_email))\\n\\n    @staticmethod\\n    def get_user_info() -> Tuple[str, str]:\\n        try:\\n            with open(\\n                    os.path.join(ModelScopeConfig.path_credential,\\n                                 ModelScopeConfig.USER_INFO_FILE_NAME),\\n                    'r',\\n                    encoding='utf-8') as f:\\n                info = f.read()\\n                return info.split(':')[0], info.split(':')[1]\\n        except FileNotFoundError:\\n            pass\\n        return None, None\\n\\n    @staticmethod\\n    def get_token() -> Optional[str]:\\n        \\\"\\\"\\\"\\n        Get token or None if not existent.\\n\\n        Returns:\\n            `str` or `None`: The token, `None` if it doesn't exist.\\n\\n        \\\"\\\"\\\"\\n        token = None\\n        try:\\n            with open(\\n                    os.path.join(ModelScopeConfig.path_credential,\\n                                 ModelScopeConfig.GIT_TOKEN_FILE_NAME),\\n                    'r',\\n                    encoding='utf-8') as f:\\n                token = f.read()\\n        except FileNotFoundError:\\n            pass\\n        return token\\n\\n    @staticmethod\\n    def get_user_agent(user_agent: Union[Dict, str, None] = None, ) -> str:\\n        \\\"\\\"\\\"Formats a user-agent string with basic info about a request.\\n\\n        Args:\\n            user_agent (`str`, `dict`, *optional*):\\n                The user agent info in the form of a dictionary or a single string.\\n\\n        Returns:\\n            The formatted user-agent string.\\n        \\\"\\\"\\\"\\n\\n        # include some more telemetrics when executing in dedicated\\n        # cloud containers\\n        env = 'custom'\\n        if MODELSCOPE_CLOUD_ENVIRONMENT in os.environ:\\n            env = os.environ[MODELSCOPE_CLOUD_ENVIRONMENT]\\n        user_name = 'unknown'\\n        if MODELSCOPE_CLOUD_USERNAME in os.environ:\\n            user_name = os.environ[MODELSCOPE_CLOUD_USERNAME]\\n\\n        from swift import __version__\\n        ua = 'modelscope/%s; python/%s; session_id/%s; platform/%s; processor/%s; env/%s; user/%s' % (\\n            __version__,\\n            platform.python_version(),\\n            ModelScopeConfig.get_user_session_id(),\\n            platform.platform(),\\n            platform.processor(),\\n            env,\\n            user_name,\\n        )\\n        if isinstance(user_agent, dict):\\n            ua += '; ' + '; '.join(f'{k}/{v}' for k, v in user_agent.items())\\n        elif isinstance(user_agent, str):\\n            ua += '; ' + user_agent\\n        return ua\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom .api import HubApi, ModelScopeConfig\\nfrom .push_to_hub import push_to_hub, push_to_hub_async, push_to_hub_in_queue\\nfrom .repository import Repository\\nfrom .snapshot_download import snapshot_download\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport hashlib\\nimport os\\nfrom datetime import datetime\\nfrom pathlib import Path\\nfrom typing import Optional\\n\\nfrom swift.hub.constants import (DEFAULT_MODELSCOPE_DOMAIN, DEFAULT_MODELSCOPE_GROUP, MODEL_ID_SEPARATOR,\\n                                 MODELSCOPE_SDK_DEBUG, MODELSCOPE_URL_SCHEME)\\nfrom swift.hub.errors import FileIntegrityError\\nfrom swift.utils.logger import get_logger\\n\\nlogger = get_logger()\\n\\n\\ndef get_default_cache_dir():\\n    \\\"\\\"\\\"\\n    default base dir: '~/.cache/modelscope'\\n    \\\"\\\"\\\"\\n    default_cache_dir = Path.home().joinpath('.cache', 'modelscope')\\n    return default_cache_dir\\n\\n\\ndef model_id_to_group_owner_name(model_id):\\n    if MODEL_ID_SEPARATOR in model_id:\\n        group_or_owner = model_id.split(MODEL_ID_SEPARATOR)[0]\\n        name = model_id.split(MODEL_ID_SEPARATOR)[1]\\n    else:\\n        group_or_owner = DEFAULT_MODELSCOPE_GROUP\\n        name = model_id\\n    return group_or_owner, name\\n\\n\\ndef get_cache_dir(model_id: Optional[str] = None):\\n    \\\"\\\"\\\"cache dir precedence:\\n        function parameter > environment > ~/.cache/modelscope/hub\\n\\n    Args:\\n        model_id (str, optional): The model id.\\n\\n    Returns:\\n        str: the model_id dir if model_id not None, otherwise cache root dir.\\n    \\\"\\\"\\\"\\n    default_cache_dir = get_default_cache_dir()\\n    base_path = os.getenv('MODELSCOPE_CACHE', os.path.join(default_cache_dir, 'hub'))\\n    return base_path if model_id is None else os.path.join(base_path, model_id + '/')\\n\\n\\ndef get_release_datetime():\\n    if MODELSCOPE_SDK_DEBUG in os.environ:\\n        rt = int(round(datetime.now().timestamp()))\\n    else:\\n        from swift import version\\n        rt = int(round(datetime.strptime(version.__release_datetime__, '%Y-%m-%d %H:%M:%S').timestamp()))\\n    return rt\\n\\n\\ndef get_endpoint():\\n    modelscope_domain = os.getenv('MODELSCOPE_DOMAIN', DEFAULT_MODELSCOPE_DOMAIN)\\n    return MODELSCOPE_URL_SCHEME + modelscope_domain\\n\\n\\ndef compute_hash(file_path):\\n    BUFFER_SIZE = 1024 * 64  # 64k buffer size\\n    sha256_hash = hashlib.sha256()\\n    with open(file_path, 'rb') as f:\\n        while True:\\n            data = f.read(BUFFER_SIZE)\\n            if not data:\\n                break\\n            sha256_hash.update(data)\\n    return sha256_hash.hexdigest()\\n\\n\\ndef file_integrity_validation(file_path, expected_sha256):\\n    \\\"\\\"\\\"Validate the file hash is expected, if not, delete the file\\n\\n    Args:\\n        file_path (str): The file to validate\\n        expected_sha256 (str): The expected sha256 hash\\n\\n    Raises:\\n        FileIntegrityError: If file_path hash is not expected.\\n\\n    \\\"\\\"\\\"\\n    file_sha256 = compute_hash(file_path)\\n    if not file_sha256 == expected_sha256:\\n        os.remove(file_path)\\n        msg = 'File %s integrity check failed, the download may be incomplete, please try again.' % file_path\\n        logger.error(msg)\\n        raise FileIntegrityError(msg)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport hashlib\\nimport os\\nimport pickle\\nimport tempfile\\nfrom shutil import move, rmtree\\n\\nfrom swift.hub.constants import MODEL_META_FILE_NAME, MODEL_META_MODEL_ID\\nfrom swift.utils.logger import get_logger\\n\\nlogger = get_logger()\\n\\\"\\\"\\\"Implements caching functionality, used internally only\\n\\\"\\\"\\\"\\n\\n\\nclass FileSystemCache(object):\\n    KEY_FILE_NAME = '.msc'\\n    \\\"\\\"\\\"Local file cache.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        cache_root_location: str,\\n        **kwargs,\\n    ):\\n        \\\"\\\"\\\"Base file system cache interface.\\n\\n        Args:\\n            cache_root_location (str): The root location to store files.\\n            kwargs(dict): The keyword arguments.\\n        \\\"\\\"\\\"\\n        os.makedirs(cache_root_location, exist_ok=True)\\n        self.cache_root_location = cache_root_location\\n        self.load_cache()\\n\\n    def get_root_location(self):\\n        return self.cache_root_location\\n\\n    def load_cache(self):\\n        self.cached_files = []\\n        cache_keys_file_path = os.path.join(self.cache_root_location, FileSystemCache.KEY_FILE_NAME)\\n        if os.path.exists(cache_keys_file_path):\\n            with open(cache_keys_file_path, 'rb') as f:\\n                self.cached_files = pickle.load(f)\\n\\n    def save_cached_files(self):\\n        \\\"\\\"\\\"Save cache metadata.\\\"\\\"\\\"\\n        # save new meta to tmp and move to KEY_FILE_NAME\\n        cache_keys_file_path = os.path.join(self.cache_root_location, FileSystemCache.KEY_FILE_NAME)\\n        # TODO: Sync file write\\n        fd, fn = tempfile.mkstemp()\\n        with open(fd, 'wb') as f:\\n            pickle.dump(self.cached_files, f)\\n        move(fn, cache_keys_file_path)\\n\\n    def get_file(self, key):\\n        \\\"\\\"\\\"Check the key is in the cache, if exist, return the file, otherwise return None.\\n\\n        Args:\\n            key(str): The cache key.\\n\\n        Raises:\\n            None\\n        \\\"\\\"\\\"\\n        pass\\n\\n    def put_file(self, key, location):\\n        \\\"\\\"\\\"Put file to the cache.\\n\\n        Args:\\n            key (str): The cache key\\n            location (str): Location of the file, we will move the file to cache.\\n\\n        Raises:\\n            None\\n        \\\"\\\"\\\"\\n        pass\\n\\n    def remove_key(self, key):\\n        \\\"\\\"\\\"Remove cache key in index, The file is removed manually\\n\\n        Args:\\n            key (dict): The cache key.\\n        \\\"\\\"\\\"\\n        if key in self.cached_files:\\n            self.cached_files.remove(key)\\n            self.save_cached_files()\\n\\n    def exists(self, key):\\n        for cache_file in self.cached_files:\\n            if cache_file == key:\\n                return True\\n\\n        return False\\n\\n    def clear_cache(self):\\n        \\\"\\\"\\\"Remove all files and metadata from the cache\\n        In the case of multiple cache locations, this clears only the last one,\\n        which is assumed to be the read/write one.\\n        \\\"\\\"\\\"\\n        rmtree(self.cache_root_location)\\n        self.load_cache()\\n\\n    def hash_name(self, key):\\n        return hashlib.sha256(key.encode()).hexdigest()\\n\\n\\nclass ModelFileSystemCache(FileSystemCache):\\n    \\\"\\\"\\\"Local cache file layout\\n       cache_root/owner/model_name/individual cached files and cache index file '.mcs'\\n       Save only one version for each file.\\n    \\\"\\\"\\\"\\n\\n    def __init__(self, cache_root, owner=None, name=None):\\n        \\\"\\\"\\\"Put file to the cache\\n        Args:\\n            cache_root(`str`): The modelscope local cache root(default: ~/.cache/modelscope/)\\n            owner(`str`): The model owner.\\n            name('str'): The name of the model\\n        Returns:\\n        Raises:\\n            None\\n        <Tip>\\n            model_id = {owner}/{name}\\n        </Tip>\\n        \\\"\\\"\\\"\\n        if owner is None or name is None:\\n            # get model meta from\\n            super().__init__(os.path.join(cache_root))\\n            self.load_model_meta()\\n        else:\\n            super().__init__(os.path.join(cache_root, owner, name))\\n            self.model_meta = {MODEL_META_MODEL_ID: '%s/%s' % (owner, name)}\\n            self.save_model_meta()\\n\\n    def load_model_meta(self):\\n        meta_file_path = os.path.join(self.cache_root_location, MODEL_META_FILE_NAME)\\n        if os.path.exists(meta_file_path):\\n            with open(meta_file_path, 'rb') as f:\\n                self.model_meta = pickle.load(f)\\n        else:\\n            self.model_meta = {MODEL_META_MODEL_ID: 'unknown'}\\n\\n    def get_model_id(self):\\n        return self.model_meta[MODEL_META_MODEL_ID]\\n\\n    def save_model_meta(self):\\n        meta_file_path = os.path.join(self.cache_root_location, MODEL_META_FILE_NAME)\\n        with open(meta_file_path, 'wb') as f:\\n            pickle.dump(self.model_meta, f)\\n\\n    def get_file_by_path(self, file_path):\\n        \\\"\\\"\\\"Retrieve the cache if there is file match the path.\\n\\n        Args:\\n            file_path (str): The file path in the model.\\n\\n        Returns:\\n            path: the full path of the file.\\n        \\\"\\\"\\\"\\n        for cached_file in self.cached_files:\\n            if file_path == cached_file['Path']:\\n                cached_file_path = os.path.join(self.cache_root_location, cached_file['Path'])\\n                if os.path.exists(cached_file_path):\\n                    return cached_file_path\\n                else:\\n                    self.remove_key(cached_file)\\n\\n        return None\\n\\n    def get_file_by_path_and_commit_id(self, file_path, commit_id):\\n        \\\"\\\"\\\"Retrieve the cache if there is file match the path.\\n\\n        Args:\\n            file_path (str): The file path in the model.\\n            commit_id (str): The commit id of the file\\n\\n        Returns:\\n            path: the full path of the file.\\n        \\\"\\\"\\\"\\n        for cached_file in self.cached_files:\\n            if file_path == cached_file['Path'] and \\\\\\n               (cached_file['Revision'].startswith(commit_id) or commit_id.startswith(cached_file['Revision'])):\\n                cached_file_path = os.path.join(self.cache_root_location, cached_file['Path'])\\n                if os.path.exists(cached_file_path):\\n                    return cached_file_path\\n                else:\\n                    self.remove_key(cached_file)\\n\\n        return None\\n\\n    def get_file_by_info(self, model_file_info):\\n        \\\"\\\"\\\"Check if exist cache file.\\n\\n        Args:\\n            model_file_info (ModelFileInfo): The file information of the file.\\n\\n        Returns:\\n            str: The file path.\\n        \\\"\\\"\\\"\\n        cache_key = self.__get_cache_key(model_file_info)\\n        for cached_file in self.cached_files:\\n            if cached_file == cache_key:\\n                orig_path = os.path.join(self.cache_root_location, cached_file['Path'])\\n                if os.path.exists(orig_path):\\n                    return orig_path\\n                else:\\n                    self.remove_key(cached_file)\\n                    break\\n\\n        return None\\n\\n    def __get_cache_key(self, model_file_info):\\n        cache_key = {\\n            'Path': model_file_info['Path'],\\n            'Revision': model_file_info['Revision'],  # commit id\\n        }\\n        return cache_key\\n\\n    def exists(self, model_file_info):\\n        \\\"\\\"\\\"Check the file is cached or not.\\n\\n        Args:\\n            model_file_info (CachedFileInfo): The cached file info\\n\\n        Returns:\\n            bool: If exists return True otherwise False\\n        \\\"\\\"\\\"\\n        key = self.__get_cache_key(model_file_info)\\n        is_exists = False\\n        for cached_key in self.cached_files:\\n            if cached_key['Path'] == key['Path'] and (cached_key['Revision'].startswith(key['Revision'])\\n                                                      or key['Revision'].startswith(cached_key['Revision'])):\\n                is_exists = True\\n                break\\n        file_path = os.path.join(self.cache_root_location, model_file_info['Path'])\\n        if is_exists:\\n            if os.path.exists(file_path):\\n                return True\\n            else:\\n                self.remove_key(model_file_info)  # someone may manual delete the file\\n        return False\\n\\n    def remove_if_exists(self, model_file_info):\\n        \\\"\\\"\\\"We in cache, remove it.\\n\\n        Args:\\n            model_file_info (ModelFileInfo): The model file information from server.\\n        \\\"\\\"\\\"\\n        for cached_file in self.cached_files:\\n            if cached_file['Path'] == model_file_info['Path']:\\n                self.remove_key(cached_file)\\n                file_path = os.path.join(self.cache_root_location, cached_file['Path'])\\n                if os.path.exists(file_path):\\n                    os.remove(file_path)\\n                break\\n\\n    def put_file(self, model_file_info, model_file_location):\\n        \\\"\\\"\\\"Put model on model_file_location to cache, the model first download to /tmp, and move to cache.\\n\\n        Args:\\n            model_file_info (str): The file description returned by get_model_files.\\n            model_file_location (str): The location of the temporary file.\\n\\n        Returns:\\n            str: The location of the cached file.\\n        \\\"\\\"\\\"\\n        self.remove_if_exists(model_file_info)  # backup old revision\\n        cache_key = self.__get_cache_key(model_file_info)\\n        cache_full_path = os.path.join(self.cache_root_location,\\n                                       cache_key['Path'])  # Branch and Tag do not have same name.\\n        cache_file_dir = os.path.dirname(cache_full_path)\\n        if not os.path.exists(cache_file_dir):\\n            os.makedirs(cache_file_dir, exist_ok=True)\\n        # We can't make operation transaction\\n        move(model_file_location, cache_full_path)\\n        self.cached_files.append(cache_key)\\n        self.save_cached_files()\\n        return cache_full_path\\n\\n\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom .app import webui_main\\n\\n\\nimport os\\nimport shutil\\nimport sys\\nimport time\\nimport typing\\nfrom dataclasses import fields\\nfrom datetime import datetime\\nfrom functools import wraps\\nfrom typing import Any, Dict, List, OrderedDict, Type\\n\\nimport json\\nfrom gradio import Accordion, Audio, Button, Checkbox, Dropdown, File, Image, Slider, Tab, TabItem, Textbox, Video\\nfrom modelscope.hub.utils.utils import get_cache_dir\\n\\nfrom swift.llm.utils.model import MODEL_MAPPING, ModelType\\n\\nall_langs = ['zh', 'en']\\nbuilder: Type['BaseUI'] = None\\nbase_builder: Type['BaseUI'] = None\\n\\n\\ndef update_data(fn):\\n\\n    @wraps(fn)\\n    def wrapper(*args, **kwargs):\\n        elem_id = kwargs.get('elem_id', None)\\n        self = args[0]\\n\\n        if builder is not None:\\n            choices = base_builder.choice(elem_id)\\n            if choices:\\n                kwargs['choices'] = choices\\n\\n        if not isinstance(self, (Tab, TabItem, Accordion)) and 'interactive' not in kwargs:  # noqa\\n            kwargs['interactive'] = True\\n\\n        if 'is_list' in kwargs:\\n            self.is_list = kwargs.pop('is_list')\\n\\n        if base_builder and base_builder.default(elem_id) is not None:\\n            if os.environ.get('MODELSCOPE_ENVIRONMENT') == 'studio' and kwargs.get('value') is not None:\\n                pass\\n            else:\\n                kwargs['value'] = base_builder.default(elem_id)\\n\\n        if builder is not None:\\n            if elem_id in builder.locales(builder.lang):\\n                values = builder.locale(elem_id, builder.lang)\\n                if 'info' in values:\\n                    kwargs['info'] = values['info']\\n                if 'value' in values:\\n                    kwargs['value'] = values['value']\\n                if 'label' in values:\\n                    kwargs['label'] = values['label']\\n                argument = base_builder.argument(elem_id)\\n                if argument and 'label' in kwargs:\\n                    kwargs['label'] = kwargs['label'] + f'({argument})'\\n\\n        kwargs['elem_classes'] = 'align'\\n        ret = fn(self, **kwargs)\\n        self.constructor_args.update(kwargs)\\n\\n        if builder is not None:\\n            builder.element_dict[elem_id] = self\\n        return ret\\n\\n    return wrapper\\n\\n\\nTextbox.__init__ = update_data(Textbox.__init__)\\nDropdown.__init__ = update_data(Dropdown.__init__)\\nCheckbox.__init__ = update_data(Checkbox.__init__)\\nSlider.__init__ = update_data(Slider.__init__)\\nTabItem.__init__ = update_data(TabItem.__init__)\\nAccordion.__init__ = update_data(Accordion.__init__)\\nButton.__init__ = update_data(Button.__init__)\\nFile.__init__ = update_data(File.__init__)\\nImage.__init__ = update_data(Image.__init__)\\nVideo.__init__ = update_data(Video.__init__)\\nAudio.__init__ = update_data(Audio.__init__)\\n\\n\\nclass BaseUI:\\n\\n    choice_dict: Dict[str, List] = {}\\n    default_dict: Dict[str, Any] = {}\\n    locale_dict: Dict[str, Dict] = {}\\n    element_dict: Dict[str, Dict] = {}\\n    arguments: Dict[str, str] = {}\\n    sub_ui: List[Type['BaseUI']] = []\\n    group: str = None\\n    lang: str = all_langs[0]\\n    int_regex = r'^[-+]?[0-9]+$'\\n    float_regex = r'[-+]?(?:\\\\d*\\\\.*\\\\d+)'\\n    bool_regex = r'^(T|t)rue$|^(F|f)alse$'\\n    cache_dir = os.path.join(get_cache_dir(), 'swift-web-ui')\\n    os.makedirs(cache_dir, exist_ok=True)\\n    quote = '\\\\'' if sys.platform != 'win32' else '\\\"'\\n\\n    @classmethod\\n    def build_ui(cls, base_tab: Type['BaseUI']):\\n        \\\"\\\"\\\"Build UI\\\"\\\"\\\"\\n        global builder, base_builder\\n        cls.element_dict = {}\\n        old_builder = builder\\n        old_base_builder = base_builder\\n        builder = cls\\n        base_builder = base_tab\\n        cls.do_build_ui(base_tab)\\n        builder = old_builder\\n        base_builder = old_base_builder\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        \\\"\\\"\\\"Build UI\\\"\\\"\\\"\\n        pass\\n\\n    @classmethod\\n    def save_cache(cls, key, value):\\n        timestamp = str(int(time.time()))\\n        filename = os.path.join(cls.cache_dir, key + '-' + timestamp)\\n        with open(filename, 'w') as f:\\n            json.dump(value, f)\\n\\n    @classmethod\\n    def list_cache(cls, key):\\n        files = []\\n        for _, _, filenames in os.walk(cls.cache_dir):\\n            for filename in filenames:\\n                if filename.startswith(key):\\n                    idx = filename.rfind('-')\\n                    key, ts = filename[:idx], filename[idx + 1:]\\n                    dt_object = datetime.fromtimestamp(int(ts))\\n                    formatted_time = dt_object.strftime('%Y/%m/%d %H:%M:%S')\\n                    files.append(formatted_time)\\n        return sorted(files, reverse=True)\\n\\n    @classmethod\\n    def load_cache(cls, key, timestamp):\\n        dt_object = datetime.strptime(timestamp, '%Y/%m/%d %H:%M:%S')\\n        timestamp = int(dt_object.timestamp())\\n        filename = key + '-' + str(timestamp)\\n        with open(os.path.join(cls.cache_dir, filename), 'r') as f:\\n            return json.load(f)\\n\\n    @classmethod\\n    def clear_cache(cls, key):\\n        for _, _, filenames in os.walk(cls.cache_dir):\\n            for filename in filenames:\\n                if filename.startswith(key):\\n                    os.remove(os.path.join(cls.cache_dir, filename))\\n\\n    @classmethod\\n    def choice(cls, elem_id):\\n        \\\"\\\"\\\"Get choice by elem_id\\\"\\\"\\\"\\n        for sub_ui in BaseUI.sub_ui:\\n            _choice = sub_ui.choice(elem_id)\\n            if _choice:\\n                return _choice\\n        return cls.choice_dict.get(elem_id, [])\\n\\n    @classmethod\\n    def default(cls, elem_id):\\n        \\\"\\\"\\\"Get choice by elem_id\\\"\\\"\\\"\\n        for sub_ui in BaseUI.sub_ui:\\n            _choice = sub_ui.default(elem_id)\\n            if _choice:\\n                return _choice\\n        return cls.default_dict.get(elem_id, None)\\n\\n    @classmethod\\n    def locale(cls, elem_id, lang):\\n        \\\"\\\"\\\"Get locale by elem_id\\\"\\\"\\\"\\n        return cls.locales(lang)[elem_id]\\n\\n    @classmethod\\n    def locales(cls, lang):\\n        \\\"\\\"\\\"Get locale by lang\\\"\\\"\\\"\\n        locales = OrderedDict()\\n        for sub_ui in cls.sub_ui:\\n            _locales = sub_ui.locales(lang)\\n            locales.update(_locales)\\n        for key, value in cls.locale_dict.items():\\n            locales[key] = {k: v[lang] for k, v in value.items()}\\n        return locales\\n\\n    @classmethod\\n    def elements(cls):\\n        \\\"\\\"\\\"Get all elements\\\"\\\"\\\"\\n        elements = OrderedDict()\\n        elements.update(cls.element_dict)\\n        for sub_ui in cls.sub_ui:\\n            _elements = sub_ui.elements()\\n            elements.update(_elements)\\n        return elements\\n\\n    @classmethod\\n    def element(cls, elem_id):\\n        \\\"\\\"\\\"Get element by elem_id\\\"\\\"\\\"\\n        elements = cls.elements()\\n        return elements[elem_id]\\n\\n    @classmethod\\n    def argument(cls, elem_id):\\n        \\\"\\\"\\\"Get argument by elem_id\\\"\\\"\\\"\\n        return cls.arguments.get(elem_id)\\n\\n    @classmethod\\n    def set_lang(cls, lang):\\n        cls.lang = lang\\n        for sub_ui in cls.sub_ui:\\n            sub_ui.lang = lang\\n\\n    @staticmethod\\n    def get_choices_from_dataclass(dataclass):\\n        choice_dict = {}\\n        for f in fields(dataclass):\\n            if 'choices' in f.metadata:\\n                choice_dict[f.name] = f.metadata['choices']\\n            if 'Literal' in str(f.type) and typing.get_args(f.type):\\n                choice_dict[f.name] = typing.get_args(f.type)\\n        return choice_dict\\n\\n    @staticmethod\\n    def get_default_value_from_dataclass(dataclass):\\n        default_dict = {}\\n        for f in fields(dataclass):\\n            if hasattr(dataclass, f.name):\\n                default_dict[f.name] = getattr(dataclass, f.name)\\n            else:\\n                default_dict[f.name] = None\\n        return default_dict\\n\\n    @staticmethod\\n    def get_argument_names(dataclass):\\n        arguments = {}\\n        for f in fields(dataclass):\\n            arguments[f.name] = f'--{f.name}'\\n        return arguments\\n\\n    @staticmethod\\n    def get_custom_name_list():\\n        return list(set(MODEL_MAPPING.keys()) - set(ModelType.get_model_name_list()))\\n\\n\\nimport os\\n\\nimport gradio as gr\\nfrom packaging import version\\nfrom transformers.utils import strtobool\\n\\nfrom swift.llm.utils import WebuiArguments\\nfrom swift.ui.llm_eval.llm_eval import LLMEval\\nfrom swift.ui.llm_export.llm_export import LLMExport\\nfrom swift.ui.llm_infer.llm_infer import LLMInfer\\nfrom swift.ui.llm_train.llm_train import LLMTrain\\nfrom swift.utils import get_main\\n\\nlocale_dict = {\\n    'title': {\\n        'zh': '🚀SWIFT: 轻量级大模型训练推理框架',\\n        'en': '🚀SWIFT: Scalable lightWeight Infrastructure for Fine-Tuning and Inference'\\n    },\\n    'sub_title': {\\n        'zh':\\n        '请查看 <a href=\\\\\\\"https://github.com/modelscope/swift/tree/main/docs/source\\\\\\\" target=\\\\\\\"_blank\\\\\\\">'\\n        'SWIFT 文档</a>来查看更多功能，使用SWIFT_UI_LANG=en环境变量来切换英文界面',\\n        'en':\\n        'Please check <a href=\\\\\\\"https://github.com/modelscope/swift/tree/main/docs/source_en\\\\\\\" target=\\\\\\\"_blank\\\\\\\">'\\n        'SWIFT Documentation</a> for more usages, Use SWIFT_UI_LANG=zh variable to switch to Chinese UI',\\n    },\\n    'star_beggar': {\\n        'zh':\\n        '喜欢<a href=\\\\\\\"https://github.com/modelscope/swift\\\\\\\" target=\\\\\\\"_blank\\\\\\\">SWIFT</a>就动动手指给我们加个star吧🥺 ',\\n        'en':\\n        'If you like <a href=\\\\\\\"https://github.com/modelscope/swift\\\\\\\" target=\\\\\\\"_blank\\\\\\\">SWIFT</a>, '\\n        'please take a few seconds to star us🥺 '\\n    },\\n}\\n\\nis_spaces = True if 'SPACE_ID' in os.environ else False\\nif is_spaces:\\n    is_shared_ui = True if 'modelscope/swift' in os.environ['SPACE_ID'] else False\\nelse:\\n    is_shared_ui = False\\n\\n\\ndef run_ui(arguments: WebuiArguments):\\n    lang = os.environ.get('SWIFT_UI_LANG') or arguments.lang\\n    share_env = os.environ.get('WEBUI_SHARE')\\n    share = strtobool(share_env) if share_env else arguments.share\\n    server = os.environ.get('WEBUI_SERVER') or arguments.host\\n    port_env = os.environ.get('WEBUI_PORT')\\n    port = int(port_env) if port_env else arguments.port\\n\\n    LLMTrain.set_lang(lang)\\n    LLMInfer.set_lang(lang)\\n    LLMExport.set_lang(lang)\\n    LLMEval.set_lang(lang)\\n    with gr.Blocks(title='SWIFT WebUI') as app:\\n        gr.HTML(f\\\"<h1><center>{locale_dict['title'][lang]}</center></h1>\\\")\\n        gr.HTML(f\\\"<h3><center>{locale_dict['sub_title'][lang]}</center></h3>\\\")\\n        gr.HTML(f\\\"<h3><center>{locale_dict['star_beggar'][lang]}</center></h3>\\\")\\n        if is_shared_ui:\\n            gr.HTML(\\n                f'<div class=\\\"gr-prose\\\" style=\\\"max-width: 80%\\\"><p>If the waiting queue is too long, you can either run locally or duplicate the Space and run it on your own profile using a (paid) private A10G-large GPU for training. A A10G-large costs US$3.15/h. &nbsp;&nbsp;<a class=\\\"duplicate-button\\\" style=\\\"display:inline-block\\\" target=\\\"_blank\\\" href=\\\"https://huggingface.co/spaces/{os.environ[\\\"SPACE_ID\\\"]}?duplicate=true\\\"><img src=\\\"https://img.shields.io/badge/-Duplicate%20Space-blue?labelColor=white&style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAP5JREFUOE+lk7FqAkEURY+ltunEgFXS2sZGIbXfEPdLlnxJyDdYB62sbbUKpLbVNhyYFzbrrA74YJlh9r079973psed0cvUD4A+4HoCjsA85X0Dfn/RBLBgBDxnQPfAEJgBY+A9gALA4tcbamSzS4xq4FOQAJgCDwV2CPKV8tZAJcAjMMkUe1vX+U+SMhfAJEHasQIWmXNN3abzDwHUrgcRGmYcgKe0bxrblHEB4E/pndMazNpSZGcsZdBlYJcEL9Afo75molJyM2FxmPgmgPqlWNLGfwZGG6UiyEvLzHYDmoPkDDiNm9JR9uboiONcBXrpY1qmgs21x1QwyZcpvxt9NS09PlsPAAAAAElFTkSuQmCC&logoWidth=14\\\" alt=\\\"Duplicate Space\\\"></a></p></div>'  # noqa\\n            )\\n        with gr.Tabs():\\n            if is_shared_ui:\\n                LLMInfer.build_ui(LLMInfer)\\n                LLMTrain.build_ui(LLMTrain)\\n                LLMExport.build_ui(LLMExport)\\n                LLMEval.build_ui(LLMEval)\\n            else:\\n                LLMTrain.build_ui(LLMTrain)\\n                LLMInfer.build_ui(LLMInfer)\\n                LLMExport.build_ui(LLMExport)\\n                LLMEval.build_ui(LLMEval)\\n\\n    concurrent = {}\\n    if version.parse(gr.__version__) < version.parse('4.0.0') and os.environ.get('MODELSCOPE_ENVIRONMENT') != 'studio':\\n        concurrent = {'concurrency_count': 5}\\n    app.queue(**concurrent).launch(server_name=server, inbrowser=True, server_port=port, height=800, share=share)\\n\\n\\nwebui_main = get_main(WebuiArguments, run_ui)\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass SelfCog(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'self_cognition': {\\n            'label': {\\n                'zh': '自我认知任务参数设置',\\n                'en': 'Self cognition settings'\\n            },\\n        },\\n        'self_cognition_sample': {\\n            'label': {\\n                'zh': '数据及采样条数',\\n                'en': 'Dataset sample size'\\n            },\\n            'info': {\\n                'zh': '设置数据集采样的条数',\\n                'en': 'Set the dataset sample size'\\n            }\\n        },\\n        'model_name': {\\n            'label': {\\n                'zh': '模型认知名称',\\n                'en': 'Model name'\\n            },\\n            'info': {\\n                'zh': '设置模型应当认知自己的名字, 格式为:中文名字 英文名字,中间以空格分隔',\\n                'en': 'Set the name of the model think itself of, the format is Chinesename Englishname, split by space'\\n            }\\n        },\\n        'model_author': {\\n            'label': {\\n                'zh': '模型作者',\\n                'en': 'Model author'\\n            },\\n            'info': {\\n                'zh': '设置模型认知的自己的作者, 格式为:中文作者 英文作者,中间以空格分隔',\\n                'en': 'Set the author of the model, the format is Chineseauthor Englishauthor, split by space'\\n            }\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='self_cognition', open=False):\\n            with gr.Row():\\n                gr.Textbox(elem_id='self_cognition_sample', scale=20)\\n                gr.Textbox(elem_id='model_name', scale=20, is_list=True)\\n                gr.Textbox(elem_id='model_author', scale=20, is_list=True)\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.llm import MODEL_MAPPING, TEMPLATE_MAPPING, ModelType\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Model(BaseUI):\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'model_type': {\\n            'label': {\\n                'zh': '选择模型',\\n                'en': 'Select Model'\\n            },\\n            'info': {\\n                'zh': 'SWIFT已支持的模型名称',\\n                'en': 'Base model supported by SWIFT'\\n            }\\n        },\\n        'model_id_or_path': {\\n            'label': {\\n                'zh': '模型id或路径',\\n                'en': 'Model id or path'\\n            },\\n            'info': {\\n                'zh': '实际的模型id',\\n                'en': 'The actual model id or model path'\\n            }\\n        },\\n        'template_type': {\\n            'label': {\\n                'zh': '模型Prompt模板类型',\\n                'en': 'Prompt template type'\\n            },\\n            'info': {\\n                'zh': '选择匹配模型的Prompt模板',\\n                'en': 'Choose the template type of the model'\\n            }\\n        },\\n        'system': {\\n            'label': {\\n                'zh': 'system字段',\\n                'en': 'system'\\n            },\\n            'info': {\\n                'zh': '选择system字段的内容',\\n                'en': 'Choose the content of the system field'\\n            }\\n        },\\n        'reset': {\\n            'value': {\\n                'zh': '恢复模型初始值',\\n                'en': 'Reset model default'\\n            },\\n        },\\n        'train_record': {\\n            'label': {\\n                'zh': '训练记录',\\n                'en': 'Train record'\\n            },\\n            'info': {\\n                'zh': '展示使用web-ui的历史训练及参数',\\n                'en': 'Show the training history and parameters'\\n            }\\n        },\\n        'clear_cache': {\\n            'value': {\\n                'zh': '删除训练记录',\\n                'en': 'Delete train records'\\n            },\\n        },\\n        'model_param': {\\n            'label': {\\n                'zh': '模型设置',\\n                'en': 'Model settings'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='model_param', open=True):\\n            with gr.Row():\\n                model_type = gr.Dropdown(\\n                    elem_id='model_type',\\n                    choices=ModelType.get_model_name_list() + cls.get_custom_name_list(),\\n                    scale=20)\\n                model_id_or_path = gr.Textbox(elem_id='model_id_or_path', lines=1, scale=20, interactive=True)\\n                template_type = gr.Dropdown(\\n                    elem_id='template_type', choices=list(TEMPLATE_MAPPING.keys()) + ['AUTO'], scale=20)\\n                train_record = gr.Dropdown(elem_id='train_record', choices=[], scale=20)\\n                clear_cache = gr.Button(elem_id='clear_cache', scale=2)\\n                model_state = gr.State({})\\n            with gr.Row():\\n                system = gr.Textbox(elem_id='system', lines=1, scale=20)\\n                reset_btn = gr.Button(elem_id='reset', scale=2)\\n\\n        def update_input_model(choice, model_state=None):\\n            if choice is None:\\n                return None, None, None, None\\n            if model_state and choice in model_state:\\n                model_id_or_path = model_state[choice]\\n            else:\\n                model_id_or_path = MODEL_MAPPING[choice]['model_id_or_path']\\n            default_system = getattr(TEMPLATE_MAPPING[MODEL_MAPPING[choice]['template']]['template'], 'default_system',\\n                                     None)\\n            template = MODEL_MAPPING[choice]['template']\\n            all_records = cls.list_cache(choice)\\n            return model_id_or_path, default_system, template, gr.update(choices=all_records)\\n\\n        def update_model_id_or_path(model_type, model_id_or_path, model_state):\\n            if model_type is None or isinstance(model_type, list):\\n                return model_state\\n            model_state[model_type] = model_id_or_path\\n            return model_state\\n\\n        def reset(model_type):\\n            model_id_or_path, default_system, template, _ = update_input_model(model_type)\\n            return model_id_or_path, default_system, template, {}\\n\\n        model_type.change(\\n            update_input_model,\\n            inputs=[model_type, model_state],\\n            outputs=[model_id_or_path, system, template_type, train_record])\\n\\n        model_id_or_path.change(\\n            update_model_id_or_path, inputs=[model_type, model_id_or_path, model_state], outputs=[model_state])\\n\\n        def clear_record(model_type):\\n            if model_type:\\n                cls.clear_cache(model_type)\\n                return gr.update(choices=[])\\n            return gr.update()\\n\\n        clear_cache.click(clear_record, inputs=[model_type], outputs=[train_record])\\n\\n        reset_btn.click(reset, inputs=[model_type], outputs=[model_id_or_path, system, template_type, model_state])\\n\\n\\nimport asyncio\\nimport sys\\nfrom asyncio.subprocess import PIPE, STDOUT\\n\\n\\nasync def run_and_get_log(*args, timeout=None):\\n    process = await asyncio.create_subprocess_exec(*args, stdout=PIPE, stderr=STDOUT)\\n    lines = []\\n    while True:\\n        try:\\n            line = await asyncio.wait_for(process.stdout.readline(), timeout)\\n        except asyncio.TimeoutError:\\n            break\\n        else:\\n            if not line:\\n                break\\n            else:\\n                lines.append(str(line))\\n    return process, lines\\n\\n\\ndef run_command_in_subprocess(*args, timeout):\\n    if sys.platform == 'win32':\\n        loop = asyncio.ProactorEventLoop()\\n        asyncio.set_event_loop(loop)\\n    else:\\n        loop = asyncio.new_event_loop()\\n        asyncio.set_event_loop(loop)\\n    process, lines = loop.run_until_complete(run_and_get_log(*args, timeout=timeout))\\n    return (loop, process), lines\\n\\n\\ndef close_loop(handler):\\n    loop, process = handler\\n    process.kill()\\n    loop.close()\\n\\n\\nimport os\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.llm import DATASET_MAPPING\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Dataset(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'dataset': {\\n            'label': {\\n                'zh': '数据集名称',\\n                'en': 'Dataset Code'\\n            },\\n            'info': {\\n                'zh': '选择训练的数据集，支持复选',\\n                'en': 'The dataset(s) to train the models'\\n            }\\n        },\\n        'max_length': {\\n            'label': {\\n                'zh': '句子最大长度',\\n                'en': 'The max length',\\n            },\\n            'info': {\\n                'zh': '设置输入模型的最大长度',\\n                'en': 'Set the max length input to the model',\\n            }\\n        },\\n        'dataset_test_ratio': {\\n            'label': {\\n                'zh': '验证集拆分比例',\\n                'en': 'Split ratio of eval dataset'\\n            },\\n            'info': {\\n                'zh': '表示将总数据的多少拆分到验证集中',\\n                'en': 'Split the datasets by this ratio for eval'\\n            }\\n        },\\n        'train_dataset_sample': {\\n            'label': {\\n                'zh': '训练集采样数量',\\n                'en': 'The sample size from the train dataset'\\n            },\\n            'info': {\\n                'zh': '从训练集中采样一定行数进行训练',\\n                'en': 'Train with the sample size from the dataset',\\n            }\\n        },\\n        'val_dataset_sample': {\\n            'label': {\\n                'zh': '验证集采样数量',\\n                'en': 'The sample size from the val dataset'\\n            },\\n            'info': {\\n                'zh': '从验证集中采样一定行数进行训练',\\n                'en': 'Validate with the sample size from the dataset',\\n            }\\n        },\\n        'custom_dataset_info': {\\n            'label': {\\n                'zh': '外部数据集配置',\\n                'en': 'Custom dataset config'\\n            },\\n            'info': {\\n                'zh': '注册外部数据集的配置文件',\\n                'en': 'An extra dataset config to register your own datasets'\\n            }\\n        },\\n        'dataset_param': {\\n            'label': {\\n                'zh': '数据集设置',\\n                'en': 'Dataset settings'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='dataset_param', open=True):\\n            with gr.Row():\\n                gr.Dropdown(\\n                    elem_id='dataset',\\n                    multiselect=True,\\n                    choices=list(DATASET_MAPPING.keys()),\\n                    scale=20,\\n                    allow_custom_value=True)\\n                gr.Textbox(elem_id='custom_dataset_info', is_list=False, scale=20)\\n            with gr.Row():\\n                gr.Slider(elem_id='dataset_test_ratio', minimum=0.0, maximum=1.0, step=0.05, scale=20)\\n                gr.Slider(elem_id='max_length', minimum=32, maximum=32768, step=1, scale=20)\\n                gr.Textbox(elem_id='train_dataset_sample', scale=20)\\n                gr.Textbox(elem_id='val_dataset_sample', scale=20)\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Save(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'save_param': {\\n            'label': {\\n                'zh': '存储参数设置',\\n                'en': 'Saving settings'\\n            },\\n        },\\n        'push_to_hub': {\\n            'label': {\\n                'zh': '推送魔搭Hub',\\n                'en': 'Push to modelscope hub',\\n            },\\n            'info': {\\n                'zh': '是否推送魔搭的模型库',\\n                'en': 'Whether push the output model to modelscope hub',\\n            }\\n        },\\n        'hub_model_id': {\\n            'label': {\\n                'zh': '魔搭模型id',\\n                'en': 'The model-id in modelscope',\\n            },\\n            'info': {\\n                'zh': '设置魔搭的模型id',\\n                'en': 'Set the model-id of modelscope',\\n            }\\n        },\\n        'hub_private_repo': {\\n            'label': {\\n                'zh': '设置仓库私有',\\n                'en': 'Model is private',\\n            },\\n            'info': {\\n                'zh': '以私有方式推送魔搭hub',\\n                'en': 'Set the model as private',\\n            }\\n        },\\n        'hub_strategy': {\\n            'label': {\\n                'zh': '推送策略',\\n                'en': 'Push strategy',\\n            },\\n            'info': {\\n                'zh': '设置模型推送策略',\\n                'en': 'Set the push strategy',\\n            }\\n        },\\n        'hub_token': {\\n            'label': {\\n                'zh': '仓库token',\\n                'en': 'The hub token',\\n            },\\n            'info': {\\n                'zh': '该token可以在www.modelscope.cn找到',\\n                'en': 'Find the token in www.modelscope.cn',\\n            }\\n        }\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='save_param', open=False):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Checkbox(elem_id='push_to_hub', scale=20)\\n                    gr.Textbox(elem_id='hub_model_id', lines=1, scale=20)\\n                    gr.Checkbox(elem_id='hub_private_repo', scale=20)\\n                    gr.Dropdown(elem_id='hub_strategy', scale=20)\\n                    gr.Textbox(elem_id='hub_token', lines=1, scale=20)\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Hyper(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'hyper_param': {\\n            'label': {\\n                'zh': '超参数设置(更多参数->高级参数设置)',\\n                'en': 'Hyper settings(more params->Advanced settings)',\\n            },\\n        },\\n        'batch_size': {\\n            'label': {\\n                'zh': '训练batch size',\\n                'en': 'Train batch size',\\n            },\\n            'info': {\\n                'zh': '训练的batch size',\\n                'en': 'Set the train batch size',\\n            }\\n        },\\n        'learning_rate': {\\n            'label': {\\n                'zh': '学习率',\\n                'en': 'Learning rate',\\n            },\\n            'info': {\\n                'zh': '设置学习率',\\n                'en': 'Set the learning rate',\\n            }\\n        },\\n        'eval_steps': {\\n            'label': {\\n                'zh': '交叉验证步数',\\n                'en': 'Eval steps',\\n            },\\n            'info': {\\n                'zh': '设置每隔多少步数进行一次验证',\\n                'en': 'Set the step interval to validate',\\n            }\\n        },\\n        'num_train_epochs': {\\n            'label': {\\n                'zh': '数据集迭代轮次',\\n                'en': 'Train epoch',\\n            },\\n            'info': {\\n                'zh': '设置对数据集训练多少轮次',\\n                'en': 'Set the max train epoch',\\n            }\\n        },\\n        'gradient_accumulation_steps': {\\n            'label': {\\n                'zh': '梯度累计步数',\\n                'en': 'Gradient accumulation steps',\\n            },\\n            'info': {\\n                'zh': '设置梯度累计步数以减小显存占用',\\n                'en': 'Set the gradient accumulation steps',\\n            }\\n        },\\n        'use_flash_attn': {\\n            'label': {\\n                'zh': '使用Flash Attention',\\n                'en': 'Use Flash Attention',\\n            },\\n            'info': {\\n                'zh': '使用Flash Attention减小显存占用',\\n                'en': 'Use Flash Attention to reduce memory',\\n            }\\n        },\\n        'neftune_noise_alpha': {\\n            'label': {\\n                'zh': 'neftune_noise_alpha',\\n                'en': 'neftune_noise_alpha'\\n            },\\n            'info': {\\n                'zh': '使用neftune提升训练效果, 一般设置为5或者10',\\n                'en': 'Use neftune to improve performance, normally the value should be 5 or 10'\\n            }\\n        },\\n        'save_steps': {\\n            'label': {\\n                'zh': '存储步数',\\n                'en': 'save steps',\\n            },\\n            'info': {\\n                'zh': '设置每个多少步数进行存储',\\n                'en': 'Set the save steps',\\n            }\\n        },\\n        'output_dir': {\\n            'label': {\\n                'zh': '存储目录',\\n                'en': 'The output dir',\\n            },\\n            'info': {\\n                'zh': '设置输出模型存储在哪个文件夹下',\\n                'en': 'Set the output folder',\\n            }\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='hyper_param', open=False):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Slider(elem_id='batch_size', minimum=1, maximum=256, step=2, scale=20)\\n                    gr.Textbox(elem_id='learning_rate', value='1e-4', lines=1, scale=20)\\n                    gr.Textbox(elem_id='num_train_epochs', lines=1, scale=20)\\n                    gr.Checkbox(elem_id='use_flash_attn', scale=20)\\n                    gr.Slider(elem_id='gradient_accumulation_steps', minimum=1, maximum=256, step=2, value=16, scale=20)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='eval_steps', lines=1, value='500', scale=20)\\n                    gr.Textbox(elem_id='save_steps', value='500', lines=1, scale=20)\\n                    gr.Textbox(elem_id='output_dir', scale=20)\\n                    gr.Slider(elem_id='neftune_noise_alpha', minimum=0.0, maximum=20.0, step=0.5, scale=20)\\n\\n    @staticmethod\\n    def update_lr(sft_type):\\n        if sft_type == 'full':\\n            return 1e-5\\n        else:\\n            return 1e-4\\n\\n\\nimport collections\\nimport os.path\\nimport sys\\nimport time\\nimport webbrowser\\nfrom datetime import datetime\\nfrom typing import Dict, List, Tuple, Type\\n\\nimport gradio as gr\\nimport json\\nimport matplotlib.pyplot as plt\\nimport psutil\\nfrom gradio import Accordion, Tab\\nfrom transformers import is_tensorboard_available\\n\\nfrom swift.ui.base import BaseUI\\nfrom swift.ui.llm_train.utils import close_loop, run_command_in_subprocess\\nfrom swift.utils import TB_COLOR, TB_COLOR_SMOOTH, get_logger, read_tensorboard_file, tensorboard_smoothing\\nfrom swift.utils.utils import format_time\\n\\nlogger = get_logger()\\n\\n\\nclass Runtime(BaseUI):\\n\\n    handlers: Dict[str, Tuple[List, Tuple]] = {}\\n\\n    group = 'llm_train'\\n\\n    all_plots = None\\n\\n    log_event = None\\n\\n    is_studio = os.environ.get('MODELSCOPE_ENVIRONMENT') == 'studio'\\n\\n    sft_plot = [\\n        {\\n            'name': 'train/loss',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'train/acc',\\n            'smooth': None,\\n        },\\n        {\\n            'name': 'train/learning_rate',\\n            'smooth': None,\\n        },\\n        {\\n            'name': 'eval/loss',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'eval/acc',\\n            'smooth': None,\\n        },\\n    ]\\n\\n    dpo_plot = [\\n        {\\n            'name': 'train/loss',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'train/rewards/accuracies',\\n            'smooth': None,\\n        },\\n        {\\n            'name': 'train/rewards/margins',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'train/logps/chosen',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'train/logps/rejected',\\n            'smooth': 0.9,\\n        },\\n    ]\\n\\n    kto_plot = [\\n        {\\n            'name': 'kl',\\n            'smooth': None,\\n        },\\n        {\\n            'name': 'rewards/chosen_sum',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'logps/chosen_sum',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'rewards/rejected_sum',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'logps/rejected_sum',\\n            'smooth': 0.9,\\n        },\\n    ]\\n\\n    orpo_plot = [\\n        {\\n            'name': 'train/loss',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'train/rewards/accuracies',\\n            'smooth': None,\\n        },\\n        {\\n            'name': 'train/rewards/margins',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'train/rewards/chosen',\\n            'smooth': 0.9,\\n        },\\n        {\\n            'name': 'train/log_odds_ratio',\\n            'smooth': 0.9,\\n        },\\n    ]\\n\\n    locale_dict = {\\n        'runtime_tab': {\\n            'label': {\\n                'zh': '运行时',\\n                'en': 'Runtime'\\n            },\\n        },\\n        'tb_not_found': {\\n            'value': {\\n                'zh': 'tensorboard未安装,使用pip install tensorboard进行安装',\\n                'en': 'tensorboard not found, install it by pip install tensorboard',\\n            }\\n        },\\n        'running_cmd': {\\n            'label': {\\n                'zh': '运行命令',\\n                'en': 'Command line'\\n            },\\n            'info': {\\n                'zh': '执行的实际命令',\\n                'en': 'The actual command'\\n            }\\n        },\\n        'show_log': {\\n            'value': {\\n                'zh': '展示运行状态',\\n                'en': 'Show running status'\\n            },\\n        },\\n        'stop_show_log': {\\n            'value': {\\n                'zh': '停止展示运行状态',\\n                'en': 'Stop showing running status'\\n            },\\n        },\\n        'logging_dir': {\\n            'label': {\\n                'zh': '日志路径',\\n                'en': 'Logging dir'\\n            },\\n            'info': {\\n                'zh': '支持手动传入文件路径',\\n                'en': 'Support fill custom path in'\\n            }\\n        },\\n        'log': {\\n            'label': {\\n                'zh': '日志输出',\\n                'en': 'Logging content'\\n            },\\n            'info': {\\n                'zh': '如果日志无更新请再次点击\\\"展示日志内容\\\"',\\n                'en': 'Please press \\\"Show log\\\" if the log content is not updating'\\n            }\\n        },\\n        'running_tasks': {\\n            'label': {\\n                'zh': '运行中任务',\\n                'en': 'Running Tasks'\\n            },\\n            'info': {\\n                'zh': '运行中的任务（所有的swift sft命令）',\\n                'en': 'All running tasks(started by swift sft)'\\n            }\\n        },\\n        'refresh_tasks': {\\n            'value': {\\n                'zh': '找回运行时任务',\\n                'en': 'Find running tasks'\\n            },\\n        },\\n        'kill_task': {\\n            'value': {\\n                'zh': '杀死任务',\\n                'en': 'Kill running task'\\n            },\\n        },\\n        'tb_url': {\\n            'label': {\\n                'zh': 'Tensorboard链接',\\n                'en': 'Tensorboard URL'\\n            },\\n            'info': {\\n                'zh': '仅展示，不可编辑',\\n                'en': 'Not editable'\\n            }\\n        },\\n        'start_tb': {\\n            'value': {\\n                'zh': '打开TensorBoard',\\n                'en': 'Start TensorBoard'\\n            },\\n        },\\n        'close_tb': {\\n            'value': {\\n                'zh': '关闭TensorBoard',\\n                'en': 'Close TensorBoard'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='runtime_tab', open=False, visible=True):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Textbox(elem_id='running_cmd', lines=1, scale=20, interactive=False, max_lines=1)\\n                    if not cls.is_studio:\\n                        gr.Textbox(elem_id='logging_dir', lines=1, scale=20, max_lines=1)\\n                        gr.Button(elem_id='show_log', scale=2, variant='primary')\\n                        gr.Button(elem_id='stop_show_log', scale=2)\\n                        gr.Textbox(elem_id='tb_url', lines=1, scale=10, interactive=False, max_lines=1)\\n                        gr.Button(elem_id='start_tb', scale=2, variant='primary')\\n                        gr.Button(elem_id='close_tb', scale=2)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='log', lines=6, visible=False)\\n                if not cls.is_studio:\\n                    with gr.Row():\\n                        gr.Dropdown(elem_id='running_tasks', scale=10)\\n                        gr.Button(elem_id='refresh_tasks', scale=1)\\n                        gr.Button(elem_id='kill_task', scale=1)\\n\\n                with gr.Row():\\n                    cls.all_plots = []\\n                    for idx, k in enumerate(Runtime.sft_plot):\\n                        name = k['name']\\n                        cls.all_plots.append(gr.Plot(elem_id=str(idx), label=name))\\n\\n                if not cls.is_studio:\\n                    cls.log_event = base_tab.element('show_log').click(\\n                        Runtime.update_log,\\n                        [base_tab.element('running_tasks')], [cls.element('log')] + cls.all_plots).then(\\n                            Runtime.wait, [base_tab.element('logging_dir'),\\n                                           base_tab.element('running_tasks')], [cls.element('log')] + cls.all_plots)\\n\\n                    base_tab.element('stop_show_log').click(lambda: None, cancels=cls.log_event)\\n\\n                    base_tab.element('start_tb').click(\\n                        Runtime.start_tb,\\n                        [base_tab.element('logging_dir')],\\n                        [base_tab.element('tb_url')],\\n                    )\\n\\n                    base_tab.element('close_tb').click(\\n                        Runtime.close_tb,\\n                        [base_tab.element('logging_dir')],\\n                        [],\\n                    )\\n\\n                    base_tab.element('refresh_tasks').click(\\n                        Runtime.refresh_tasks,\\n                        [base_tab.element('running_tasks')],\\n                        [base_tab.element('running_tasks')],\\n                    )\\n\\n    @classmethod\\n    def get_plot(cls, task):\\n        if not task or 'swift sft' in task:\\n            return cls.sft_plot\\n\\n        args: dict = cls.parse_info_from_cmdline(task)[1]\\n        train_type = args.get('rlhf_type', 'dpo')\\n        if train_type in ('dpo', 'cpo', 'simpo'):\\n            return cls.dpo_plot\\n        elif train_type == 'kto':\\n            return cls.kto_plot\\n        elif train_type == 'orpo':\\n            return cls.orpo_plot\\n\\n    @classmethod\\n    def update_log(cls, task):\\n        ret = [gr.update(visible=True)]\\n        plot = Runtime.get_plot(task)\\n        for i in range(len(plot)):\\n            p = plot[i]\\n            ret.append(gr.update(visible=True, label=p['name']))\\n        return ret\\n\\n    @classmethod\\n    def get_initial(cls, line):\\n        tqdm_starts = ['Train:', 'Map:', 'Val:', 'Filter:']\\n        for start in tqdm_starts:\\n            if line.startswith(start):\\n                return start\\n        return None\\n\\n    @classmethod\\n    def wait(cls, logging_dir, task):\\n        if not logging_dir:\\n            return [None] + Runtime.plot(task)\\n        log_file = os.path.join(logging_dir, 'run.log')\\n        offset = 0\\n        latest_data = ''\\n        lines = collections.deque(maxlen=int(os.environ.get('MAX_LOG_LINES', 50)))\\n        try:\\n            with open(log_file, 'r') as input:\\n                input.seek(offset)\\n                fail_cnt = 0\\n                while True:\\n                    try:\\n                        latest_data += input.read()\\n                    except UnicodeDecodeError:\\n                        continue\\n                    if not latest_data:\\n                        time.sleep(0.5)\\n                        fail_cnt += 1\\n                        if fail_cnt > 50:\\n                            break\\n\\n                    if '\\\\n' not in latest_data:\\n                        continue\\n                    latest_lines = latest_data.split('\\\\n')\\n                    if latest_data[-1] != '\\\\n':\\n                        latest_data = latest_lines[-1]\\n                        latest_lines = latest_lines[:-1]\\n                    else:\\n                        latest_data = ''\\n                    lines.extend(latest_lines)\\n                    start = cls.get_initial(lines[-1])\\n                    if start:\\n                        i = len(lines) - 2\\n                        while i >= 0:\\n                            if lines[i].startswith(start):\\n                                del lines[i]\\n                                i -= 1\\n                            else:\\n                                break\\n                    yield ['\\\\n'.join(lines)] + Runtime.plot(task)\\n        except IOError:\\n            pass\\n\\n    @classmethod\\n    def show_log(cls, logging_dir):\\n        webbrowser.open('file://' + os.path.join(logging_dir, 'run.log'), new=2)\\n\\n    @classmethod\\n    def start_tb(cls, logging_dir):\\n        if not is_tensorboard_available():\\n            gr.Error(cls.locale('tb_not_found', cls.lang)['value'])\\n            return ''\\n\\n        logging_dir = logging_dir.strip()\\n        logging_dir = logging_dir if not logging_dir.endswith(os.sep) else logging_dir[:-1]\\n        if logging_dir in cls.handlers:\\n            return cls.handlers[logging_dir][1]\\n\\n        handler, lines = run_command_in_subprocess('tensorboard', '--logdir', logging_dir, timeout=2)\\n        localhost_addr = ''\\n        for line in lines:\\n            if 'http://localhost:' in line:\\n                line = line[line.index('http://localhost:'):]\\n                localhost_addr = line[:line.index(' ')]\\n        cls.handlers[logging_dir] = (handler, localhost_addr)\\n        logger.info('===========Tensorboard Log============')\\n        logger.info('\\\\n'.join(lines))\\n        webbrowser.open(localhost_addr, new=2)\\n        return localhost_addr\\n\\n    @staticmethod\\n    def close_tb(logging_dir):\\n        if logging_dir in Runtime.handlers:\\n            close_loop(Runtime.handlers[logging_dir][0])\\n            Runtime.handlers.pop(logging_dir)\\n\\n    @staticmethod\\n    def refresh_tasks(running_task=None):\\n        output_dir = running_task if not running_task or 'pid:' not in running_task else None\\n        process_name = 'swift'\\n        negative_name = 'swift.exe'\\n        cmd_name = ['sft', 'rlhf']\\n        process = []\\n        selected = None\\n        for proc in psutil.process_iter():\\n            try:\\n                cmdlines = proc.cmdline()\\n            except (psutil.ZombieProcess, psutil.AccessDenied, psutil.NoSuchProcess):\\n                cmdlines = []\\n            if any([process_name in cmdline\\n                    for cmdline in cmdlines]) and not any([negative_name in cmdline\\n                                                           for cmdline in cmdlines]) and any(  # noqa\\n                                                               [cmdline in cmd_name for cmdline in cmdlines]):  # noqa\\n                process.append(Runtime.construct_running_task(proc))\\n                if output_dir is not None and any(  # noqa\\n                    [output_dir == cmdline for cmdline in cmdlines]):  # noqa\\n                    selected = Runtime.construct_running_task(proc)\\n        if not selected:\\n            if running_task and running_task in process:\\n                selected = running_task\\n        if not selected and process:\\n            selected = process[0]\\n        return gr.update(choices=process, value=selected)\\n\\n    @staticmethod\\n    def construct_running_task(proc):\\n        pid = proc.pid\\n        ts = time.time()\\n        create_time = proc.create_time()\\n        create_time_formatted = datetime.fromtimestamp(create_time).strftime('%Y-%m-%d, %H:%M')\\n\\n        return f'pid:{pid}/create:{create_time_formatted}' \\\\\\n               f'/running:{format_time(ts-create_time)}/cmd:{\\\" \\\".join(proc.cmdline())}'\\n\\n    @staticmethod\\n    def parse_info_from_cmdline(task):\\n        pid = None\\n        if '/cmd:' in task:\\n            for i in range(3):\\n                slash = task.find('/')\\n                if i == 0:\\n                    pid = task[:slash].split(':')[1]\\n                task = task[slash + 1:]\\n        if 'swift sft' in task:\\n            args = task.split('swift sft')[1]\\n        elif 'swift rlhf' in task:\\n            args = task.split('swift rlhf')[1]\\n        else:\\n            raise ValueError(f'Cannot parse cmd line: {task}')\\n        args = [arg.strip() for arg in args.split('--') if arg.strip()]\\n        all_args = {}\\n        for i in range(len(args)):\\n            space = args[i].find(' ')\\n            splits = args[i][:space], args[i][space + 1:]\\n            all_args[splits[0]] = splits[1]\\n\\n        output_dir = all_args['output_dir']\\n        if os.path.exists(os.path.join(output_dir, 'sft_args.json')):\\n            with open(os.path.join(output_dir, 'sft_args.json'), 'r') as f:\\n                _json = json.load(f)\\n            for key in all_args.keys():\\n                all_args[key] = _json.get(key)\\n                if isinstance(all_args[key], list):\\n                    if any([' ' in value for value in all_args[key]]):\\n                        all_args[key] = [f'\\\"{value}\\\"' for value in all_args[key]]\\n                    all_args[key] = ' '.join(all_args[key])\\n        return pid, all_args\\n\\n    @staticmethod\\n    def kill_task(task):\\n        pid, all_args = Runtime.parse_info_from_cmdline(task)\\n        output_dir = all_args['output_dir']\\n        if sys.platform == 'win32':\\n            os.system(f'taskkill /f /t /pid \\\"{pid}\\\"')\\n        else:\\n            os.system(f'pkill -9 -f {output_dir}')\\n        time.sleep(1)\\n        return [Runtime.refresh_tasks()] + [gr.update(value=None)] * (len(Runtime.get_plot(task)) + 1)\\n\\n    @staticmethod\\n    def reset():\\n        return None, 'output'\\n\\n    @staticmethod\\n    def task_changed(task, base_tab):\\n        if task:\\n            _, all_args = Runtime.parse_info_from_cmdline(task)\\n        else:\\n            all_args = {}\\n        elements = [value for value in base_tab.elements().values() if not isinstance(value, (Tab, Accordion))]\\n        ret = []\\n        for e in elements:\\n            if e.elem_id in all_args:\\n                if isinstance(e, gr.Dropdown) and e.multiselect:\\n                    arg = all_args[e.elem_id].split(' ')\\n                else:\\n                    arg = all_args[e.elem_id]\\n                ret.append(gr.update(value=arg))\\n            else:\\n                ret.append(gr.update())\\n        return ret + [gr.update(value=None)] * (len(Runtime.get_plot(task)) + 1)\\n\\n    @staticmethod\\n    def plot(task):\\n        plot = Runtime.get_plot(task)\\n        if not task:\\n            return [None] * len(plot)\\n        _, all_args = Runtime.parse_info_from_cmdline(task)\\n        tb_dir = all_args['logging_dir']\\n        if not os.path.exists(tb_dir):\\n            return [None] * len(plot)\\n        fname = [\\n            fname for fname in os.listdir(tb_dir)\\n            if os.path.isfile(os.path.join(tb_dir, fname)) and fname.startswith('events.out')\\n        ]\\n        if fname:\\n            fname = fname[0]\\n        else:\\n            return [None] * len(plot)\\n        tb_path = os.path.join(tb_dir, fname)\\n        data = read_tensorboard_file(tb_path)\\n\\n        plots = []\\n        for k in plot:\\n            name = k['name']\\n            smooth = k['smooth']\\n            if name not in data:\\n                plots.append(None)\\n                continue\\n            _data = data[name]\\n            steps = [d['step'] for d in _data]\\n            values = [d['value'] for d in _data]\\n            if len(values) == 0:\\n                continue\\n\\n            plt.close('all')\\n            fig = plt.figure()\\n            ax = fig.add_subplot()\\n            # _, ax = plt.subplots(1, 1, squeeze=True, figsize=(8, 5), dpi=100)\\n            ax.set_title(name)\\n            if len(values) == 1:\\n                ax.scatter(steps, values, color=TB_COLOR_SMOOTH)\\n            elif smooth is not None:\\n                ax.plot(steps, values, color=TB_COLOR)\\n                values_s = tensorboard_smoothing(values, smooth)\\n                ax.plot(steps, values_s, color=TB_COLOR_SMOOTH)\\n            else:\\n                ax.plot(steps, values, color=TB_COLOR_SMOOTH)\\n            plots.append(fig)\\n        return plots\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Advanced(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'advanced_param': {\\n            'label': {\\n                'zh': '高级参数设置',\\n                'en': 'Advanced settings'\\n            },\\n        },\\n        'optim': {\\n            'label': {\\n                'zh': 'Optimizer类型',\\n                'en': 'The Optimizer type'\\n            },\\n            'info': {\\n                'zh': '设置Optimizer类型',\\n                'en': 'Set the Optimizer type'\\n            }\\n        },\\n        'weight_decay': {\\n            'label': {\\n                'zh': '权重衰减',\\n                'en': 'Weight decay'\\n            },\\n            'info': {\\n                'zh': '设置weight decay',\\n                'en': 'Set the weight decay'\\n            }\\n        },\\n        'logging_steps': {\\n            'label': {\\n                'zh': '日志打印步数',\\n                'en': 'Logging steps'\\n            },\\n            'info': {\\n                'zh': '设置日志打印的步数间隔',\\n                'en': 'Set the logging interval'\\n            }\\n        },\\n        'lr_scheduler_type': {\\n            'label': {\\n                'zh': 'LrScheduler类型',\\n                'en': 'The LrScheduler type'\\n            },\\n            'info': {\\n                'zh': '设置LrScheduler类型',\\n                'en': 'Set the LrScheduler type'\\n            }\\n        },\\n        'warmup_ratio': {\\n            'label': {\\n                'zh': '学习率warmup比例',\\n                'en': 'Lr warmup ratio'\\n            },\\n            'info': {\\n                'zh': '设置学习率warmup比例',\\n                'en': 'Set the warmup ratio in total steps'\\n            }\\n        },\\n        'more_params': {\\n            'label': {\\n                'zh': '其他高级参数',\\n                'en': 'Other params'\\n            },\\n            'info': {\\n                'zh': '以json格式或--xxx xxx命令行格式填入',\\n                'en': 'Fill in with json format or --xxx xxx cmd format'\\n            }\\n        },\\n        'custom_train_dataset_path': {\\n            'label': {\\n                'zh': '自定义训练数据集路径',\\n                'en': 'Custom train dataset path'\\n            },\\n            'info': {\\n                'zh': '输入自定义的训练数据集路径，空格分隔',\\n                'en': 'Extra train files, split by blank'\\n            }\\n        },\\n        'custom_val_dataset_path': {\\n            'label': {\\n                'zh': '自定义校验数据集路径',\\n                'en': 'Custom val dataset path'\\n            },\\n            'info': {\\n                'zh': '输入自定义的校验数据集路径，逗号分隔',\\n                'en': 'Extra val files, split by comma'\\n            }\\n        },\\n        'truncation_strategy': {\\n            'label': {\\n                'zh': '数据集超长策略',\\n                'en': 'Dataset truncation strategy'\\n            },\\n            'info': {\\n                'zh': '如果token超长该如何处理',\\n                'en': 'How to deal with the rows exceed the max length'\\n            }\\n        },\\n        'gpu_memory_fraction': {\\n            'label': {\\n                'zh': 'GPU显存限制',\\n                'en': 'GPU memory fraction'\\n            },\\n            'info': {\\n                'zh': '设置使用显存的比例，一般用于显存测试',\\n                'en': 'Set the memory fraction ratio of GPU, usually used in memory test'\\n            }\\n        },\\n        'max_steps': {\\n            'label': {\\n                'zh': '最大迭代步数',\\n                'en': 'Max steps',\\n            },\\n            'info': {\\n                'zh': '设置最大迭代步数，该值如果大于零则数据集迭代次数不生效',\\n                'en': 'Set the max steps, if the value > 0 then num_train_epochs has no effects',\\n            }\\n        },\\n        'eval_batch_size': {\\n            'label': {\\n                'zh': '验证batch size',\\n                'en': 'Val batch size',\\n            },\\n            'info': {\\n                'zh': '验证的batch size',\\n                'en': 'Set the val batch size',\\n            }\\n        },\\n        'max_grad_norm': {\\n            'label': {\\n                'zh': '梯度裁剪',\\n                'en': 'Max grad norm',\\n            },\\n            'info': {\\n                'zh': '设置梯度裁剪',\\n                'en': 'Set the max grad norm',\\n            }\\n        },\\n        'predict_with_generate': {\\n            'label': {\\n                'zh': '使用生成指标代替loss',\\n                'en': 'Use generate metric instead of loss',\\n            },\\n            'info': {\\n                'zh': '验证时使用generate/Rouge代替loss',\\n                'en': 'Use model.generate/Rouge instead of loss',\\n            }\\n        },\\n        'deepspeed': {\\n            'label': {\\n                'zh': 'deepspeed',\\n                'en': 'deepspeed',\\n            },\\n            'info': {\\n                'zh': '可以选择下拉列表，也支持传入路径',\\n                'en': 'Choose from the dropbox or fill in a valid path',\\n            }\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='advanced_param', open=False):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Textbox(elem_id='optim', lines=1, scale=20)\\n                    gr.Textbox(elem_id='weight_decay', lines=1, scale=20)\\n                    gr.Textbox(elem_id='logging_steps', lines=1, scale=20)\\n                    gr.Textbox(elem_id='lr_scheduler_type', lines=1, scale=20)\\n                    gr.Textbox(elem_id='max_steps', lines=1, scale=20)\\n                    gr.Slider(elem_id='warmup_ratio', minimum=0.0, maximum=1.0, step=0.05, scale=20)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='custom_train_dataset_path', is_list=True, scale=20)\\n                    gr.Textbox(elem_id='custom_val_dataset_path', is_list=True, scale=20)\\n                    gr.Dropdown(elem_id='truncation_strategy', scale=20)\\n                    gr.Slider(elem_id='eval_batch_size', minimum=1, maximum=256, step=2, scale=20)\\n                    gr.Textbox(elem_id='max_grad_norm', lines=1, scale=20)\\n                    gr.Checkbox(elem_id='predict_with_generate', scale=20)\\n                with gr.Row():\\n                    gr.Dropdown(\\n                        elem_id='deepspeed',\\n                        scale=4,\\n                        allow_custom_value=True,\\n                        choices=['default-zero2', 'default-zero3', 'zero2-offload', 'zero3-offload'])\\n                    gr.Textbox(elem_id='gpu_memory_fraction', scale=4)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='more_params', lines=4, scale=20)\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.llm import MODEL_MAPPING, ModelType\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass RLHF(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'rlhf_tab': {\\n            'label': {\\n                'zh': '人类对齐参数设置',\\n                'en': 'RLHF settings'\\n            },\\n        },\\n        'rlhf_type': {\\n            'label': {\\n                'zh': '人类对齐算法类型',\\n                'en': 'RLHF type'\\n            },\\n        },\\n        'ref_model_type': {\\n            'label': {\\n                'zh': '选择ref模型',\\n                'en': 'Select ref model'\\n            },\\n            'info': {\\n                'zh': 'SWIFT已支持的模型名称',\\n                'en': 'Base model supported by SWIFT'\\n            }\\n        },\\n        'ref_model_id_or_path': {\\n            'label': {\\n                'zh': 'ref模型id或路径',\\n                'en': 'Ref model id or path'\\n            },\\n            'info': {\\n                'zh': '实际的模型id或路径',\\n                'en': 'The actual model id or path'\\n            }\\n        },\\n        'beta': {\\n            'label': {\\n                'zh': 'KL正则项系数',\\n                'en': 'KL regression ratio'\\n            },\\n        },\\n        'loss_type': {\\n            'label': {\\n                'zh': 'Loss类型',\\n                'en': 'Loss type'\\n            },\\n        },\\n        'rpo_alpha': {\\n            'label': {\\n                'zh': 'DPO中混合sft交叉熵的系数',\\n                'en': 'DPO Cross Entropy ratio'\\n            },\\n        },\\n        'simpo_gamma': {\\n            'label': {\\n                'zh': 'SimPO reward margin',\\n                'en': 'SimPO reward margin'\\n            },\\n        },\\n        'desirable_weight': {\\n            'label': {\\n                'zh': 'KTO符合项系数',\\n                'en': 'KTO desirable ratio'\\n            },\\n        },\\n        'undesirable_weight': {\\n            'label': {\\n                'zh': 'KTO不符合项系数',\\n                'en': 'KTO undesirable ratio'\\n            },\\n        }\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='rlhf_tab', open=False):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    rlhf_type = gr.Dropdown(elem_id='rlhf_type')\\n                    ref_model_type = gr.Dropdown(\\n                        elem_id='ref_model_type',\\n                        choices=ModelType.get_model_name_list() + cls.get_custom_name_list(),\\n                        scale=20)\\n                    ref_model_id_or_path = gr.Textbox(elem_id='ref_model_id_or_path', lines=1, scale=20)\\n                    model_state = gr.State({})\\n                with gr.Row():\\n                    loss_type = gr.Dropdown(elem_id='loss_type')\\n                    beta = gr.Slider(elem_id='beta', minimum=0., maximum=5.0, step=0.1, scale=20)\\n                    gr.Slider(elem_id='rpo_alpha', minimum=0., maximum=2, step=0.1, scale=20)\\n                    gr.Slider(elem_id='simpo_gamma', minimum=0., maximum=2.0, step=0.1, scale=20)\\n                    gr.Slider(elem_id='desirable_weight', minimum=0., maximum=2.0, step=0.1, scale=20)\\n                    gr.Slider(elem_id='undesirable_weight', minimum=0., maximum=2.0, step=0.1, scale=20)\\n\\n            def update_input_model(choice, model_state=None):\\n                if choice is None:\\n                    return None\\n                if model_state and choice in model_state:\\n                    model_id_or_path = model_state[choice]\\n                else:\\n                    model_id_or_path = MODEL_MAPPING[choice]['model_id_or_path']\\n                return model_id_or_path\\n\\n            def update_model_id_or_path(model_type, model_id_or_path, model_state):\\n                if model_type is None or isinstance(model_type, list):\\n                    return model_state\\n                model_state[model_type] = model_id_or_path\\n                return model_state\\n\\n            def update_value(rlhf_type):\\n                beta = None\\n                if rlhf_type in ['dpo', 'orpo', 'kto', 'cpo']:\\n                    beta = 0.1\\n                elif rlhf_type == 'simpo':\\n                    beta = 2.0\\n\\n                loss_type = None\\n                if rlhf_type in ['dpo', 'cpo']:\\n                    loss_type = 'sigmoid'\\n                elif rlhf_type == 'kto':\\n                    loss_type = 'kto'\\n\\n                return beta, loss_type\\n\\n            rlhf_type.change(update_value, inputs=[rlhf_type], outputs=[beta, loss_type])\\n\\n            ref_model_type.change(\\n                update_input_model, inputs=[ref_model_type, model_state], outputs=[ref_model_id_or_path])\\n\\n            ref_model_id_or_path.change(\\n                update_model_id_or_path,\\n                inputs=[ref_model_type, ref_model_id_or_path, model_state],\\n                outputs=[model_state])\\n\\n\\nimport collections\\nimport os\\nimport re\\nimport sys\\nimport time\\nfrom functools import partial\\nfrom subprocess import PIPE, STDOUT, Popen\\nfrom typing import Dict, Type\\n\\nimport gradio as gr\\nimport json\\nimport torch\\nfrom gradio import Accordion, Checkbox, Dropdown, Slider, Tab, Textbox\\nfrom json import JSONDecodeError\\n\\nfrom swift.llm import RLHFArguments\\nfrom swift.ui.base import BaseUI\\nfrom swift.ui.llm_train.advanced import Advanced\\nfrom swift.ui.llm_train.dataset import Dataset\\nfrom swift.ui.llm_train.galore import Galore\\nfrom swift.ui.llm_train.hyper import Hyper\\nfrom swift.ui.llm_train.lisa import Lisa\\nfrom swift.ui.llm_train.llamapro import LlamaPro\\nfrom swift.ui.llm_train.lora import LoRA\\nfrom swift.ui.llm_train.model import Model\\nfrom swift.ui.llm_train.quantization import Quantization\\nfrom swift.ui.llm_train.rlhf import RLHF\\nfrom swift.ui.llm_train.runtime import Runtime\\nfrom swift.ui.llm_train.save import Save\\nfrom swift.ui.llm_train.self_cog import SelfCog\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\nis_spaces = True if 'SPACE_ID' in os.environ else False\\nif is_spaces:\\n    is_shared_ui = True if 'modelscope/swift' in os.environ['SPACE_ID'] else False\\nelse:\\n    is_shared_ui = False\\n\\n\\nclass LLMTrain(BaseUI):\\n    group = 'llm_train'\\n\\n    is_studio = os.environ.get('MODELSCOPE_ENVIRONMENT') == 'studio'\\n\\n    sub_ui = [\\n        Model,\\n        Dataset,\\n        Runtime,\\n        Save,\\n        LoRA,\\n        Hyper,\\n        Quantization,\\n        SelfCog,\\n        Advanced,\\n        RLHF,\\n        Lisa,\\n        Galore,\\n        LlamaPro,\\n    ]\\n\\n    locale_dict: Dict[str, Dict] = {\\n        'llm_train': {\\n            'label': {\\n                'zh': 'LLM训练',\\n                'en': 'LLM Training',\\n            }\\n        },\\n        'train_type': {\\n            'label': {\\n                'zh': '训练Stage',\\n                'en': 'Train Stage'\\n            },\\n            'info': {\\n                'zh': '请注意选择于此匹配的数据集，人类对齐配置在页面下方',\\n                'en': 'Please choose matched dataset, RLHF settings is at the bottom of the page'\\n            }\\n        },\\n        'submit_alert': {\\n            'value': {\\n                'zh':\\n                '任务已开始，请查看tensorboard或日志记录，关闭本页面不影响训练过程',\\n                'en':\\n                'Task started, please check the tensorboard or log file, '\\n                'closing this page does not affect training'\\n            }\\n        },\\n        'dataset_alert': {\\n            'value': {\\n                'zh': '请选择或填入一个数据集',\\n                'en': 'Please input or select a dataset'\\n            }\\n        },\\n        'submit': {\\n            'value': {\\n                'zh': '🚀 开始训练',\\n                'en': '🚀 Begin'\\n            }\\n        },\\n        'dry_run': {\\n            'label': {\\n                'zh': '仅生成运行命令',\\n                'en': 'Dry-run'\\n            },\\n            'info': {\\n                'zh': '仅生成运行命令，开发者自行运行',\\n                'en': 'Generate run command only, for manually running'\\n            }\\n        },\\n        'gpu_id': {\\n            'label': {\\n                'zh': '选择可用GPU',\\n                'en': 'Choose GPU'\\n            },\\n            'info': {\\n                'zh': '选择训练使用的GPU号，如CUDA不可用只能选择CPU',\\n                'en': 'Select GPU to train'\\n            }\\n        },\\n        'sft_type': {\\n            'label': {\\n                'zh': '训练方式',\\n                'en': 'Train type'\\n            },\\n            'info': {\\n                'zh': '选择训练的方式',\\n                'en': 'Select the training type'\\n            }\\n        },\\n        'seed': {\\n            'label': {\\n                'zh': '随机数种子',\\n                'en': 'Seed'\\n            },\\n            'info': {\\n                'zh': '选择随机数种子',\\n                'en': 'Select a random seed'\\n            }\\n        },\\n        'dtype': {\\n            'label': {\\n                'zh': '训练精度',\\n                'en': 'Training Precision'\\n            },\\n            'info': {\\n                'zh': '选择训练精度',\\n                'en': 'Select the training precision'\\n            }\\n        },\\n        'use_ddp': {\\n            'label': {\\n                'zh': '使用DDP',\\n                'en': 'Use DDP'\\n            },\\n            'info': {\\n                'zh': '是否使用数据并行训练',\\n                'en': 'Use Distributed Data Parallel to train'\\n            }\\n        },\\n        'ddp_num': {\\n            'label': {\\n                'zh': 'DDP分片数量',\\n                'en': 'Number of DDP sharding'\\n            },\\n            'info': {\\n                'zh': '启用多少进程的数据并行',\\n                'en': 'The data parallel size of DDP'\\n            }\\n        },\\n        'tuner_backend': {\\n            'label': {\\n                'zh': 'Tuner backend',\\n                'en': 'Tuner backend'\\n            },\\n            'info': {\\n                'zh': 'tuner实现框架，建议peft或者unsloth',\\n                'en': 'The tuner backend, suggest to use peft or unsloth'\\n            }\\n        },\\n        'use_liger': {\\n            'label': {\\n                'zh': '使用Liger kernel',\\n                'en': 'Use Liger kernel'\\n            },\\n            'info': {\\n                'zh': 'Liger kernel可以有效降低显存使用',\\n                'en': 'Liger kernel can reduce memory usage'\\n            }\\n        },\\n        'sequence_parallel_size': {\\n            'label': {\\n                'zh': '序列并行分段',\\n                'en': 'Sequence parallel size'\\n            },\\n            'info': {\\n                'zh': 'DDP条件下的序列并行（减小显存），需要安装ms-swift[seq_parallel]',\\n                'en': 'Sequence parallel when ddp, need to install ms-swift[seq_parallel]'\\n            }\\n        },\\n        'train_param': {\\n            'label': {\\n                'zh': '训练参数设置',\\n                'en': 'Train settings'\\n            },\\n        },\\n    }\\n\\n    choice_dict = BaseUI.get_choices_from_dataclass(RLHFArguments)\\n    default_dict = BaseUI.get_default_value_from_dataclass(RLHFArguments)\\n    arguments = BaseUI.get_argument_names(RLHFArguments)\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.TabItem(elem_id='llm_train', label=''):\\n            gpu_count = 0\\n            default_device = 'cpu'\\n            if torch.cuda.is_available():\\n                gpu_count = torch.cuda.device_count()\\n                default_device = '0'\\n            with gr.Blocks():\\n                Model.build_ui(base_tab)\\n                Dataset.build_ui(base_tab)\\n                with gr.Accordion(elem_id='train_param', open=True):\\n                    with gr.Row():\\n                        gr.Dropdown(\\n                            elem_id='train_type', choices=['pretrain/sft', 'rlhf'], value='pretrain/sft', scale=3)\\n                        gr.Dropdown(elem_id='sft_type', scale=2)\\n                        gr.Dropdown(elem_id='tuner_backend', scale=2)\\n                        gr.Textbox(elem_id='sequence_parallel_size', scale=3)\\n                    with gr.Row():\\n                        gr.Textbox(elem_id='seed', scale=4)\\n                        gr.Dropdown(elem_id='dtype', scale=4)\\n                        gr.Checkbox(elem_id='use_liger', scale=4)\\n                        gr.Checkbox(elem_id='use_ddp', value=False, scale=4)\\n                        gr.Textbox(elem_id='ddp_num', value='2', scale=4)\\n                Hyper.build_ui(base_tab)\\n                Runtime.build_ui(base_tab)\\n                with gr.Row():\\n                    gr.Dropdown(\\n                        elem_id='gpu_id',\\n                        multiselect=True,\\n                        choices=[str(i) for i in range(gpu_count)] + ['cpu'],\\n                        value=default_device,\\n                        scale=8)\\n                    if is_shared_ui:\\n                        gr.Checkbox(elem_id='dry_run', value=True, interactive=False, scale=4)\\n                    else:\\n                        gr.Checkbox(elem_id='dry_run', value=False, scale=4)\\n                    submit = gr.Button(elem_id='submit', scale=4, variant='primary')\\n\\n                LoRA.build_ui(base_tab)\\n                RLHF.build_ui(base_tab)\\n                Quantization.build_ui(base_tab)\\n                Galore.build_ui(base_tab)\\n                Lisa.build_ui(base_tab)\\n                LlamaPro.build_ui(base_tab)\\n                SelfCog.build_ui(base_tab)\\n                Save.build_ui(base_tab)\\n                Advanced.build_ui(base_tab)\\n\\n                cls.element('sft_type').change(\\n                    Hyper.update_lr, inputs=[base_tab.element('sft_type')], outputs=[cls.element('learning_rate')])\\n\\n                cls.element('train_record').change(\\n                    partial(cls.update_all_settings, base_tab=base_tab),\\n                    inputs=[cls.element('model_type'), cls.element('train_record')],\\n                    outputs=[value for value in cls.elements().values() if not isinstance(value, (Tab, Accordion))])\\n                if cls.is_studio:\\n                    submit.click(\\n                        cls.update_runtime, [],\\n                        [cls.element('runtime_tab'), cls.element('log')]).then(\\n                            cls.train_studio,\\n                            [value for value in cls.elements().values() if not isinstance(value, (Tab, Accordion))],\\n                            [cls.element('log')] + Runtime.all_plots + [cls.element('running_cmd')],\\n                            queue=True)\\n                else:\\n                    submit.click(\\n                        cls.train_local,\\n                        [value for value in cls.elements().values() if not isinstance(value, (Tab, Accordion))], [\\n                            cls.element('running_cmd'),\\n                            cls.element('logging_dir'),\\n                            cls.element('runtime_tab'),\\n                            cls.element('running_tasks'),\\n                            cls.element('train_record'),\\n                        ],\\n                        queue=True)\\n                if not cls.is_studio:\\n                    base_tab.element('running_tasks').change(\\n                        partial(Runtime.task_changed, base_tab=base_tab), [base_tab.element('running_tasks')],\\n                        [value for value in base_tab.elements().values() if not isinstance(value, (Tab, Accordion))]\\n                        + [cls.element('log')] + Runtime.all_plots,\\n                        cancels=Runtime.log_event)\\n                    Runtime.element('kill_task').click(\\n                        Runtime.kill_task,\\n                        [Runtime.element('running_tasks')],\\n                        [Runtime.element('running_tasks')] + [Runtime.element('log')] + Runtime.all_plots,\\n                        cancels=[Runtime.log_event],\\n                    ).then(Runtime.reset, [], [Runtime.element('logging_dir')] + [Hyper.element('output_dir')])\\n\\n    @classmethod\\n    def update_runtime(cls):\\n        return gr.update(open=True), gr.update(visible=True)\\n\\n    @classmethod\\n    def update_all_settings(cls, model_type, train_record, base_tab):\\n        if not train_record:\\n            return [gr.update()] * len(base_tab.elements())\\n        cache = cls.load_cache(model_type, train_record)\\n        updates = []\\n        for key, value in base_tab.elements().items():\\n            if isinstance(value, (Tab, Accordion)):\\n                continue\\n            if (key in cache and isinstance(value, (Textbox, Dropdown, Slider, Checkbox)) and key != 'train_record'):\\n                updates.append(gr.update(value=cache[key]))\\n            else:\\n                updates.append(gr.update())\\n        return updates\\n\\n    @classmethod\\n    def train(cls, *args):\\n        ignore_elements = ('model_type', 'logging_dir', 'more_params', 'train_type')\\n        default_args = cls.get_default_value_from_dataclass(RLHFArguments)\\n        kwargs = {}\\n        kwargs_is_list = {}\\n        other_kwargs = {}\\n        more_params = {}\\n        more_params_cmd = ''\\n        keys = [key for key, value in cls.elements().items() if not isinstance(value, (Tab, Accordion))]\\n        model_type = None\\n        do_rlhf = False\\n        for key, value in zip(keys, args):\\n            compare_value = default_args.get(key)\\n            if isinstance(value, str) and re.fullmatch(cls.int_regex, value):\\n                value = int(value)\\n            elif isinstance(value, str) and re.fullmatch(cls.float_regex, value):\\n                value = float(value)\\n            elif isinstance(value, str) and re.fullmatch(cls.bool_regex, value):\\n                value = True if value.lower() == 'true' else False\\n            if key not in ignore_elements and key in default_args and compare_value != value and value:\\n                kwargs[key] = value if not isinstance(value, list) else ' '.join(value)\\n                kwargs_is_list[key] = isinstance(value, list) or getattr(cls.element(key), 'is_list', False)\\n            else:\\n                other_kwargs[key] = value\\n            if key == 'more_params' and value:\\n                try:\\n                    more_params = json.loads(value)\\n                except (JSONDecodeError or TypeError):\\n                    more_params_cmd = value\\n\\n            if key == 'model_type':\\n                model_type = value\\n\\n            if key == 'train_type':\\n                do_rlhf = value == 'rlhf'\\n\\n        if os.path.exists(kwargs['model_id_or_path']):\\n            kwargs['model_type'] = model_type\\n\\n        kwargs.update(more_params)\\n        if 'dataset' not in kwargs and 'custom_train_dataset_path' not in kwargs:\\n            raise gr.Error(cls.locale('dataset_alert', cls.lang)['value'])\\n\\n        cmd = 'rlhf' if do_rlhf else 'sft'\\n        if kwargs.get('deepspeed'):\\n            more_params_cmd += f' --deepspeed {kwargs.pop(\\\"deepspeed\\\")} '\\n        sft_args = RLHFArguments(\\n            **{\\n                key: value.split(' ') if kwargs_is_list.get(key, False) and isinstance(value, str) else value\\n                for key, value in kwargs.items()\\n            })\\n        params = ''\\n\\n        sep = f'{cls.quote} {cls.quote}'\\n        for e in kwargs:\\n            if isinstance(kwargs[e], list):\\n                params += f'--{e} {cls.quote}{sep.join(kwargs[e])}{cls.quote} '\\n            elif e in kwargs_is_list and kwargs_is_list[e]:\\n                all_args = [arg for arg in kwargs[e].split(' ') if arg.strip()]\\n                params += f'--{e} {cls.quote}{sep.join(all_args)}{cls.quote} '\\n            else:\\n                params += f'--{e} {cls.quote}{kwargs[e]}{cls.quote} '\\n        params += more_params_cmd + ' '\\n        params += f'--add_output_dir_suffix False --output_dir {sft_args.output_dir} ' \\\\\\n                  f'--logging_dir {sft_args.logging_dir} --ignore_args_error True'\\n        ddp_param = ''\\n        devices = other_kwargs['gpu_id']\\n        devices = [d for d in devices if d]\\n        if other_kwargs['use_ddp']:\\n            assert int(other_kwargs['ddp_num']) > 0\\n            ddp_param = f'NPROC_PER_NODE={int(other_kwargs[\\\"ddp_num\\\"])}'\\n        assert (len(devices) == 1 or 'cpu' not in devices)\\n        gpus = ','.join(devices)\\n        cuda_param = ''\\n        if gpus != 'cpu':\\n            cuda_param = f'CUDA_VISIBLE_DEVICES={gpus}'\\n\\n        log_file = os.path.join(sft_args.logging_dir, 'run.log')\\n        if sys.platform == 'win32':\\n            if cuda_param:\\n                cuda_param = f'set {cuda_param} && '\\n            if ddp_param:\\n                ddp_param = f'set {ddp_param} && '\\n            run_command = f'{cuda_param}{ddp_param}start /b swift sft {params} > {log_file} 2>&1'\\n        elif cls.is_studio:\\n            run_command = f'{cuda_param} {ddp_param} swift {cmd} {params}'\\n        else:\\n            run_command = f'{cuda_param} {ddp_param} nohup swift {cmd} {params} > {log_file} 2>&1 &'\\n        logger.info(f'Run training: {run_command}')\\n        if model_type:\\n            record = {}\\n            for key, value in zip(keys, args):\\n                if key in default_args or key in ('more_params', 'train_type', 'use_ddp', 'ddp_num', 'gpu_id'):\\n                    record[key] = value or None\\n            cls.save_cache(model_type, record)\\n        return run_command, sft_args, other_kwargs\\n\\n    @classmethod\\n    def train_studio(cls, *args):\\n        run_command, sft_args, other_kwargs = cls.train(*args)\\n        if not other_kwargs['dry_run']:\\n            lines = collections.deque(maxlen=int(os.environ.get('MAX_LOG_LINES', 50)))\\n            process = Popen(run_command, shell=True, stdout=PIPE, stderr=STDOUT)\\n            with process.stdout:\\n                for line in iter(process.stdout.readline, b''):\\n                    line = line.decode('utf-8')\\n                    lines.append(line)\\n                    yield ['\\\\n'.join(lines)] + Runtime.plot(run_command) + [run_command]\\n        else:\\n            yield [\\n                'Current is dryrun mode so you can only view the training cmd, please duplicate this space to '\\n                'do training or use with inference.'\\n            ] + [None] * len(Runtime.sft_plot) + [run_command]\\n\\n    @classmethod\\n    def train_local(cls, *args):\\n        run_command, sft_args, other_kwargs = cls.train(*args)\\n        if not other_kwargs['dry_run']:\\n            os.makedirs(sft_args.logging_dir, exist_ok=True)\\n            os.system(run_command)\\n            time.sleep(1)  # to make sure the log file has been created.\\n            gr.Info(cls.locale('submit_alert', cls.lang)['value'])\\n        return run_command, sft_args.logging_dir, gr.update(open=True), Runtime.refresh_tasks(\\n            sft_args.output_dir), gr.update(choices=cls.list_cache(sft_args.model_type))\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.llm import MODEL_MAPPING, get_default_lora_target_modules\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass LoRA(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'lora_tab': {\\n            'label': {\\n                'zh': 'LoRA参数设置',\\n                'en': 'LoRA settings'\\n            },\\n        },\\n        'lora_target_modules': {\\n            'label': {\\n                'zh': 'LoRA目标模块',\\n                'en': 'LoRA target modules'\\n            },\\n            'info': {\\n                'zh': '设置LoRA目标模块，如训练所有Linear请改为ALL',\\n                'en': 'Set the LoRA target modules, fill in ALL if train all Linears'\\n            }\\n        },\\n        'lora_rank': {\\n            'label': {\\n                'zh': 'LoRA的秩',\\n                'en': 'The LoRA rank'\\n            }\\n        },\\n        'lora_alpha': {\\n            'label': {\\n                'zh': 'LoRA的alpha',\\n                'en': 'The LoRA alpha'\\n            }\\n        },\\n        'lora_dropout': {\\n            'label': {\\n                'zh': 'LoRA的dropout',\\n                'en': 'The LoRA dropout'\\n            }\\n        },\\n        'use_rslora': {\\n            'label': {\\n                'zh': '使用rslora',\\n                'en': 'Use rslora'\\n            }\\n        },\\n        'use_dora': {\\n            'label': {\\n                'zh': '使用dora',\\n                'en': 'Use dora'\\n            }\\n        },\\n        'lora_dtype': {\\n            'label': {\\n                'zh': 'lora部分的参数类型',\\n                'en': 'The dtype of lora parameters'\\n            }\\n        },\\n        'init_lora_weights': {\\n            'label': {\\n                'zh': 'lora初始化方法',\\n                'en': 'init lora weights'\\n            },\\n            'info': {\\n                'zh': 'gaussian/pissa/pissa_niter_[n]/olora/loftq/true/false',\\n                'en': 'gaussian/pissa/pissa_niter_[n]/olora/loftq/true/false',\\n            }\\n        },\\n        'lora_lr_ratio': {\\n            'label': {\\n                'zh': 'Lora+学习率倍率',\\n                'en': 'The lr ratio of Lora+'\\n            },\\n            'info': {\\n                'zh': '建议值16.0',\\n                'en': 'Suggested value: 16.0'\\n            }\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='lora_tab', open=True):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    lora_target_modules = gr.Textbox(\\n                        elem_id='lora_target_modules', lines=1, scale=5, value='ALL', is_list=True)\\n                    gr.Slider(elem_id='lora_rank', value=32, minimum=1, maximum=512, step=8, scale=2)\\n                    gr.Slider(elem_id='lora_alpha', value=8, minimum=1, maximum=512, step=8, scale=2)\\n                    gr.Textbox(elem_id='lora_dropout', scale=2)\\n                with gr.Row():\\n                    gr.Dropdown(elem_id='lora_dtype', scale=2)\\n                    gr.Textbox(elem_id='lora_lr_ratio', scale=2)\\n                    gr.Checkbox(elem_id='use_rslora', scale=2)\\n                    gr.Checkbox(elem_id='use_dora', scale=2)\\n                    gr.Textbox(elem_id='init_lora_weights', scale=4)\\n\\n            def update_lora(choice):\\n                if choice is not None:\\n                    target_modules = get_default_lora_target_modules(choice)\\n                    if isinstance(target_modules, list):\\n                        target_modules = 'ALL'  # llm\\n                    return target_modules\\n                return None\\n\\n            base_tab.element('model_type').change(\\n                update_lora, inputs=[base_tab.element('model_type')], outputs=[lora_target_modules])\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Galore(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'galore_tab': {\\n            'label': {\\n                'zh': 'Galore参数设置',\\n                'en': 'Galore Settings'\\n            },\\n        },\\n        'use_galore': {\\n            'label': {\\n                'zh': '使用GaLore',\\n                'en': 'Use GaLore'\\n            },\\n            'info': {\\n                'zh': '使用Galore来减少全参数训练的显存消耗',\\n                'en': 'Use Galore to reduce GPU memory usage in full parameter training'\\n            }\\n        },\\n        'galore_rank': {\\n            'label': {\\n                'zh': 'Galore的秩',\\n                'en': 'The rank of Galore'\\n            },\\n        },\\n        'galore_update_proj_gap': {\\n            'label': {\\n                'zh': 'Galore project matrix更新频率',\\n                'en': 'The updating gap of the project matrix'\\n            },\\n        },\\n        'galore_optim_per_parameter': {\\n            'label': {\\n                'zh': '为每个Galore Parameter创建单独的optimizer',\\n                'en': 'Create unique optimizer for per Galore parameter'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='galore_tab', open=False):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Checkbox(elem_id='use_galore', scale=4)\\n                    gr.Slider(elem_id='galore_rank', minimum=8, maximum=256, step=8, scale=4)\\n                    gr.Slider(elem_id='galore_update_proj_gap', minimum=10, maximum=1000, step=50, scale=4)\\n                    gr.Checkbox(elem_id='galore_optim_per_parameter', scale=4)\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass LlamaPro(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'llamapro_tab': {\\n            'label': {\\n                'zh': 'LLAMAPRO参数设置',\\n                'en': 'LLAMAPRO Settings'\\n            },\\n        },\\n        'llamapro_num_new_blocks': {\\n            'label': {\\n                'zh': 'LLAMAPRO插入层数',\\n                'en': 'LLAMAPRO new layers'\\n            },\\n        },\\n        'llamapro_num_groups': {\\n            'label': {\\n                'zh': 'LLAMAPRO对原模型的分组数',\\n                'en': 'LLAMAPRO groups of model'\\n            }\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='llamapro_tab', open=False):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Textbox(elem_id='llamapro_num_new_blocks')\\n                    gr.Textbox(elem_id='llamapro_num_groups')\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Quantization(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'quantization_tab': {\\n            'label': {\\n                'zh': '量化参数设置',\\n                'en': 'Quantization settings'\\n            },\\n        },\\n        'quant_method': {\\n            'label': {\\n                'zh': '量化方式',\\n                'en': 'Quantization method'\\n            },\\n            'info': {\\n                'zh': '如果制定了量化位数，本参数默认为bnb',\\n                'en': 'Default is bnb if quantization_bit is specified'\\n            }\\n        },\\n        'quantization_bit': {\\n            'label': {\\n                'zh': '量化bit数',\\n                'en': 'Quantization bit'\\n            },\\n            'info': {\\n                'zh': '设置量化bit数, 0代表不进行量化',\\n                'en': 'Set the quantization bit, 0 for no quantization'\\n            }\\n        },\\n        'bnb_4bit_comp_dtype': {\\n            'label': {\\n                'zh': 'bnb_4bit_comp_dtype',\\n                'en': 'bnb_4bit_comp_dtype'\\n            },\\n        },\\n        'bnb_4bit_quant_type': {\\n            'label': {\\n                'zh': 'bnb_4bit_quant_type',\\n                'en': 'bnb_4bit_quant_type'\\n            },\\n        },\\n        'bnb_4bit_use_double_quant': {\\n            'label': {\\n                'zh': 'bnb_4bit_use_double_quant',\\n                'en': 'bnb_4bit_use_double_quant'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='quantization_tab', open=False):\\n            with gr.Row():\\n                gr.Dropdown(elem_id='quantization_bit')\\n                gr.Dropdown(elem_id='quant_method')\\n                gr.Dropdown(elem_id='bnb_4bit_comp_dtype')\\n                gr.Dropdown(elem_id='bnb_4bit_quant_type')\\n                gr.Checkbox(elem_id='bnb_4bit_use_double_quant')\\n\\n\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Lisa(BaseUI):\\n\\n    group = 'llm_train'\\n\\n    locale_dict = {\\n        'lisa_tab': {\\n            'label': {\\n                'zh': 'LISA参数设置',\\n                'en': 'LISA settings'\\n            },\\n        },\\n        'lisa_activated_layers': {\\n            'label': {\\n                'zh': 'LISA激活层数',\\n                'en': 'LoRA activated layers'\\n            },\\n            'info': {\\n                'zh': 'LISA每次训练的模型层数，调整为正整数代表使用LISA',\\n                'en': 'Num of layers activated each time, a positive value means using lisa'\\n            }\\n        },\\n        'lisa_step_interval': {\\n            'label': {\\n                'zh': 'LISA切换layers间隔',\\n                'en': 'The interval of lisa layers switching'\\n            }\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='lisa_tab', open=False):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Textbox(elem_id='lisa_activated_layers')\\n                    gr.Textbox(elem_id='lisa_step_interval')\\n\\n\\nimport os.path\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.llm import MODEL_MAPPING, ModelType\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Model(BaseUI):\\n\\n    group = 'llm_eval'\\n\\n    locale_dict = {\\n        'checkpoint': {\\n            'value': {\\n                'zh': '训练后的模型',\\n                'en': 'Trained model'\\n            }\\n        },\\n        'model_type': {\\n            'label': {\\n                'zh': '选择模型',\\n                'en': 'Select Model'\\n            },\\n            'info': {\\n                'zh': 'SWIFT已支持的模型名称',\\n                'en': 'Base model supported by SWIFT'\\n            }\\n        },\\n        'model_id_or_path': {\\n            'label': {\\n                'zh': '模型id或路径',\\n                'en': 'Model id or path'\\n            },\\n            'info': {\\n                'zh': '实际的模型id，如果是训练后的模型请填入checkpoint-xxx的目录',\\n                'en': 'The actual model id or path, if is a trained model, please fill in the checkpoint-xxx dir'\\n            }\\n        },\\n        'reset': {\\n            'value': {\\n                'zh': '恢复初始值',\\n                'en': 'Reset to default'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Row():\\n            model_type = gr.Dropdown(\\n                elem_id='model_type',\\n                choices=[base_tab.locale('checkpoint', cls.lang)['value']] + ModelType.get_model_name_list()\\n                + cls.get_custom_name_list(),\\n                value=base_tab.locale('checkpoint', cls.lang)['value'],\\n                allow_custom_value=True,\\n                scale=20)\\n            model_id_or_path = gr.Textbox(elem_id='model_id_or_path', lines=1, scale=20, interactive=True)\\n            reset_btn = gr.Button(elem_id='reset', scale=2)\\n            model_state = gr.State({})\\n\\n        def update_input_model(choice, model_state=None):\\n            if choice == base_tab.locale('checkpoint', cls.lang)['value']:\\n                if model_state and choice in model_state:\\n                    model_id_or_path = model_state[choice]\\n                else:\\n                    model_id_or_path = None\\n            else:\\n                if model_state and choice in model_state:\\n                    model_id_or_path = model_state[choice]\\n                else:\\n                    model_id_or_path = MODEL_MAPPING.get(choice, {}).get('model_id_or_path')\\n            return model_id_or_path\\n\\n        def update_model_id_or_path(model_type, path, model_state):\\n            if not path or not os.path.exists(path):\\n                return gr.update()\\n            model_state[model_type] = path\\n            return model_state\\n\\n        model_type.change(update_input_model, inputs=[model_type, model_state], outputs=[model_id_or_path])\\n\\n        model_id_or_path.change(\\n            update_model_id_or_path, inputs=[model_type, model_id_or_path, model_state], outputs=[model_state])\\n\\n        def reset(model_type):\\n            model_id_or_path = update_input_model(model_type)\\n            return model_id_or_path, {}\\n\\n        reset_btn.click(reset, inputs=[model_type], outputs=[model_id_or_path, model_state])\\n\\n\\nimport os\\nimport re\\nimport sys\\nimport time\\nfrom datetime import datetime\\nfrom functools import partial\\nfrom typing import Type\\n\\nimport gradio as gr\\nimport json\\nimport torch\\nfrom gradio import Accordion, Tab\\nfrom json import JSONDecodeError\\nfrom modelscope import snapshot_download\\n\\nfrom swift.llm import EvalArguments\\nfrom swift.ui.base import BaseUI\\nfrom swift.ui.llm_eval.eval import Eval\\nfrom swift.ui.llm_eval.model import Model\\nfrom swift.ui.llm_eval.runtime import EvalRuntime\\n\\n\\nclass LLMEval(BaseUI):\\n    group = 'llm_eval'\\n\\n    sub_ui = [Model, Eval, EvalRuntime]\\n\\n    cmd = 'eval'\\n\\n    locale_dict = {\\n        'llm_eval': {\\n            'label': {\\n                'zh': 'LLM评测',\\n                'en': 'LLM evaluation',\\n            }\\n        },\\n        'more_params': {\\n            'label': {\\n                'zh': '更多参数',\\n                'en': 'More params'\\n            },\\n            'info': {\\n                'zh': '以json格式或--xxx xxx命令行格式填入',\\n                'en': 'Fill in with json format or --xxx xxx cmd format'\\n            }\\n        },\\n        'evaluate': {\\n            'value': {\\n                'zh': '开始评测',\\n                'en': 'Begin Evaluation'\\n            },\\n        },\\n        'gpu_id': {\\n            'label': {\\n                'zh': '选择可用GPU',\\n                'en': 'Choose GPU'\\n            },\\n            'info': {\\n                'zh': '选择训练使用的GPU号，如CUDA不可用只能选择CPU',\\n                'en': 'Select GPU to train'\\n            }\\n        },\\n    }\\n\\n    choice_dict = BaseUI.get_choices_from_dataclass(EvalArguments)\\n    default_dict = BaseUI.get_default_value_from_dataclass(EvalArguments)\\n    arguments = BaseUI.get_argument_names(EvalArguments)\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.TabItem(elem_id='llm_eval', label=''):\\n            gpu_count = 0\\n            default_device = 'cpu'\\n            if torch.cuda.is_available():\\n                gpu_count = torch.cuda.device_count()\\n                default_device = '0'\\n            with gr.Blocks():\\n                model_and_template = gr.State([])\\n                Model.build_ui(base_tab)\\n                Eval.build_ui(base_tab)\\n                EvalRuntime.build_ui(base_tab)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='more_params', lines=4, scale=20)\\n                    gr.Button(elem_id='evaluate', scale=2, variant='primary')\\n                gr.Dropdown(\\n                    elem_id='gpu_id',\\n                    multiselect=True,\\n                    choices=[str(i) for i in range(gpu_count)] + ['cpu'],\\n                    value=default_device,\\n                    scale=8)\\n\\n                cls.element('evaluate').click(\\n                    cls.eval_model,\\n                    [value for value in cls.elements().values() if not isinstance(value, (Tab, Accordion))],\\n                    [cls.element('runtime_tab'),\\n                     cls.element('running_tasks'), model_and_template])\\n\\n                base_tab.element('running_tasks').change(\\n                    partial(EvalRuntime.task_changed, base_tab=base_tab), [base_tab.element('running_tasks')],\\n                    [value for value in base_tab.elements().values() if not isinstance(value, (Tab, Accordion))]\\n                    + [cls.element('log'), model_and_template],\\n                    cancels=EvalRuntime.log_event)\\n                EvalRuntime.element('kill_task').click(\\n                    EvalRuntime.kill_task,\\n                    [EvalRuntime.element('running_tasks')],\\n                    [EvalRuntime.element('running_tasks')] + [EvalRuntime.element('log')],\\n                    cancels=[EvalRuntime.log_event],\\n                )\\n\\n    @classmethod\\n    def eval(cls, *args):\\n        eval_args = cls.get_default_value_from_dataclass(EvalArguments)\\n        kwargs = {}\\n        kwargs_is_list = {}\\n        other_kwargs = {}\\n        more_params = {}\\n        more_params_cmd = ''\\n        keys = [key for key, value in cls.elements().items() if not isinstance(value, (Tab, Accordion))]\\n        for key, value in zip(keys, args):\\n            compare_value = eval_args.get(key)\\n            compare_value_arg = str(compare_value) if not isinstance(compare_value, (list, dict)) else compare_value\\n            compare_value_ui = str(value) if not isinstance(value, (list, dict)) else value\\n            if key in eval_args and compare_value_ui != compare_value_arg and value:\\n                if isinstance(value, str) and re.fullmatch(cls.int_regex, value):\\n                    value = int(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.float_regex, value):\\n                    value = float(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.bool_regex, value):\\n                    value = True if value.lower() == 'true' else False\\n                kwargs[key] = value if not isinstance(value, list) else ' '.join(value)\\n                kwargs_is_list[key] = isinstance(value, list) or getattr(cls.element(key), 'is_list', False)\\n            else:\\n                other_kwargs[key] = value\\n            if key == 'more_params' and value:\\n                try:\\n                    more_params = json.loads(value)\\n                except (JSONDecodeError or TypeError):\\n                    more_params_cmd = value\\n\\n        kwargs.update(more_params)\\n        if kwargs['model_type'] == cls.locale('checkpoint', cls.lang)['value']:\\n            model_dir = kwargs.pop('model_id_or_path')\\n            if not os.path.exists(model_dir):\\n                model_dir = snapshot_download(model_dir)\\n            kwargs['ckpt_dir'] = model_dir\\n\\n        eval_args = EvalArguments(\\n            **{\\n                key: value.split(' ') if key in kwargs_is_list and kwargs_is_list[key] else value\\n                for key, value in kwargs.items()\\n            })\\n        params = ''\\n        sep = f'{cls.quote} {cls.quote}'\\n        for e in kwargs:\\n            if isinstance(kwargs[e], list):\\n                params += f'--{e} {cls.quote}{sep.join(kwargs[e])}{cls.quote} '\\n            elif e in kwargs_is_list and kwargs_is_list[e]:\\n                all_args = [arg for arg in kwargs[e].split(' ') if arg.strip()]\\n                params += f'--{e} {cls.quote}{sep.join(all_args)}{cls.quote} '\\n            else:\\n                params += f'--{e} {cls.quote}{kwargs[e]}{cls.quote} '\\n        params += more_params_cmd + ' '\\n        devices = other_kwargs['gpu_id']\\n        devices = [d for d in devices if d]\\n        assert (len(devices) == 1 or 'cpu' not in devices)\\n        gpus = ','.join(devices)\\n        cuda_param = ''\\n        if gpus != 'cpu':\\n            cuda_param = f'CUDA_VISIBLE_DEVICES={gpus}'\\n        now = datetime.now()\\n        time_str = f'{now.year}{now.month}{now.day}{now.hour}{now.minute}{now.second}'\\n        file_path = f'output/{eval_args.model_type}-{time_str}'\\n        if not os.path.exists(file_path):\\n            os.makedirs(file_path, exist_ok=True)\\n        log_file = os.path.join(os.getcwd(), f'{file_path}/run_eval.log')\\n        eval_args.log_file = log_file\\n        params += f'--log_file \\\"{log_file}\\\" '\\n        params += '--ignore_args_error true '\\n        if sys.platform == 'win32':\\n            if cuda_param:\\n                cuda_param = f'set {cuda_param} && '\\n            run_command = f'{cuda_param}start /b swift eval {params} > {log_file} 2>&1'\\n        else:\\n            run_command = f'{cuda_param} nohup swift eval {params} > {log_file} 2>&1 &'\\n        return run_command, eval_args, log_file\\n\\n    @classmethod\\n    def eval_model(cls, *args):\\n        run_command, eval_args, log_file = cls.eval(*args)\\n        os.system(run_command)\\n        time.sleep(2)\\n        return gr.update(open=True), EvalRuntime.refresh_tasks(log_file), [eval_args.sft_type]\\n\\n\\nimport os.path\\nfrom typing import Type\\n\\nimport gradio as gr\\nfrom packaging import version\\n\\nfrom swift.ui.base import BaseUI\\nfrom swift.ui.llm_infer.runtime import Runtime\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass EvalRuntime(Runtime):\\n\\n    group = 'llm_eval'\\n\\n    cmd = 'eval'\\n\\n    locale_dict = {\\n        'runtime_tab': {\\n            'label': {\\n                'zh': '运行时',\\n                'en': 'Runtime'\\n            },\\n        },\\n        'running_cmd': {\\n            'label': {\\n                'zh': '运行命令',\\n                'en': 'Command line'\\n            },\\n            'info': {\\n                'zh': '执行的实际命令',\\n                'en': 'The actual command'\\n            }\\n        },\\n        'show_log': {\\n            'value': {\\n                'zh': '展示评测状态',\\n                'en': 'Show eval status'\\n            },\\n        },\\n        'stop_show_log': {\\n            'value': {\\n                'zh': '停止展示',\\n                'en': 'Stop showing running status'\\n            },\\n        },\\n        'log': {\\n            'label': {\\n                'zh': '日志输出',\\n                'en': 'Logging content'\\n            },\\n            'info': {\\n                'zh': '如果日志无更新请再次点击\\\"展示日志内容\\\"',\\n                'en': 'Please press \\\"Show log\\\" if the log content is not updating'\\n            }\\n        },\\n        'running_tasks': {\\n            'label': {\\n                'zh': '运行中评测',\\n                'en': 'Running evaluation'\\n            },\\n            'info': {\\n                'zh': '所有的swift eval命令启动的任务',\\n                'en': 'All tasks started by swift eval'\\n            }\\n        },\\n        'refresh_tasks': {\\n            'value': {\\n                'zh': '找回评测',\\n                'en': 'Find evaluation'\\n            },\\n        },\\n        'kill_task': {\\n            'value': {\\n                'zh': '杀死评测',\\n                'en': 'Kill evaluation'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='runtime_tab', open=False, visible=True):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Dropdown(elem_id='running_tasks', scale=10)\\n                    gr.Button(elem_id='refresh_tasks', scale=1, variant='primary')\\n                    gr.Button(elem_id='show_log', scale=1, variant='primary')\\n                    gr.Button(elem_id='stop_show_log', scale=1)\\n                    gr.Button(elem_id='kill_task', scale=1)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='log', lines=6, visible=False)\\n\\n                concurrency_limit = {}\\n                if version.parse(gr.__version__) >= version.parse('4.0.0') and os.environ.get(\\n                        'MODELSCOPE_ENVIRONMENT') != 'studio':\\n                    concurrency_limit = {'concurrency_limit': 5}\\n                cls.log_event = base_tab.element('show_log').click(cls.update_log, [], [cls.element('log')]).then(\\n                    cls.wait, [base_tab.element('running_tasks')], [cls.element('log')], **concurrency_limit)\\n\\n                base_tab.element('stop_show_log').click(lambda: None, cancels=cls.log_event)\\n\\n                base_tab.element('refresh_tasks').click(\\n                    cls.refresh_tasks,\\n                    [base_tab.element('running_tasks')],\\n                    [base_tab.element('running_tasks')],\\n                )\\n\\n\\n\\n\\nimport os.path\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass Eval(BaseUI):\\n\\n    group = 'llm_eval'\\n\\n    locale_dict = {\\n        'name': {\\n            'label': {\\n                'zh': '评测名称',\\n                'en': 'Evaluation name'\\n            },\\n            'info': {\\n                'zh': '支持英文字母、下划线、横线和数字',\\n                'en': 'Support characters, underscores, hyphens and numbers'\\n            }\\n        },\\n        'eval_dataset': {\\n            'label': {\\n                'zh': '评测数据集',\\n                'en': 'Evaluation dataset'\\n            },\\n            'info': {\\n                'zh': '选择评测数据集，支持多选',\\n                'en': 'Select eval dataset, multiple datasets supported'\\n            }\\n        },\\n        'eval_few_shot': {\\n            'label': {\\n                'zh': 'prompt的few-shot',\\n                'en': 'The few-shot for the prompt'\\n            },\\n            'info': {\\n                'zh': 'Few-shot数量在评测集中有默认设置，可以不填',\\n                'en': 'Few-shot numbers have default values in different datasets'\\n            }\\n        },\\n        'eval_limit': {\\n            'label': {\\n                'zh': '评测数据个数',\\n                'en': 'Eval numbers for each dataset'\\n            },\\n            'info': {\\n                'zh': '每个评测集的取样数',\\n                'en': 'Number of rows sampled from each dataset'\\n            }\\n        },\\n        'eval_use_cache': {\\n            'label': {\\n                'zh': '使用缓存',\\n                'en': 'Use eval cache'\\n            },\\n            'info': {\\n                'zh': '如果name指定的评测已经存在，则可以使用已有缓存',\\n                'en': 'If the evaluation results of the name exists, you may use cache.'\\n            }\\n        },\\n        'custom_eval_config': {\\n            'label': {\\n                'zh': '自定义数据集评测配置',\\n                'en': 'Custom eval config'\\n            },\\n            'info': {\\n                'zh': '可以使用该配置评测自己的数据集，详见github文档的评测部分',\\n                'en': 'Use this config to eval your own datasets, check the docs in github for details'\\n            }\\n        },\\n        'eval_url': {\\n            'label': {\\n                'zh': '评测链接',\\n                'en': 'The eval url'\\n            },\\n            'info': {\\n                'zh':\\n                'OpenAI样式的评测链接(如：http://localhost:8080/v1)，用于评测接口（模型类型输入为实际模型类型）',\\n                'en':\\n                'The OpenAI style link(like: http://localhost:8080/v1) for '\\n                'evaluation(Input actual model type into model_type)'\\n            }\\n        },\\n        'eval_token': {\\n            'label': {\\n                'zh': 'Url token',\\n                'en': 'The url token'\\n            },\\n        },\\n        'eval_is_chat_model': {\\n            'label': {\\n                'zh': '接口是chat模型',\\n                'en': 'Chat model'\\n            },\\n            'info': {\\n                'zh': '评测接口是否是Chat模型',\\n                'en': 'The eval url is a chat model or not'\\n            }\\n        },\\n        'infer_backend': {\\n            'label': {\\n                'zh': '推理框架',\\n                'en': 'Infer backend'\\n            },\\n        }\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        try:\\n            from evalscope.backend.opencompass import OpenCompassBackendManager\\n            from evalscope.backend.vlm_eval_kit import VLMEvalKitBackendManager\\n            eval_dataset_list = (\\n                OpenCompassBackendManager.list_datasets() + VLMEvalKitBackendManager.list_supported_datasets())\\n        except Exception as e:\\n            logger.error(e)\\n            eval_dataset_list = [\\n                'AX_b', 'cmb', 'winogrande', 'mmlu', 'afqmc', 'COPA', 'commonsenseqa', 'CMRC', 'lcsts', 'nq',\\n                'ocnli_fc', 'math', 'mbpp', 'DRCD', 'TheoremQA', 'CB', 'ReCoRD', 'lambada', 'tnews', 'flores',\\n                'humaneval', 'AX_g', 'ceval', 'bbh', 'BoolQ', 'MultiRC', 'piqa', 'csl', 'ARC_c', 'agieval', 'cmnli',\\n                'strategyqa', 'gsm8k', 'summedits', 'eprstmt', 'WiC', 'cluewsc', 'Xsum', 'ocnli', 'triviaqa',\\n                'hellaswag', 'race', 'bustm', 'RTE', 'C3', 'GaokaoBench', 'storycloze', 'ARC_e', 'siqa', 'obqa', 'WSC',\\n                'chid', 'COCO_VAL', 'MME', 'HallusionBench', 'POPE', 'MMBench_DEV_EN', 'MMBench_TEST_EN',\\n                'MMBench_DEV_CN', 'MMBench_TEST_CN', 'MMBench', 'MMBench_CN', 'MMBench_DEV_EN_V11',\\n                'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11', 'MMBench_TEST_CN_V11', 'MMBench_V11', 'MMBench_CN_V11',\\n                'SEEDBench_IMG', 'SEEDBench2', 'SEEDBench2_Plus', 'ScienceQA_VAL', 'ScienceQA_TEST', 'MMT-Bench_ALL_MI',\\n                'MMT-Bench_ALL', 'MMT-Bench_VAL_MI', 'MMT-Bench_VAL', 'AesBench_VAL', 'AesBench_TEST', 'CCBench',\\n                'AI2D_TEST', 'MMStar', 'RealWorldQA', 'MLLMGuard_DS', 'BLINK', 'OCRVQA_TEST', 'OCRVQA_TESTCORE',\\n                'TextVQA_VAL', 'DocVQA_VAL', 'DocVQA_TEST', 'InfoVQA_VAL', 'InfoVQA_TEST', 'ChartQA_TEST', 'MathVision',\\n                'MathVision_MINI', 'MMMU_DEV_VAL', 'MMMU_TEST', 'OCRBench', 'MathVista_MINI', 'LLaVABench', 'MMVet',\\n                'MTVQA_TEST', 'MMLongBench_DOC', 'VCR_EN_EASY_500', 'VCR_EN_EASY_100', 'VCR_EN_EASY_ALL',\\n                'VCR_EN_HARD_500', 'VCR_EN_HARD_100', 'VCR_EN_HARD_ALL', 'VCR_ZH_EASY_500', 'VCR_ZH_EASY_100',\\n                'VCR_ZH_EASY_ALL', 'VCR_ZH_HARD_500', 'VCR_ZH_HARD_100', 'VCR_ZH_HARD_ALL', 'MMDU', 'MMBench-Video',\\n                'Video-MME', 'MMBench_DEV_EN', 'MMBench_TEST_EN', 'MMBench_DEV_CN', 'MMBench_TEST_CN', 'MMBench',\\n                'MMBench_CN', 'MMBench_DEV_EN_V11', 'MMBench_TEST_EN_V11', 'MMBench_DEV_CN_V11', 'MMBench_TEST_CN_V11',\\n                'MMBench_V11', 'MMBench_CN_V11', 'SEEDBench_IMG', 'SEEDBench2', 'SEEDBench2_Plus', 'ScienceQA_VAL',\\n                'ScienceQA_TEST', 'MMT-Bench_ALL_MI', 'MMT-Bench_ALL', 'MMT-Bench_VAL_MI', 'MMT-Bench_VAL',\\n                'AesBench_VAL', 'AesBench_TEST', 'CCBench', 'AI2D_TEST', 'MMStar', 'RealWorldQA', 'MLLMGuard_DS',\\n                'BLINK'\\n            ]\\n\\n        with gr.Row():\\n            gr.Textbox(elem_id='name', scale=20)\\n            gr.Dropdown(\\n                elem_id='eval_dataset',\\n                is_list=True,\\n                choices=eval_dataset_list,\\n                multiselect=True,\\n                allow_custom_value=True,\\n                scale=20)\\n            gr.Textbox(elem_id='eval_few_shot', scale=20)\\n            gr.Textbox(elem_id='eval_limit', scale=20)\\n            gr.Checkbox(elem_id='eval_use_cache', scale=20)\\n            gr.Dropdown(elem_id='infer_backend', scale=20)\\n        with gr.Row():\\n            gr.Textbox(elem_id='custom_eval_config', scale=20)\\n        with gr.Row():\\n            gr.Textbox(elem_id='eval_url', scale=20)\\n            gr.Textbox(elem_id='eval_token', scale=20)\\n            gr.Checkbox(elem_id='eval_is_chat_model', scale=20)\\n\\n\\nimport os.path\\nfrom typing import Type\\n\\nimport gradio as gr\\nimport json\\n\\nfrom swift.llm import MODEL_MAPPING, TEMPLATE_MAPPING, ModelType\\nfrom swift.ui.base import BaseUI\\nfrom swift.ui.llm_infer.generate import Generate\\n\\n\\nclass Model(BaseUI):\\n\\n    llm_train = 'llm_infer'\\n\\n    sub_ui = [Generate]\\n\\n    is_inference = os.environ.get('USE_INFERENCE') == '1' or os.environ.get('MODELSCOPE_ENVIRONMENT') == 'studio'\\n\\n    locale_dict = {\\n        'checkpoint': {\\n            'value': {\\n                'zh': '训练后的模型',\\n                'en': 'Trained model'\\n            }\\n        },\\n        'model_type': {\\n            'label': {\\n                'zh': '选择模型',\\n                'en': 'Select Model'\\n            },\\n            'info': {\\n                'zh': 'SWIFT已支持的模型名称',\\n                'en': 'Base model supported by SWIFT'\\n            }\\n        },\\n        'load_checkpoint': {\\n            'value': {\\n                'zh': '加载模型' if is_inference else '部署模型',\\n                'en': 'Load model' if is_inference else 'Deploy model',\\n            }\\n        },\\n        'model_id_or_path': {\\n            'label': {\\n                'zh': '模型id或路径',\\n                'en': 'Model id or path'\\n            },\\n            'info': {\\n                'zh': '实际的模型id，如果是训练后的模型请填入checkpoint-xxx的目录',\\n                'en': 'The actual model id or path, if is a trained model, please fill in the checkpoint-xxx dir'\\n            }\\n        },\\n        'template_type': {\\n            'label': {\\n                'zh': '模型Prompt模板类型',\\n                'en': 'Prompt template type'\\n            },\\n            'info': {\\n                'zh': '选择匹配模型的Prompt模板',\\n                'en': 'Choose the template type of the model'\\n            }\\n        },\\n        'system': {\\n            'label': {\\n                'zh': 'system字段',\\n                'en': 'system'\\n            },\\n            'info': {\\n                'zh': 'system字段支持在加载模型后修改',\\n                'en': 'system can be modified after the model weights loaded'\\n            }\\n        },\\n        'merge_lora': {\\n            'label': {\\n                'zh': '合并lora',\\n                'en': 'merge lora'\\n            },\\n            'info': {\\n                'zh': '仅在sft_type=lora时可用',\\n                'en': 'Only available when sft_type=lora'\\n            }\\n        },\\n        'lora_modules': {\\n            'label': {\\n                'zh': '外部lora模块',\\n                'en': 'More lora modules'\\n            },\\n            'info': {\\n                'zh': '空格分割的name=/path1/path2键值对',\\n                'en': 'name=/path1/path2 split by blanks'\\n            }\\n        },\\n        'more_params': {\\n            'label': {\\n                'zh': '更多参数',\\n                'en': 'More params'\\n            },\\n            'info': {\\n                'zh': '以json格式或--xxx xxx命令行格式填入',\\n                'en': 'Fill in with json format or --xxx xxx cmd format'\\n            }\\n        },\\n        'reset': {\\n            'value': {\\n                'zh': '恢复初始值',\\n                'en': 'Reset to default'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Row():\\n            model_type = gr.Dropdown(\\n                elem_id='model_type',\\n                choices=[base_tab.locale('checkpoint', cls.lang)['value']] + ModelType.get_model_name_list()\\n                + cls.get_custom_name_list(),\\n                value=base_tab.locale('checkpoint', cls.lang)['value'],\\n                scale=20)\\n            model_id_or_path = gr.Textbox(elem_id='model_id_or_path', lines=1, scale=20, interactive=True)\\n            template_type = gr.Dropdown(\\n                elem_id='template_type', choices=list(TEMPLATE_MAPPING.keys()) + ['AUTO'], scale=20)\\n            gr.Checkbox(elem_id='merge_lora', scale=4)\\n            reset_btn = gr.Button(elem_id='reset', scale=2)\\n            model_state = gr.State({})\\n        with gr.Row():\\n            system = gr.Textbox(elem_id='system', lines=4, scale=20)\\n        Generate.build_ui(base_tab)\\n        with gr.Row():\\n            gr.Textbox(elem_id='lora_modules', lines=1, is_list=True, scale=40)\\n            gr.Textbox(elem_id='more_params', lines=1, scale=20)\\n            gr.Button(elem_id='load_checkpoint', scale=2, variant='primary')\\n\\n        def update_input_model(choice, model_state=None):\\n            if choice == base_tab.locale('checkpoint', cls.lang)['value']:\\n                if model_state and choice in model_state:\\n                    model_id_or_path = model_state[choice]\\n                else:\\n                    model_id_or_path = None\\n                default_system = None\\n                template = None\\n            else:\\n                if model_state and choice in model_state:\\n                    model_id_or_path = model_state[choice]\\n                else:\\n                    model_id_or_path = MODEL_MAPPING[choice]['model_id_or_path']\\n                default_system = getattr(TEMPLATE_MAPPING[MODEL_MAPPING[choice]['template']]['template'],\\n                                         'default_system', None)\\n                template = MODEL_MAPPING[choice]['template']\\n            return model_id_or_path, default_system, template\\n\\n        def update_model_id_or_path(model_type, path, system, template_type, model_state):\\n            if not path or not os.path.exists(path):\\n                return gr.update(), gr.update(), gr.update()\\n            local_path = os.path.join(path, 'sft_args.json')\\n            if not os.path.exists(local_path):\\n                default_system = getattr(TEMPLATE_MAPPING[MODEL_MAPPING[model_type]['template']]['template'],\\n                                         'default_system', None)\\n                template = MODEL_MAPPING[model_type]['template']\\n                return default_system, template, model_state\\n\\n            with open(local_path, 'r') as f:\\n                sft_args = json.load(f)\\n            base_model_type = sft_args['model_type']\\n            system = getattr(TEMPLATE_MAPPING[MODEL_MAPPING[base_model_type]['template']]['template'], 'default_system',\\n                             None)\\n            model_state[model_type] = path\\n            return sft_args['system'] or system, sft_args['template_type'], model_state\\n\\n        model_type.change(\\n            update_input_model, inputs=[model_type, model_state], outputs=[model_id_or_path, system, template_type])\\n\\n        model_id_or_path.change(\\n            update_model_id_or_path,\\n            inputs=[model_type, model_id_or_path, system, template_type, model_state],\\n            outputs=[system, template_type, model_state])\\n\\n        def reset(model_type):\\n            model_id_or_path, default_system, template = update_input_model(model_type)\\n            return model_id_or_path, default_system, template, {}\\n\\n        reset_btn.click(reset, inputs=[model_type], outputs=[model_id_or_path, system, template_type, model_state])\\n\\n\\nimport os\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Generate(BaseUI):\\n\\n    group = 'llm_infer'\\n\\n    locale_dict = {\\n        'max_new_tokens': {\\n            'label': {\\n                'zh': '生成序列最大长度',\\n                'en': 'Max new tokens'\\n            },\\n        },\\n        'do_sample': {\\n            'label': {\\n                'zh': 'do_sample',\\n                'en': 'do_sample'\\n            },\\n        },\\n        'temperature': {\\n            'label': {\\n                'zh': 'temperature',\\n                'en': 'temperature'\\n            },\\n        },\\n        'top_k': {\\n            'label': {\\n                'zh': 'top_k',\\n                'en': 'top_k'\\n            },\\n        },\\n        'top_p': {\\n            'label': {\\n                'zh': 'top_p',\\n                'en': 'top_p'\\n            },\\n        },\\n        'infer_backend': {\\n            'label': {\\n                'zh': '推理框架',\\n                'en': 'Infer backend'\\n            },\\n        },\\n        'repetition_penalty': {\\n            'label': {\\n                'zh': 'repetition_penalty',\\n                'en': 'repetition_penalty'\\n            },\\n        },\\n        'port': {\\n            'label': {\\n                'zh': '端口',\\n                'en': 'port'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Row():\\n            gr.Textbox(elem_id='max_new_tokens', lines=1, value='2048')\\n            gr.Checkbox(elem_id='do_sample', value=True)\\n            gr.Dropdown(elem_id='infer_backend', value='pt')\\n            gr.Slider(elem_id='temperature', minimum=0.0, maximum=10, step=0.1, value=0.3)\\n            gr.Slider(elem_id='top_k', minimum=1, maximum=100, step=5, value=20)\\n            gr.Slider(elem_id='top_p', minimum=0.0, maximum=1.0, step=0.05, value=0.7)\\n            gr.Slider(elem_id='repetition_penalty', minimum=0.0, maximum=10, step=0.05, value=1.05)\\n            if os.environ.get('MODELSCOPE_ENVIRONMENT') != 'studio':\\n                gr.Textbox(elem_id='port', lines=1, value='8000')\\n\\n\\nimport collections\\nimport os.path\\nimport sys\\nimport time\\nfrom datetime import datetime\\nfrom typing import Dict, List, Tuple, Type\\n\\nimport gradio as gr\\nimport json\\nimport psutil\\nfrom gradio import Accordion, Tab\\nfrom packaging import version\\n\\nfrom swift.ui.base import BaseUI\\nfrom swift.utils import get_logger\\nfrom swift.utils.utils import format_time\\n\\nlogger = get_logger()\\n\\n\\nclass Runtime(BaseUI):\\n    handlers: Dict[str, Tuple[List, Tuple]] = {}\\n\\n    group = 'llm_infer'\\n\\n    cmd = 'deploy'\\n\\n    log_event = None\\n\\n    locale_dict = {\\n        'runtime_tab': {\\n            'label': {\\n                'zh': '运行时',\\n                'en': 'Runtime'\\n            },\\n        },\\n        'running_cmd': {\\n            'label': {\\n                'zh': '运行命令',\\n                'en': 'Command line'\\n            },\\n            'info': {\\n                'zh': '执行的实际命令',\\n                'en': 'The actual command'\\n            }\\n        },\\n        'show_log': {\\n            'value': {\\n                'zh': '展示部署状态',\\n                'en': 'Show running status'\\n            },\\n        },\\n        'stop_show_log': {\\n            'value': {\\n                'zh': '停止展示',\\n                'en': 'Stop showing running status'\\n            },\\n        },\\n        'log': {\\n            'label': {\\n                'zh': '日志输出',\\n                'en': 'Logging content'\\n            },\\n            'info': {\\n                'zh': '如果日志无更新请再次点击\\\"展示日志内容\\\"',\\n                'en': 'Please press \\\"Show log\\\" if the log content is not updating'\\n            }\\n        },\\n        'running_tasks': {\\n            'label': {\\n                'zh': '运行中部署',\\n                'en': 'Running deployments'\\n            },\\n            'info': {\\n                'zh': '所有的swift deploy命令启动的任务',\\n                'en': 'Started by swift deploy'\\n            }\\n        },\\n        'refresh_tasks': {\\n            'value': {\\n                'zh': '找回部署',\\n                'en': 'Find deployments'\\n            },\\n        },\\n        'kill_task': {\\n            'value': {\\n                'zh': '杀死部署',\\n                'en': 'Kill running task'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Accordion(elem_id='runtime_tab', open=False, visible=True):\\n            with gr.Blocks():\\n                with gr.Row():\\n                    gr.Dropdown(elem_id='running_tasks', scale=10)\\n                    gr.Button(elem_id='refresh_tasks', scale=1, variant='primary')\\n                    gr.Button(elem_id='show_log', scale=1, variant='primary')\\n                    gr.Button(elem_id='stop_show_log', scale=1)\\n                    gr.Button(elem_id='kill_task', scale=1)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='log', lines=6, visible=False)\\n\\n                concurrency_limit = {}\\n                if version.parse(gr.__version__) >= version.parse('4.0.0') and os.environ.get(\\n                        'MODELSCOPE_ENVIRONMENT') != 'studio':\\n                    concurrency_limit = {'concurrency_limit': 5}\\n                cls.log_event = base_tab.element('show_log').click(cls.update_log, [], [cls.element('log')]).then(\\n                    cls.wait, [base_tab.element('running_tasks')], [cls.element('log')], **concurrency_limit)\\n\\n                base_tab.element('stop_show_log').click(lambda: None, cancels=cls.log_event)\\n\\n                base_tab.element('refresh_tasks').click(\\n                    cls.refresh_tasks,\\n                    [base_tab.element('running_tasks')],\\n                    [base_tab.element('running_tasks')],\\n                )\\n\\n    @classmethod\\n    def update_log(cls):\\n        return gr.update(visible=True)\\n\\n    @classmethod\\n    def wait(cls, task):\\n        if not task:\\n            return [None]\\n        _, args = cls.parse_info_from_cmdline(task)\\n        log_file = args['log_file']\\n        offset = 0\\n        latest_data = ''\\n        lines = collections.deque(maxlen=int(os.environ.get('MAX_LOG_LINES', 50)))\\n        try:\\n            with open(log_file, 'r') as input:\\n                input.seek(offset)\\n                fail_cnt = 0\\n                while True:\\n                    try:\\n                        latest_data += input.read()\\n                    except UnicodeDecodeError:\\n                        continue\\n                    if not latest_data:\\n                        time.sleep(0.5)\\n                        fail_cnt += 1\\n                        if fail_cnt > 50:\\n                            break\\n\\n                    if '\\\\n' not in latest_data:\\n                        continue\\n                    latest_lines = latest_data.split('\\\\n')\\n                    if latest_data[-1] != '\\\\n':\\n                        latest_data = latest_lines[-1]\\n                        latest_lines = latest_lines[:-1]\\n                    else:\\n                        latest_data = ''\\n                    lines.extend(latest_lines)\\n                    yield '\\\\n'.join(lines)\\n        except IOError:\\n            pass\\n\\n    @classmethod\\n    def get_all_ports(cls):\\n        process_name = 'swift'\\n        cmd_name = cls.cmd\\n        ports = set()\\n        for proc in psutil.process_iter():\\n            try:\\n                cmdlines = proc.cmdline()\\n            except (psutil.ZombieProcess, psutil.AccessDenied, psutil.NoSuchProcess):\\n                cmdlines = []\\n            if any([process_name in cmdline for cmdline in cmdlines]) and any(  # noqa\\n                [cmd_name == cmdline for cmdline in cmdlines]):  # noqa\\n                try:\\n                    ports.add(int(cls.parse_info_from_cmdline(cls.construct_running_task(proc))[1].get('port', 8000)))\\n                except IndexError:\\n                    pass\\n        return ports\\n\\n    @classmethod\\n    def refresh_tasks(cls, running_task=None):\\n        log_file = running_task if not running_task or 'pid:' not in running_task else None\\n        process_name = 'swift'\\n        negative_name = 'swift.exe'\\n        cmd_name = cls.cmd\\n        process = []\\n        selected = None\\n        for proc in psutil.process_iter():\\n            try:\\n                cmdlines = proc.cmdline()\\n            except (psutil.ZombieProcess, psutil.AccessDenied, psutil.NoSuchProcess):\\n                cmdlines = []\\n            if any([process_name in cmdline\\n                    for cmdline in cmdlines]) and not any([negative_name in cmdline\\n                                                           for cmdline in cmdlines]) and any(  # noqa\\n                                                               [cmd_name == cmdline for cmdline in cmdlines]):  # noqa\\n                process.append(cls.construct_running_task(proc))\\n                if log_file is not None and any(  # noqa\\n                    [log_file == cmdline for cmdline in cmdlines]):  # noqa\\n                    selected = cls.construct_running_task(proc)\\n        if not selected:\\n            if running_task and running_task in process:\\n                selected = running_task\\n        if not selected and process:\\n            selected = process[0]\\n        return gr.update(choices=process, value=selected)\\n\\n    @staticmethod\\n    def construct_running_task(proc):\\n        pid = proc.pid\\n        ts = time.time()\\n        create_time = proc.create_time()\\n        create_time_formatted = datetime.fromtimestamp(create_time).strftime('%Y-%m-%d, %H:%M')\\n\\n        return f'pid:{pid}/create:{create_time_formatted}' \\\\\\n               f'/running:{format_time(ts - create_time)}/cmd:{\\\" \\\".join(proc.cmdline())}'\\n\\n    @classmethod\\n    def parse_info_from_cmdline(cls, task):\\n        pid = None\\n        for i in range(3):\\n            slash = task.find('/')\\n            if i == 0:\\n                pid = task[:slash].split(':')[1]\\n            task = task[slash + 1:]\\n        args = task.split(f'swift {cls.cmd}')[1]\\n        args = [arg.strip() for arg in args.split('--') if arg.strip()]\\n        all_args = {}\\n        for i in range(len(args)):\\n            space = args[i].find(' ')\\n            splits = args[i][:space], args[i][space + 1:]\\n            all_args[splits[0]] = splits[1]\\n        return pid, all_args\\n\\n    @classmethod\\n    def kill_task(cls, task):\\n        pid, all_args = cls.parse_info_from_cmdline(task)\\n        log_file = all_args['log_file']\\n        if sys.platform == 'win32':\\n            os.system(f'taskkill /f /t /pid \\\"{pid}\\\"')\\n        else:\\n            os.system(f'pkill -9 -f {log_file}')\\n        time.sleep(1)\\n        return [cls.refresh_tasks()] + [gr.update(value=None)]\\n\\n    @classmethod\\n    def task_changed(cls, task, base_tab):\\n        if task:\\n            _, all_args = cls.parse_info_from_cmdline(task)\\n        else:\\n            all_args = {}\\n        elements = [value for value in base_tab.elements().values() if not isinstance(value, (Tab, Accordion))]\\n        ret = []\\n        is_custom_path = 'ckpt_dir' in all_args\\n        for e in elements:\\n            if e.elem_id in all_args:\\n                if isinstance(e, gr.Dropdown) and e.multiselect:\\n                    arg = all_args[e.elem_id].split(' ')\\n                else:\\n                    if e.elem_id == 'model_type':\\n                        if is_custom_path:\\n                            arg = base_tab.locale('checkpoint', base_tab.lang)['value']\\n                        else:\\n                            arg = all_args[e.elem_id]\\n                    elif e.elem_id == 'model_id_or_path':\\n                        if is_custom_path:\\n                            arg = all_args['ckpt_dir']\\n                        else:\\n                            arg = all_args['model_id_or_path']\\n                    else:\\n                        arg = all_args[e.elem_id]\\n                ret.append(gr.update(value=arg))\\n            else:\\n                ret.append(gr.update())\\n        sft_type = None\\n        if is_custom_path:\\n            with open(os.path.join(all_args['ckpt_dir'], 'sft_args.json'), 'r') as f:\\n                _json = json.load(f)\\n                sft_type = _json['sft_type']\\n        return ret + [gr.update(value=None), [all_args.get('model_type'), all_args.get('template_type'), sft_type]]\\n\\n\\nimport os\\nimport re\\nimport sys\\nimport time\\nfrom datetime import datetime\\nfrom functools import partial\\nfrom typing import Type\\n\\nimport gradio as gr\\nimport json\\nimport torch\\nfrom gradio import Accordion, Tab\\nfrom json import JSONDecodeError\\nfrom modelscope import GenerationConfig, snapshot_download\\n\\nfrom swift.llm import (TEMPLATE_MAPPING, DeployArguments, InferArguments, XRequestConfig, inference_client,\\n                       inference_stream, prepare_model_template)\\nfrom swift.ui.base import BaseUI\\nfrom swift.ui.llm_infer.model import Model\\nfrom swift.ui.llm_infer.runtime import Runtime\\n\\n\\nclass LLMInfer(BaseUI):\\n\\n    group = 'llm_infer'\\n\\n    sub_ui = [Model, Runtime]\\n\\n    is_inference = os.environ.get('USE_INFERENCE') == '1' or os.environ.get('MODELSCOPE_ENVIRONMENT') == 'studio'\\n\\n    locale_dict = {\\n        'generate_alert': {\\n            'value': {\\n                'zh': '请先加载模型' if is_inference else '请先部署模型',\\n                'en': 'Please load model first' if is_inference else 'Please deploy model first',\\n            }\\n        },\\n        'llm_infer': {\\n            'label': {\\n                'zh': 'LLM推理' if is_inference else 'LLM部署',\\n                'en': 'LLM Inference' if is_inference else 'LLM Deployment',\\n            }\\n        },\\n        'load_alert': {\\n            'value': {\\n                'zh':\\n                '加载中，请等待' if is_inference else '部署中，请点击\\\"展示部署状态\\\"查看',\\n                'en':\\n                'Start to load model, please wait' if is_inference else 'Start to deploy model, '\\n                'please Click \\\"Show running '\\n                'status\\\" to view details',\\n            }\\n        },\\n        'loaded_alert': {\\n            'value': {\\n                'zh': '模型加载完成',\\n                'en': 'Model loaded'\\n            }\\n        },\\n        'port_alert': {\\n            'value': {\\n                'zh': '该端口已被占用',\\n                'en': 'The port has been occupied'\\n            }\\n        },\\n        'chatbot': {\\n            'value': {\\n                'zh': '对话框',\\n                'en': 'Chat bot'\\n            },\\n        },\\n        'infer_model_type': {\\n            'label': {\\n                'zh': 'Lora模块',\\n                'en': 'Lora module'\\n            },\\n            'info': {\\n                'zh': '发送给server端哪个LoRA，默认为`default-lora`',\\n                'en': 'Which LoRA to use on server, default value is `default-lora`'\\n            }\\n        },\\n        'prompt': {\\n            'label': {\\n                'zh': '请输入：',\\n                'en': 'Input:'\\n            },\\n        },\\n        'clear_history': {\\n            'value': {\\n                'zh': '清除对话信息',\\n                'en': 'Clear history'\\n            },\\n        },\\n        'submit': {\\n            'value': {\\n                'zh': '🚀 发送',\\n                'en': '🚀 Send'\\n            },\\n        },\\n        'gpu_id': {\\n            'label': {\\n                'zh': '选择可用GPU',\\n                'en': 'Choose GPU'\\n            },\\n            'info': {\\n                'zh': '选择训练使用的GPU号，如CUDA不可用只能选择CPU',\\n                'en': 'Select GPU to train'\\n            }\\n        },\\n    }\\n\\n    choice_dict = BaseUI.get_choices_from_dataclass(InferArguments)\\n    default_dict = BaseUI.get_default_value_from_dataclass(InferArguments)\\n    arguments = BaseUI.get_argument_names(InferArguments)\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.TabItem(elem_id='llm_infer', label=''):\\n            gpu_count = 0\\n            default_device = 'cpu'\\n            if torch.cuda.is_available():\\n                gpu_count = torch.cuda.device_count()\\n                default_device = '0'\\n            with gr.Blocks():\\n                model_and_template = gr.State([])\\n                history = gr.State([])\\n                Model.build_ui(base_tab)\\n                Runtime.build_ui(base_tab)\\n                with gr.Row():\\n                    gr.Dropdown(\\n                        elem_id='gpu_id',\\n                        multiselect=True,\\n                        choices=[str(i) for i in range(gpu_count)] + ['cpu'],\\n                        value=default_device,\\n                        scale=8)\\n                    infer_model_type = gr.Textbox(elem_id='infer_model_type', scale=4)\\n                chatbot = gr.Chatbot(elem_id='chatbot', elem_classes='control-height')\\n                with gr.Row():\\n                    prompt = gr.Textbox(elem_id='prompt', lines=1, interactive=True)\\n                    with gr.Tabs():\\n                        with gr.TabItem(label='Image'):\\n                            image = gr.Image(type='filepath')\\n                        with gr.TabItem(label='Video'):\\n                            video = gr.Video()\\n                        with gr.TabItem(label='Audio'):\\n                            audio = gr.Audio(type='filepath')\\n\\n                with gr.Row():\\n                    clear_history = gr.Button(elem_id='clear_history')\\n                    submit = gr.Button(elem_id='submit')\\n\\n                if cls.is_inference:\\n                    submit.click(\\n                        cls.generate_chat,\\n                        inputs=[\\n                            model_and_template,\\n                            cls.element('template_type'), prompt, image, video, audio, history,\\n                            cls.element('system'),\\n                            cls.element('max_new_tokens'),\\n                            cls.element('temperature'),\\n                            cls.element('do_sample'),\\n                            cls.element('top_k'),\\n                            cls.element('top_p'),\\n                            cls.element('repetition_penalty')\\n                        ],\\n                        outputs=[prompt, chatbot, image, video, audio, history],\\n                        queue=True)\\n\\n                    clear_history.click(\\n                        fn=cls.clear_session, inputs=[], outputs=[prompt, chatbot, image, video, audio, history])\\n\\n                    cls.element('load_checkpoint').click(\\n                        cls.reset_memory, [], [model_and_template]) \\\\\\n                        .then(cls.reset_loading_button, [], [cls.element('load_checkpoint')]).then(\\n                        cls.prepare_checkpoint, [\\n                            value for value in cls.elements().values()\\n                            if not isinstance(value, (Tab, Accordion))\\n                        ], [model_and_template]).then(cls.change_interactive, [],\\n                                                      [prompt, image, video, audio]).then(  # noqa\\n                        cls.clear_session,\\n                        inputs=[],\\n                        outputs=[prompt, chatbot, image, video, audio, history],\\n                        queue=True).then(cls.reset_load_button, [], [cls.element('load_checkpoint')])\\n                else:\\n                    cls.element('load_checkpoint').click(\\n                        cls.deploy_model,\\n                        [value for value in cls.elements().values() if not isinstance(value, (Tab, Accordion))],\\n                        [cls.element('runtime_tab'),\\n                         cls.element('running_tasks'), model_and_template])\\n                    submit.click(\\n                        cls.send_message,\\n                        inputs=[\\n                            cls.element('running_tasks'), model_and_template,\\n                            cls.element('template_type'), prompt, image, video, audio, history, infer_model_type,\\n                            cls.element('system'),\\n                            cls.element('max_new_tokens'),\\n                            cls.element('temperature'),\\n                            cls.element('top_k'),\\n                            cls.element('top_p'),\\n                            cls.element('repetition_penalty')\\n                        ],\\n                        outputs=[prompt, chatbot, image, video, audio, history],\\n                        queue=True)\\n\\n                    clear_history.click(\\n                        fn=cls.clear_session, inputs=[], outputs=[prompt, chatbot, image, video, audio, history])\\n\\n                    base_tab.element('running_tasks').change(\\n                        partial(Runtime.task_changed, base_tab=base_tab), [base_tab.element('running_tasks')],\\n                        [value for value in base_tab.elements().values() if not isinstance(value, (Tab, Accordion))]\\n                        + [cls.element('log'), model_and_template],\\n                        cancels=Runtime.log_event)\\n                    Runtime.element('kill_task').click(\\n                        Runtime.kill_task,\\n                        [Runtime.element('running_tasks')],\\n                        [Runtime.element('running_tasks')] + [Runtime.element('log')],\\n                        cancels=[Runtime.log_event],\\n                    )\\n\\n    @classmethod\\n    def deploy(cls, *args):\\n        deploy_args = cls.get_default_value_from_dataclass(DeployArguments)\\n        kwargs = {}\\n        kwargs_is_list = {}\\n        other_kwargs = {}\\n        more_params = {}\\n        more_params_cmd = ''\\n        keys = [key for key, value in cls.elements().items() if not isinstance(value, (Tab, Accordion))]\\n        for key, value in zip(keys, args):\\n            compare_value = deploy_args.get(key)\\n            compare_value_arg = str(compare_value) if not isinstance(compare_value, (list, dict)) else compare_value\\n            compare_value_ui = str(value) if not isinstance(value, (list, dict)) else value\\n            if key in deploy_args and compare_value_ui != compare_value_arg and value:\\n                if isinstance(value, str) and re.fullmatch(cls.int_regex, value):\\n                    value = int(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.float_regex, value):\\n                    value = float(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.bool_regex, value):\\n                    value = True if value.lower() == 'true' else False\\n                kwargs[key] = value if not isinstance(value, list) else ' '.join(value)\\n                kwargs_is_list[key] = isinstance(value, list) or getattr(cls.element(key), 'is_list', False)\\n            else:\\n                other_kwargs[key] = value\\n            if key == 'more_params' and value:\\n                try:\\n                    more_params = json.loads(value)\\n                except (JSONDecodeError or TypeError):\\n                    more_params_cmd = value\\n\\n        kwargs.update(more_params)\\n        if kwargs['model_type'] == cls.locale('checkpoint', cls.lang)['value']:\\n            model_dir = kwargs.pop('model_id_or_path')\\n            if not os.path.exists(model_dir):\\n                model_dir = snapshot_download(model_dir)\\n            kwargs['ckpt_dir'] = model_dir\\n\\n        if 'ckpt_dir' in kwargs:\\n            with open(os.path.join(kwargs['ckpt_dir'], 'sft_args.json'), 'r') as f:\\n                _json = json.load(f)\\n                kwargs['model_type'] = _json['model_type']\\n                kwargs['sft_type'] = _json['sft_type']\\n        deploy_args = DeployArguments(\\n            **{\\n                key: value.split(' ') if key in kwargs_is_list and kwargs_is_list[key] else value\\n                for key, value in kwargs.items()\\n            })\\n        if deploy_args.port in Runtime.get_all_ports():\\n            raise gr.Error(cls.locale('port_alert', cls.lang)['value'])\\n        params = ''\\n        sep = f'{cls.quote} {cls.quote}'\\n        for e in kwargs:\\n            if isinstance(kwargs[e], list):\\n                params += f'--{e} {cls.quote}{sep.join(kwargs[e])}{cls.quote} '\\n            elif e in kwargs_is_list and kwargs_is_list[e]:\\n                all_args = [arg for arg in kwargs[e].split(' ') if arg.strip()]\\n                params += f'--{e} {cls.quote}{sep.join(all_args)}{cls.quote} '\\n            else:\\n                params += f'--{e} {cls.quote}{kwargs[e]}{cls.quote} '\\n        if 'port' not in kwargs:\\n            params += f'--port \\\"{deploy_args.port}\\\" '\\n        params += more_params_cmd + ' '\\n        devices = other_kwargs['gpu_id']\\n        devices = [d for d in devices if d]\\n        assert (len(devices) == 1 or 'cpu' not in devices)\\n        gpus = ','.join(devices)\\n        cuda_param = ''\\n        if gpus != 'cpu':\\n            cuda_param = f'CUDA_VISIBLE_DEVICES={gpus}'\\n        now = datetime.now()\\n        time_str = f'{now.year}{now.month}{now.day}{now.hour}{now.minute}{now.second}'\\n        file_path = f'output/{deploy_args.model_type}-{time_str}'\\n        if not os.path.exists(file_path):\\n            os.makedirs(file_path, exist_ok=True)\\n        log_file = os.path.join(os.getcwd(), f'{file_path}/run_deploy.log')\\n        deploy_args.log_file = log_file\\n        params += f'--log_file \\\"{log_file}\\\" '\\n        params += '--ignore_args_error true '\\n        if sys.platform == 'win32':\\n            if cuda_param:\\n                cuda_param = f'set {cuda_param} && '\\n            run_command = f'{cuda_param}start /b swift deploy {params} > {log_file} 2>&1'\\n        else:\\n            run_command = f'{cuda_param} nohup swift deploy {params} > {log_file} 2>&1 &'\\n        return run_command, deploy_args, log_file\\n\\n    @classmethod\\n    def deploy_model(cls, *args):\\n        run_command, deploy_args, log_file = cls.deploy(*args)\\n        os.system(run_command)\\n        gr.Info(cls.locale('load_alert', cls.lang)['value'])\\n        time.sleep(2)\\n        return gr.update(open=True), Runtime.refresh_tasks(log_file), [\\n            deploy_args.model_type, deploy_args.template_type, deploy_args.sft_type\\n        ]\\n\\n    @classmethod\\n    def update_runtime(cls):\\n        return gr.update(open=True), gr.update(visible=True)\\n\\n    @classmethod\\n    def reset_load_button(cls):\\n        return gr.update(value=cls.locale('load_checkpoint', cls.lang)['value'])\\n\\n    @classmethod\\n    def reset_loading_button(cls):\\n        return gr.update(value=cls.locale('load_alert', cls.lang)['value'])\\n\\n    @classmethod\\n    def reset_memory(cls):\\n        return []\\n\\n    @classmethod\\n    def prepare_checkpoint(cls, *args):\\n        torch.cuda.empty_cache()\\n        infer_args = cls.get_default_value_from_dataclass(InferArguments)\\n        kwargs = {}\\n        kwargs_is_list = {}\\n        other_kwargs = {}\\n        more_params = {}\\n        keys = [key for key, value in cls.elements().items() if not isinstance(value, (Tab, Accordion))]\\n        for key, value in zip(keys, args):\\n            compare_value = infer_args.get(key)\\n            compare_value_arg = str(compare_value) if not isinstance(compare_value, (list, dict)) else compare_value\\n            compare_value_ui = str(value) if not isinstance(value, (list, dict)) else value\\n            if key in infer_args and compare_value_ui != compare_value_arg and value:\\n                if isinstance(value, str) and re.fullmatch(cls.int_regex, value):\\n                    value = int(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.float_regex, value):\\n                    value = float(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.bool_regex, value):\\n                    value = True if value.lower() == 'true' else False\\n                kwargs[key] = value if not isinstance(value, list) else ' '.join(value)\\n                kwargs_is_list[key] = isinstance(value, list)\\n            else:\\n                other_kwargs[key] = value\\n            if key == 'more_params' and value:\\n                more_params = json.loads(value)\\n\\n        kwargs.update(more_params)\\n        if kwargs['model_type'] == cls.locale('checkpoint', cls.lang)['value']:\\n            model_dir = kwargs.pop('model_id_or_path')\\n            if not os.path.exists(model_dir):\\n                model_dir = snapshot_download(model_dir)\\n            kwargs['ckpt_dir'] = model_dir\\n        if 'ckpt_dir' in kwargs or ('model_id_or_path' in kwargs and not os.path.exists(kwargs['model_id_or_path'])):\\n            kwargs.pop('model_type', None)\\n\\n        devices = other_kwargs['gpu_id']\\n        devices = [d for d in devices if d]\\n        assert (len(devices) == 1 or 'cpu' not in devices)\\n        gpus = ','.join(devices)\\n        if gpus != 'cpu':\\n            os.environ['CUDA_VISIBLE_DEVICES'] = gpus\\n        infer_args = InferArguments(**kwargs)\\n        model, template = prepare_model_template(infer_args)\\n        gr.Info(cls.locale('loaded_alert', cls.lang)['value'])\\n        return [model, template]\\n\\n    @classmethod\\n    def clear_session(cls):\\n        return ('', [], gr.update(value=None, interactive=True), gr.update(value=None, interactive=True),\\n                gr.update(value=None, interactive=True), [])\\n\\n    @classmethod\\n    def change_interactive(cls):\\n        return (gr.update(interactive=True), gr.update(interactive=True), gr.update(interactive=True),\\n                gr.update(interactive=True))\\n\\n    @classmethod\\n    def _replace_tag_with_media(cls, history):\\n        total_history = []\\n        for h in history:\\n            for m in h[2]:\\n                total_history.append([(m, ), None])\\n            if h[0] and h[0].strip():\\n                total_history.append(h[:2])\\n        return total_history\\n\\n    @classmethod\\n    def _get_text_history(cls, history, prompt):\\n        total_history = []\\n        for h in history:\\n            if h[0]:\\n                prefix = ''\\n                if h[3]:\\n                    prefix = ''.join([f'<{media_type}>' for media_type in h[3]])\\n                total_history.append([prefix + h[0], h[1]])\\n\\n        if not history[-1][0] and history[-1][2]:\\n            prefix = ''.join([f'<{media_type}>' for media_type in history[-1][3]])\\n            prompt = prefix + prompt\\n        return total_history, prompt\\n\\n    @classmethod\\n    def _get_medias(cls, history):\\n        images = []\\n        videos = []\\n        audios = []\\n        for h in history:\\n            if h[2]:\\n                for media, media_type in zip(h[2], h[3]):\\n                    if media_type == 'image':\\n                        images.append(media)\\n                    if media_type == 'video':\\n                        videos.append(media)\\n                    if media_type == 'audio':\\n                        audios.append(media)\\n        return images, videos, audios\\n\\n    @classmethod\\n    def agent_type(cls, response):\\n        if response.lower().endswith('observation:'):\\n            return 'react'\\n        if 'observation:' not in response.lower() and 'action input:' in response.lower():\\n            return 'toolbench'\\n        return None\\n\\n    @classmethod\\n    def send_message(cls, running_task, model_and_template, template_type, prompt: str, image, video, audio, history,\\n                     infer_model_type, system, max_new_tokens, temperature, top_k, top_p, repetition_penalty):\\n        if not model_and_template:\\n            gr.Warning(cls.locale('generate_alert', cls.lang)['value'])\\n            return '', None, None, []\\n\\n        if not history or history[-1][1]:\\n            history.append([None, None, [], []])\\n        media = image or video or audio\\n        media_type = 'image' if image else 'video' if video else 'audio'\\n        if media:\\n            if not history[-1][2] or history[-1][2][-1] != media:\\n                history[-1][2].append(media)\\n                history[-1][3].append(media_type)\\n\\n        if not prompt:\\n            yield '', cls._replace_tag_with_media(history), None, history\\n            return\\n\\n        _, args = Runtime.parse_info_from_cmdline(running_task)\\n        model_type, template, sft_type = model_and_template\\n        if sft_type in ('lora', 'longlora') and not args.get('merge_lora'):\\n            model_type = infer_model_type or 'default-lora'\\n        old_history, history = history or [], []\\n        request_config = XRequestConfig(\\n            temperature=temperature, top_k=top_k, top_p=top_p, repetition_penalty=repetition_penalty)\\n        request_config.stream = True\\n        request_config.stop = ['Observation:']\\n        stream_resp_with_history = ''\\n        media_infer_type = TEMPLATE_MAPPING[template].get('infer_media_type', 'round')\\n        interactive = media_infer_type != 'dialogue'\\n\\n        text_history, new_prompt = cls._get_text_history(old_history, prompt)\\n        images, videos, audios = cls._get_medias(old_history)\\n        media_kwargs = {}\\n        if images:\\n            media_kwargs['images'] = images\\n        if videos:\\n            media_kwargs['videos'] = videos\\n        if audios:\\n            media_kwargs['audios'] = audios\\n        roles = []\\n        for i in range(len(text_history) + 1):\\n            roles.append(['user', 'assistant'])\\n\\n        for i, h in enumerate(text_history):\\n            agent_type = cls.agent_type(h[1])\\n            if i < len(text_history) - 1 and agent_type == 'toolbench':\\n                roles[i + 1][0] = 'tool'\\n            if i == len(text_history) - 1 and agent_type in ('toolbench', 'react'):\\n                roles[i + 1][0] = 'tool'\\n\\n        if not template_type.endswith('generation'):\\n            stream_resp = inference_client(\\n                model_type,\\n                new_prompt,\\n                history=text_history,\\n                system=system,\\n                port=args['port'],\\n                request_config=request_config,\\n                roles=roles,\\n                **media_kwargs,\\n            )\\n            for chunk in stream_resp:\\n                stream_resp_with_history += chunk.choices[0].delta.content\\n                old_history[-1][0] = prompt\\n                old_history[-1][1] = stream_resp_with_history\\n                yield ('', cls._replace_tag_with_media(old_history), gr.update(value=None, interactive=interactive),\\n                       gr.update(value=None, interactive=interactive), gr.update(value=None,\\n                                                                                 interactive=interactive), old_history)\\n        else:\\n            request_config.max_tokens = max_new_tokens\\n            stream_resp = inference_client(\\n                model_type, prompt, images=old_history[-1][2], port=args['port'], request_config=request_config)\\n            for chunk in stream_resp:\\n                stream_resp_with_history += chunk.choices[0].text\\n                old_history[-1][0] = prompt\\n                old_history[-1][1] = stream_resp_with_history\\n                yield ('', cls._replace_tag_with_media(old_history), gr.update(value=None, interactive=interactive),\\n                       gr.update(value=None, interactive=interactive), gr.update(value=None,\\n                                                                                 interactive=interactive), old_history)\\n\\n    @classmethod\\n    def generate_chat(cls, model_and_template, template_type, prompt: str, image, video, audio, history, system,\\n                      max_new_tokens, temperature, do_sample, top_k, top_p, repetition_penalty):\\n        if not model_and_template:\\n            gr.Warning(cls.locale('generate_alert', cls.lang)['value'])\\n            return '', None, None, []\\n\\n        if not history or history[-1][1]:\\n            history.append([None, None, [], []])\\n        media = image or video or audio\\n        media_type = 'image' if image else 'video' if video else 'audio'\\n        if media:\\n            if not history[-1][2] or history[-1][2][-1] != media:\\n                history[-1][2].append(media)\\n                history[-1][3].append(media_type)\\n\\n        if not prompt:\\n            yield '', cls._replace_tag_with_media(history), None, history\\n            return\\n\\n        model, template = model_and_template\\n\\n        if os.environ.get('MODELSCOPE_ENVIRONMENT') == 'studio':\\n            model.cuda()\\n        old_history, history = history or [], []\\n\\n        generation_config = GenerationConfig(\\n            temperature=temperature,\\n            top_k=top_k,\\n            top_p=top_p,\\n            do_sample=do_sample,\\n            max_new_tokens=int(max_new_tokens),\\n            repetition_penalty=repetition_penalty)\\n        text_history, new_prompt = cls._get_text_history(old_history, prompt)\\n        images, videos, audios = cls._get_medias(old_history)\\n        media_kwargs = {}\\n        if images:\\n            media_kwargs['images'] = images\\n        if videos:\\n            media_kwargs['videos'] = videos\\n        if audios:\\n            media_kwargs['audios'] = audios\\n        gen = inference_stream(\\n            model,\\n            template,\\n            new_prompt,\\n            history=text_history,\\n            system=system,\\n            generation_config=generation_config,\\n            stop_words=['Observation:'],\\n            **media_kwargs,\\n        )\\n        for _, history in gen:\\n            old_history[-1][0] = history[-1][0]\\n            old_history[-1][1] = history[-1][1]\\n            yield '', cls._replace_tag_with_media(old_history), None, None, None, old_history\\n        if os.environ.get('MODELSCOPE_ENVIRONMENT') == 'studio':\\n            model.cpu()\\n\\n\\n\\n\\nimport os.path\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.llm import MODEL_MAPPING, ModelType\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Model(BaseUI):\\n\\n    group = 'llm_export'\\n\\n    locale_dict = {\\n        'checkpoint': {\\n            'value': {\\n                'zh': '训练后的模型',\\n                'en': 'Trained model'\\n            }\\n        },\\n        'model_type': {\\n            'label': {\\n                'zh': '选择模型',\\n                'en': 'Select Model'\\n            },\\n            'info': {\\n                'zh': 'SWIFT已支持的模型名称',\\n                'en': 'Base model supported by SWIFT'\\n            }\\n        },\\n        'model_id_or_path': {\\n            'label': {\\n                'zh': '模型id或路径',\\n                'en': 'Model id or path'\\n            },\\n            'info': {\\n                'zh': '实际的模型id，如果是训练后的模型请填入checkpoint-xxx的目录',\\n                'en': 'The actual model id or path, if is a trained model, please fill in the checkpoint-xxx dir'\\n            }\\n        },\\n        'reset': {\\n            'value': {\\n                'zh': '恢复初始值',\\n                'en': 'Reset to default'\\n            },\\n        },\\n    }\\n\\n    ignored_models = ['int1', 'int2', 'int4', 'int8', 'awq', 'gptq', 'bnb', 'eetq', 'aqlm', 'hqq']\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Row():\\n            all_models = [base_tab.locale('checkpoint', cls.lang)['value']\\n                          ] + ModelType.get_model_name_list() + cls.get_custom_name_list()\\n            all_models = [m for m in all_models if not any([ignored in m for ignored in cls.ignored_models])]\\n            model_type = gr.Dropdown(\\n                elem_id='model_type',\\n                choices=all_models,\\n                value=base_tab.locale('checkpoint', cls.lang)['value'],\\n                scale=20)\\n            model_id_or_path = gr.Textbox(elem_id='model_id_or_path', lines=1, scale=20, interactive=True)\\n            reset_btn = gr.Button(elem_id='reset', scale=2)\\n            model_state = gr.State({})\\n\\n        def update_input_model(choice, model_state=None):\\n            if choice in (base_tab.locale('checkpoint', cls.lang)['value']):\\n                if model_state and choice in model_state:\\n                    model_id_or_path = model_state[choice]\\n                else:\\n                    model_id_or_path = None\\n            else:\\n                if model_state and choice in model_state:\\n                    model_id_or_path = model_state[choice]\\n                else:\\n                    model_id_or_path = MODEL_MAPPING[choice]['model_id_or_path']\\n            return model_id_or_path\\n\\n        def update_model_id_or_path(model_type, path, model_state):\\n            if not path or not os.path.exists(path):\\n                return gr.update()\\n            model_state[model_type] = path\\n            return model_state\\n\\n        model_type.change(update_input_model, inputs=[model_type, model_state], outputs=[model_id_or_path])\\n\\n        model_id_or_path.change(\\n            update_model_id_or_path, inputs=[model_type, model_id_or_path, model_state], outputs=[model_state])\\n\\n        def reset(model_type):\\n            model_id_or_path = update_input_model(model_type)\\n            return model_id_or_path, {}\\n\\n        reset_btn.click(reset, inputs=[model_type], outputs=[model_id_or_path, model_state])\\n\\n\\nfrom typing import Type\\n\\nimport gradio as gr\\n\\nfrom swift.llm import DATASET_MAPPING\\nfrom swift.ui.base import BaseUI\\n\\n\\nclass Export(BaseUI):\\n\\n    group = 'llm_export'\\n\\n    locale_dict = {\\n        'merge_lora': {\\n            'label': {\\n                'zh': '合并lora',\\n                'en': 'Merge lora'\\n            },\\n            'info': {\\n                'zh':\\n                'lora合并的路径在填入的checkpoint同级目录，请查看运行时log获取更具体的信息',\\n                'en':\\n                'The output path is in the sibling directory as the input checkpoint. '\\n                'Please refer to the runtime log for more specific information.'\\n            },\\n        },\\n        'merge_device_map': {\\n            'label': {\\n                'zh': '合并lora使用的device_map',\\n                'en': 'The device_map when merge-lora'\\n            },\\n            'info': {\\n                'zh': '如果显存不够请填入cpu',\\n                'en': 'If GPU memory is not enough, fill in cpu'\\n            },\\n        },\\n        'quant_bits': {\\n            'label': {\\n                'zh': '量化比特数',\\n                'en': 'Quantize bits'\\n            },\\n        },\\n        'quant_method': {\\n            'label': {\\n                'zh': '量化方法',\\n                'en': 'Quantize method'\\n            },\\n        },\\n        'quant_n_samples': {\\n            'label': {\\n                'zh': '量化集采样数',\\n                'en': 'Sampled rows from calibration dataset'\\n            },\\n        },\\n        'quant_seqlen': {\\n            'label': {\\n                'zh': '量化集的max-length',\\n                'en': 'The quantize sequence length'\\n            },\\n        },\\n        'quant_output_dir': {\\n            'label': {\\n                'zh': '量化输出路径',\\n                'en': 'Output dir for quantization'\\n            },\\n            'info': {\\n                'zh':\\n                '如果仅merge-lora不需要修改这里, 留空时量化输出在当前目录的<model-type>-<quant_method>-<quant_bits>下',\\n                'en':\\n                'If only merging LoRA, no need to modify this. When left blank, '\\n                'the output will be in the current directory under <model-type>-<quant_method>-<quant_bits>'\\n            },\\n        },\\n        'dataset': {\\n            'label': {\\n                'zh': '校准数据集',\\n                'en': 'Calibration datasets'\\n            },\\n        },\\n    }\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.Row():\\n            gr.Checkbox(elem_id='merge_lora', scale=10)\\n            gr.Textbox(elem_id='merge_device_map', scale=20)\\n        with gr.Row():\\n            gr.Textbox(elem_id='quant_bits', scale=20)\\n            gr.Dropdown(elem_id='quant_method', scale=20)\\n            gr.Textbox(elem_id='quant_n_samples', scale=20)\\n            gr.Textbox(elem_id='quant_seqlen', scale=20)\\n        with gr.Row():\\n            gr.Textbox(elem_id='quant_output_dir', scale=20)\\n            gr.Dropdown(\\n                elem_id='dataset',\\n                multiselect=True,\\n                allow_custom_value=True,\\n                choices=list(DATASET_MAPPING.keys()),\\n                scale=20)\\n\\n\\nimport os\\nimport re\\nimport sys\\nimport time\\nfrom datetime import datetime\\nfrom functools import partial\\nfrom typing import Type\\n\\nimport gradio as gr\\nimport json\\nimport torch\\nfrom gradio import Accordion, Tab\\nfrom json import JSONDecodeError\\nfrom modelscope import snapshot_download\\n\\nfrom swift.llm import ExportArguments\\nfrom swift.ui.base import BaseUI\\nfrom swift.ui.llm_export.export import Export\\nfrom swift.ui.llm_export.model import Model\\nfrom swift.ui.llm_export.runtime import ExportRuntime\\n\\n\\nclass LLMExport(BaseUI):\\n    group = 'llm_export'\\n\\n    sub_ui = [Model, Export, ExportRuntime]\\n\\n    locale_dict = {\\n        'llm_export': {\\n            'label': {\\n                'zh': 'LLM导出',\\n                'en': 'LLM export',\\n            }\\n        },\\n        'more_params': {\\n            'label': {\\n                'zh': '更多参数',\\n                'en': 'More params'\\n            },\\n            'info': {\\n                'zh': '以json格式或--xxx xxx命令行格式填入',\\n                'en': 'Fill in with json format or --xxx xxx cmd format'\\n            }\\n        },\\n        'export': {\\n            'value': {\\n                'zh': '开始导出',\\n                'en': 'Begin Export'\\n            },\\n        },\\n        'gpu_id': {\\n            'label': {\\n                'zh': '选择可用GPU',\\n                'en': 'Choose GPU'\\n            },\\n            'info': {\\n                'zh': '选择使用的GPU号，如CUDA不可用只能选择CPU',\\n                'en': 'Select GPU to export'\\n            }\\n        },\\n    }\\n\\n    choice_dict = BaseUI.get_choices_from_dataclass(ExportArguments)\\n    default_dict = BaseUI.get_default_value_from_dataclass(ExportArguments)\\n    arguments = BaseUI.get_argument_names(ExportArguments)\\n\\n    @classmethod\\n    def do_build_ui(cls, base_tab: Type['BaseUI']):\\n        with gr.TabItem(elem_id='llm_export', label=''):\\n            gpu_count = 0\\n            default_device = 'cpu'\\n            if torch.cuda.is_available():\\n                gpu_count = torch.cuda.device_count()\\n                default_device = '0'\\n            with gr.Blocks():\\n                model_and_template = gr.State([])\\n                Model.build_ui(base_tab)\\n                Export.build_ui(base_tab)\\n                ExportRuntime.build_ui(base_tab)\\n                with gr.Row():\\n                    gr.Textbox(elem_id='more_params', lines=4, scale=20)\\n                    gr.Button(elem_id='export', scale=2, variant='primary')\\n                gr.Dropdown(\\n                    elem_id='gpu_id',\\n                    multiselect=True,\\n                    choices=[str(i) for i in range(gpu_count)] + ['cpu'],\\n                    value=default_device,\\n                    scale=8)\\n\\n                cls.element('export').click(\\n                    cls.export_model,\\n                    [value for value in cls.elements().values() if not isinstance(value, (Tab, Accordion))],\\n                    [cls.element('runtime_tab'),\\n                     cls.element('running_tasks'), model_and_template])\\n\\n                base_tab.element('running_tasks').change(\\n                    partial(ExportRuntime.task_changed, base_tab=base_tab), [base_tab.element('running_tasks')],\\n                    [value for value in base_tab.elements().values() if not isinstance(value, (Tab, Accordion))]\\n                    + [cls.element('log'), model_and_template],\\n                    cancels=ExportRuntime.log_event)\\n                ExportRuntime.element('kill_task').click(\\n                    ExportRuntime.kill_task,\\n                    [ExportRuntime.element('running_tasks')],\\n                    [ExportRuntime.element('running_tasks')] + [ExportRuntime.element('log')],\\n                    cancels=[ExportRuntime.log_event],\\n                )\\n\\n    @classmethod\\n    def export(cls, *args):\\n        export_args = cls.get_default_value_from_dataclass(ExportArguments)\\n        kwargs = {}\\n        kwargs_is_list = {}\\n        other_kwargs = {}\\n        more_params = {}\\n        more_params_cmd = ''\\n        keys = [key for key, value in cls.elements().items() if not isinstance(value, (Tab, Accordion))]\\n        for key, value in zip(keys, args):\\n            compare_value = export_args.get(key)\\n            compare_value_arg = str(compare_value) if not isinstance(compare_value, (list, dict)) else compare_value\\n            compare_value_ui = str(value) if not isinstance(value, (list, dict)) else value\\n            if key in export_args and compare_value_ui != compare_value_arg and value:\\n                if isinstance(value, str) and re.fullmatch(cls.int_regex, value):\\n                    value = int(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.float_regex, value):\\n                    value = float(value)\\n                elif isinstance(value, str) and re.fullmatch(cls.bool_regex, value):\\n                    value = True if value.lower() == 'true' else False\\n                kwargs[key] = value if not isinstance(value, list) else ' '.join(value)\\n                kwargs_is_list[key] = isinstance(value, list) or getattr(cls.element(key), 'is_list', False)\\n            else:\\n                other_kwargs[key] = value\\n            if key == 'more_params' and value:\\n                try:\\n                    more_params = json.loads(value)\\n                except (JSONDecodeError or TypeError):\\n                    more_params_cmd = value\\n\\n        kwargs.update(more_params)\\n        if kwargs['model_type'] == cls.locale('checkpoint', cls.lang)['value']:\\n            model_dir = kwargs.pop('model_id_or_path')\\n            if not os.path.exists(model_dir):\\n                model_dir = snapshot_download(model_dir)\\n            kwargs['ckpt_dir'] = model_dir\\n            kwargs.pop('model_type')\\n\\n        export_args = ExportArguments(\\n            **{\\n                key: value.split(' ') if key in kwargs_is_list and kwargs_is_list[key] else value\\n                for key, value in kwargs.items()\\n            })\\n        params = ''\\n        sep = f'{cls.quote} {cls.quote}'\\n        for e in kwargs:\\n            if isinstance(kwargs[e], list):\\n                params += f'--{e} {cls.quote}{sep.join(kwargs[e])}{cls.quote} '\\n            elif e in kwargs_is_list and kwargs_is_list[e]:\\n                all_args = [arg for arg in kwargs[e].split(' ') if arg.strip()]\\n                params += f'--{e} {cls.quote}{sep.join(all_args)}{cls.quote} '\\n            else:\\n                params += f'--{e} {cls.quote}{kwargs[e]}{cls.quote} '\\n        params += more_params_cmd + ' '\\n        devices = other_kwargs['gpu_id']\\n        devices = [d for d in devices if d]\\n        assert (len(devices) == 1 or 'cpu' not in devices)\\n        gpus = ','.join(devices)\\n        cuda_param = ''\\n        if gpus != 'cpu':\\n            cuda_param = f'CUDA_VISIBLE_DEVICES={gpus}'\\n        now = datetime.now()\\n        time_str = f'{now.year}{now.month}{now.day}{now.hour}{now.minute}{now.second}'\\n        file_path = f'output/{export_args.model_type}-{time_str}'\\n        if not os.path.exists(file_path):\\n            os.makedirs(file_path, exist_ok=True)\\n        log_file = os.path.join(os.getcwd(), f'{file_path}/run_export.log')\\n        export_args.log_file = log_file\\n        params += f'--log_file \\\"{log_file}\\\" '\\n        params += '--ignore_args_error true '\\n        additional_param = ''\\n        if export_args.quant_method == 'gptq':\\n            additional_param = 'OMP_NUM_THREADS=14'\\n        if sys.platform == 'win32':\\n            if cuda_param:\\n                cuda_param = f'set {cuda_param} && '\\n            if additional_param:\\n                additional_param = f'set {additional_param} && '\\n            run_command = f'{cuda_param}{additional_param}start /b swift export {params} > {log_file} 2>&1'\\n        else:\\n            run_command = f'{cuda_param} {additional_param} nohup swift export {params} > {log_file} 2>&1 &'\\n        return run_command, export_args, log_file\\n\\n    @classmethod\\n    def export_model(cls, *args):\\n        run_command, export_args, log_file = cls.export(*args)\\n        os.system(run_command)\\n        time.sleep(2)\\n        return gr.update(open=True), ExportRuntime.refresh_tasks(log_file), [export_args.sft_type]\\n\\n\\nfrom swift.ui.llm_infer.runtime import Runtime\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass ExportRuntime(Runtime):\\n\\n    group = 'llm_export'\\n\\n    cmd = 'export'\\n\\n    locale_dict = {\\n        'runtime_tab': {\\n            'label': {\\n                'zh': '运行时',\\n                'en': 'Runtime'\\n            },\\n        },\\n        'running_cmd': {\\n            'label': {\\n                'zh': '运行命令',\\n                'en': 'Command line'\\n            },\\n            'info': {\\n                'zh': '执行的实际命令',\\n                'en': 'The actual command'\\n            }\\n        },\\n        'show_log': {\\n            'value': {\\n                'zh': '展示导出状态',\\n                'en': 'Show export status'\\n            },\\n        },\\n        'stop_show_log': {\\n            'value': {\\n                'zh': '停止展示',\\n                'en': 'Stop showing running status'\\n            },\\n        },\\n        'log': {\\n            'label': {\\n                'zh': '日志输出',\\n                'en': 'Logging content'\\n            },\\n            'info': {\\n                'zh': '如果日志无更新请再次点击\\\"展示日志内容\\\"',\\n                'en': 'Please press \\\"Show log\\\" if the log content is not updating'\\n            }\\n        },\\n        'running_tasks': {\\n            'label': {\\n                'zh': '运行中导出任务',\\n                'en': 'Running export task'\\n            },\\n            'info': {\\n                'zh': '所有的swift export命令启动的任务',\\n                'en': 'All tasks started by swift export'\\n            }\\n        },\\n        'refresh_tasks': {\\n            'value': {\\n                'zh': '找回导出任务',\\n                'en': 'Find export'\\n            },\\n        },\\n        'kill_task': {\\n            'value': {\\n                'zh': '杀死导出任务',\\n                'en': 'Kill export'\\n            },\\n        },\\n    }\\n\\n\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport math\\n\\nimport torch\\nimport torch.nn as nn\\nimport torch.nn.functional as F\\nfrom einops import rearrange\\n\\nfrom swift.utils.logger import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass ResTuner(nn.Module):\\n\\n    def __init__(self, dim=None, layer_num=-1, depth=-1, zero_init_last=False, stage='', tuner_cfg={}, **kwargs):\\n        super().__init__()\\n        self.dim = dim\\n        self.layer_num = layer_num\\n        self.depth = depth\\n        self.stage = stage\\n        self.tuner_cfg = tuner_cfg\\n\\n        if (isinstance(tuner_cfg, str) and tuner_cfg == 'res_adapter') or \\\\\\n                (isinstance(tuner_cfg, dict) and 'res_adapter' in tuner_cfg):\\n            tuner_cfg = tuner_cfg['res_adapter'] if isinstance(tuner_cfg, dict) else tuner_cfg\\n            self.tuner = ResAdapter(\\n                dim=dim,\\n                layer_num=layer_num,\\n                depth=depth,\\n                zero_init_last=zero_init_last,\\n                stage=stage,\\n                tuner_cfg=tuner_cfg,\\n                **kwargs)\\n        elif (isinstance(tuner_cfg, str) and tuner_cfg == 'res_group_adapter') or \\\\\\n                (isinstance(tuner_cfg, dict) and 'res_group_adapter' in tuner_cfg):\\n            tuner_cfg = tuner_cfg['res_group_adapter'] if isinstance(tuner_cfg, dict) else tuner_cfg\\n            self.tuner = ResGroupAdapter(\\n                dim=dim,\\n                layer_num=layer_num,\\n                depth=depth,\\n                zero_init_last=zero_init_last,\\n                stage=stage,\\n                tuner_cfg=tuner_cfg,\\n                **kwargs)\\n        elif (isinstance(tuner_cfg, str) and tuner_cfg == 'upsample') or \\\\\\n                (isinstance(tuner_cfg, dict) and 'upsample' in tuner_cfg):\\n            tuner_cfg = tuner_cfg['upsample'] if isinstance(tuner_cfg, dict) else tuner_cfg\\n            if 'upsample_out_channels' in kwargs:\\n                out_channels = kwargs['upsample_out_channels']\\n                use_conv = True if out_channels else False\\n            else:\\n                out_channels = dim\\n                use_conv = False\\n            self.tuner = Upsample(\\n                channels=dim, use_conv=use_conv, out_channels=out_channels, tuner_cfg=tuner_cfg, **kwargs)\\n        else:\\n            self.tuner = Identity()\\n\\n    def forward(self, x, *args, **kwargs):\\n        if self.tuner_cfg == 'zero' or 'zero' in self.tuner_cfg:\\n            x_out = 0.0\\n        else:\\n            x_out = self.tuner(x, *args, **kwargs)\\n        return x_out\\n\\n\\nclass ResAdapter(nn.Module):\\n\\n    def __init__(self,\\n                 dim,\\n                 layer_num=-1,\\n                 depth=-1,\\n                 zero_init_last=False,\\n                 stage='',\\n                 tuner_cfg=None,\\n                 act_layer=nn.GELU,\\n                 **kwargs):\\n        super(ResAdapter, self).__init__()\\n        self.dim = dim\\n        self.layer_num = layer_num\\n        self.depth = depth\\n\\n        self.adapter_length = tuner_cfg['adapter_length'] if 'adapter_length' in tuner_cfg else 32\\n        self.adapter_type = tuner_cfg['adapter_type'] if 'adapter_type' in tuner_cfg else None\\n        self.adapter_weight = tuner_cfg['adapter_weight'] if 'adapter_weight' in tuner_cfg else None\\n\\n        self.adapter_length = self.adapter_length[self.layer_num] if isinstance(self.adapter_length,\\n                                                                                list) else self.adapter_length\\n        assert isinstance(self.adapter_length, int) or (isinstance(self.adapter_length, tuple)\\n                                                        and len(self.adapter_length) == 3)\\n        if isinstance(self.adapter_length, int):\\n            self.ln1 = nn.Linear(dim, self.adapter_length)\\n        else:\\n            self.ln1 = nn.Linear(self.adapter_length[0], self.adapter_length[1])\\n        self.activate = act_layer()\\n        if isinstance(self.adapter_length, int):\\n            self.ln2 = nn.Linear(self.adapter_length, dim)\\n        else:\\n            self.ln2 = nn.Linear(self.adapter_length[1], self.adapter_length[2])\\n            dim = self.adapter_length[2]\\n\\n        self._xavier_init_weights(self.ln1)\\n        if zero_init_last and layer_num == depth - 1:\\n            self._zero_init_weights(self.ln2)\\n        else:\\n            self._xavier_init_weights(self.ln2)\\n\\n        self.scaling = init_weight_type(dim, self.adapter_weight)\\n        self._prepared = False\\n\\n    def _zero_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.zeros_(m.weight)\\n            nn.init.zeros_(m.bias)\\n\\n    def _kaiming_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.kaiming_uniform_(m.weight, a=math.sqrt(5))\\n            nn.init.normal_(m.bias)\\n\\n    def _xavier_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.xavier_uniform_(m.weight)\\n            nn.init.normal_(m.bias, std=1e-6)\\n\\n    def forward(self, x):\\n        if not self._prepared:\\n            self.ln1.to(x.device)\\n            self.activate.to(x.device)\\n            self.ln2.to(x.device)\\n            self._prepared = True\\n\\n        x_dtype = x.dtype\\n        x = x.to(self.ln1.weight.dtype)\\n        x_shortcut = x\\n        if len(x_shortcut.size()) == 4:\\n            B, C, N1, N2 = x.size()\\n            x = x.view(x_shortcut.size()[0], x_shortcut.size()[1], -1).permute(0, 2, 1)\\n\\n        x_adapter = self.ln2(self.activate(self.ln1(x)))\\n\\n        if self.adapter_weight:\\n            x_adapter = apply_data_weight(x_adapter, self.scaling, self.adapter_weight)\\n\\n        if len(x_shortcut.size()) == 4:\\n            x_adapter = x_adapter.permute(0, 2, 1).view(x_shortcut.size()[0],\\n                                                        x_adapter.size()[-1],\\n                                                        x_shortcut.size()[2],\\n                                                        x_shortcut.size()[3])\\n        x_out = x_shortcut + x_adapter\\n        return x_out.to(x_dtype)\\n\\n\\nclass ResGroupAdapter(nn.Module):\\n\\n    def __init__(self,\\n                 dim,\\n                 layer_num=-1,\\n                 depth=-1,\\n                 zero_init_last=False,\\n                 stage='',\\n                 tuner_cfg=None,\\n                 act_layer=nn.GELU,\\n                 **kwargs):\\n        super(ResGroupAdapter, self).__init__()\\n        self.dim = dim\\n        self.layer_num = layer_num\\n        self.depth = depth\\n\\n        self.adapter_type = tuner_cfg['adapter_type'] if 'adapter_type' in tuner_cfg else None\\n        self.adapter_weight = tuner_cfg['adapter_weight'] if 'adapter_weight' in tuner_cfg else None\\n\\n        self.adapter_dim = tuner_cfg['dim'] if 'dim' in tuner_cfg else dim\\n        self.adapter_head = tuner_cfg['head'] if 'head' in tuner_cfg else 4\\n        self.adapter_scale_factor = tuner_cfg['scale_factor'] if 'scale_factor' in tuner_cfg else 2\\n\\n        assert self.adapter_dim % self.adapter_head == 0, 'adapter dim should be divisible by adapter head'\\n        self.dim_mlp = self.adapter_dim // self.adapter_head\\n\\n        self.ln1 = nn.Linear(self.dim_mlp, self.dim_mlp * self.adapter_scale_factor)\\n        self.ln2 = nn.Linear(self.dim_mlp * self.adapter_scale_factor, self.dim_mlp)\\n        self.activate = act_layer()\\n\\n        self._kaiming_init_weights(self.ln1)\\n        if zero_init_last and layer_num == depth - 1:\\n            self._zero_init_weights(self.ln2)\\n        else:\\n            self._kaiming_init_weights(self.ln2)\\n        self.scaling = init_weight_type(dim, self.adapter_weight)\\n        self._prepared = False\\n\\n    def _zero_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.zeros_(m.weight)\\n            nn.init.zeros_(m.bias)\\n\\n    def _kaiming_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.kaiming_uniform_(m.weight, a=math.sqrt(5))\\n            nn.init.normal_(m.bias)\\n\\n    def _xavier_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.xavier_uniform_(m.weight)\\n            nn.init.normal_(m.bias, std=1e-6)\\n\\n    def forward(self, x):\\n        if not self._prepared:\\n            self.ln1.to(x.device)\\n            self.activate.to(x.device)\\n            self.ln2.to(x.device)\\n            self._prepared = True\\n\\n        x_dtype = x.dtype\\n        x = x.to(self.ln1.weight.dtype)\\n        x_shortcut = x\\n\\n        batch, inner_dim, height, width = x.shape\\n\\n        x_adapter = x.permute(0, 2, 3, 1).reshape(batch, height * width, inner_dim)\\n\\n        x_adapter = rearrange(x_adapter, 'b n (c h) -> (b h) n c', h=self.adapter_head)\\n        x_adapter = self.ln2(self.activate(self.ln1(x_adapter)))\\n        x_adapter = rearrange(x_adapter, '(b h) n c -> b n (c h)', h=self.adapter_head)\\n\\n        if self.adapter_weight:\\n            x_adapter = apply_data_weight(x_adapter, self.scaling, self.adapter_weight)\\n\\n        x_adapter = x_adapter.reshape(batch, height, width, -1).permute(0, 3, 1, 2).contiguous()\\n        x_out = x_shortcut + x_adapter\\n\\n        return x_out.to(x_dtype)\\n\\n\\nclass Identity(nn.Module):\\n\\n    def __init__(self):\\n        super().__init__()\\n\\n    def forward(self, inputs, *args, **kwargs):\\n        return inputs\\n\\n\\nclass Upsample(nn.Module):\\n    \\\"\\\"\\\"\\n    An upsampling layer with an optional convolution.\\n    :param channels: channels in the inputs and outputs.\\n    :param use_conv: a bool determining if a convolution is applied.\\n    :param dims: determines if the signal is 1D, 2D, or 3D. If 3D, then\\n                 upsampling occurs in the inner-two dimensions.\\n    \\\"\\\"\\\"\\n\\n    def __init__(self, channels, use_conv=False, out_channels=None, padding=1, **kwargs):\\n        super().__init__()\\n        self.channels = channels\\n        self.out_channels = out_channels or channels\\n        self.use_conv = use_conv\\n        if use_conv:\\n            self.conv = nn.Conv2d(self.channels, self.out_channels, 3, padding=padding)\\n        self.init_weights()\\n\\n    def init_weights(self):\\n\\n        def _init_weights(m):\\n            if isinstance(m, nn.Conv2d):\\n                nn.init.zeros_(m.weight)\\n                nn.init.zeros_(m.bias)\\n\\n        self.apply(_init_weights)\\n\\n    def forward(self, x, target_size=None, *args, **kwargs):\\n        assert x.shape[1] == self.channels\\n        if target_size is None:\\n            x = F.interpolate(x.float(), scale_factor=2, mode='nearest').type_as(x)\\n        else:\\n            x = F.interpolate(x.float(), target_size, mode='nearest').type_as(x)\\n        if self.use_conv:\\n            x = self.conv(x)\\n        return x\\n\\n\\ndef init_weight_type(dim, weight_type):\\n    if weight_type is None:\\n        scaling = None\\n    elif weight_type == 'gate':\\n        scaling = nn.Linear(dim, 1)\\n    elif weight_type == 'scale':\\n        scaling = nn.Parameter(torch.Tensor(1))\\n        scaling.data.fill_(1)\\n    elif weight_type == 'scale_kv':\\n        scaling_k = nn.Parameter(torch.Tensor(1))\\n        scaling_k.data.fill_(1)\\n        scaling_v = nn.Parameter(torch.Tensor(1))\\n        scaling_v.data.fill_(1)\\n        scaling = (scaling_k, scaling_v)\\n    elif weight_type == 'scale_channel':\\n        scaling = nn.Parameter(torch.Tensor(dim))\\n        scaling.data.fill_(1)\\n    elif weight_type == 'scale_kv_channel':\\n        scaling_k = nn.Parameter(torch.Tensor(dim))\\n        scaling_k.data.fill_(1)\\n        scaling_v = nn.Parameter(torch.Tensor(dim))\\n        scaling_v.data.fill_(1)\\n        scaling = (scaling_k, scaling_v)\\n    elif weight_type and weight_type.startswith('scalar'):\\n        scaling = float(weight_type.split('_')[-1])\\n    else:\\n        scaling = None\\n    return scaling\\n\\n\\ndef apply_data_weight(data, scaling, weight_type):\\n    if weight_type in ['gate']:\\n        scaling = torch.mean(torch.sigmoid(scaling(data)), dim=1).view(-1, 1, 1)\\n    elif weight_type in ['scale', 'scale_channel'] or weight_type.startswith('scalar'):\\n        scaling = scaling\\n    else:\\n        scaling = None\\n    if scaling is not None:\\n        data = data * scaling\\n    return data\\n\\n\\ndef detach_tensors(feats):\\n    if type(feats) in [list, tuple]:\\n        feats = [detach_tensors(feat) if feat is not None else None for feat in feats]\\n    elif isinstance(feats, dict):\\n        feats = {key: detach_tensors(val) for key, val in feats.items()}\\n    elif isinstance(feats, torch.Tensor):\\n        feats = feats.detach()\\n    else:\\n        feats = feats.detach()\\n    return feats\\n\\n\\ndef probe_tensors(module, feats, name):\\n    feats = detach_tensors(feats)\\n    setattr(module, name, feats)\\n\\n\\ndef probe_input_pre_hook(self, args):\\n    input = args[0]\\n    probe_tensors(self, input, 'probe_input_data')\\n    return args\\n\\n\\ndef probe_output_hook(self, args, result):\\n    output = result\\n    probe_tensors(self, output, 'probe_output_data')\\n    return output\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom .adapter import Adapter, AdapterConfig\\nfrom .llamapro import LLaMAPro, LLaMAProConfig\\nfrom .longlora.longlora import LongLoRA, LongLoRAConfig\\nfrom .lora import LoRA, LoRAConfig\\nfrom .neftune import NEFTune, NEFTuneConfig\\nfrom .part import Part, PartConfig\\nfrom .prompt import Prompt, PromptConfig\\nfrom .reft import Reft, ReftConfig\\nfrom .restuning import ResTuning, ResTuningConfig\\nfrom .rome import Rome, RomeConfig\\nfrom .scetuning.scetuning import SCETuning, SCETuningConfig\\nfrom .side import Side, SideConfig\\n\\n\\nclass SwiftTuners:\\n    ADAPTER = 'ADAPTER'\\n    PROMPT = 'PROMPT'\\n    LORA = 'LORA'\\n    SIDE = 'SIDE'\\n    RESTUNING = 'RESTUNING'\\n    ROME = 'ROME'\\n    LONGLORA = 'longlora'\\n    NEFTUNE = 'neftune'\\n    LLAMAPRO = 'LLAMAPRO'\\n    SCETUNING = 'SCETuning'\\n    PART = 'part'\\n    REFT = 'reft'\\n\\n\\nSWIFT_MAPPING = {\\n    SwiftTuners.ADAPTER: (AdapterConfig, Adapter),\\n    SwiftTuners.PROMPT: (PromptConfig, Prompt),\\n    SwiftTuners.LORA: (LoRAConfig, LoRA),\\n    SwiftTuners.SIDE: (SideConfig, Side),\\n    SwiftTuners.RESTUNING: (ResTuningConfig, ResTuning),\\n    SwiftTuners.ROME: (RomeConfig, Rome),\\n    SwiftTuners.LONGLORA: (LongLoRAConfig, LongLoRA),\\n    SwiftTuners.NEFTUNE: (NEFTuneConfig, NEFTune),\\n    SwiftTuners.SCETUNING: (SCETuningConfig, SCETuning),\\n    SwiftTuners.LLAMAPRO: (LLaMAProConfig, LLaMAPro),\\n    SwiftTuners.PART: (PartConfig, Part),\\n    SwiftTuners.REFT: (ReftConfig, Reft),\\n}\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Copyright 2023-present the HuggingFace Inc. team.\\n\\nimport hashlib\\nimport os\\nimport shutil\\nimport threading\\nimport uuid\\nfrom dataclasses import asdict, dataclass, field\\nfrom types import FunctionType\\nfrom typing import Dict, Optional, Union\\n\\nimport json\\nimport numpy as np\\nimport torch\\nfrom modelscope import snapshot_download\\nfrom modelscope.hub.utils.utils import get_cache_dir\\nfrom packaging import version\\nfrom peft.utils import CONFIG_NAME\\nfrom peft.utils import ModulesToSaveWrapper as _ModulesToSaveWrapper\\nfrom peft.utils import _get_submodules\\n\\nfrom swift.utils.constants import BIN_EXTENSIONS\\nfrom swift.utils.logger import get_logger\\nfrom swift.utils.module_mapping import MODEL_KEYS_MAPPING, ModelKeys\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass SwiftConfig:\\n\\n    swift_type: str = field(default=None)\\n\\n    model_key_mapping: Optional[Union[dict, ModelKeys]] = field(default=None)\\n\\n    @property\\n    def __dict__(self):\\n        return asdict(self)\\n\\n    def to_dict(self):\\n        return self.__dict__\\n\\n    def save_pretrained(self, save_directory, **kwargs):\\n        r\\\"\\\"\\\"\\n        This method saves the configuration of your adapter model in a directory.\\n\\n        Args:\\n            save_directory (`str`):\\n                The directory where the configuration will be saved.\\n        \\\"\\\"\\\"\\n        if os.path.isfile(save_directory):\\n            raise AssertionError(f'Provided path ({save_directory}) should be a directory, not a file')\\n\\n        os.makedirs(save_directory, exist_ok=True)\\n\\n        output_dict = self.__dict__\\n        output_dict.update(kwargs)\\n        output_path = os.path.join(save_directory, CONFIG_NAME)\\n\\n        # save it\\n        with open(output_path, 'w') as writer:\\n            writer.write(json.dumps(output_dict, indent=2, sort_keys=True))\\n\\n    @classmethod\\n    def from_pretrained(cls, pretrained_model_name_or_path, **kwargs):\\n        r\\\"\\\"\\\"\\n        This method loads the configuration of your adapter model from a directory.\\n\\n        Args:\\n            pretrained_model_name_or_path (`str`):\\n                The directory or the hub-id where the configuration is saved.\\n            **kwargs:\\n                Additional keyword arguments passed along to the child class initialization.\\n        \\\"\\\"\\\"\\n        if os.path.isfile(os.path.join(pretrained_model_name_or_path, CONFIG_NAME)):\\n            config_file = os.path.join(pretrained_model_name_or_path, CONFIG_NAME)\\n        else:\\n            try:\\n                model_dir = snapshot_download(pretrained_model_name_or_path, ignore_file_pattern=BIN_EXTENSIONS)\\n                config_file = os.path.join(model_dir, CONFIG_NAME)\\n            except Exception:\\n                raise ValueError(f\\\"Can't find config.json at '{pretrained_model_name_or_path}'\\\")\\n\\n        loaded_attributes = cls.from_json_file(config_file)\\n\\n        from .mapping import SWIFT_MAPPING\\n        assert loaded_attributes.get('swift_type', '') in SWIFT_MAPPING\\n        config = SWIFT_MAPPING[loaded_attributes['swift_type']][0](**kwargs)\\n\\n        for key, value in loaded_attributes.items():\\n            if hasattr(config, key):\\n                setattr(config, key, value)\\n\\n        return config\\n\\n    @classmethod\\n    def from_json_file(cls, path_json_file, **kwargs):\\n        r\\\"\\\"\\\"\\n        Loads a configuration file from a json file.\\n\\n        Args:\\n            path_json_file (`str`):\\n                The path to the json file.\\n        \\\"\\\"\\\"\\n        with open(path_json_file, 'r') as file:\\n            json_object = json.load(file)\\n\\n        return json_object\\n\\n\\n@dataclass\\nclass SwiftOutput:\\n    \\\"\\\"\\\"The output class returned by all tuners.\\n\\n    Args:\\n        model (`torch.nn.Module`): The model wrapped\\n        config (`SwiftConfig`): The swift config instance.\\n        state_dict_callback (`FunctionType`): A callback returned by the tuner\\n            which is used to get the tuner's state dict among the model's state dict.\\n            This callback should receive a state dict, and returns a created state dict.\\n            Examples:\\n                >>> def state_dict_callback(state_dict, adapter_name):\\n                >>>     return {\\n                >>>         key: value\\n                >>>         for key, value in state_dict.items() if adapter_name in key\\n                >>>     }\\n        save_callback (`FunctionType`): A callback used to save trained model.\\n        mark_trainable_callback (`FunctionType`): A callback returned by the tuner\\n            which is used to mark the tuner's adapter's parameters to trainable.\\n            This callback should receive a model instance, and returns nothing.\\n            Examples:\\n                >>> def mark_trainable_callback(model):\\n                >>>     mark_lora_as_trainable(model, config.bias)\\n        optimizer_group_callback (`FunctionType`): A callback returned the param group cared by the tuner.\\n        load_state_dict_callback (`FunctionType`): A callback called before load_state_dict of the tuner.\\n        load_callback (`FunctionType`): A callback used to load trained model.\\n    \\\"\\\"\\\"\\n    model: torch.nn.Module = None\\n    config: SwiftConfig = None\\n    state_dict_callback: FunctionType = None\\n    save_callback: FunctionType = None\\n    mark_trainable_callback: FunctionType = None\\n    optimizer_group_callback: FunctionType = None\\n    load_state_dict_callback: FunctionType = None\\n    load_callback: FunctionType = None\\n\\n\\nclass ActivationMixin:\\n\\n    USE_UNIQUE_THREAD = 'USE_UNIQUE_THREAD'\\n\\n    REMINEDED = False\\n\\n    def __init__(self, module_key):\\n        self.module_key = module_key\\n        self._thread_inf: Dict[int, Dict[str, bool]] = {}\\n        self._unique_thread = bool(int(os.environ.get(ActivationMixin.USE_UNIQUE_THREAD, '1')))\\n        if not self._unique_thread and not ActivationMixin.REMINEDED:\\n            ActivationMixin.REMINEDED = True\\n            logger.warn('Using multiple thread mode, gradient checkpointing is not supported.')\\n\\n    def mark_all_sub_modules_as_plugin(self: torch.nn.Module):\\n        self.plugin = True\\n        for name, module in self.named_modules():\\n            if 'base_layer' not in name:\\n                module.plugin = True\\n\\n    @property\\n    def indent(self):\\n        return 0 if self.unique_thread else threading.get_ident()\\n\\n    @property\\n    def unique_thread(self):\\n        return self._unique_thread\\n\\n    def set_activation(self, adapter_name, activate=True):\\n        tid = self.indent\\n        if tid not in self._thread_inf:\\n            self._thread_inf[tid] = {}\\n        self._thread_inf[tid][adapter_name] = activate\\n\\n    def is_activated(self, adapter_name):\\n        tid = self.indent\\n        return self._thread_inf.get(tid, {}).get(adapter_name, False)\\n\\n    def get_activated_adapters(self):\\n        return [key for key, value in self._thread_inf.get(self.indent, {}).items() if value]\\n\\n\\nclass OffloadHelper:\\n\\n    def __init__(self):\\n        sub_dir = os.path.join('offload_cache', str(uuid.uuid4().hex))\\n        self.cache_dir = os.path.join(get_cache_dir(), sub_dir)\\n        shutil.rmtree(self.cache_dir, ignore_errors=True)\\n        os.makedirs(self.cache_dir, exist_ok=True)\\n        self.index = {}\\n\\n    def __del__(self):\\n        shutil.rmtree(self.cache_dir, ignore_errors=True)\\n\\n    @staticmethod\\n    def offload_weight(weight, weight_name, offload_folder, index=None):\\n        dtype = None\\n        if str(weight.dtype) == 'torch.bfloat16':\\n            weight = weight.view(torch.int16)\\n            dtype = 'bfloat16'\\n        array = weight.cpu().numpy()\\n        tensor_file = os.path.join(offload_folder, f'{weight_name}.dat')\\n        if index is not None:\\n            if dtype is None:\\n                dtype = str(array.dtype)\\n            index[weight_name] = {'dtype': dtype, 'shape': list(array.shape)}\\n        if array.ndim == 0:\\n            array = array[None]\\n        file_array = np.memmap(tensor_file, dtype=array.dtype, mode='w+', shape=array.shape)\\n        file_array[:] = array[:]\\n        file_array.flush()\\n        return index\\n\\n    @staticmethod\\n    def load_offloaded_weight(weight_file, weight_info):\\n        shape = tuple(weight_info['shape'])\\n        if shape == ():\\n            shape = (1, )\\n\\n        dtype = weight_info['dtype']\\n        if dtype == 'bfloat16':\\n            dtype = 'int16'\\n\\n        weight = np.memmap(weight_file, dtype=dtype, shape=shape, mode='r')\\n\\n        if len(weight_info['shape']) == 0:\\n            weight = weight[0]\\n        weight = torch.tensor(weight)\\n        if weight_info['dtype'] == 'bfloat16':\\n            weight = weight.view(torch.bfloat16)\\n\\n        return weight\\n\\n    def offload_disk(self, module: torch.nn.Module, adapter_name, module_key):\\n        key = adapter_name + ':' + module_key\\n        md5 = hashlib.md5(key.encode('utf-8')).hexdigest()\\n        sub_folder = os.path.join(self.cache_dir, md5)\\n        os.makedirs(sub_folder, exist_ok=True)\\n        state_dict = module.state_dict()\\n        self.index[md5] = {}\\n        for key, tensor in state_dict.items():\\n            OffloadHelper.offload_weight(tensor, key, sub_folder, self.index[md5])\\n\\n    def load_disk(self, module: torch.nn.Module, adapter_name, module_key):\\n        key = adapter_name + ':' + module_key\\n        md5 = hashlib.md5(key.encode('utf-8')).hexdigest()\\n        sub_folder = os.path.join(self.cache_dir, md5)\\n        state_dict = {}\\n        for key, value in self.index[md5].items():\\n            file = os.path.join(sub_folder, f'{key}.dat')\\n            state_dict[key] = OffloadHelper.load_offloaded_weight(file, self.index[md5][key])\\n        if version.parse(torch.__version__) >= version.parse('2.1.0'):\\n            module.load_state_dict(state_dict, assign=True)\\n        else:\\n            for name, _module in module.named_modules():\\n                if len(list(_module.modules())) > 1:\\n                    continue\\n\\n                buffers = {}\\n                prefix = name if not name else name + '.'\\n                for sub_name, buffer in _module.named_buffers():\\n                    buffer_cls = type(buffer)\\n                    buffers[sub_name] = buffer_cls(state_dict[prefix + sub_name])\\n                _module._buffers.update(buffers)\\n                params = {}\\n                for sub_name, param in _module.named_parameters():\\n                    param_cls = type(param)\\n                    params[sub_name] = param_cls(state_dict[prefix + sub_name], requires_grad=param.requires_grad)\\n                _module._parameters.update(params)\\n        shutil.rmtree(sub_folder, ignore_errors=True)\\n\\n\\nclass SwiftAdapter:\\n\\n    offload_helper = OffloadHelper()\\n\\n    @staticmethod\\n    def prepare_model(model: torch.nn.Module, config: SwiftConfig, adapter_name: str) -> SwiftOutput:\\n        raise NotImplementedError\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        raise NotImplementedError\\n\\n    @staticmethod\\n    def save_memory(module: torch.nn.Module, adapter_name: str, module_key: str, activate: bool, offload: str = None):\\n        if not isinstance(module, torch.nn.Module):\\n            return\\n        if activate:\\n            SwiftAdapter.load(module, adapter_name, module_key)\\n        else:\\n            SwiftAdapter.offload(module, adapter_name, module_key, offload=offload)\\n\\n    @staticmethod\\n    def offload(module: torch.nn.Module, adapter_name, module_key, offload: str):\\n        if not offload:\\n            return\\n        device = next(iter(module.parameters())).device\\n        if hasattr(module, 'origin_device') and module.origin_device != str(device):\\n            return\\n        module.origin_device = str(device)\\n        if offload == 'cpu':\\n            if str(device) != 'cpu':\\n                module.to('cpu')\\n        elif offload == 'meta':\\n            if str(device) != 'meta':\\n                SwiftAdapter.offload_helper.offload_disk(module, adapter_name=adapter_name, module_key=module_key)\\n                module.to('meta')\\n        else:\\n            raise NotImplementedError\\n        torch.cuda.empty_cache()\\n\\n    @staticmethod\\n    def load(module: torch.nn.Module, adapter_name, module_key):\\n        device = next(iter(module.parameters())).device\\n        if not hasattr(module, 'origin_device') or module.origin_device == str(device):\\n            return\\n        if str(device) == 'cpu':\\n            module.to(module.origin_device)\\n            delattr(module, 'origin_device')\\n        elif str(device) == 'meta':\\n            SwiftAdapter.offload_helper.load_disk(module, adapter_name=adapter_name, module_key=module_key)\\n            module.to(module.origin_device)\\n            delattr(module, 'origin_device')\\n\\n    @classmethod\\n    def get_model_key_mapping(cls, model_type, config) -> ModelKeys:\\n        if model_type in MODEL_KEYS_MAPPING.keys():\\n            model_key_mapping = MODEL_KEYS_MAPPING[model_type]\\n        else:\\n            model_key_mapping = config.model_key_mapping\\n\\n        if model_key_mapping is None:\\n            raise ValueError(f'{model_type} is not defined in MODEL_KEYS_MAPPING, '\\n                             f'please consider pass the information through the config.model_key_mapping')\\n\\n        if isinstance(model_key_mapping, dict):\\n            model_key_mapping: ModelKeys = ModelKeys(**model_key_mapping)\\n        return model_key_mapping\\n\\n    @staticmethod\\n    def state_dict_load_hook(model: torch.nn.Module, state_dict: Dict[str, torch.Tensor]):\\n        pass\\n\\n    @staticmethod\\n    def has_additional_modules():\\n        return True\\n\\n\\nclass ModulesToSaveWrapper(ActivationMixin, _ModulesToSaveWrapper):\\n\\n    def __init__(self, *args, module_key, **kwargs):\\n        super(ModulesToSaveWrapper, self).__init__(module_key)\\n        super(ActivationMixin, self).__init__(*args, **kwargs)\\n        SwiftAdapter.save_memory(self.original_module, 'original_module', self.module_key, False, offload='cpu')\\n\\n    @property\\n    def active_adapter(self):\\n        active_adapters = self.get_activated_adapters()\\n        if not active_adapters:\\n            return None\\n        elif len(active_adapters) > 1:\\n            raise ValueError('ModulesToSaveWrapper does not support multiple active adapters')\\n        return active_adapters[0]\\n\\n    def set_adapter(self, adapter_name: str, offload: str = None):\\n        if adapter_name not in self.modules_to_save:\\n            raise ValueError(f'Adapter {adapter_name} not found in {self.modules_to_save.keys()}')\\n        self.modules_to_save[adapter_name].requires_grad_(True)\\n        self.set_activation(adapter_name, True)\\n        SwiftAdapter.save_memory(self.modules_to_save[adapter_name], adapter_name, self.module_key, True)\\n        SwiftAdapter.save_memory(self.original_module, 'original_module', self.module_key, False, offload=offload)\\n\\n    def deactivate_adapter(self, adapter_name: str, offload: str = None):\\n        if adapter_name in self.modules_to_save and self.unique_thread:\\n            self.modules_to_save[adapter_name].requires_grad_(False)\\n        self.set_activation(adapter_name, False)\\n        SwiftAdapter.save_memory(\\n            self.modules_to_save[adapter_name], adapter_name, self.module_key, False, offload=offload)\\n        if not self.get_activated_adapters():\\n            SwiftAdapter.save_memory(self.original_module, 'original_module', self.module_key, True)\\n\\n    def enable_adapters(self, enabled: bool):\\n        super().enable_adapters(enabled)\\n        if not enabled:\\n            SwiftAdapter.save_memory(self.original_module, 'original_module', self.module_key, False, offload='meta')\\n        else:\\n            SwiftAdapter.save_memory(self.original_module, 'original_module', self.module_key, True)\\n\\n\\ndef set_adapter(model, adapter_name, activate, offload):\\n    for module in model.modules():\\n        if isinstance(module, ModulesToSaveWrapper):\\n            if activate:\\n                module.set_adapter(adapter_name, offload)\\n            else:\\n                module.deactivate_adapter(adapter_name, offload)\\n\\n\\ndef set_trainable(model, adapter_name):\\n    key_list = [key for key, _ in model.named_modules()]\\n    for key in key_list:\\n        target_module_found = any(key.endswith(target_key) for target_key in model.modules_to_save)\\n        if target_module_found:\\n            parent, target, target_name = _get_submodules(model, key)\\n            if isinstance(target, ModulesToSaveWrapper):\\n                target.update(adapter_name)\\n                target.set_adapter(target.active_adapter)\\n            else:\\n                new_module = ModulesToSaveWrapper(target, module_key=key, adapter_name=adapter_name)\\n                new_module.set_adapter(adapter_name)\\n                setattr(parent, target_name, new_module)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport copy\\nimport re\\nimport types\\nfrom dataclasses import dataclass, field\\nfrom typing import Dict, List, Optional, Union\\n\\nimport torch\\nimport torch.nn as nn\\n\\nfrom swift import get_logger\\nfrom swift.utils.torch_utils import find_sub_module\\nfrom .restuning_components import ResTuner, detach_tensors, probe_input_pre_hook, probe_output_hook\\nfrom .utils import ActivationMixin, SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass ResTuningConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the ResTuning module.\\n\\n    ResTuning is a flexible parameter-efficient and memory-efficient tuning paradigm framework.\\n    'Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone'\\n    by Jiang et al.(2023)\\n    See\\n\\n    Args:\\n        dims(`Union[List[int], int]`): The dimensions of the hidden states\\n        root_modules(`str`): The root module to be replaced, can a regex string\\n        root_modules_hook(`str`): The hook type of root modules, can be \\\"input\\\" or \\\"output\\\"\\n        stem_modules(`Union[List[str], str]`): The stem modules to be replaced,\\n            can a regex string or name list of full match format\\n        stem_modules_hook(`Union[List[str], str]`): The hook type of stem modules, can be \\\"input\\\" or \\\"output\\\"\\n        target_modules(`str`): The target module to be replaced, can a regex string\\n        target_modules_hook(`str`): The hook type of target modules, can be \\\"input\\\" or \\\"output\\\"\\n        tuner_cfg(`Union[List[Dict], Dict, str]`): The configuration of the tuning module,\\n            can a string or customized config\\n        use_upsample(bool): Whether to use auxiliary upsample module\\n        upsample_out_channels(List[int]): The channels if `use_upsample`\\n        zero_init_last(bool): Use zero to initialize the last Linear in every sub tuner.\\n\\n    \\\"\\\"\\\"\\n\\n    dims: Optional[Union[List[int], int]] = field(\\n        default=None, metadata={'help': 'The dimensions of the hidden states'})\\n\\n    root_modules: str = field(\\n        default=None,\\n        metadata={\\n            'help':\\n            'The root module to be replaced, can a regex string (use the first matching module) or full match format'\\n        })\\n\\n    root_modules_hook: str = field(\\n        default='input', metadata={'help': 'The hook type of root modules, can be \\\"input\\\" or \\\"output\\\"'})\\n\\n    stem_modules: Optional[Union[List[str], str]] = field(\\n        default=None,\\n        metadata={'help': 'The stem modules to be replaced, can a regex string or name list of full match format'})\\n\\n    stem_modules_hook: str = field(\\n        default='output', metadata={'help': 'The hook type of stem modules, can be \\\"input\\\" or \\\"output\\\"'})\\n\\n    target_modules: str = field(\\n        default=None,\\n        metadata={\\n            'help':\\n            'The target module to be replaced, can a regex string (use the first matching module) or full match format'\\n        })\\n\\n    target_modules_hook: str = field(\\n        default='input', metadata={'help': 'The hook type of target modules, can be \\\"input\\\" or \\\"output\\\"'})\\n\\n    target_hidden_pos: Union[int, str] = field(\\n        default=None, metadata={'help': 'The position of the hidden state for target modules output'})\\n\\n    tuner_cfg: Optional[Union[List[Dict], Dict, str]] = field(\\n        default=None, metadata={'help': 'The configuration of the tuning module, can a string or customized config'})\\n\\n    use_upsample: bool = field(default=False, metadata={'help': 'Whether to use auxiliary upsample module'})\\n\\n    upsample_out_channels: List[int] = field(\\n        default=None, metadata={'help': 'The number of output channels when \\\"use_upsample\\\" is set to \\\"True\\\"'})\\n\\n    zero_init_last: bool = field(default=False, metadata={'help': 'Zero init last weight'})\\n\\n    use_bypass: bool = field(default=True, metadata={'help': 'Whether to use bypass'})\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.RESTUNING\\n        self.target_hidden_pos = 0 if self.target_hidden_pos is None else self.target_hidden_pos\\n\\n\\nclass ResTuning(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: ResTuningConfig, adapter_name: str) -> SwiftOutput:\\n        \\\"\\\"\\\"Prepare a model with `ResTuningConfig`\\\"\\\"\\\"\\n\\n        def _forward_seq(self, input, *args, **kwargs):\\n            for idx, module in enumerate(self):\\n                if idx >= len(self.origin_module_keys):\\n                    continue\\n                input = module(input)\\n            return input\\n\\n        def _forward_target(self, *args, **kwargs):\\n            if self.target_modules_hook == 'input':\\n                if isinstance(self.target_hidden_pos, int):\\n                    args = list(args)\\n                    _arg = args[self.target_hidden_pos]\\n                else:\\n                    _arg = kwargs[self.target_hidden_pos]\\n                args_main = _forward_restuning(self, _arg)\\n                if isinstance(self.target_hidden_pos, int):\\n                    args[self.target_hidden_pos] = args_main\\n                else:\\n                    kwargs[self.target_hidden_pos] = args_main\\n                args_main = getattr(self, f'forward_origin_{adapter_name}')(*args, **kwargs)\\n            else:\\n                _args_main = getattr(self, f'forward_origin_{adapter_name}')(*args, **kwargs)\\n                _arg = _args_main[self.target_hidden_pos] if isinstance(_args_main, (tuple, list, dict)) else _args_main\\n                args_main = _forward_restuning(self, _arg)\\n                if type(_args_main) != type(args_main):\\n                    _args_main[self.target_hidden_pos] = args_main\\n                    args_main = _args_main\\n            return args_main\\n\\n        def _forward_restuning(self, origin_arg):\\n            probe_results = []\\n            root_module_ins = self.root_module_ins_list[0]\\n            stem_module_ins_list = self.stem_module_ins_list\\n            top_module = model.get_submodule('')\\n            if root_module_ins:\\n                if root_module_ins.root_modules_hook == 'input':\\n                    probe_results.append(root_module_ins.probe_input_data)\\n                else:\\n                    probe_results.append(root_module_ins.probe_output_data)\\n            for i, st_mod in enumerate(stem_module_ins_list):\\n                if i == 0 and root_module_ins is None:\\n                    probe_results.append(st_mod.probe_input_data)\\n                if st_mod.stem_modules_hook == 'input':\\n                    probe_results.append(st_mod.probe_input_data)\\n                else:\\n                    probe_results.append(st_mod.probe_output_data)\\n            args_main = getattr(top_module, f'restuning_{adapter_name}')(probe_results, origin_arg)\\n            return args_main\\n\\n        # 1. Matching the root module\\n        module_keys = [key for key, _ in model.named_modules()]\\n        root_module_ins_list = []\\n        if config.root_modules:\\n            for module_key in module_keys:\\n                if re.fullmatch(config.root_modules, module_key):\\n                    root_module = model.get_submodule(module_key)\\n                    logger.info(f'Matching root module [{module_key}] of type {type(root_module)}')\\n                    if isinstance(root_module, (nn.ModuleList, nn.ModuleDict)):\\n                        logger.warning(\\n                            f'Type of {type(root_module)} may not be supported because of its customized forward')\\n                    if config.root_modules_hook == 'input':\\n                        root_module.register_forward_pre_hook(probe_input_pre_hook)\\n                    else:\\n                        root_module.register_forward_hook(probe_output_hook)\\n                    root_module.root_modules_hook = config.root_modules_hook\\n                    root_module_ins_list.append(root_module)\\n                    break\\n            if len(root_module_ins_list) == 0:\\n                logger.error('Cannot match root modules')\\n\\n        # 2. Matching the stem module\\n        stem_module_ins_list = []\\n        stem_module_ins_index = []\\n        for module_key in module_keys:\\n            if (isinstance(config.stem_modules, str) and re.fullmatch(config.stem_modules, module_key)) or \\\\\\n                    (isinstance(config.stem_modules, list) and module_key in config.stem_modules):\\n                stem_module = model.get_submodule(module_key)\\n                if isinstance(config.stem_modules, list):\\n                    stem_module_ins_index.append(config.stem_modules.index(module_key))\\n                logger.info(f'Matching stem module [{module_key}] of type {type(stem_module)}')\\n                if isinstance(stem_module, (nn.ModuleList, nn.ModuleDict)):\\n                    logger.warning(\\n                        f'Type of {type(stem_module)} may not be supported because of its customized forward')\\n                if len(root_module_ins_list) == 0 and len(stem_module_ins_list) == 0:\\n                    stem_module.register_forward_pre_hook(probe_input_pre_hook)\\n                if config.stem_modules_hook == 'input':\\n                    stem_module.register_forward_pre_hook(probe_input_pre_hook)\\n                else:\\n                    stem_module.register_forward_hook(probe_output_hook)\\n                stem_module.stem_modules_hook = config.stem_modules_hook\\n                stem_module_ins_list.append(stem_module)\\n        if isinstance(config.stem_modules, list):\\n            stem_module_ins_list = [\\n                stem_module_ins_list[stem_module_ins_index.index(i)] for i in range(len(stem_module_ins_index))\\n            ]\\n        depth = len(stem_module_ins_list)\\n        if len(stem_module_ins_list) == 0:\\n            raise Exception('Cannot match source modules')\\n\\n        # 3. Init restuning module\\n        if len(stem_module_ins_list) != 0:\\n            top_module = model.get_submodule('')\\n            restuning_module = ResTuningBypassModule(config.dims, depth, adapter_name, config.use_upsample,\\n                                                     config.upsample_out_channels, config.zero_init_last,\\n                                                     config.tuner_cfg)\\n            setattr(top_module, f'restuning_{adapter_name}', restuning_module)\\n\\n        # 4. Matching the target module\\n        target_module_ins = None\\n        for module_key in module_keys:\\n            if re.fullmatch(config.target_modules, module_key):\\n                tgt_module = model.get_submodule(module_key)\\n                logger.info(f'Matching target module [{module_key}] of type {type(tgt_module)}')\\n                if isinstance(tgt_module, (nn.ModuleList, nn.ModuleDict)):\\n                    raise Exception(\\n                        f'Type of {type(tgt_module)} may not be supported because of its customized forward')\\n\\n                tgt_module.target_modules_hook = config.target_modules_hook\\n                tgt_module.target_hidden_pos = config.target_hidden_pos\\n                tgt_module.root_module_ins_list = root_module_ins_list\\n                tgt_module.stem_module_ins_list = stem_module_ins_list\\n                target_module_ins = tgt_module\\n\\n                if isinstance(tgt_module, nn.Sequential) and not hasattr(tgt_module, 'origin_module_keys'):\\n                    tgt_module.origin_module_keys = copy.deepcopy(list(tgt_module._modules.keys()))\\n\\n                    setattr(tgt_module, f'forward_origin_{adapter_name}', types.MethodType(_forward_seq, tgt_module))\\n                else:\\n                    setattr(tgt_module, f'forward_origin_{adapter_name}', tgt_module.forward)\\n                tgt_module.forward = types.MethodType(_forward_target, tgt_module)\\n        if target_module_ins is None:\\n            raise Exception('Cannot match target modules')\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            return {key: value for key, value in state_dict.items() if f'restuning_{adapter_name}' in key}\\n\\n        def mark_trainable_callback(model):\\n            return\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        modules = find_sub_module(module, f'restuning_{adapter_name}')\\n        for _module in modules:\\n            _module: ActivationMixin\\n            _module: nn.Module\\n            _module.set_activation(adapter_name, activate)\\n            SwiftAdapter.save_memory(_module, adapter_name, _module.module_key, activate, offload)\\n\\n\\nclass ResTuningBypassModule(nn.Module, ActivationMixin):\\n    \\\"\\\"\\\"The implementation of ResTuningBypass method.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        dims,\\n        depth,\\n        adapter_name,\\n        use_upsample=False,\\n        upsample_out_channels=None,\\n        zero_init_last=False,\\n        tuner_cfg=None,\\n    ):\\n        super(ResTuningBypassModule, self).__init__()\\n        super(nn.Module, self).__init__('')\\n        self.adapter_name = adapter_name\\n\\n        self.bypass_blocks = nn.Sequential(*[\\n            ResTunerBypassBlock(\\n                dim=dims[i] if isinstance(dims, list) else dims,\\n                layer_num=i,\\n                depth=depth,\\n                use_upsample=use_upsample,\\n                upsample_out_channels=upsample_out_channels[i] if isinstance(upsample_out_channels, list\\n                                                                             ) else upsample_out_channels,\\n                zero_init_last=zero_init_last,\\n                tuner_cfg=tuner_cfg[i] if isinstance(tuner_cfg, list) else tuner_cfg) for i in range(depth)\\n        ])\\n        self.mark_all_sub_modules_as_plugin()\\n\\n    def forward(self, x_list, origin_arg, **kwargs):\\n        if not self.is_activated(self.adapter_name):\\n            return origin_arg\\n        x_bypass = detach_tensors(x_list.pop(0))\\n        x_bypass = x_bypass[0] if isinstance(x_bypass, (list, tuple)) else x_bypass\\n        x_list = detach_tensors(x_list)\\n        x_list = [_x[0] if isinstance(_x, (list, tuple)) else _x for _x in x_list]\\n        for i, (bp_blk, x_stem) in enumerate(zip(self.bypass_blocks, x_list)):\\n            target_size = x_list[i + 1].shape[2:] if i < len(x_list) - 1 else None\\n            x_bypass = bp_blk(x_stem, x_bypass, target_size, **kwargs)\\n        return x_bypass\\n\\n\\nclass ResTunerBypassBlock(nn.Module):\\n\\n    def __init__(self, dim, layer_num=-1, depth=-1, use_upsample=False, zero_init_last=False, tuner_cfg=None, **kwargs):\\n        super().__init__()\\n        self.layer_num = layer_num\\n        self.depth = depth\\n\\n        if isinstance(tuner_cfg, str):\\n            lateral_cfg = tuner_cfg\\n            vertical_cfg = tuner_cfg\\n            aux_cfg = 'upsample' if use_upsample and layer_num != depth - 1 else None\\n        elif isinstance(tuner_cfg, dict):\\n            lateral_cfg = tuner_cfg['lateral_cfg'] if 'lateral_cfg' in tuner_cfg else None\\n            vertical_cfg = tuner_cfg['vertical_cfg'] if 'vertical_cfg' in tuner_cfg else None\\n            aux_cfg = tuner_cfg['aux_cfg'] if 'aux_cfg' in tuner_cfg else None\\n\\n        self.lateral_tuner = ResTuner(dim, layer_num, depth, zero_init_last, 'lateral', lateral_cfg, **kwargs)\\n        self.vertical_tuner = ResTuner(dim, layer_num, depth, zero_init_last, 'vertical', vertical_cfg, **kwargs)\\n        if aux_cfg and len(aux_cfg) != 0:\\n            self.aux_tuner = ResTuner(dim, layer_num, depth, zero_init_last, 'aux', aux_cfg, **kwargs)\\n\\n    def forward(self, x_stem, x_bypass, target_size=None, **kwargs):\\n        x_lateral = self.lateral_tuner(x_stem)\\n        x_vertical = self.vertical_tuner(x_bypass)\\n\\n        x_bypass_out = x_lateral + x_vertical\\n        if hasattr(self, 'aux_tuner'):\\n            x_bypass_out = self.aux_tuner(x_bypass_out, target_size)\\n        return x_bypass_out\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Copyright (c) Microsoft Corporation. All rights reserved.\\n# Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.\\nimport importlib\\nimport math\\nimport re\\nimport warnings\\nfrom itertools import chain\\nfrom typing import Any, Dict, List, Optional\\n\\nimport importlib_metadata\\nimport packaging\\nimport peft\\nimport torch\\nimport torch.nn as nn\\nimport torch.nn.functional as F\\nfrom packaging import version\\nfrom peft.import_utils import is_bnb_4bit_available, is_bnb_available\\nfrom peft.tuners.lora import Conv2d as _Conv2d\\nfrom peft.tuners.lora import Embedding as _Embedding\\nfrom peft.tuners.lora import Linear as _Linear\\nfrom peft.tuners.lora import LoraLayer\\nfrom peft.tuners.lora import LoraModel as _LoraModel\\nfrom peft.tuners.lora.tp_layer import LoraParallelLinear as _LoraParallelLinear\\nfrom peft.tuners.tuners_utils import BaseTunerLayer\\nfrom peft.utils import _get_submodules, get_auto_gptq_quant_linear, get_quantization_config\\nfrom transformers import Conv1D\\n\\nfrom swift import LoraConfig, get_logger\\nfrom .utils import ActivationMixin, ModulesToSaveWrapper, SwiftAdapter\\n\\nlogger = get_logger()\\ndispatchers = []\\n\\n\\ndef is_auto_awq_available():\\n    return importlib.util.find_spec('awq') is not None\\n\\n\\ndef is_aqlm_available():\\n    return importlib.util.find_spec('aqlm') is not None\\n\\n\\ndef is_eetq_available():\\n    return importlib.util.find_spec('eetq') is not None\\n\\n\\ndef is_hqq_available():\\n    return importlib.util.find_spec('hqq') is not None\\n\\n\\ndef is_auto_gptq_available():\\n    try:\\n        return peft.import_utils._is_auto_gptq_available()\\n    except ImportError as e:\\n        logger.warn(e)\\n        return False\\n\\n\\npeft.import_utils._is_auto_gptq_available = peft.import_utils.is_auto_gptq_available\\npeft.import_utils.is_auto_gptq_available = is_auto_gptq_available\\n\\n\\nclass LoRAActivationMixin(ActivationMixin):\\n\\n    @property\\n    def active_adapters(self):\\n        return self.get_activated_adapters()\\n\\n    @property\\n    def active_adapter(self) -> str:\\n        return self.get_activated_adapters()\\n\\n    def set_adapter(self, adapter_names, offload=None):\\n        if isinstance(adapter_names, str):\\n            adapter_names = [adapter_names]\\n\\n        # Deactivate grads on the inactive adapter and activate grads on the active adapter\\n        for layer_name in self.adapter_layer_names:\\n            module_dict = getattr(self, layer_name)\\n            for key, layer in module_dict.items():\\n                if key in adapter_names:\\n                    self.set_activation(key, True)\\n                    layer.requires_grad_(True)\\n                    SwiftAdapter.save_memory(layer, key, self.module_key, True)\\n                else:\\n                    self.set_activation(key, False)\\n                    layer.requires_grad_(False)\\n                    SwiftAdapter.save_memory(layer, key, self.module_key, False, offload=offload)\\n\\n    def save_memory(self, adapter_name, activate, offload=None):\\n        for layer_name in self.adapter_layer_names:\\n            module_dict = getattr(self, layer_name)\\n            for key, layer in module_dict.items():\\n                if key == adapter_name:\\n                    if activate:\\n                        SwiftAdapter.save_memory(layer, layer_name + '.' + key, self.module_key, True)\\n                    else:\\n                        SwiftAdapter.save_memory(layer, layer_name + '.' + key, self.module_key, False, offload=offload)\\n\\n    def merge(self, *args, **kwargs):\\n        if not self.unique_thread:\\n            raise AssertionError('Merge is unsupported in multiple thread, '\\n                                 'please set `USE_UNIQUE_THREAD=1` in env variable to merge LoRA.')\\n        return super().merge(*args, **kwargs)\\n\\n\\nif is_bnb_available():\\n    import bitsandbytes as bnb\\n    from peft.tuners.lora.bnb import Linear8bitLt as _Linear8bitLt\\n\\n    class Linear8bitLt(LoRAActivationMixin, _Linear8bitLt):\\n\\n        def __init__(\\n            self,\\n            *args,\\n            module_key: str,\\n            **kwargs,\\n        ):\\n            super(Linear8bitLt, self).__init__(module_key)\\n            self.set_activation(args[1], True)\\n            super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n    def dispatch_bnb_8bit(target: torch.nn.Module, adapter_name: str, module_key: str, **kwargs):\\n        new_module = None\\n\\n        if isinstance(target, BaseTunerLayer):\\n            target_base_layer = target.get_base_layer()\\n        else:\\n            target_base_layer = target\\n\\n        loaded_in_8bit = kwargs.get('loaded_in_8bit', False)\\n        if loaded_in_8bit and isinstance(target_base_layer, bnb.nn.Linear8bitLt):\\n            eightbit_kwargs = kwargs.copy()\\n            eightbit_kwargs.update({\\n                'has_fp16_weights': target.state.has_fp16_weights,\\n                'memory_efficient_backward': target.state.memory_efficient_backward,\\n                'threshold': target.state.threshold,\\n                'index': target.index,\\n            })\\n            new_module = Linear8bitLt(target, adapter_name, module_key=module_key, **eightbit_kwargs)\\n\\n        return new_module\\n\\n    dispatchers.append(dispatch_bnb_8bit)\\n\\nif is_bnb_4bit_available():\\n    from peft.tuners.lora.bnb import Linear4bit as _Linear4bit\\n\\n    class Linear4bit(LoRAActivationMixin, _Linear4bit):\\n\\n        def __init__(\\n            self,\\n            *args,\\n            module_key: str,\\n            **kwargs,\\n        ):\\n            super(Linear4bit, self).__init__(module_key)\\n            self.set_activation(args[1], True)\\n            super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n    def dispatch_bnb_4bit(target: torch.nn.Module, adapter_name: str, module_key: str, **kwargs):\\n        new_module = None\\n\\n        if isinstance(target, BaseTunerLayer):\\n            target_base_layer = target.get_base_layer()\\n        else:\\n            target_base_layer = target\\n\\n        loaded_in_4bit = kwargs.get('loaded_in_4bit', False)\\n        if loaded_in_4bit and is_bnb_4bit_available() and isinstance(target_base_layer, bnb.nn.Linear4bit):\\n            fourbit_kwargs = kwargs.copy()\\n            fourbit_kwargs.update({\\n                'compute_dtype': target_base_layer.compute_dtype,\\n                'compress_statistics': target_base_layer.weight.compress_statistics,\\n                'quant_type': target_base_layer.weight.quant_type,\\n            })\\n            new_module = Linear4bit(target, adapter_name, module_key=module_key, **fourbit_kwargs)\\n\\n        return new_module\\n\\n    dispatchers.append(dispatch_bnb_4bit)\\n\\nif is_aqlm_available():\\n    from peft.tuners.lora.aqlm import AqlmLoraLinear as _AqlmLoraLinear\\n    from aqlm import QuantizedLinear\\n\\n    class AqlmLoraLinear(LoRAActivationMixin, _AqlmLoraLinear):\\n\\n        def __init__(\\n            self,\\n            *args,\\n            module_key: str,\\n            **kwargs,\\n        ):\\n            super(AqlmLoraLinear, self).__init__(module_key)\\n            self.set_activation(args[1], True)\\n            super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n    def dispatch_aqlm(\\n        target: torch.nn.Module,\\n        adapter_name: str,\\n        **kwargs: Any,\\n    ) -> Optional[torch.nn.Module]:\\n        new_module = None\\n\\n        if isinstance(target, BaseTunerLayer):\\n            target_base_layer = target.get_base_layer()\\n        else:\\n            target_base_layer = target\\n\\n        if is_aqlm_available() and isinstance(target_base_layer, QuantizedLinear):\\n            new_module = AqlmLoraLinear(target, adapter_name, **kwargs)\\n            target.qweight = target_base_layer.codes\\n\\n        return new_module\\n\\n    dispatchers.append(dispatch_aqlm)\\n\\nif is_auto_awq_available():\\n    from peft.tuners.lora.awq import AwqLoraLinear as _AwqLoraLinear\\n    from awq.modules.linear import WQLinear_GEMM\\n\\n    class AwqLoraLinear(LoRAActivationMixin, _AwqLoraLinear):\\n\\n        def __init__(\\n            self,\\n            *args,\\n            module_key: str,\\n            **kwargs,\\n        ):\\n            super(AwqLoraLinear, self).__init__(module_key)\\n            self.set_activation(args[1], True)\\n            super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n    def dispatch_awq(\\n        target: torch.nn.Module,\\n        adapter_name: str,\\n        module_key: str,\\n        **kwargs: Any,\\n    ) -> Optional[torch.nn.Module]:\\n        new_module = None\\n\\n        if isinstance(target, BaseTunerLayer):\\n            target_base_layer = target.get_base_layer()\\n        else:\\n            target_base_layer = target\\n\\n        if isinstance(target_base_layer, WQLinear_GEMM):\\n            # Raise the error only at the dispatch level\\n            AUTOAWQ_MINIMUM_VERSION = packaging.version.parse('0.2.0')\\n            version_autoawq = packaging.version.parse(importlib_metadata.version('autoawq'))\\n\\n            if AUTOAWQ_MINIMUM_VERSION > version_autoawq:\\n                raise ImportError(f'Found an incompatible version of auto-awq. Found version {version_autoawq}, '\\n                                  f'but only versions above {AUTOAWQ_MINIMUM_VERSION} are supported for PEFT.')\\n\\n            new_module = AwqLoraLinear(target, adapter_name, module_key=module_key, **kwargs)\\n            target.qweight = target_base_layer.qweight\\n\\n        return new_module\\n\\n    dispatchers.append(dispatch_awq)\\n\\nif is_auto_gptq_available():\\n    from peft.tuners.lora import QuantLinear as _QuantLinear\\n\\n    class QuantLinear(LoRAActivationMixin, _QuantLinear):\\n\\n        def __init__(\\n            self,\\n            base_layer,\\n            adapter_name: str,\\n            module_key: str,\\n            r: int = 0,\\n            lora_alpha: int = 1,\\n            lora_dropout: float = 0.0,\\n            init_lora_weights: bool = True,\\n            use_rslora: bool = False,\\n            use_dora: bool = False,\\n            use_qa_lora=False,\\n            group_size=None,\\n            **kwargs,\\n        ):\\n            super(QuantLinear, self).__init__(module_key)\\n            self.set_activation(adapter_name, True)\\n            nn.Module.__init__(self)\\n            self.group_size = group_size\\n            self.use_qa_lora = use_qa_lora\\n            if self.use_qa_lora:\\n                assert self.group_size is not None, 'To use qa_lora you need to pass in the `group_size` param.'\\n                self.qa_pool = torch.nn.AvgPool1d(self.group_size)  # using pooling layer to conduct sum operation\\n\\n            LoraLayer.__init__(self, base_layer)\\n            if use_dora:\\n                raise ValueError(f'{_QuantLinear.__name__} does not support DoRA yet, please set it to False')\\n            if self.use_qa_lora:\\n                self.in_features = self.in_features // self.group_size\\n            # self.base_layer and self.quant_linear_module are the same;\\n            # we need the former for consistency and the latter\\n            # for backwards compatibility\\n            self.quant_linear_module = base_layer\\n            self._active_adapter = adapter_name\\n            self.update_layer(\\n                adapter_name,\\n                r,\\n                lora_alpha=lora_alpha,\\n                lora_dropout=lora_dropout,\\n                init_lora_weights=init_lora_weights,\\n                use_rslora=use_rslora,\\n                use_dora=use_dora,\\n            )\\n\\n        def forward(self, x: torch.Tensor):\\n            # note: logic differs from default Linear because merging is not supported\\n            result = self.quant_linear_module(x)\\n\\n            if self.disable_adapters:\\n                return result\\n\\n            for active_adapter in self.active_adapters:\\n                if active_adapter not in self.lora_A.keys():\\n                    continue\\n                lora_A = self.lora_A[active_adapter]\\n                lora_B = self.lora_B[active_adapter]\\n                dropout = self.lora_dropout[active_adapter]\\n                scaling = self.scaling[active_adapter]\\n\\n                requires_conversion = not torch.is_autocast_enabled()\\n                if requires_conversion:\\n                    expected_dtype = result.dtype\\n                    x = x.to(lora_A.weight.dtype)\\n\\n                if self.use_qa_lora:\\n                    x = self.qa_pool(x) * self.group_size\\n                output = lora_B(lora_A(dropout(x)))\\n                if requires_conversion:\\n                    output = output.to(expected_dtype)\\n                output = output * scaling\\n                result += output\\n            return result\\n\\n    def dispatch_gptq(\\n        target: torch.nn.Module,\\n        adapter_name: str,\\n        module_key: str,\\n        **kwargs: Any,\\n    ) -> Optional[torch.nn.Module]:\\n        new_module = None\\n\\n        if isinstance(target, BaseTunerLayer):\\n            target_base_layer = target.get_base_layer()\\n        else:\\n            target_base_layer = target\\n\\n        gptq_quantization_config = kwargs.get('gptq_quantization_config', None)\\n        AutoGPTQQuantLinear = get_auto_gptq_quant_linear(gptq_quantization_config)\\n\\n        if AutoGPTQQuantLinear is not None and isinstance(target_base_layer, AutoGPTQQuantLinear):\\n            new_module = QuantLinear(target, adapter_name, module_key=module_key, **kwargs)\\n            target.qweight = target_base_layer.qweight\\n\\n        return new_module\\n\\n    dispatchers.append(dispatch_gptq)\\n\\nif is_eetq_available():\\n    from peft.tuners.lora.eetq import EetqLoraLinear as _EetqLoraLinear\\n    from eetq import EetqLinear\\n\\n    class EetqLoraLinear(LoRAActivationMixin, _EetqLoraLinear):\\n\\n        def __init__(\\n            self,\\n            *args,\\n            module_key: str,\\n            **kwargs,\\n        ):\\n            super(EetqLoraLinear, self).__init__(module_key)\\n            self.set_activation(args[1], True)\\n            super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n    def dispatch_eetq(\\n        target: torch.nn.Module,\\n        adapter_name: str,\\n        **kwargs: Any,\\n    ) -> Optional[torch.nn.Module]:\\n        new_module = None\\n\\n        if isinstance(target, BaseTunerLayer):\\n            target_base_layer = target.get_base_layer()\\n        else:\\n            target_base_layer = target\\n\\n        if is_eetq_available() and isinstance(target_base_layer, EetqLinear):\\n            new_module = EetqLoraLinear(target, adapter_name, **kwargs)\\n            target.weight = target_base_layer.weight\\n\\n            if hasattr(target, 'bias'):\\n                target.bias = target_base_layer.bias\\n\\n        return new_module\\n\\n    dispatchers.append(dispatch_eetq)\\n\\nif is_hqq_available():\\n    from peft.tuners.lora.hqq import HqqLoraLinear as _HqqLoraLinear\\n    from hqq.core.quantize import HQQLinear\\n\\n    class HqqLoraLinear(LoRAActivationMixin, _HqqLoraLinear):\\n\\n        def __init__(\\n            self,\\n            *args,\\n            module_key: str,\\n            **kwargs,\\n        ):\\n            super(HqqLoraLinear, self).__init__(module_key)\\n            self.set_activation(args[1], True)\\n            super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n    def dispatch_hqq(target: torch.nn.Module, adapter_name: str, **kwargs):\\n        new_module = None\\n\\n        if isinstance(target, BaseTunerLayer):\\n            target_base_layer = target.get_base_layer()\\n        else:\\n            target_base_layer = target\\n\\n        if is_hqq_available() and isinstance(target_base_layer, HQQLinear):\\n            new_module = HqqLoraLinear(target_base_layer, adapter_name, **kwargs)\\n\\n        return new_module\\n\\n    dispatchers.append(dispatch_hqq)\\n\\n\\ndef dispatch_megatron(\\n    target: torch.nn.Module,\\n    adapter_name: str,\\n    lora_config,\\n    module_key,\\n    **kwargs: Any,\\n) -> Optional[torch.nn.Module]:\\n    new_module = None\\n\\n    if isinstance(target, BaseTunerLayer):\\n        target_base_layer = target.get_base_layer()\\n    else:\\n        target_base_layer = target\\n\\n    if lora_config.megatron_config:\\n        megatron_core = importlib.import_module(lora_config.megatron_core)\\n    else:\\n        megatron_core = None\\n\\n    if megatron_core and isinstance(\\n            target_base_layer,\\n        (megatron_core.tensor_parallel.ColumnParallelLinear, megatron_core.tensor_parallel.RowParallelLinear)):  # noqa\\n        megatron_kwargs = kwargs.copy()\\n        megatron_config = lora_config.megatron_config\\n        if isinstance(megatron_config, dict):\\n            transformer_config_class = megatron_core.transformer.transformer_config.TransformerConfig\\n            megatron_config = transformer_config_class(**lora_config.megatron_config)\\n        megatron_kwargs['megatron_config'] = megatron_config\\n        if megatron_kwargs['fan_in_fan_out']:\\n            warnings.warn('fan_in_fan_out is set to True but the target module is `ColumnParallelLinear` '\\n                          'or `RowParallelLinear`. '\\n                          'Setting fan_in_fan_out to False.')\\n            megatron_kwargs['fan_in_fan_out'] = lora_config.fan_in_fan_out = False\\n        new_module = LoraParallelLinear(\\n            base_layer=target,\\n            adapter_name=adapter_name,\\n            module_key=module_key,\\n            backend=megatron_core.tensor_parallel,\\n            **megatron_kwargs)\\n\\n    return new_module\\n\\n\\ndef dispatch_default(\\n    target: torch.nn.Module,\\n    adapter_name: str,\\n    lora_config: LoraConfig,\\n    module_key: str,\\n    **kwargs,\\n) -> Optional[torch.nn.Module]:\\n    new_module = None\\n\\n    if isinstance(target, BaseTunerLayer):\\n        target_base_layer = target.get_base_layer()\\n    else:\\n        target_base_layer = target\\n\\n    if isinstance(target_base_layer, torch.nn.Embedding):\\n        embedding_kwargs = kwargs.copy()\\n        embedding_kwargs.pop('fan_in_fan_out', None)\\n        embedding_kwargs.update(lora_config.loftq_config)\\n        new_module = Embedding(target, adapter_name, module_key=module_key, **embedding_kwargs)\\n    elif isinstance(target_base_layer, torch.nn.Conv2d):\\n        kwargs.update(lora_config.loftq_config)\\n        new_module = Conv2d(target, adapter_name, module_key=module_key, **kwargs)\\n    elif isinstance(target_base_layer, torch.nn.Linear):\\n        if target_base_layer.__class__.__name__ == 'NonDynamicallyQuantizableLinear':\\n            # Fix issue: https://github.com/modelscope/swift/issues/342\\n            return None\\n        if kwargs['fan_in_fan_out']:\\n            warnings.warn('fan_in_fan_out is set to True but the target module is `torch.nn.Linear`. '\\n                          'Setting fan_in_fan_out to False.')\\n            kwargs['fan_in_fan_out'] = lora_config.fan_in_fan_out = False\\n        kwargs.update(lora_config.loftq_config)\\n        new_module = Linear(target, adapter_name, module_key=module_key, **kwargs)\\n    elif isinstance(target_base_layer, Conv1D):\\n        if not kwargs['fan_in_fan_out']:\\n            warnings.warn('fan_in_fan_out is set to False but the target module is `Conv1D`. '\\n                          'Setting fan_in_fan_out to True.')\\n            kwargs['fan_in_fan_out'] = lora_config.fan_in_fan_out = True\\n        kwargs.update(lora_config.loftq_config)\\n        new_module = Linear(target, adapter_name, is_target_conv_1d_layer=True, module_key=module_key, **kwargs)\\n\\n    return new_module\\n\\n\\ndispatchers.append(dispatch_megatron)\\ndispatchers.append(dispatch_default)\\n\\n\\nclass Embedding(LoRAActivationMixin, _Embedding):\\n\\n    def __init__(\\n        self,\\n        *args,\\n        module_key: str,\\n        **kwargs,\\n    ) -> None:\\n        super(Embedding, self).__init__(module_key)\\n        self.set_activation(args[1], True)\\n        super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n\\nclass Linear(LoRAActivationMixin, _Linear):\\n\\n    def __init__(self, *args, module_key: str, **kwargs):\\n        super(Linear, self).__init__(module_key)\\n        self.set_activation(args[1], True)\\n        super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n\\nclass Conv2d(LoRAActivationMixin, _Conv2d):\\n\\n    def __init__(self, *args, module_key: str, **kwargs):\\n        super(Conv2d, self).__init__(module_key)\\n        self.set_activation(args[1], True)\\n        super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n\\nclass LoraParallelLinear(LoRAActivationMixin, _LoraParallelLinear):\\n\\n    def __init__(self, *args, module_key: str, **kwargs):\\n        super(LoraParallelLinear, self).__init__(module_key)\\n        self.set_activation(args[1], True)\\n        super(ActivationMixin, self).__init__(*args, **kwargs)\\n\\n\\nclass LoraModel(_LoraModel):\\n\\n    prefix: str = 'lora_'\\n\\n    def __init__(self, model, config, adapter_name):\\n        if config is not None:\\n            super().__init__(model, config, adapter_name)\\n        else:\\n            nn.Module.__init__(self)\\n            self.model = model\\n\\n    def _mark_only_adapters_as_trainable(self, model: nn.Module) -> None:\\n        for active_adapter in self.active_adapters:\\n            bias = self.peft_config[active_adapter].bias\\n            if bias == 'none':\\n                continue\\n\\n            if bias == 'all':\\n                for n, p in model.named_parameters():\\n                    if 'bias' in n:\\n                        p.requires_grad = True\\n            elif bias == 'lora_only':\\n                for m in model.modules():\\n                    if isinstance(m, LoraLayer) and hasattr(m, 'bias') and m.bias is not None:\\n                        m.bias.requires_grad = True\\n            else:\\n                raise NotImplementedError(f'Requested bias: {bias}, is not implemented.')\\n\\n    def inject_adapter(self, model: nn.Module, adapter_name: str):\\n        r\\\"\\\"\\\"\\n        Override code:\\n        1. ModulesToSaveWrapper construction method: add module_key=key argument to offload to cpu\\n        \\\"\\\"\\\"\\n        peft_config = self.peft_config[adapter_name]\\n        # Note: If possible, all checks should be performed *at the start of this method*.\\n        # This way, we can raise early if something goes wrong, without leaving the model\\n        # in a bad (half-initialized) state.\\n        self._check_new_adapter_config(peft_config)\\n\\n        is_target_modules_in_base_model = False\\n        key_list = [key for key, _ in model.named_modules()]\\n\\n        _check_for_modules_to_save = getattr(peft_config, 'modules_to_save', None) is not None\\n        _has_modules_to_save = False\\n\\n        model_config = getattr(model, 'config', {'model_type': 'custom'})\\n        if hasattr(model_config, 'to_dict'):\\n            model_config = model_config.to_dict()\\n\\n        peft_config = self._prepare_adapter_config(peft_config, model_config)\\n\\n        from peft.tuners.tuners_utils import _maybe_include_all_linear_layers\\n        try:\\n            from peft.utils.constants import DUMMY_TARGET_MODULES\\n        except ImportError:  # compat with peft==0.11.*\\n            DUMMY_TARGET_MODULES = 'dummy-target-modules'\\n        if getattr(peft_config, 'target_modules', None) == DUMMY_TARGET_MODULES:\\n            # dummy adapter, we allow not matching any module\\n            key_list = []\\n            is_target_modules_in_base_model = True\\n        # update peft_config.target_modules if required\\n        peft_config = _maybe_include_all_linear_layers(peft_config, model)\\n        self._prepare_model(peft_config, model)\\n\\n        for key in key_list:\\n            if '_part_' in key:\\n                # Avoid lora conflict with part tuner\\n                continue\\n            # Check for modules_to_save in case\\n            if _check_for_modules_to_save and any(\\n                    key.endswith(f'{module_to_save}') for module_to_save in peft_config.modules_to_save):\\n                # Optionally set the modules to save\\n                parent, target, target_name = _get_submodules(model, key)\\n\\n                if not isinstance(target, ModulesToSaveWrapper):\\n                    new_module = ModulesToSaveWrapper(target, adapter_name=adapter_name, module_key=key)\\n                    setattr(parent, target_name, new_module)\\n                else:\\n                    target.update(adapter_name)\\n\\n                _has_modules_to_save = True\\n                continue\\n\\n            if not self._check_target_module_exists(peft_config, key):\\n                continue\\n\\n            self.targeted_module_names.append(key)\\n            is_target_modules_in_base_model = True\\n            parent, target, target_name = _get_submodules(model, key)\\n            self._create_and_replace(peft_config, adapter_name, target, target_name, parent, current_key=key)\\n\\n        # Handle X-LoRA case.\\n        if not is_target_modules_in_base_model and hasattr(peft_config, 'target_modules'):\\n            raise ValueError(f'Target modules {peft_config.target_modules} not found in the base model. '\\n                             f'Please check the target modules and try again.')\\n\\n        self._mark_only_adapters_as_trainable(self.model)\\n\\n        if self.peft_config[adapter_name].inference_mode:\\n            for n, p in self.model.named_parameters():\\n                if adapter_name in n:\\n                    p.requires_grad = False\\n\\n        if _has_modules_to_save:\\n            if not hasattr(model, 'modules_to_save'):\\n                model.modules_to_save = set(peft_config.modules_to_save)\\n            else:\\n                model.modules_to_save.update(set(peft_config.modules_to_save))\\n\\n    def _convert_dtype(self, target: nn.Module, lora_dtype: str):\\n        if lora_dtype == 'fp32':\\n            torch_dtype = torch.float32\\n        elif lora_dtype == 'fp16':\\n            torch_dtype = torch.float16\\n        elif lora_dtype == 'bf16':\\n            torch_dtype = torch.bfloat16\\n        else:\\n            torch_dtype = None\\n\\n        if torch_dtype is not None:\\n            if hasattr(target, 'lora_A'):\\n                target.lora_A.to(torch_dtype)\\n                target.lora_B.to(torch_dtype)\\n            if hasattr(target, 'lora_embedding_A'):\\n                target.lora_embedding_A.to(torch_dtype)\\n                target.lora_embedding_B.to(torch_dtype)\\n\\n    def _create_and_replace(\\n        self,\\n        lora_config,\\n        adapter_name,\\n        target,\\n        target_name,\\n        parent,\\n        current_key,\\n        **optional_kwargs,\\n    ):\\n        \\\"\\\"\\\"\\n        Override code:\\n        1. Import bnb from upper code\\n        2. Support dtype converting\\n        3. Support skipping NonDynamicallyQuantizableLinear\\n        4. Add current_key argument to _create_new_module\\n        5. Use Class type defined here\\n        6. Allow new_module being None\\n        \\\"\\\"\\\"\\n        if current_key is None:\\n            raise ValueError(\\\"Current Key shouldn't be `None`\\\")\\n\\n        # Regexp matching - Find key which matches current target_name in patterns provided\\n        pattern_keys = list(chain(lora_config.rank_pattern.keys(), lora_config.alpha_pattern.keys()))\\n        target_name_key = next(filter(lambda key: re.match(rf'.*\\\\.{key}$', current_key), pattern_keys), current_key)\\n        r = lora_config.rank_pattern.get(target_name_key, lora_config.r)\\n        alpha = lora_config.alpha_pattern.get(target_name_key, lora_config.lora_alpha)\\n\\n        kwargs = {\\n            'r': r,\\n            'lora_alpha': alpha,\\n            'lora_dropout': lora_config.lora_dropout,\\n            'fan_in_fan_out': lora_config.fan_in_fan_out,\\n            'init_lora_weights': lora_config.init_lora_weights,\\n            'use_rslora': lora_config.use_rslora,\\n            'use_dora': lora_config.use_dora,\\n            'loaded_in_8bit': getattr(self.model, 'is_loaded_in_8bit', False),\\n            'loaded_in_4bit': getattr(self.model, 'is_loaded_in_4bit', False),\\n        }\\n        # compat with peft==0.11.*\\n        if hasattr(lora_config, 'runtime_config'):\\n            kwargs['ephemeral_gpu_offload'] = lora_config.runtime_config.ephemeral_gpu_offload\\n\\n        quant_methods = ['gptq', 'aqlm', 'awq']\\n        for quant_method in quant_methods:\\n            quantization_config = get_quantization_config(self.model, method=quant_method)\\n            if quantization_config is not None:\\n                kwargs[f'{quant_method}_quantization_config'] = quantization_config\\n\\n        # note: AdaLoraLayer is a subclass of LoraLayer, we need to exclude it\\n        from peft.tuners.adalora import AdaLoraLayer\\n\\n        if isinstance(target, LoraLayer) and not isinstance(target, AdaLoraLayer):\\n            if target.__class__.__name__ == 'NonDynamicallyQuantizableLinear':\\n                # Fix issue: https://github.com/modelscope/swift/issues/342\\n                return\\n            target.update_layer(\\n                adapter_name,\\n                r,\\n                lora_alpha=alpha,\\n                lora_dropout=lora_config.lora_dropout,\\n                init_lora_weights=lora_config.init_lora_weights,\\n                use_rslora=lora_config.use_rslora,\\n                use_dora=lora_config.use_dora,\\n            )\\n            self._convert_dtype(target, lora_config.lora_dtype)\\n            ActivationMixin.mark_all_sub_modules_as_plugin(target)\\n        else:\\n            new_module = self._create_new_module(lora_config, adapter_name, target, current_key=current_key, **kwargs)\\n            if new_module is not None:\\n                ActivationMixin.mark_all_sub_modules_as_plugin(new_module)\\n                if adapter_name not in self.active_adapters:\\n                    # adding an additional adapter: it is not automatically trainable\\n                    new_module.requires_grad_(False)\\n                self._replace_module(parent, target_name, new_module, target)\\n                self._convert_dtype(new_module, lora_config.lora_dtype)\\n\\n    def _replace_module(self, parent, child_name, new_module, child):\\n        setattr(parent, child_name, new_module)\\n        # It's not necessary to set requires_grad here, as that is handled by\\n        # _mark_only_adapters_as_trainable\\n\\n        # child layer wraps the original module, unpack it\\n        if hasattr(child, 'base_layer'):\\n            child = child.base_layer\\n\\n        if not hasattr(new_module, 'base_layer'):\\n            if hasattr(new_module, 'W_q'):  # HQQ\\n                new_module.W_q = child.W_q\\n            else:\\n                new_module.weight = child.weight\\n            if hasattr(child, 'bias'):\\n                new_module.bias = child.bias\\n\\n        if getattr(child, 'state', None) is not None:\\n            if hasattr(new_module, 'base_layer'):\\n                new_module.base_layer.state = child.state\\n            else:\\n                new_module.state = child.state\\n            new_module.to(child.weight.device)\\n\\n        # dispatch to correct device\\n        for name, module in new_module.named_modules():\\n            if (self.prefix in name) or ('ranknum' in name):\\n                weight = (\\n                    child.qweight if hasattr(child, 'qweight') else child.W_q if hasattr(child, 'W_q') else\\n                    child.weight if hasattr(child, 'weight') else next(child.parameters()))\\n                module.to(weight.device)\\n\\n    @staticmethod\\n    def _create_new_module(lora_config, adapter_name, target, **kwargs):\\n        \\\"\\\"\\\"\\n        Override code:\\n        1. Support current_key argument\\n        2. Support MergedLinear\\n        3. Support skipping NonDynamicallyQuantizableLinear(Move to dispatcher)\\n        4. Use Class type defined here(Move to dispatcher)\\n        5. return None instead of raising error when target type not found\\n        \\\"\\\"\\\"\\n        # Collect dispatcher functions to decide what backend to use for the replaced LoRA layer. The order matters,\\n        # because the first match is always used. Therefore, the default layers should be checked last.\\n        current_key = kwargs.pop('current_key')\\n        new_module = None\\n        if lora_config.use_qa_lora:\\n            kwargs['use_qa_lora'] = True\\n            kwargs['group_size'] = lora_config.group_size\\n        if lora_config.use_merged_linear:\\n            bias = kwargs.pop('bias', False)\\n            new_module = MergedLinear(\\n                adapter_name, current_key, target, bias=bias, enable_lora=lora_config.enable_lora, **kwargs)\\n        else:\\n            for dispatcher in dispatchers:\\n                new_module = dispatcher(target, adapter_name, lora_config=lora_config, module_key=current_key, **kwargs)\\n                if new_module is not None:  # first match wins\\n                    break\\n\\n        if new_module is None:\\n            # no module could be matched\\n            logger.debug(\\n                f'Target module {target} is not supported. Currently, only the following modules are supported: '\\n                '`torch.nn.Linear`, `torch.nn.Embedding`, `torch.nn.Conv2d`, `transformers.pytorch_utils.Conv1D`.')\\n            new_module = None\\n\\n        return new_module\\n\\n\\nclass LoRALayer(ActivationMixin):\\n\\n    def __init__(\\n        self,\\n        adapter_name: str,\\n        module_key: str,\\n        r: int,\\n        lora_alpha: int,\\n        lora_dropout: float,\\n        merge_weights: bool,\\n    ):\\n        super().__init__(module_key)\\n        self.adapter_name = adapter_name\\n        self.r = r\\n        self.lora_alpha = lora_alpha\\n        # Optional dropout\\n        if lora_dropout > 0.:\\n            self.lora_dropout = nn.Dropout(p=lora_dropout)\\n        else:\\n            self.lora_dropout = lambda x: x\\n        # Mark the weight as unmerged\\n        self.merged = False\\n        self.merge_weights = merge_weights\\n        if not self._unique_thread:\\n            self.merge_weights = False\\n\\n\\nclass MergedLinear(nn.Linear, LoRALayer):\\n    # LoRA implemented in a dense layer\\n    def __init__(self,\\n                 adapter_name: str,\\n                 module_key: str,\\n                 base_layer: nn.Linear,\\n                 r: int = 0,\\n                 lora_alpha: int = 1,\\n                 lora_dropout: float = 0.,\\n                 enable_lora: List[bool] = [False],\\n                 fan_in_fan_out: bool = False,\\n                 merge_weights: bool = True,\\n                 bias: bool = True,\\n                 device=None,\\n                 dtype=None,\\n                 **kwargs):\\n        nn.Linear.__init__(self, base_layer.in_features, base_layer.out_features, bias=bias, device=device, dtype=dtype)\\n        LoRALayer.__init__(\\n            self,\\n            adapter_name,\\n            module_key,\\n            r=r,\\n            lora_alpha=lora_alpha,\\n            lora_dropout=lora_dropout,\\n            merge_weights=merge_weights)\\n        assert base_layer.out_features % len(enable_lora) == 0, \\\\\\n            'The length of enable_lora must divide out_features'\\n        self.enable_lora = enable_lora\\n        self.fan_in_fan_out = fan_in_fan_out\\n        self.base_layer = base_layer\\n        # Actual trainable parameters\\n        if r > 0 and any(enable_lora):\\n            self.lora_A = nn.Parameter(self.weight.new_zeros((r * sum(enable_lora), base_layer.in_features)))\\n            self.lora_B = nn.Parameter(\\n                self.weight.new_zeros((base_layer.out_features // len(enable_lora) * sum(enable_lora),\\n                                       r)))  # weights for Conv1D with groups=sum(enable_lora)\\n            self.scaling = self.lora_alpha / self.r\\n            # Freezing the pre-trained weight matrix\\n            self.weight.requires_grad = False\\n            # Compute the indices\\n            self.lora_ind = self.weight.new_zeros((base_layer.out_features, ),\\n                                                  dtype=torch.bool).view(len(enable_lora), -1)\\n            self.lora_ind[enable_lora, :] = True\\n            self.lora_ind = self.lora_ind.view(-1)\\n        self.reset_parameters()\\n        self.weight = self.base_layer.weight\\n        if getattr(self.base_layer, 'bias', None) is not None:\\n            self.bias = self.base_layer.bias\\n        if fan_in_fan_out:\\n            self.weight.data = self.weight.data.transpose(0, 1)\\n\\n    def reset_parameters(self):\\n        nn.Linear.reset_parameters(self)\\n        if hasattr(self, 'lora_A'):\\n            # initialize A the same way as the default for nn.Linear and B to zero\\n            nn.init.kaiming_uniform_(self.lora_A, a=math.sqrt(5))\\n            nn.init.zeros_(self.lora_B)\\n\\n    def zero_pad(self, x):\\n        result = x.new_zeros((len(self.lora_ind), *x.shape[1:]))\\n        result[self.lora_ind] = x\\n        return result\\n\\n    def merge_AB(self):\\n\\n        def T(w):\\n            return w.transpose(0, 1) if self.fan_in_fan_out else w\\n\\n        delta_w = F.conv1d(self.lora_A.unsqueeze(0), self.lora_B.unsqueeze(-1), groups=sum(self.enable_lora)).squeeze(0)\\n        return T(self.zero_pad(delta_w))\\n\\n    def merge(self, **kwargs):\\n        if self.merge_weights and not self.merged:\\n            # Merge the weights and mark it\\n            if self.r > 0 and any(self.enable_lora):\\n                self.weight.data += self.merge_AB() * self.scaling\\n\\n    def unmerge(self, **kwargs):\\n        if self.merge_weights and self.merged:\\n            # Make sure that the weights are not merged\\n            if self.r > 0 and any(self.enable_lora):\\n                self.weight.data -= self.merge_AB() * self.scaling\\n            self.merged = False\\n\\n    def forward(self, x: torch.Tensor, **kwargs):\\n\\n        def T(w):\\n            return w.transpose(0, 1) if self.fan_in_fan_out else w\\n\\n        if self.merged or not self.is_activated(self.adapter_name):\\n            return F.linear(x, T(self.weight), bias=self.bias)\\n        else:\\n            result = F.linear(x, T(self.weight), bias=self.bias)\\n            if self.r > 0:\\n                x_dtype = x.dtype\\n                x = x.to(self.lora_A.dtype)\\n                result += self.lora_dropout(x) @ T(self.merge_AB().T) * self.scaling\\n                result = result.to(x_dtype)\\n            return result\\n\\n\\ndef mark_lora_as_trainable(model: nn.Module, adapter_name: str, bias: str = 'none') -> None:\\n    if bias == 'none':\\n        return\\n    elif bias == 'all':\\n        for n, p in model.named_parameters():\\n            if 'bias' in n:\\n                p.requires_grad = True\\n    elif bias == 'lora_only':\\n        for n, m in model.named_modules():\\n            if 'lora_' in n and f'.{adapter_name}' in n and \\\\\\n                    hasattr(m, 'bias') and \\\\\\n                    m.bias is not None:\\n                m.bias.requires_grad = True\\n    else:\\n        raise NotImplementedError\\n\\n\\ndef lora_state_dict(state_dict, adapter_name: str, bias: str = 'none') -> Dict[str, torch.Tensor]:\\n    if bias == 'none':\\n        to_return = {k: state_dict[k] for k in state_dict if 'lora_' in k}\\n    elif bias == 'all':\\n        to_return = {k: state_dict[k] for k in state_dict if 'lora_' in k or 'bias' in k}\\n    elif bias == 'lora_only':\\n        to_return = {}\\n        for k in state_dict:\\n            if 'lora_' in k:\\n                to_return[k] = state_dict[k]\\n                bias_name = k.split('lora_')[0] + 'bias'\\n                if bias_name in state_dict:\\n                    to_return[bias_name] = state_dict[bias_name]\\n    else:\\n        raise NotImplementedError\\n    return {k: v for k, v in to_return.items() if (('lora_' in k and f'.{adapter_name}' in k) or ('bias' in k))}\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport copy\\nimport re\\nimport types\\nfrom collections import OrderedDict\\nfrom dataclasses import dataclass, field\\nfrom functools import partial\\nfrom itertools import repeat\\nfrom typing import List, Union\\n\\nimport torch\\nfrom torch import nn\\n\\nfrom swift.utils.logger import get_logger\\nfrom swift.utils.torch_utils import find_sub_module\\nfrom .utils import ActivationMixin, SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass SideConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the side module.\\n\\n    Side-Tuning only needs to train one side network and\\n    weights the output of pre-trained model and side network.\\n    'Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks'\\n    by Zhang et al.(2019)\\n    See https://arxiv.org/abs/1912.13503\\n\\n    Args:\\n        target_modules: The feedforward module to be replaced, in regex format\\n    \\\"\\\"\\\"\\n\\n    dim: int = field(default=None, metadata={'help': 'The dimension of the hidden states'})\\n\\n    target_modules: str = field(\\n        default=None, metadata={'help': 'The target module to be replaced, in full match format'})\\n\\n    side_module_name: str = field(default='fcn4', metadata={'help': 'The name of the additive side networks'})\\n\\n    source_hidden_pos: Union[str, int] = field(\\n        default=0,\\n        metadata={\\n            'help': 'The position of the hidden state input to the target module, can be int (args) or str (kwargs)'\\n        })\\n\\n    target_hidden_pos: Union[str, int] = field(\\n        default=0,\\n        metadata={\\n            'help': 'The position of the hidden state output from the target module, can be int (args) or str (kwargs)'\\n        })\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.SIDE\\n\\n\\nclass Side(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: SideConfig, adapter_name: str) -> SwiftOutput:\\n        \\\"\\\"\\\"Prepare a model with `SideConfig`\\\"\\\"\\\"\\n        module_keys = [key for key, _ in model.named_modules()]\\n\\n        for module_key in module_keys:\\n            if re.fullmatch(config.target_modules, module_key):  # noqa\\n                tgt_module = model.get_submodule(module_key)\\n                logger.info(f'Matching target module [{module_key}] of type {type(tgt_module)}')\\n                if isinstance(tgt_module, (nn.ModuleList, nn.ModuleDict)):\\n                    raise Exception(\\n                        f'Type of {type(tgt_module)} may not be supported because of its customized forward')\\n\\n                def _forward(self, *args, **kwargs):\\n                    args_main = getattr(self, f'forward_origin_{adapter_name}')(*args, **kwargs)\\n\\n                    if isinstance(config.source_hidden_pos, int):\\n                        x = args[config.source_hidden_pos]\\n                    else:\\n                        x = kwargs[config.source_hidden_pos]\\n\\n                    x_main = args_main[config.target_hidden_pos] \\\\\\n                        if isinstance(args_main, (tuple, list, dict)) else args_main\\n                    out = getattr(self, f'side_{adapter_name}')(x, x_main)\\n                    if isinstance(args_main, (tuple, list, dict)):\\n                        args_main[config.target_hidden_pos] = out\\n                    else:\\n                        args_main = out\\n                    return args_main\\n\\n                if isinstance(tgt_module, nn.Sequential) and not hasattr(tgt_module, 'tgt_module_keys'):\\n                    tgt_module.tgt_module_keys = copy.deepcopy(list(tgt_module._modules.keys()))\\n\\n                    def forward_seq(self, input, *args, **kwargs):\\n                        for idx, module in enumerate(self):\\n                            if idx >= len(tgt_module.tgt_module_keys):\\n                                continue\\n                            input = module(input)\\n                        return input\\n\\n                    setattr(tgt_module, f'forward_origin_{adapter_name}', types.MethodType(forward_seq, tgt_module))\\n                else:\\n                    setattr(tgt_module, f'forward_origin_{adapter_name}', tgt_module.forward)\\n                tgt_module.forward = types.MethodType(_forward, tgt_module)\\n                side_module = SideModule(config.dim, adapter_name, module_key, config.side_module_name)\\n                setattr(tgt_module, f'side_{adapter_name}', side_module)\\n                logger.info(f'Side modules(module_key): {module_key}.side_{adapter_name}')\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            return {key: value for key, value in state_dict.items() if f'side_{adapter_name}' in key}\\n\\n        def mark_trainable_callback(model):\\n            return\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        modules = find_sub_module(module, f'side_{adapter_name}')\\n        for _module in modules:\\n            _module: ActivationMixin\\n            _module: nn.Module\\n            _module.set_activation(adapter_name, activate)\\n            SwiftAdapter.save_memory(_module, adapter_name, _module.module_key, activate, offload)\\n\\n\\nclass SideModule(nn.Module, ActivationMixin):\\n    \\\"\\\"\\\"The implementation of vision side-tuning method.\\n\\n    Side-Tuning only needs to train one side network and\\n    weights the output of pre-trained model and side network.\\n    'Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks'\\n    by Zhang et al.(2019)\\n    See https://arxiv.org/abs/1912.13503\\n\\n    Attributes:\\n        side_module_name: The name of the additive side networks.\\n    \\\"\\\"\\\"\\n\\n    def __init__(self, dim, adapter_name, module_key, side_module_name='fcn4'):\\n        super(SideModule, self).__init__()\\n        super(nn.Module, self).__init__(module_key)\\n        self.adapter_name = adapter_name\\n\\n        side_module_name = side_module_name.lower()\\n        if side_module_name == 'fcn4':\\n            self.side_net = FCN4(out_dims=dim)\\n        elif side_module_name == 'mlp':\\n            self.side_net = Mlp(dim)\\n        elif side_module_name == 'alexnet':\\n            import torchvision\\n            mm = torchvision.models.alexnet(pretrained=True)\\n            self.side_net = nn.Sequential(\\n                OrderedDict([('features', mm.features), ('avgpool', mm.avgpool), ('flatten', nn.Flatten()),\\n                             ('fc', nn.Linear(9216, dim, bias=False))]))\\n        else:\\n            raise ValueError(f'Unsupported side_module_name: {side_module_name}')\\n        self.alpha = nn.Parameter(torch.tensor(0.0))\\n        self.mark_all_sub_modules_as_plugin()\\n\\n    def forward(self, x, x_main):\\n        if not self.is_activated(self.adapter_name):\\n            return x_main\\n        alpha_squashed = torch.sigmoid(self.alpha)\\n        x_side = self.side_net(x)\\n        x_out = alpha_squashed * x_main + (1 - alpha_squashed) * x_side\\n        return x_out\\n\\n\\nclass FCN4(nn.Module):\\n    \\\"\\\"\\\"The implementation of simple FCN4 network for side network.\\n    \\\"\\\"\\\"\\n\\n    def __init__(self, out_dims=-1, **kwargs):\\n        super(FCN4, self).__init__(**kwargs)\\n\\n        self.conv1 = nn.Sequential(\\n            nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1, bias=False, dilation=1), nn.GroupNorm(2, 16),\\n            nn.ReLU())\\n        self.conv2 = nn.Sequential(\\n            nn.Conv2d(16, 16, kernel_size=3, stride=2, padding=0, bias=False, dilation=1), nn.GroupNorm(2, 16),\\n            nn.ReLU())\\n        self.conv3 = nn.Sequential(\\n            nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=0, bias=False, dilation=1), nn.GroupNorm(2, 32),\\n            nn.ReLU())\\n        self.conv4 = nn.Sequential(\\n            nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=0, bias=False, dilation=1), nn.GroupNorm(2, 64),\\n            nn.ReLU())\\n        self.pool = nn.AdaptiveAvgPool2d((1, 1))\\n        if out_dims > 0:\\n            self.fc = nn.Linear(64, out_dims)\\n        else:\\n            self.fc = None\\n\\n    def forward(self, x):\\n        x = self.conv1(x)\\n        x = self.conv2(x)\\n        x = self.conv3(x)\\n        x = self.conv4(x)\\n        x = self.pool(x)\\n        x = x.view(x.size(0), -1)\\n        if self.fc is not None:\\n            x = self.fc(x)\\n        return x\\n\\n\\nclass Mlp(nn.Module):\\n    \\\"\\\"\\\" MLP as used in Vision Transformer.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        in_features,\\n        hidden_features=None,\\n        out_features=None,\\n        act_layer=nn.GELU,\\n        norm_layer=None,\\n        bias=True,\\n        drop=0.,\\n        use_conv=False,\\n    ):\\n        super().__init__()\\n        out_features = out_features or in_features\\n        hidden_features = hidden_features or in_features\\n        bias = tuple(repeat(bias, 2))\\n        drop_probs = tuple(repeat(drop, 2))\\n        linear_layer = partial(nn.Conv2d, kernel_size=1) if use_conv else nn.Linear\\n\\n        self.fc1 = linear_layer(in_features, hidden_features, bias=bias[0])\\n        self.act = act_layer()\\n        self.drop1 = nn.Dropout(drop_probs[0])\\n        self.norm = norm_layer(hidden_features) if norm_layer is not None else nn.Identity()\\n        self.fc2 = linear_layer(hidden_features, out_features, bias=bias[1])\\n        self.drop2 = nn.Dropout(drop_probs[1])\\n\\n    def forward(self, x):\\n        x = self.fc1(x)\\n        x = self.act(x)\\n        x = self.drop1(x)\\n        x = self.norm(x)\\n        x = self.fc2(x)\\n        x = self.drop2(x)\\n        return x\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom dataclasses import dataclass\\nfrom types import MethodType\\nfrom typing import List, Literal, Optional\\n\\nimport json\\nimport torch\\nfrom torch import nn\\n\\nfrom swift import get_logger\\nfrom .utils import SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass ReftConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    Train a model with Reft.\\n    Paper: https://arxiv.org/pdf/2404.03592\\n\\n    Args:\\n        model_type(`Optional[str]`): The model_type to find down_proj/layers.\\n        layer_key(`Optional[str]`): Manually specify the layer key, for example `language_model.layers`.\\n        layers (`Optional[List[int]]`): The layer number to inject.\\n        r(`int`): The rank of Reft.\\n        intervention_type (`Literal['NoreftIntervention', 'LoreftIntervention',\\n                        'ConsreftIntervention', 'LobireftIntervention',\\n                        'DireftIntervention', 'NodireftIntervention']`): The intervention type,\\n                        default LoreftIntervention\\n        args (`Optional[str]`): Other reft_args in json-string format\\n    \\\"\\\"\\\"\\n\\n    model_type: Optional[str] = None\\n    layer_key: Optional[str] = None\\n    layers: Optional[List[int]] = None\\n    r: int = 4\\n    intervention_type: Literal['NoreftIntervention', 'LoreftIntervention', 'ConsreftIntervention',\\n                               'LobireftIntervention', 'DireftIntervention',\\n                               'NodireftIntervention'] = 'LoreftIntervention'\\n    args: Optional[str] = None\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.REFT\\n        if self.args:\\n            self.args = json.loads(self.args)\\n        else:\\n            self.args = {}\\n\\n\\nclass Reft(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: ReftConfig, adapter_name: str):\\n        from swift.llm.utils.utils import is_pyreft_available\\n        if not is_pyreft_available():\\n            raise ImportError('Please install pyreft before using ReFT: '\\n                              '`pip install git+https://github.com/stanfordnlp/pyreft.git`')\\n\\n        import pyreft\\n        from pyreft import ReftModel\\n        from pyreft.interventions import LowRankRotateLayer\\n        from pyreft import (\\n            NoreftIntervention,\\n            LoreftIntervention,\\n            ConsreftIntervention,\\n            LobireftIntervention,\\n            DireftIntervention,\\n            NodireftIntervention,\\n        )\\n\\n        intervention_mapping = {\\n            'NoreftIntervention': NoreftIntervention,\\n            'LoreftIntervention': LoreftIntervention,\\n            'ConsreftIntervention': ConsreftIntervention,\\n            'LobireftIntervention': LobireftIntervention,\\n            'DireftIntervention': DireftIntervention,\\n            'NodireftIntervention': NodireftIntervention,\\n        }\\n\\n        def __getattr__(self, name: str):\\n            try:\\n                return super(ReftModel, self).__getattr__(name)\\n            except AttributeError:\\n                return getattr(self.model, name)\\n\\n        ReftModel.__getattr__ = __getattr__\\n\\n        def forward(self, x):\\n            self.to(x.device)\\n            return self.forward_origin(x)\\n\\n        def forward2(self, base, source=None, subspaces=None):\\n            self.to(base.device)\\n            return self.forward_origin(base, source, subspaces)\\n\\n        if not hasattr(LowRankRotateLayer, 'forward_origin'):\\n            LowRankRotateLayer.forward_origin = LowRankRotateLayer.forward\\n            LowRankRotateLayer.forward = forward\\n            NoreftIntervention.forward_origin = NoreftIntervention.forward\\n            NoreftIntervention.forward = forward2\\n            LoreftIntervention.forward_origin = LoreftIntervention.forward\\n            LoreftIntervention.forward = forward2\\n            ConsreftIntervention.forward_origin = ConsreftIntervention.forward\\n            ConsreftIntervention.forward = forward2\\n            LobireftIntervention.forward_origin = LobireftIntervention.forward\\n            LobireftIntervention.forward = forward2\\n            DireftIntervention.forward_origin = DireftIntervention.forward\\n            DireftIntervention.forward = forward2\\n            NodireftIntervention.forward_origin = NodireftIntervention.forward\\n            NodireftIntervention.forward = forward2\\n\\n        module_list_key = config.layer_key\\n        if module_list_key is None:\\n            model_key_mapping = Reft.get_model_key_mapping(config.model_type, config)\\n            module_list_key = model_key_mapping.module_list\\n        logger.info(f'Applying Reft to module: {module_list_key}')\\n        module_list: nn.ModuleList = model.get_submodule(module_list_key)\\n        representations = []\\n        for idx, layer in enumerate(module_list):\\n            if config.layers and idx not in config.layers:\\n                continue\\n            intervention_config = {\\n                'layer':\\n                idx,\\n                'component':\\n                module_list_key + f'[{idx}].output',\\n                'low_rank_dimension':\\n                config.r,\\n                'intervention':\\n                intervention_mapping[config.intervention_type](\\n                    embed_dim=model.config.hidden_size, low_rank_dimension=config.r, **config.args)\\n            }\\n            representations.append(intervention_config)\\n\\n        reft_config = pyreft.ReftConfig(representations=representations)\\n        reft_model = pyreft.get_reft_model(model, reft_config, set_device=False)\\n        reft_model.reft_config = reft_model.config\\n        reft_model.config = reft_model.model.config\\n\\n        def _pre_forward_hook(module, args, kwargs):\\n            if 'base' in kwargs:\\n                return args, kwargs\\n\\n            if 'input_ids' not in kwargs:\\n                raise ValueError('Input does not contain `input_ids`, maybe the model does not support ReFT.')\\n            # run intervened forward pass\\n            unit_locations = None\\n            if 'intervention_locations' in kwargs:\\n                if kwargs['intervention_locations'].dim() == 3:\\n                    unit_locations = {\\n                        'sources->base': (None, kwargs['intervention_locations'].permute(1, 0, 2).tolist())\\n                    }\\n                else:\\n                    # this is dummy for lora only baseline\\n                    unit_locations = {'sources->base': (None, 0)}\\n            kwargs = {\\n                'base': {\\n                    'input_ids': kwargs['input_ids'],\\n                    'attention_mask': kwargs['attention_mask']\\n                },\\n                'unit_locations': unit_locations,\\n                'labels': kwargs['labels'],\\n                'subspaces': kwargs['subspaces'].permute(1, 0, 2).tolist() if 'subspaces' in kwargs else None\\n            }\\n            return args, kwargs\\n\\n        def _post_forward_hook(module, args, kwargs, outputs):\\n            return outputs[1]\\n\\n        def _generate(self, **kwargs):\\n            # run intervened forward pass\\n            unit_locations = None\\n            if 'intervention_locations' in kwargs:\\n                if kwargs['intervention_locations'].dim() == 3:\\n                    unit_locations = {\\n                        'sources->base': (None, kwargs['intervention_locations'].permute(1, 0, 2).tolist())\\n                    }\\n                else:\\n                    # this is dummy for lora only baseline\\n                    unit_locations = {'sources->base': (None, 0)}\\n\\n            _kwargs = {\\n                'base': {\\n                    'input_ids': kwargs.pop('input_ids'),\\n                    'attention_mask': kwargs.pop('attention_mask')\\n                },\\n                'unit_locations': unit_locations,\\n                'subspaces': kwargs.pop('subspaces').permute(1, 0, 2).tolist() if 'subspaces' in kwargs else None\\n            }\\n            _kwargs = {**_kwargs, **kwargs}\\n            return self.generate_origin(**_kwargs)[1]\\n\\n        reft_model.generate_origin = reft_model.generate\\n        reft_model.generate = MethodType(_generate, reft_model)\\n        reft_model.register_forward_pre_hook(_pre_forward_hook, with_kwargs=True)\\n        reft_model.register_forward_hook(_post_forward_hook, with_kwargs=True)\\n\\n        def save_callback(swift_model, model_dir, adapter_name):\\n            reft_model.save_intervention(save_directory=model_dir, include_model=False)\\n\\n        def mark_trainable_callback(model):\\n            return\\n\\n        def load_callback(swift_model, model_dir, adapter_name):\\n            reft_model.load_intervention(model_dir, include_model=False)\\n\\n        return SwiftOutput(\\n            model=reft_model,\\n            config=config,\\n            mark_trainable_callback=mark_trainable_callback,\\n            save_callback=save_callback,\\n            load_callback=load_callback)\\n\\n    @staticmethod\\n    def has_additional_modules():\\n        return True\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        assert activate, 'ReFT does not support deactivate'\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport re\\nimport types\\nfrom dataclasses import dataclass, field\\nfrom typing import List, Union\\n\\nimport torch\\nfrom torch import nn\\n\\nfrom swift import get_logger\\nfrom swift.utils.torch_utils import find_sub_module\\nfrom .utils import ActivationMixin, SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass PromptConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the prompt module.\\n\\n    Visual prompt tuning (VPT) is proposed to initialize tunable prompt tokens\\n    and prepend to the original tokens in the first layer or multiple layers.\\n    'Visual Prompt Tuning' by Jia et al.(2022)\\n    See https://arxiv.org/abs/2203.12119\\n\\n    Here we apply the VPT to other fields.\\n\\n    Args:\\n        dim(`Union[int, List[int]]`): The dimension of the hidden states, use list if there are up-sample blocks\\n            or down-sample blocks\\n        target_modules(str): The layer module to be replaced, in regex format\\n        embedding_pos(Union[str, int]): The position of the embedding tensor\\n        attention_mask_pos(Union[str, int]): The position of the attention mask\\n        attention_mask_value(Union[float, int, bool]): The value to pad to the attention mask\\n        prompt_length(int): The length of the prompt tokens\\n        attach_front(bool): When set to True, prompt is attached in front of the embedding\\n        extract_embedding(bool): Whether the embedding is extracted at final stage to keep the same dims with inputs\\n    \\\"\\\"\\\"\\n\\n    dim: Union[int, List[int]] = field(default=None, metadata={'help': 'The dimension of the hidden states'})\\n\\n    target_modules: str = field(default=None, metadata={'help': 'The layer module to be replaced, in regex format'})\\n\\n    embedding_pos: Union[str, int] = field(default=None, metadata={'help': 'The position of the embedding tensor'})\\n\\n    attention_mask_pos: Union[str, int] = field(default=None, metadata={'help': 'The position of the attention mask'})\\n\\n    attention_mask_value: Union[float, int, bool] = field(\\n        default=0., metadata={'help': 'The value to pad to the attention mask'})\\n\\n    prompt_length: int = field(default=16, metadata={'help': 'The length of the prompt tokens'})\\n\\n    attach_front: bool = field(\\n        default=True, metadata={'help': 'When set to True, prompt is attached in front of the embedding'})\\n\\n    extract_embedding: bool = field(\\n        default=False,\\n        metadata={'help': 'Whether the embedding is extracted at final stage to keep the same dims with inputs'})\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.PROMPT\\n\\n\\nclass Prompt(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: PromptConfig, adapter_name: str):\\n        module_keys = [key for key, _ in model.named_modules()]\\n        match_module_keys = []\\n        for module_key in module_keys:\\n            if isinstance(config.target_modules, str):\\n                target_module_found = re.fullmatch(config.target_modules, module_key)\\n            else:\\n                target_module_found = any(module_key.endswith(target_key) for target_key in config.target_modules)\\n            if target_module_found:  # noqa\\n                module = model.get_submodule(module_key)\\n\\n                def _forward(self, *args, **kwargs):\\n                    if isinstance(config.embedding_pos, int):\\n                        input_embedding = args[config.embedding_pos]\\n                    else:\\n                        input_embedding = kwargs[config.embedding_pos]\\n\\n                    input_embedding = getattr(self, f'prompt_{adapter_name}').forward(input_embedding)\\n                    if isinstance(config.embedding_pos, int):\\n                        args = type(args)(\\n                            args[0:config.embedding_pos] + (input_embedding, ) + args[config.embedding_pos + 1:])\\n                    else:\\n                        kwargs[config.embedding_pos] = input_embedding\\n\\n                    if config.attention_mask_pos:\\n                        attention_mask = None\\n                        if isinstance(config.attention_mask_pos, int):\\n                            attention_mask = args[config.attention_mask_pos]\\n                        elif isinstance(config.attention_mask_pos, str):\\n                            attention_mask = kwargs[config.attention_mask_pos]\\n\\n                        if attention_mask is not None:\\n                            attention_mask = getattr(self,\\n                                                     f'prompt_{adapter_name}').patch_attention_mask(attention_mask)\\n                        if isinstance(config.attention_mask_pos, int):\\n                            args = type(args)(\\n                                args[0:config.attention_mask_pos] + (attention_mask, )\\n                                + args[config.attention_mask_pos + 1:])\\n                        else:\\n                            kwargs[config.attention_mask_pos] = attention_mask\\n\\n                    forward_output = getattr(self, f'forward_origin_{adapter_name}')(*args, **kwargs)\\n                    if config.extract_embedding:\\n                        forward_output = getattr(self, f'prompt_{adapter_name}').extract(forward_output)\\n\\n                    return forward_output\\n\\n                setattr(module, f'forward_origin_{adapter_name}', module.forward)\\n                module.forward = types.MethodType(_forward, module)\\n                if isinstance(config.dim, list):\\n                    input_dim = config.dim[len(match_module_keys)]\\n                else:\\n                    input_dim = config.dim\\n                prompt_module = PromptModule(input_dim, int(module_key.rsplit('.')[-1]), adapter_name, module_key,\\n                                             config.prompt_length, config.attention_mask_value, config.attach_front)\\n                setattr(module, f'prompt_{adapter_name}', prompt_module)\\n                logger.info(f'Prompt modules(module_key): {module_key}.prompt_{adapter_name}')\\n                match_module_keys.append(module_key)\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            return {key: value for key, value in state_dict.items() if f'prompt_{adapter_name}' in key}\\n\\n        def mark_trainable_callback(model):\\n            return\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        modules = find_sub_module(module, f'prompt_{adapter_name}')\\n        for _module in modules:\\n            _module: ActivationMixin\\n            _module: nn.Module\\n            _module.set_activation(adapter_name, activate)\\n            SwiftAdapter.save_memory(_module, adapter_name, _module.module_key, activate, offload)\\n\\n\\nclass PromptModule(nn.Module, ActivationMixin):\\n    \\\"\\\"\\\"The implementation of vision prompt tuning method.\\n\\n    Visual prompt tuning (VPT) is proposed to initialize tunable prompt tokens\\n    and prepend to the original tokens in the first layer or multiple layers.\\n    'Visual Prompt Tuning' by Jia et al.(2022)\\n    See https://arxiv.org/abs/2203.12119\\n\\n    Attributes:\\n        dim: An integer indicating the embedding dimension.\\n        layer_num: An integer indicating number of layers.\\n        prompt_length: An integer indicating the length of vision prompt tuning.\\n    \\\"\\\"\\\"\\n\\n    def __init__(self, dim, layer_num, adapter_name, module_key, prompt_length=None, mask_values=0., attach_front=True):\\n        super(PromptModule, self).__init__()\\n        super(nn.Module, self).__init__(module_key)\\n        self.dim = dim\\n        self.layer_num = layer_num\\n        self.adapter_name = adapter_name\\n        self.prompt_length = prompt_length\\n        self.mask_values = mask_values\\n        self.attach_front = attach_front\\n        self.prompt_token = nn.Parameter(torch.zeros(1, prompt_length, dim))\\n        nn.init.xavier_uniform_(self.prompt_token)\\n        self.mark_all_sub_modules_as_plugin()\\n\\n    def forward(self, x):\\n        if not self.is_activated(self.adapter_name):\\n            return x\\n        prompt_token = self.prompt_token.expand(x.shape[0], -1, -1).to(x.device, x.dtype)\\n\\n        if self.layer_num == 0:\\n            if self.attach_front:\\n                x = torch.cat((prompt_token, x), dim=1)\\n            else:\\n                x = torch.cat((x, prompt_token), dim=1)\\n        else:\\n            if self.attach_front:\\n                x = torch.cat((prompt_token, x[:, self.prompt_length:, :]), dim=1)\\n            else:\\n                x = torch.cat((x[:, :-self.prompt_length, :], prompt_token), dim=1)\\n        return x\\n\\n    def patch_attention_mask(self, m):\\n        if not self.is_activated(self.adapter_name):\\n            return m\\n        prefix_attention_mask = torch.full((*m.shape[:-1], self.prompt_length), self.mask_values).to(m.device)\\n        if self.attach_front:\\n            return torch.cat((prefix_attention_mask, m), dim=-1)\\n        else:\\n            return torch.cat((m, prefix_attention_mask), dim=-1)\\n\\n    def extract(self, x):\\n        if self.attach_front:\\n            return x[:, self.prompt_length:, :]\\n        else:\\n            return x[:, :-self.prompt_length, :]\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom dataclasses import dataclass, field\\n\\nimport torch\\nfrom torch import nn\\n\\nfrom swift.utils.logger import get_logger\\nfrom .utils import SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass NEFTuneConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the NEFTune module.\\n\\n    NEFTune adds slightly noises to embedding outputs.\\n    See https://arxiv.org/abs/2310.05914\\n\\n    Args:\\n        noise_alpha(`float`): The noise alpha value used for the NEFTune, default 5.0\\n    \\\"\\\"\\\"\\n    noise_alpha: float = field(default=5.0, metadata={'help': 'The noise alpha value used for the NEFTune'})\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.NEFTUNE\\n\\n\\nclass NEFTune(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: NEFTuneConfig, adapter_name: str) -> SwiftOutput:\\n        \\\"\\\"\\\"Prepare a model with `NEFTuneConfig`\\\"\\\"\\\"\\n        for sub_module in model.modules():\\n            if isinstance(sub_module, torch.nn.Embedding):\\n\\n                def neftune_hook(module, args, output):\\n                    if module.training and getattr(module, 'nef_activated'):\\n                        dims = torch.tensor(output.size(-1) * output.size(-2))\\n                        mag_norm = config.noise_alpha / torch.sqrt(dims)\\n                        output = output + torch.zeros_like(output).uniform_(-mag_norm, mag_norm)\\n                    return output\\n\\n                if hasattr(sub_module, 'nef_activated'):\\n                    raise ValueError('NEFTune does not support a second tuner.')\\n\\n                sub_module.register_forward_hook(neftune_hook)\\n                sub_module.nef_activated = True\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            return state_dict\\n\\n        def mark_trainable_callback(model):\\n            return\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        for sub_module in module.modules():\\n            if isinstance(sub_module, torch.nn.Embedding):\\n                sub_module.nef_activated = activate\\n\\n    @staticmethod\\n    def freeze_model():\\n        return False\\n\\n    @staticmethod\\n    def has_additional_modules():\\n        return False\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport inspect\\nimport re\\nimport types\\nfrom dataclasses import dataclass, field\\nfrom typing import List, Union\\n\\nimport torch\\nfrom torch import nn\\nfrom transformers.activations import ACT2CLS\\n\\nfrom swift import get_logger\\nfrom swift.utils.torch_utils import find_sub_module\\nfrom .utils import ActivationMixin, SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass AdapterConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the adapter module.\\n\\n    Adapters project input tokens by an MLP layer.\\n    'Parameter-Efficient Transfer Learning for NLP' by Houlsby et al.(2019)\\n    See http://arxiv.org/abs/1902.00751\\n\\n    Args:\\n        dim(`int`): The dimension of the hidden states\\n        target_modules(`Union[str, List[str]]`): The feedforward module to be replaced.\\n            in regex format if this argument is str, else will match with `end with` if List[str].\\n        hidden_pos(`Union[str, int]`): The position of the hidden state to be passed into the adapter,\\n            can be int (args) or str (kwargs)\\n        method_name(`str`): The method to be replaced, default is `forward`\\n        adapter_length: The length of the adapter length (intermediate length)\\n        act_layer: The activation layer of the adapter\\n    \\\"\\\"\\\"\\n\\n    dim: int = field(default=None, metadata={'help': 'The dimension of the hidden states'})\\n\\n    target_modules: Union[str, List[str]] = field(\\n        default=None,\\n        metadata={\\n            'help':\\n            'The feedforward module to be replaced. in regex format if this argument is str, '\\n            'else will match with `end with` if List[str].'\\n        })\\n\\n    hidden_pos: Union[str, int] = field(\\n        default=None,\\n        metadata={\\n            'help': 'The position of the hidden state to be passed into the adapter, can be int (args) or str (kwargs)'\\n        })\\n\\n    method_name: str = field(default='forward', metadata={'help': 'The method to be replaced, default is `forward`'})\\n\\n    adapter_length: int = field(\\n        default=128, metadata={'help': 'The length of the adapter length (intermediate length)'})\\n\\n    act_layer: str = field(default='gelu', metadata={'help': 'The activation layer of the adapter'})\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.ADAPTER\\n\\n\\nclass Adapter(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: AdapterConfig, adapter_name: str) -> SwiftOutput:\\n        \\\"\\\"\\\"Prepare a model with `AdapterConfig`\\\"\\\"\\\"\\n        module_keys = [key for key, _ in model.named_modules()]\\n\\n        for module_key in module_keys:\\n            if isinstance(config.target_modules, str):\\n                target_module_found = re.fullmatch(config.target_modules, module_key)\\n            else:\\n                target_module_found = any(module_key.endswith(target_key) for target_key in config.target_modules)\\n\\n            if target_module_found:  # noqa\\n                module = model.get_submodule(module_key)\\n\\n                def _forward(self, *args, **kwargs):\\n                    args = getattr(self, f'forward_origin_{adapter_name}')(*args, **kwargs)\\n                    if isinstance(args, (tuple, list, dict)):\\n                        if isinstance(config.hidden_pos, int):\\n                            _type = type(args)\\n                            args = list(args)\\n                            args[config.hidden_pos] = getattr(self, f'adapter_{adapter_name}')(args[config.hidden_pos])\\n                            args = _type(args)\\n                        else:\\n                            args[config.hidden_pos] = getattr(self, f'adapter_{adapter_name}')(args[config.hidden_pos])\\n                    elif isinstance(args, torch.Tensor):\\n                        args = getattr(self, f'adapter_{adapter_name}')(args)\\n                    return args\\n\\n                def _feed_forward_chunk(self, attention_output):\\n                    return _forward(self, attention_output)\\n\\n                # TODO The `config.method_name` method should not be replaced twice.\\n\\n                setattr(module, f'forward_origin_{adapter_name}', getattr(module, config.method_name))\\n                num_args_in_forward_chunk_fn = len(\\n                    inspect.signature(getattr(module, f'forward_origin_{adapter_name}')).parameters)\\n                if config.method_name == 'feed_forward_chunk' and num_args_in_forward_chunk_fn == 1:\\n                    setattr(module, config.method_name, types.MethodType(_feed_forward_chunk, module))\\n                else:\\n                    setattr(module, config.method_name, types.MethodType(_forward, module))\\n                adapter_module = AdapterModule(config.dim, adapter_name, module_key, config.adapter_length,\\n                                               ACT2CLS[config.act_layer])\\n                setattr(module, f'adapter_{adapter_name}', adapter_module)\\n                logger.info(f'Adapter modules(module_key): {module_key}.adapter_{adapter_name}')\\n\\n        def state_dict_callback(state_dict, adapter_name: str):\\n            return {key: value for key, value in state_dict.items() if f'adapter_{adapter_name}' in key}\\n\\n        def mark_trainable_callback(model):\\n            return\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        modules = find_sub_module(module, f'adapter_{adapter_name}')\\n        for _module in modules:\\n            _module: ActivationMixin\\n            _module: nn.Module\\n            _module.set_activation(adapter_name, activate)\\n            SwiftAdapter.save_memory(_module, adapter_name, _module.module_key, activate, offload)\\n\\n\\nclass AdapterModule(nn.Module, ActivationMixin):\\n    \\\"\\\"\\\"The implementation of adapter tuning method.\\n\\n    Adapters project input tokens by an MLP layer.\\n    'Parameter-Efficient Transfer Learning for NLP' by Houlsby et al.(2019)\\n    See http://arxiv.org/abs/1902.00751\\n\\n    Attributes:\\n        dim: An integer indicating the embedding dimension.\\n        adapter_length: An integer indicating the length of adapter tuning.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        dim,\\n        adapter_name,\\n        module_key,\\n        adapter_length=None,\\n        act_layer=nn.GELU,\\n    ):\\n        super(AdapterModule, self).__init__()\\n        super(nn.Module, self).__init__(module_key)\\n        self.dim = dim\\n        self.adapter_name = adapter_name\\n        self.adapter_length = adapter_length\\n        self.linear1 = nn.Linear(dim, adapter_length)\\n        self.act = act_layer()\\n        self.linear2 = nn.Linear(adapter_length, dim)\\n        self.init_weights()\\n        self._prepared = False\\n        self.mark_all_sub_modules_as_plugin()\\n\\n    def init_weights(self):\\n\\n        def _init_weights(m):\\n            if isinstance(m, nn.Linear):\\n                nn.init.xavier_uniform_(m.weight)\\n                nn.init.normal_(m.bias, std=1e-6)\\n\\n        self.apply(_init_weights)\\n\\n    def forward(self, x, identity=None):\\n        if not self.is_activated(self.adapter_name):\\n            return x\\n        if not self._prepared:\\n            self.linear1.to(x.device)\\n            self.act.to(x.device)\\n            self.linear2.to(x.device)\\n            self._prepared = True\\n\\n        x_dtype = x.dtype\\n        x = x.to(self.linear1.weight.dtype)\\n        out = self.linear2(self.act(self.linear1(x)))\\n        if identity is None:\\n            identity = x\\n        identity = identity.to(out.dtype)\\n        out = identity + out\\n        return out.to(x_dtype)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Copyright (c) Microsoft Corporation. All rights reserved.\\n# Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.\\nfrom dataclasses import asdict, dataclass, field\\nfrom functools import reduce\\n\\nimport torch\\nfrom transformers import Trainer\\n\\nfrom .lora_layers import *  # noqa\\nfrom .utils import SwiftAdapter, SwiftConfig, SwiftOutput, set_adapter\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass LoRAConfig(LoraConfig, SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the loRA module.\\n\\n    Args:\\n        use_qa_lora(bool): Use\\n            QA-LoRA:[Quantization-Aware Low-Rank Adaptation of Large Language Models](https://arxiv.org/abs/2309.14717)\\n            instead of LoRA. QA-LoRA only supports AutoGPTQ quantized models.\\n            Deprecated, do not use this argument.\\n        lora_dtype(str): The dtype for all lora modules, supported values are `fp32`, `fp16`, `bf16`.\\n            Default value is `None`, which means follow the dtype of original module's weight.\\n        lorap_lr_ratio(float): The lr_ratio argument for [LoRA+](https://arxiv.org/abs/2402.12354)\\n    \\\"\\\"\\\"\\n\\n    use_qa_lora: bool = field(\\n        default=False, metadata={'help': 'Use [qa-lora](https://github.com/yuhuixu1993/qa-lora) or not'})\\n\\n    use_merged_linear: bool = field(default=False, metadata={'help': 'Use merged Linear'})\\n\\n    enable_lora: List[bool] = field(\\n        default=None, metadata={'help': 'The modules need to be turned on when using the merged linear layer'})\\n\\n    lora_dtype: Optional[str] = field(\\n        default=None, metadata={'help': 'The lora dtype, default None means following the original layer\\\\'s dtype'})\\n\\n    lorap_lr_ratio: float = field(default=2.0**4, metadata={'help': 'The lr ratio of lora_B in lora+'})\\n\\n    lorap_emb_lr: float = field(default=1e-6, metadata={'help': 'The lr for embedding in lora+'})\\n\\n    def __post_init__(self):\\n        super().__post_init__()\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.LORA\\n\\n    def can_be_saved_to_peft(self) -> bool:\\n        if self.use_qa_lora or self.use_merged_linear:\\n            logger.warn('QA-LoRA and MergedLinear cannot be saved to peft format')\\n            return False\\n        return True\\n\\n    def to_peft_config(self) -> LoraConfig:\\n        _dict = asdict(self)\\n        _dict.pop('use_qa_lora', None)\\n        _dict.pop('enable_lora', None)\\n        _dict.pop('lora_dtype', None)\\n        _dict.pop('use_merged_linear', None)\\n        _dict['peft_type'] = _dict['swift_type']\\n        _dict.pop('swift_type', None)\\n        _dict.pop('lr_ratio', None)\\n        _dict.pop('model_key_mapping', None)\\n        return LoraConfig(**_dict)\\n\\n    def save_pretrained(self, save_directory: str, **kwargs) -> None:\\n        super(peft.LoraConfig, self).save_pretrained(save_directory, **kwargs)\\n\\n\\nclass LoRA(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: LoRAConfig, adapter_name: str):\\n        assert not config.use_qa_lora, 'Do not use qa-lora'\\n        if config.use_qa_lora:\\n            auto_gptq_config = get_quantization_config(model, method='gptq')\\n            if auto_gptq_config:\\n                config.group_size = getattr(auto_gptq_config, 'group_size', None)\\n        LoraModel(model, config, adapter_name)\\n\\n        def state_dict_callback(state_dict, adapter_name, cfg=None):\\n            return lora_state_dict(state_dict, adapter_name, cfg.bias if cfg else config.bias)\\n\\n        def mark_trainable_callback(model, cfg=None):\\n            mark_lora_as_trainable(model, adapter_name, cfg.bias if cfg else config.bias)\\n\\n        def optimizer_group_callback(model, **defaults):\\n            if config.lorap_lr_ratio is None:\\n                return None, None\\n\\n            def get_module(name):\\n                parent_idx = 2 if 'lora' in name else 1\\n                module_names = name.split(sep='.')[:-parent_idx]\\n                module = reduce(getattr, module_names, model)\\n                return module\\n\\n            all_params = set()\\n            param_groups = {\\n                'groupA': {},\\n                'groupB': {},\\n                'groupB_no_decay': {},\\n                'embedding': {},\\n            }\\n\\n            decay_parameters = Trainer.get_decay_parameter_names(None, model)\\n            for name, param in model.named_parameters():\\n                if not param.requires_grad:\\n                    continue\\n                module = get_module(name)\\n                if isinstance(module, Embedding):\\n                    param_groups['embedding'][name] = param\\n                elif 'lora_B' in name or param.ndim == 1:\\n                    if name in decay_parameters:\\n                        param_groups['groupB'][name] = param\\n                    else:\\n                        param_groups['groupB_no_decay'][name] = param\\n                else:\\n                    param_groups['groupA'][name] = param\\n                all_params.add(name)\\n\\n            lr = defaults['lr']\\n            weight_decay = defaults.get('weight_decay', 0.0)\\n\\n            param_groups = [\\n                {\\n                    'params': list(param_groups['groupA'].values()),\\n                    'weight_decay': weight_decay,\\n                    'lr': lr,\\n                },\\n                {\\n                    'params': list(param_groups['embedding'].values()),\\n                    'weight_decay': weight_decay,\\n                    'lr': config.lorap_emb_lr,\\n                },\\n                {\\n                    'params': list(param_groups['groupB'].values()),\\n                    'weight_decay': weight_decay,\\n                    'lr': lr * config.lorap_lr_ratio,\\n                },\\n                {\\n                    'params': list(param_groups['groupB_no_decay'].values()),\\n                    'weight_decay': 0.0,\\n                    'lr': lr * config.lorap_lr_ratio,\\n                },\\n            ]\\n            return all_params, param_groups\\n\\n        return SwiftOutput(\\n            config=config,\\n            state_dict_callback=state_dict_callback,\\n            mark_trainable_callback=mark_trainable_callback,\\n            optimizer_group_callback=optimizer_group_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        set_adapter(module, adapter_name, activate, offload)\\n        for sub_module in module.modules():\\n            if isinstance(sub_module, (LoraLayer, LoRALayer)):\\n                sub_module.set_activation(adapter_name, activate)\\n                if hasattr(sub_module, 'save_memory'):\\n                    sub_module.save_memory(adapter_name, activate, offload)\\n\\n    @staticmethod\\n    def unpatch_lora(model, config: LoRAConfig, adapter_name: str):\\n        \\\"\\\"\\\"Unpatch lora modules and merge the weights to original modules.\\n\\n        LoRA constructs an additional layer with low-rank decomposition matrices of the weights in the network.\\n        'LoRA: Low-Rank Adaptation of Large Language Models' by Hu et al.(2021)\\n        See https://arxiv.org/abs/2106.09685\\n\\n        Args:\\n            model(`torch.nn.Module`): The model called with `tune` function.\\n            config(`LoRAConfig`): The `LoRAConfig` to use. Deprecated\\n            adapter_name(`str`): The adapter name\\n        \\\"\\\"\\\"\\n        if not config.use_merged_linear:\\n            if version.parse(peft.__version__) < version.parse('0.6.3'):\\n                logger.info('All adapters will be merged.')\\n                LoraModel(model, None, '').merge_and_unload()\\n            else:\\n                LoraModel(model, None, '').merge_and_unload(adapter_names=[adapter_name])\\n        else:\\n            for name, sub_module in model.named_modules():\\n                if isinstance(sub_module, MergedLinear):\\n                    sub_module.merge()\\n                    parent = model.get_submodule('.'.join(name.split('.')[:-1]))\\n                    target_name = name.split('.')[-1]\\n                    setattr(parent, target_name, sub_module.base_layer)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom copy import deepcopy\\nfrom dataclasses import dataclass, field\\nfrom typing import Optional\\n\\nimport torch\\nfrom torch import nn\\n\\nfrom swift.utils.logger import get_logger\\nfrom swift.utils.module_mapping import MODEL_KEYS_MAPPING, ModelKeys\\nfrom .utils import ActivationMixin, SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass LLaMAProConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the LLaMAPro module.\\n\\n    See https://arxiv.org/abs/2401.02415\\n\\n    Args:\\n        model_type(`str`): LLaMAPro only support parts of the LLM models because of the variables need to be manually\\n            modified.\\n        num_new_blocks(`int`): How many new blocks need to be added\\n        num_groups(`int`): The groups of new blocks are split to. Default equals to `num_new_blocks` which means each\\n            single layer will be inserted into every `num_hidden_layers/num_new_blocks` original layers.\\n    \\\"\\\"\\\"\\n    model_type: str = field(\\n        default=None, metadata={\\n            'choices': list(MODEL_KEYS_MAPPING.keys()),\\n        })\\n\\n    num_new_blocks: int = None\\n\\n    num_groups: Optional[int] = None\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.LLAMAPRO\\n\\n\\nclass LLaMAPro(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: LLaMAProConfig, adapter_name: str) -> SwiftOutput:\\n        \\\"\\\"\\\"Prepare a model with `LLaMAProConfig`\\\"\\\"\\\"\\n        num_hidden_layers = None\\n        if hasattr(model.config, 'num_hidden_layers'):\\n            num_hidden_layers = model.config.num_hidden_layers\\n        elif hasattr(model.config, 'num_layers'):\\n            num_hidden_layers = model.config.num_layers\\n\\n        assert num_hidden_layers is not None, 'Cannot find num of layers config'\\n        assert num_hidden_layers % config.num_new_blocks == 0, f'Model layers {num_hidden_layers} ' \\\\\\n                                                               f'should be divided by {config.num_new_blocks}'\\n        if config.num_groups is None:\\n            config.num_groups = config.num_new_blocks\\n\\n        num_stride = num_hidden_layers // config.num_groups\\n\\n        # We only support decoder only model for now.\\n        module_list = LLaMAPro._find_module_list(config, model)\\n        new_module_list = nn.ModuleList()\\n        new_module_idx = []\\n        for idx, module in enumerate(module_list):\\n            new_module_list.append(module)\\n            if (idx + 1) % num_stride == 0:\\n                new_module = deepcopy(module)\\n                ActivationMixin.mark_all_sub_modules_as_plugin(new_module)\\n                new_module_list.append(new_module)\\n                new_module_idx.append(idx + 1 + len(new_module_idx))\\n\\n        LLaMAPro._update_module_weight(config, new_module_list, new_module_idx)\\n        LLaMAPro._update_module_attr(config, new_module_list)\\n        model.config.num_hidden_layers = len(new_module_list)\\n        LLaMAPro._set_module_list(config, model, new_module_list)\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            model_key_mapping = LLaMAPro.get_model_key_mapping(config.model_type, config)\\n            new_module_list = [model_key_mapping.module_list + f'.{i}' for i in new_module_idx]\\n            return {\\n                key: value\\n                for key, value in state_dict.items() if any([m_part in key for m_part in new_module_list])\\n            }\\n\\n        def mark_trainable_callback(model):\\n            model_key_mapping = LLaMAPro.get_model_key_mapping(config.model_type, config)\\n            new_module_list = [model_key_mapping.module_list + f'.{i}' for i in new_module_idx]\\n            for name, parameter in model.named_parameters():\\n                parameter: nn.Parameter\\n                if any([m_part in name for m_part in new_module_list]):\\n                    parameter.requires_grad = True\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def _update_module_attr(config: LLaMAProConfig, module_list):\\n        model_type = config.model_type\\n        model_key_mapping = LLaMAPro.get_model_key_mapping(model_type, config)\\n        attention = model_key_mapping.attention\\n        attention = attention.split('{}.')[1]\\n        if model_type == 'phi3-small':\\n            raise ValueError('phi3-small does not support llamapro currently')\\n        if model_type in ('llama', 'mistral', 'qwen2', 'yi', 'gemma', 'deepseek', 'openbuddy', 'xverse', 'orion',\\n                          'bluelm', 'ziya', 'skywork', 'deepseek-v2', 'minicpm', 'phi3', 'internlm2'):\\n            for idx, module in enumerate(module_list):\\n                getattr(module, attention).layer_idx = idx\\n        elif model_type in ('chatglm', 'glm4'):\\n            for idx, module in enumerate(module_list):\\n                getattr(module, attention).layer_number = idx\\n        elif model_type in ('phi2', ):\\n            for idx, module in enumerate(module_list):\\n                getattr(module, attention).block_idx = idx\\n        else:\\n            for idx, module in enumerate(module_list):\\n                attrs = [\\n                    attr for attr in dir(getattr(module_list[0], attention))\\n                    if attr in ('layer_idx', 'layer_number', 'block_idx')\\n                ]\\n                assert len(attrs) <= 1\\n                if attrs:\\n                    setattr(getattr(module, attention), attrs[0], idx)\\n                else:\\n                    logger.warn(f'model_type: {model_type} seems has no layer_idx, if you encountered anything wrong,'\\n                                f'please give us a feedback.')\\n\\n    @classmethod\\n    def get_model_key_mapping(cls, model_type, config) -> ModelKeys:\\n        model_key_mapping = SwiftAdapter.get_model_key_mapping(model_type, config)\\n        assert model_key_mapping.o_proj is not None and model_key_mapping.down_proj is not None, \\\\\\n            'LLaMAPro only support models with o_proj and down_proj components.'\\n        return model_key_mapping\\n\\n    @staticmethod\\n    def _update_module_weight(config: LLaMAProConfig, module_list, new_module_idx):\\n        model_key_mapping = LLaMAPro.get_model_key_mapping(config.model_type, config)\\n        o_proj = model_key_mapping.o_proj.split('{}.')[1]\\n        down_proj = model_key_mapping.down_proj.split('{}.')[1]\\n\\n        for idx, module in enumerate(module_list):\\n            if idx not in new_module_idx:\\n                continue\\n            _o_proj: nn.Linear = module.get_submodule(o_proj)\\n            _down_proj: nn.Linear = module.get_submodule(down_proj)\\n            _o_proj.weight.data = torch.zeros_like(_o_proj.weight.data)\\n            _down_proj.weight.data = torch.zeros_like(_down_proj.weight.data)\\n            if hasattr(_o_proj, 'bias') and _o_proj.bias is not None:\\n                _o_proj.bias.data = torch.zeros_like(_o_proj.bias)\\n            if hasattr(_down_proj, 'bias') and _down_proj.bias is not None:\\n                _down_proj.bias.data = torch.zeros_like(_down_proj.bias)\\n\\n    @staticmethod\\n    def _set_module_list(config, module: nn.Module, module_list: nn.ModuleList):\\n        model_key_mapping = LLaMAPro.get_model_key_mapping(config.model_type, config)\\n        idx = model_key_mapping.module_list.rfind('.')\\n        parent = module.get_submodule(model_key_mapping.module_list[:idx])\\n        setattr(parent, model_key_mapping.module_list[idx + 1:], module_list)\\n\\n    @staticmethod\\n    def _find_module_list(config, module: nn.Module) -> nn.ModuleList:\\n        model_key_mapping = LLaMAPro.get_model_key_mapping(config.model_type, config)\\n        return module.get_submodule(model_key_mapping.module_list)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        for sub_module in module.modules():\\n            if isinstance(sub_module, torch.nn.Embedding):\\n                sub_module.nef_activated = activate\\n\\n    @staticmethod\\n    def has_additional_modules():\\n        return True\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import TYPE_CHECKING\\n\\nfrom swift.utils.import_utils import _LazyModule\\n\\nif TYPE_CHECKING:\\n    from .adapter import Adapter, AdapterConfig, AdapterModule\\n    from .base import SwiftModel, Swift\\n    from .lora import LoRA, LoRAConfig\\n    from .mapping import SWIFT_MAPPING, SwiftTuners\\n    from .side import Side, SideConfig, SideModule\\n    from .neftune import NEFTune, NEFTuneConfig\\n    from .longlora.longlora import LongLoRAModelType, LongLoRAConfig, LongLoRA\\n    from .restuning import ResTuning, ResTuningConfig, ResTuningBypassModule\\n    from .reft import Reft, ReftConfig\\n    from .llamapro import LLaMAPro, LLaMAProConfig\\n    from .peft import (AdaLoraConfig, IA3Config, LoftQConfig, LoHaConfig, LoKrConfig, LoraConfig, VeraConfig,\\n                       BOFTConfig, OFTConfig, PeftConfig, PeftModel, PeftModelForCausalLM, PeftModelForSeq2SeqLM,\\n                       PeftModelForSequenceClassification, PeftModelForTokenClassification, PrefixTuningConfig,\\n                       PromptEncoderConfig, PromptLearningConfig, PromptTuningConfig, get_peft_config, get_peft_model,\\n                       get_peft_model_state_dict)\\n    from .prompt import Prompt, PromptConfig, PromptModule\\n    from .scetuning.scetuning import SCETuning, SCETuningConfig\\n    from .utils import SwiftConfig, SwiftOutput\\nelse:\\n    _import_structure = {\\n        'adapter': ['Adapter', 'AdapterConfig', 'AdapterModule'],\\n        'base': ['SwiftModel', 'Swift'],\\n        'lora': ['LoRA', 'LoRAConfig'],\\n        'longlora.longlora': ['LongLoRAModelType', 'LongLoRAConfig', 'LongLoRA'],\\n        'mapping': ['SWIFT_MAPPING', 'SwiftTuners'],\\n        'side': ['Side', 'SideConfig', 'SideModule'],\\n        'reft': ['Reft', 'ReftConfig'],\\n        'llamapro': ['LLaMAPro', 'LLaMAProConfig'],\\n        'neftune': ['NEFTune', 'NEFTuneConfig'],\\n        'restuning': ['ResTuning', 'ResTuningConfig', 'ResTuningBypassModule'],\\n        'peft': [\\n            'AdaLoraConfig', 'IA3Config', 'LoftQConfig', 'LoHaConfig', 'LoKrConfig', 'LoraConfig', 'VeraConfig',\\n            'BOFTConfig', 'OFTConfig', 'PeftConfig', 'PeftModel', 'PeftModelForCausalLM', 'PeftModelForSeq2SeqLM',\\n            'PeftModelForSequenceClassification', 'PeftModelForTokenClassification', 'PrefixTuningConfig',\\n            'PromptEncoderConfig', 'PromptLearningConfig', 'PromptTuningConfig', 'get_peft_config', 'get_peft_model',\\n            'get_peft_model_state_dict'\\n        ],\\n        'prompt': ['Prompt', 'PromptConfig', 'PromptModule'],\\n        'scetuning': ['SCETuning', 'SCETuningConfig'],\\n        'utils': ['SwiftConfig', 'SwiftOutput'],\\n    }\\n\\n    import sys\\n\\n    sys.modules[__name__] = _LazyModule(\\n        __name__,\\n        globals()['__file__'],\\n        _import_structure,\\n        module_spec=__spec__,\\n        extra_objects={},\\n    )\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport re\\nfrom copy import deepcopy\\nfrom dataclasses import dataclass\\nfrom types import MethodType\\nfrom typing import Dict, Optional\\n\\nimport torch\\nfrom torch import nn\\n\\nfrom swift import get_logger\\nfrom .utils import ActivationMixin, SwiftAdapter, SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass PartConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    Freeze the model and train a part of it.\\n\\n    Args:\\n        target_modules(`Optional[str]`): The target modules to be trained in regex format\\n    \\\"\\\"\\\"\\n\\n    target_modules: Optional[str] = None\\n\\n    def __post_init__(self):\\n        from .mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.PART\\n\\n\\nclass Part(SwiftAdapter):\\n\\n    @staticmethod\\n    def target_module_matched(module_key: str, config: PartConfig):\\n        return re.fullmatch(config.target_modules, module_key)\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: PartConfig, adapter_name: str):\\n        name_list = [name for name, _ in model.named_modules(remove_duplicate=False)]\\n        for name in name_list:\\n            module: nn.Module = model.get_submodule(name)\\n            if Part.target_module_matched(name, config) and not getattr(module, 'plugin', False):\\n                if hasattr(module, 'base_layer'):\\n                    module = module.base_layer\\n\\n                def _forward(self, *args, **kwargs):\\n                    child_list = [\\n                        sub_module for name, sub_module in self.named_modules(remove_duplicate=False)\\n                        if '_part_' in name\\n                    ]\\n                    sub_modules = [child for child in child_list if getattr(child, 'activated', False)]\\n                    assert len(sub_modules) <= 1\\n                    if len(sub_modules) == 1:\\n                        return sub_modules[0].forward(*args, **kwargs)\\n                    else:\\n                        return self.forward_origin(*args, **kwargs)\\n\\n                if not hasattr(module, 'forward_origin'):\\n                    module.forward_origin = module.forward\\n                    module.forward = MethodType(_forward, module)\\n\\n                new_module = deepcopy(module)\\n                for attr in dir(new_module):\\n                    if '_part_' in attr:\\n                        delattr(new_module, attr)\\n                new_module.part_name = adapter_name\\n                ActivationMixin.mark_all_sub_modules_as_plugin(new_module)\\n                setattr(module, f'_part_{adapter_name}', new_module)\\n                new_module.requires_grad_(True)\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            new_state_dict = {}\\n            for key, value in state_dict.items():\\n                if f'_part_{adapter_name}.' in key:\\n                    new_key = key.replace(f'_part_{adapter_name}.', '').replace('base_layer.', '')\\n                    new_state_dict[new_key] = value\\n\\n            return new_state_dict\\n\\n        def mark_trainable_callback(model: nn.Module):\\n            pass\\n\\n        def load_state_dict_callback(model: nn.Module, adapter_name: str, state_dict: Dict[str, torch.Tensor]):\\n            new_state_dict = {}\\n            for name, module in model.named_modules(remove_duplicate=False):\\n                module: nn.Module\\n                if Part.target_module_matched(name, config):\\n                    for param_name in state_dict:\\n                        if param_name.startswith(name):\\n                            end = param_name[len(name):]\\n                            if hasattr(module, 'base_layer'):\\n                                new_state_dict[name + f'.base_layer._part_{adapter_name}'\\n                                               + end] = state_dict[param_name]\\n                            else:\\n                                new_state_dict[name + f'._part_{adapter_name}' + end] = state_dict[param_name]\\n            return new_state_dict\\n\\n        return SwiftOutput(\\n            config=config,\\n            state_dict_callback=state_dict_callback,\\n            mark_trainable_callback=mark_trainable_callback,\\n            load_state_dict_callback=load_state_dict_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        name_list = [name for name, _ in module.named_modules(remove_duplicate=False)]\\n        for name in name_list:\\n            sub_module: nn.Module = module.get_submodule(name)\\n            if re.fullmatch(f'.*_part_{adapter_name}$', name):\\n                sub_module.activated = activate\\n                SwiftAdapter.save_memory(sub_module, adapter_name, name, activate, offload)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Copyright 2023-present the HuggingFace Inc. team.\\nimport os\\nimport re\\nimport shutil\\nfrom copy import copy\\nfrom functools import partial\\nfrom inspect import Parameter, Signature, signature\\nfrom types import MethodType\\nfrom typing import Dict, List, Literal, Optional, Union\\n\\nimport json\\nimport torch\\nfrom modelscope import snapshot_download\\nfrom peft.utils import CONFIG_NAME\\nfrom peft.utils.other import SAFETENSORS_WEIGHTS_NAME, WEIGHTS_NAME\\nfrom torch import nn\\nfrom transformers import Trainer\\n\\nfrom swift.utils.constants import DEFAULT_ADAPTER, SWIFT_TYPE_KEY\\nfrom swift.utils.logger import get_logger\\nfrom .mapping import SwiftTuners\\nfrom .peft import PeftConfig, PeftModel, get_peft_model\\nfrom .utils import SwiftConfig, SwiftOutput\\n\\nlogger = get_logger()\\n\\n\\nclass SwiftModel(nn.Module):\\n    \\\"\\\"\\\"The Swift wrapper model.\\n\\n    Args:\\n        model (`Union[nn.Module, 'SwiftModel']`) A module to be tuned by Swift.\\n        config (`Union[SwiftConfig, Dict[str, SwiftConfig]]`) A config or a dict of {adapter_name: SwiftConfig}.\\n            If it's a config class, the adapter_name will be `default`\\n        extra_state_keys (`List[str]`, `optional`) A list of regex to match the extra state keys to be saved.\\n        inference_mode (bool, `optional`): Load model at inference mode, default False.\\n    \\\"\\\"\\\"\\n\\n    EXTRA_STATE_DIR = 'extra_states'\\n\\n    def __init__(self,\\n                 model: Union[nn.Module, 'SwiftModel'],\\n                 config: Union[SwiftConfig, Dict[str, SwiftConfig]],\\n                 extra_state_keys: List[str] = None,\\n                 inference_mode: bool = False,\\n                 **kwargs):\\n        super().__init__()\\n        self.adapters = {}\\n        self.active_adapters = set()\\n        if isinstance(model, SwiftModel):\\n            self.adapters = model.adapters\\n            extra_state_keys = extra_state_keys or []\\n            extra_state_keys.extend(model.extra_state_keys)\\n            self.active_adapters = model.active_adapters\\n            model = model.base_model\\n\\n        self.base_model = model\\n        new_adapters = []\\n        if isinstance(config, SwiftConfig):\\n            if DEFAULT_ADAPTER not in self.adapters:\\n                all_parts = self._deactivate_all_parts()\\n                self.adapters[DEFAULT_ADAPTER] = self._prepare_model(model, config, DEFAULT_ADAPTER)\\n                for part in all_parts:\\n                    self.activate_adapter(part)\\n                new_adapters.append(DEFAULT_ADAPTER)\\n                if self.adapters[DEFAULT_ADAPTER].model is not None:\\n                    self.base_model = self.adapters[DEFAULT_ADAPTER].model\\n            else:\\n                logger.warn(f'Adapter {DEFAULT_ADAPTER} has been patched, skip.')\\n        elif isinstance(config, dict):\\n            assert (all(isinstance(c, SwiftConfig) for c in config.values()))\\n            for adapter_name, _config in config.items():\\n                if adapter_name not in self.adapters:\\n                    all_parts = self._deactivate_all_parts()\\n                    self.adapters[adapter_name] = self._prepare_model(model, _config, adapter_name)\\n                    for part in all_parts:\\n                        self.activate_adapter(part)\\n                    new_adapters.append(adapter_name)\\n                    if self.adapters[adapter_name].model is not None:\\n                        self.base_model = self.adapters[adapter_name].model\\n                else:\\n                    logger.warn(f'Adapter {adapter_name} has been patched, skip.')\\n\\n        self.extra_state_keys = extra_state_keys or []\\n        self.has_additional_modules = any([c.config.has_additional_modules for c in self.adapters.values()])\\n\\n        def forward(self, *args, **kwargs):\\n            return self.base_model(*args, **kwargs)\\n\\n        _parameters = [Parameter('self', Parameter.POSITIONAL_ONLY)]\\n        _parameters += list(signature(self.base_model.forward).parameters.values())\\n        forward.__signature__ = Signature(_parameters)\\n        self.forward = MethodType(forward, self)\\n        for adapter_name in new_adapters:\\n            self.activate_adapter(adapter_name)\\n\\n        if inference_mode:\\n            self.eval()\\n        else:\\n            for key, output in self.adapters.items():\\n                if key in new_adapters:\\n                    output.mark_trainable_callback(model)\\n            if self.extra_state_keys:\\n                for n, p in model.named_parameters():\\n                    if any(re.fullmatch(extra_key, n) for extra_key in self.extra_state_keys):\\n                        p.requires_grad = True\\n\\n    @property\\n    def model(self):\\n        return self.base_model\\n\\n    def _deactivate_all_parts(self):\\n        deactivated = []\\n        for adapter in self.active_adapters:\\n            output = self.adapters[adapter]\\n            if output.config.swift_type == SwiftTuners.PART:\\n                deactivated.append(adapter)\\n                self.deactivate_adapter(adapter)\\n        return deactivated\\n\\n    def load_state_dict(self, state_dict, strict=True, adapter_name: str = None):\\n        if adapter_name is not None:\\n            output: SwiftOutput = self.adapters[adapter_name]\\n            if getattr(output.config, 'modules_to_save', None):\\n                for key, value in copy(state_dict).items():\\n                    for module_name in output.config.modules_to_save:\\n                        if module_name in key:\\n                            state_dict.pop(key)\\n                            key = key.replace(module_name, f'{module_name}.modules_to_save.{adapter_name}')\\n                            break\\n                    state_dict[key] = value\\n\\n            for key, value in copy(state_dict).items():\\n                if key.startswith('base_model.model.'):\\n                    state_dict.pop(key, None)\\n                    key = key[len('base_model.model.'):]\\n                if f'lora_A.{adapter_name}.' not in key and 'lora_A' in key:\\n                    state_dict.pop(key, None)\\n                    key = key.replace('lora_A.', f'lora_A.{adapter_name}.')\\n                if f'lora_B.{adapter_name}.' not in key and 'lora_B' in key:\\n                    state_dict.pop(key, None)\\n                    key = key.replace('lora_B.', f'lora_B.{adapter_name}.')\\n                if f'lora_embedding_A.{adapter_name}.' not in key and 'lora_embedding_A' in key:\\n                    state_dict.pop(key, None)\\n                    key = key.replace('lora_embedding_A.', f'lora_embedding_A.{adapter_name}.')\\n                if f'lora_embedding_B.{adapter_name}.' not in key and 'lora_embedding_B' in key:\\n                    state_dict.pop(key, None)\\n                    key = key.replace('lora_embedding_B.', f'lora_embedding_B.{adapter_name}.')\\n                state_dict[key] = value\\n\\n            if output.load_state_dict_callback:\\n                state_dict = output.load_state_dict_callback(self.base_model, adapter_name, state_dict)\\n\\n        incompatible_keys = self.base_model.load_state_dict(state_dict, False)\\n        if incompatible_keys and len(incompatible_keys[1]) > 0:\\n            logger.error(f'Load state dict with unexpected keys: {incompatible_keys[1]}')\\n\\n    def state_dict(self,\\n                   *args,\\n                   destination=None,\\n                   prefix='',\\n                   keep_vars=False,\\n                   adapter_name: str = None,\\n                   peft_format: bool = False,\\n                   **kwargs):\\n        \\\"\\\"\\\"\\n        Args:\\n            destination (`dict`, `optional`): If provided, the state of module will\\n                be updated into the dict and the same object is returned.\\n                Otherwise, an ``OrderedDict`` will be created and returned.\\n                Default: ``None``.\\n            prefix (`str`, `optional`): a prefix added to parameter and buffer\\n                names to compose the keys in state_dict. Default: ``''``.\\n            keep_vars (`bool`, `optional`): by default the :class:`~torch.Tensor` s\\n                returned in the state dict are detached from autograd. If it's\\n                set to ``True``, detaching will not be performed.\\n                Default: ``False``.\\n            adapter_name (`str`, `optional`): The name of the adapter's parameters to be saved,\\n                `None` input will save all adapters.\\n            peft_format (`bool`, `optional`): Save with peft format (extra `base_model.model.` prefix)\\n            **kwargs:\\n                save_adapter(`bool`): Save adapters or not, default True\\n                save_extra_states(`bool`): Save extra states or not, default True\\n        Returns:\\n            The state dict to be saved.\\n        \\\"\\\"\\\"\\n        state_dict = kwargs.get('state_dict')\\n        if state_dict is None:\\n            state_dict = self.base_model.state_dict(destination=destination, prefix=prefix, keep_vars=keep_vars)\\n        state_dict = {\\n            key[len('base_model.'):] if key.startswith('base_model.') else key: value\\n            for key, value in state_dict.items()\\n        }\\n        if not self.has_additional_modules:\\n            return state_dict\\n\\n        state_dicts = {}\\n        if kwargs.get('save_adapter', True):\\n            for name, output in self.adapters.items():\\n                if (adapter_name == name or adapter_name is None) and output.config.has_additional_modules:  # noqa\\n                    state_dicts.update(output.state_dict_callback(state_dict, name))\\n                    modules_to_save_names = [\\n                        sub_name for sub_name, _ in self.base_model.named_parameters()\\n                        if f'modules_to_save.{name}' in sub_name\\n                    ]\\n                    for module_name in modules_to_save_names:\\n                        if f'modules_to_save.{name}' in module_name:\\n                            state_dicts[module_name.replace(f'modules_to_save.{name}.', '')] = state_dict[module_name]\\n        if kwargs.get('save_extra_states', True):\\n            state_dicts.update({\\n                k: v\\n                for k, v in state_dict.items() if any(\\n                    re.fullmatch(extra_key, k) for extra_key in self.extra_state_keys)\\n            })\\n        if peft_format:\\n            new_state_dict = {}\\n            for key, value in state_dicts.items():\\n                if not key.startswith('base_model.model.'):\\n                    key = 'base_model.model.' + key\\n                key = key.replace(f'lora_A.{adapter_name}.', 'lora_A.')\\n                key = key.replace(f'lora_B.{adapter_name}.', 'lora_B.')\\n                key = key.replace(f'lora_embedding_A.{adapter_name}.', 'lora_embedding_A.')\\n                key = key.replace(f'lora_embedding_B.{adapter_name}.', 'lora_embedding_B.')\\n                new_state_dict[key] = value\\n            state_dicts = new_state_dict\\n        return state_dicts\\n\\n    def __getattr__(self, name: str):\\n        \\\"\\\"\\\"Forward missing attributes to the wrapped module.\\\"\\\"\\\"\\n        try:\\n            return super().__getattr__(name)  # defer to nn.Module's logic\\n        except AttributeError:\\n            return getattr(self.base_model, name)\\n\\n    @staticmethod\\n    def load_state_file(path, device: Optional[str] = None):\\n        \\\"\\\"\\\"Load a state dict file by the input path.\\n\\n        Args:\\n            path: The local dir to load the state file.\\n\\n        Returns:\\n            The state dict.\\n        \\\"\\\"\\\"\\n        if device is None:\\n            device = 'cuda' if torch.cuda.is_available() else 'cpu'\\n        if os.path.exists(os.path.join(path, SAFETENSORS_WEIGHTS_NAME)):\\n            filename = os.path.join(path, SAFETENSORS_WEIGHTS_NAME)\\n            from safetensors.torch import load_file as safe_load_file\\n            return safe_load_file(filename, device=device)\\n        elif os.path.exists(os.path.join(path, WEIGHTS_NAME)):\\n            filename = os.path.join(path, WEIGHTS_NAME)\\n            return torch.load(filename, map_location=device)\\n        return None\\n\\n    def create_optimizer_param_groups(self, **defaults):\\n        all_param_names = set()\\n        param_groups = []\\n        for output in self.adapters.values():\\n            if output.optimizer_group_callback:\\n                param_names, param_group = output.optimizer_group_callback(self.model, **defaults)\\n                if param_names and all_param_names & param_names:\\n                    raise ValueError('Cannot set one parameter to different param groups')\\n                if param_names and param_group:\\n                    all_param_names.update(param_names)\\n                    param_groups.extend(param_group)\\n\\n        decay_parameters = Trainer.get_decay_parameter_names(None, self.model)\\n        param_groups.extend([\\n            {\\n                'params': [\\n                    p for n, p in self.model.named_parameters()\\n                    if (n in decay_parameters and n not in all_param_names and p.requires_grad)\\n                ],\\n                'weight_decay':\\n                defaults['weight_decay'],\\n            },\\n            {\\n                'params': [\\n                    p for n, p in self.model.named_parameters()\\n                    if (n not in decay_parameters and n not in all_param_names and p.requires_grad)\\n                ],\\n                'weight_decay':\\n                0.0,\\n            },\\n        ])\\n\\n        return param_groups\\n\\n    @classmethod\\n    def from_pretrained(cls,\\n                        model: Union[nn.Module, 'SwiftModel'],\\n                        model_id: str = None,\\n                        adapter_name: Union[str, List[str], Dict[str, str]] = None,\\n                        inference_mode: bool = False,\\n                        revision: str = None,\\n                        **kwargs):\\n        \\\"\\\"\\\"Load a set of tuners and corresponding weights by a model_id.\\n\\n        Args:\\n            model (`Union[torch.nn.Module, 'SwiftModel']`): The model to be tuned,\\n                if the model is already a `SwiftModel` it will be un-wrapped and re-wrapped..\\n            model_id (`str`): The model_id or a local model dir of tuners to use to tune the model.\\n            adapter_name (`Union[str, List[str], Dict[str, str]]`): The adapter_names saved in the model repo to load.\\n                Default `None`, means load all tuners saved in the model_id\\n            inference_mode (`bool`): Use in the inference mode or not.\\n            revision (`str`): The model revision to use.\\n            **kwargs:\\n                extra_state_keys (`List[str]`, `optional`) A list of regex to match the extra state keys to be saved.\\n                Other parameters will be passed to the device_map.\\n        Returns:\\n            The `SwiftModel` instance.\\n        \\\"\\\"\\\"\\n        adapters = {}\\n        model_dir = model_id\\n        if not os.path.exists(model_dir):\\n            model_dir = snapshot_download(model_dir, revision=revision)\\n        if os.path.isfile(model_dir):\\n            raise ValueError(f'Please pass in a local dir or a model id, not a local file: {model_dir}')\\n        extra_state_keys = kwargs.pop('extra_state_keys', None)\\n        if extra_state_keys is None and os.path.isfile(os.path.join(model_dir, cls.EXTRA_STATE_DIR, CONFIG_NAME)):\\n            with open(os.path.join(model_dir, cls.EXTRA_STATE_DIR, CONFIG_NAME), 'r') as file:\\n                _json = json.load(file)\\n                extra_state_keys = _json.get('extra_state_keys')\\n        if adapter_name is None:\\n            adapter_name = [\\n                sub_dir for sub_dir in os.listdir(model_dir)\\n                if os.path.isfile(os.path.join(model_dir, sub_dir, CONFIG_NAME)) and sub_dir != cls.EXTRA_STATE_DIR\\n            ]\\n        for _name in adapter_name if isinstance(adapter_name,\\n                                                list) else [adapter_name] \\\\\\n                if isinstance(adapter_name, str) else adapter_name.keys():\\n            sub_folder = os.path.join(model_dir, _name)\\n            config_file = os.path.join(sub_folder, CONFIG_NAME)\\n\\n            if not os.path.isfile(config_file):\\n                logger.warning(f'{_name} is not a valid tuner')\\n                continue\\n\\n            with open(config_file, 'r') as file:\\n                json_object = json.load(file)\\n\\n            if SWIFT_TYPE_KEY not in json_object:\\n                raise ValueError('Mixed using with peft is not allowed now.')\\n            else:\\n                key = _name if not isinstance(adapter_name, dict) else adapter_name[_name]\\n                adapters[key] = SwiftConfig.from_pretrained(sub_folder)\\n\\n        self = SwiftModel(model, adapters, extra_state_keys, inference_mode, **kwargs)\\n        for _name in adapter_name if isinstance(adapter_name,\\n                                                list) else [adapter_name] \\\\\\n                if isinstance(adapter_name, str) else adapter_name.keys():\\n            _adapter = _name if not isinstance(adapter_name, dict) else adapter_name[_name]\\n            output: SwiftOutput = self.adapters[_adapter]\\n            sub_folder = os.path.join(model_dir, _name)\\n            if output.load_callback:\\n                output.load_callback(self, sub_folder, _adapter)\\n                continue\\n            state_dict = cls.load_state_file(sub_folder)\\n            if state_dict is not None:\\n                model_is_qlora = len([\\n                    k for k in self.state_dict().keys()\\n                    if k.endswith(f'.lora_A.{_adapter}.weight') or k.endswith(f'.lora_B.{_adapter}.weight')\\n                ])\\n                if not model_is_qlora:\\n                    # model is lora, state_dict: qlora->lora\\n                    state_dict = {\\n                        k[:-len(f'.{_name}.weight') if k.endswith(f'.lora_A.{_name}.weight') or k.\\n                          endswith(f'.lora_B.{_name}.weight') else None]: v\\n                        for k, v in state_dict.items()\\n                    }\\n                if any(['loramodule' in key for key in state_dict]):\\n                    # Compatible with old checkpoints before ms-swift:1.5.0\\n                    state_dict = {\\n                        key.replace(f'loramodule_{_name}.lora_A', 'lora_A') if f'loramodule_{_name}.lora_A.{_name}'\\n                        in key else key.replace(f'loramodule_{_name}.lora_A', f'lora_A.{_name}.weight'): value\\n                        for key, value in state_dict.items()\\n                    }\\n                    state_dict = {\\n                        key.replace(f'loramodule_{_name}.lora_B', 'lora_B') if f'loramodule_{_name}.lora_B.{_name}'\\n                        in key else key.replace(f'loramodule_{_name}.lora_B', f'lora_B.{_name}.weight'): value\\n                        for key, value in state_dict.items()\\n                    }\\n                if isinstance(adapter_name, dict):\\n                    # TODO this logic is fragile! replace `_name` may cause other parts replaced\\n                    state_dict = {key.replace(_name, adapter_name[_name]): value for key, value in state_dict.items()}\\n                self.load_state_dict(state_dict, adapter_name=_adapter)\\n        state_dict = cls.load_state_file(os.path.join(model_dir, self.EXTRA_STATE_DIR))\\n        if state_dict is not None:\\n            self.load_state_dict(state_dict)\\n        return self\\n\\n    @classmethod\\n    def _prepare_model(\\n        cls,\\n        model: nn.Module,\\n        config: SwiftConfig,\\n        adapter_name: str,\\n    ):\\n        assert (hasattr(config, SWIFT_TYPE_KEY))\\n        from .mapping import SWIFT_MAPPING\\n\\n        adatper_cls = SWIFT_MAPPING[config.swift_type][1]\\n        if adatper_cls.has_additional_modules() and not getattr(model, 'model_frozen', False):\\n            for _, p in model.named_parameters():\\n                p.requires_grad = False\\n            model.model_frozen = True\\n        config.has_additional_modules = adatper_cls.has_additional_modules()\\n        return adatper_cls.prepare_model(model, config, adapter_name)\\n\\n    def create_or_update_model_card(self, output_dir: str):\\n        \\\"\\\"\\\"\\n        Updates or create the model card.\\n        \\\"\\\"\\\"\\n        if not os.path.exists(os.path.join(output_dir, 'README.md')):\\n            lines = []\\n        else:\\n            with open(os.path.join(output_dir, 'README.md'), 'r') as f:\\n                lines = f.readlines()\\n\\n        quantization_config = None\\n        if hasattr(self.base_model, 'config') and hasattr(self.base_model.config, 'quantization_config'):\\n            if hasattr(self.base_model.config.quantization_config, 'to_dict'):\\n                quantization_config = self.base_model.config.quantization_config.to_dict()\\n        training_config_text = ''\\n        # Adds quantization information if it was used\\n        if quantization_config is not None:\\n            training_config_text += '\\\\nThe following `bitsandbytes` quantization config was used during training:\\\\n'\\n            training_config_text += '\\\\n'.join([f'- {name}: {value}' for name, value in quantization_config.items()])\\n            training_config_text += '\\\\n'\\n\\n        training_procedure_heading = '## Training procedure\\\\n'\\n        if training_procedure_heading in lines:\\n            lines.insert(lines.index(training_procedure_heading) + 2, training_config_text)\\n        else:\\n            lines.append(f'{training_procedure_heading}\\\\n{training_config_text}')\\n\\n        framework_block_heading = '### Framework versions\\\\n'\\n        from swift.version import __version__\\n        if framework_block_heading in lines:\\n            lines.insert(lines.index(framework_block_heading) + 2, f'- SWIFT {__version__}\\\\n')\\n        else:\\n            lines.append(f'{framework_block_heading}\\\\n\\\\n- SWIFT {__version__}\\\\n')\\n\\n        base_model_heading = '### Base model information\\\\n'\\n        lines.append(f'{base_model_heading}\\\\n\\\\n- BaseModel Class {self.base_model.__class__.__name__}\\\\n')\\n\\n        # write the lines back to README.md\\n        with open(os.path.join(output_dir, 'README.md'), 'w') as f:\\n            f.writelines(lines)\\n\\n    def add_weighted_adapter(\\n        self,\\n        adapters,\\n        weights,\\n        adapter_name,\\n        combination_type='svd',\\n        svd_rank=None,\\n        svd_clamp=None,\\n        svd_full_matrices=True,\\n        svd_driver=None,\\n        density=None,\\n        majority_sign_method: Literal['total', 'frequency'] = 'total',\\n    ):\\n        \\\"\\\"\\\"\\n        This method adds a new adapter by merging the given adapters with the given weights.\\n\\n        When using the `cat` combination_type you should be aware that rank of the resulting adapter will be equal to\\n        the sum of all adapters ranks. So it's possible that the mixed adapter may become too big and result in OOM\\n        errors.\\n\\n        Args:\\n            adapters (`list`):\\n                List of adapter names to be merged.\\n            weights (`list`):\\n                List of weights for each adapter.\\n            adapter_name (`str`):\\n                Name of the new adapter.\\n            combination_type (`str`):\\n                The merging type can be one of [`svd`, `linear`, `cat`, `ties`, `ties_svd`, `dare_ties`, `dare_linear`,\\n                `dare_ties_svd`, `dare_linear_svd`, `magnitude_prune`, `magnitude_prune_svd`]. When using the `cat`\\n                combination_type, the rank of the resulting adapter is equal to the sum of all adapters ranks (the\\n                mixed adapter may be too big and result in OOM errors).\\n            svd_rank (`int`, *optional*):\\n                Rank of output adapter for svd. If None provided, will use max rank of merging adapters.\\n            svd_clamp (`float`, *optional*):\\n                A quantile threshold for clamping SVD decomposition output. If None is provided, do not perform\\n                clamping. Defaults to None.\\n            svd_full_matrices (`bool`, *optional*):\\n                Controls whether to compute the full or reduced SVD, and consequently, the shape of the returned\\n                tensors U and Vh. Defaults to True.\\n            svd_driver (`str`, *optional*):\\n                Name of the cuSOLVER method to be used. This keyword argument only works when merging on CUDA. Can be\\n                one of [None, `gesvd`, `gesvdj`, `gesvda`]. For more info please refer to `torch.linalg.svd`\\n                documentation. Defaults to None.\\n            density (`float`, *optional*):\\n                Value between 0 and 1. 0 means all values are pruned and 1 means no values are pruned. Should be used\\n                with [`ties`, `ties_svd`, `dare_ties`, `dare_linear`, `dare_ties_svd`, `dare_linear_svd`,\\n                `magnintude_prune`, `magnitude_prune_svd`]\\n            majority_sign_method (`str`):\\n                The method, should be one of [\\\"total\\\", \\\"frequency\\\"], to use to get the magnitude of the sign values.\\n                Should be used with [`ties`, `ties_svd`, `dare_ties`, `dare_ties_svd`]\\n        \\\"\\\"\\\"\\n        from swift.tuners.lora import LoraModel\\n        lora_model = LoraModel(self.model, None, '')\\n        lora_model.peft_config = {key: value.config for key, value in self.adapters.items()}\\n        from peft.tuners.lora import LoraLayer\\n        lora_model.targeted_module_names = [\\n            key for key, value in self.model.named_modules() if isinstance(value, LoraLayer)\\n        ]\\n        lora_model.active_adapter = self.active_adapters\\n        lora_model.add_weighted_adapter(\\n            adapters=adapters,\\n            weights=weights,\\n            adapter_name=adapter_name,\\n            combination_type=combination_type,\\n            svd_rank=svd_rank,\\n            svd_clamp=svd_clamp,\\n            svd_full_matrices=svd_full_matrices,\\n            svd_driver=svd_driver,\\n            density=density,\\n            majority_sign_method=majority_sign_method,\\n        )\\n\\n        def state_dict_callback(state_dict, adapter_name, cfg):\\n            from swift.tuners.lora_layers import lora_state_dict\\n            return lora_state_dict(state_dict, adapter_name, cfg.bias)\\n\\n        def mark_trainable_callback(model, cfg):\\n            from swift.tuners.lora_layers import mark_lora_as_trainable\\n            mark_lora_as_trainable(model, adapter_name, cfg.bias)\\n\\n        cfg = lora_model.peft_config[adapter_name]\\n        cfg.has_additional_modules = True\\n        self.adapters[adapter_name] = SwiftOutput(\\n            config=cfg,\\n            state_dict_callback=partial(state_dict_callback, cfg=cfg),\\n            mark_trainable_callback=partial(mark_trainable_callback, cfg=cfg),\\n            optimizer_group_callback=None,\\n        )\\n\\n        self.set_active_adapters(adapter_name)\\n\\n    def save_pretrained(self,\\n                        save_directory: str,\\n                        safe_serialization: bool = False,\\n                        adapter_name: Union[str, List[str]] = None,\\n                        **kwargs):\\n        \\\"\\\"\\\"Save the adapters to a local directory.\\n\\n        Args:\\n            save_directory (`str`): The directory to use.\\n            safe_serialization (`bool`): Use safe tensors to save the weights, default False.\\n            adapter_name(`Union[str, List[str]]`): The adapters to be saved, default is `None` to save all.\\n        \\\"\\\"\\\"\\n        peft_format = kwargs.pop('peft_format', False)\\n        if os.path.isfile(save_directory):\\n            raise ValueError(f'Provided path ({save_directory}) should be a directory, not a file')\\n        os.makedirs(save_directory, exist_ok=True)\\n        if not self.has_additional_modules:\\n            if hasattr(self.base_model, 'save_pretrained'):\\n                self.base_model.save_pretrained(save_directory, safe_serialization=safe_serialization)\\n            else:\\n                self._save_state_dict(self.base_model.state_dict(), save_directory, safe_serialization)\\n                self.create_or_update_model_card(save_directory)\\n        else:\\n            self.create_or_update_model_card(save_directory)\\n\\n        adapter_names = adapter_name if isinstance(adapter_name, list) or adapter_name is None else [adapter_name]\\n\\n        state_dict_kwargs = {}\\n        state_dict = kwargs.get('state_dict')\\n        if state_dict is not None:\\n            state_dict_kwargs['state_dict'] = kwargs['state_dict']\\n        for adapter_name, output in self.adapters.items():\\n            if adapter_names is not None and adapter_name not in adapter_names:\\n                continue\\n\\n            save_to_peft = peft_format and output.config.swift_type == SwiftTuners.LORA\\n            save_to_peft = save_to_peft and output.config.can_be_saved_to_peft()\\n            if peft_format and not save_to_peft:\\n                logger.error('You are using additional lora parameters, which is not compatible with peft,'\\n                             'which is unable to save to peft format.')\\n            output_dir = os.path.join(save_directory,\\n                                      adapter_name) if adapter_name != 'default' or not save_to_peft else save_directory\\n\\n            if save_to_peft:\\n                config = output.config.to_peft_config()\\n                config.save_pretrained(output_dir)\\n            else:\\n                output.config.save_pretrained(output_dir)\\n\\n            if output.save_callback:\\n                output.save_callback(self, output_dir, adapter_name)\\n                continue\\n\\n            # save only the trainable weights\\n            output_state_dict = self.state_dict(\\n                adapter_name=adapter_name, save_extra_states=False, peft_format=save_to_peft, **state_dict_kwargs)\\n            os.makedirs(output_dir, exist_ok=True)\\n            if output_state_dict and output.config.has_additional_modules:\\n                self._save_state_dict(output_state_dict, output_dir, safe_serialization)\\n\\n        output_state_dict = self.state_dict(save_extra_states=True, save_adapter=False, **state_dict_kwargs)\\n        if len(output_state_dict) > 0:\\n            if self.has_additional_modules:\\n                os.makedirs(os.path.join(save_directory, self.EXTRA_STATE_DIR), exist_ok=True)\\n                self._save_state_dict(output_state_dict, os.path.join(save_directory, self.EXTRA_STATE_DIR),\\n                                      safe_serialization)\\n                with open(os.path.join(save_directory, self.EXTRA_STATE_DIR, CONFIG_NAME), 'w') as file:\\n                    json.dump({'extra_state_keys': self.extra_state_keys}, file)\\n            else:\\n                logger.error('Full parameter training, save_extra_states will be ignored')\\n\\n        if not os.path.exists(os.path.join(save_directory, 'configuration.json')):\\n            with open(os.path.join(save_directory, 'configuration.json'), 'w') as f:\\n                f.write('{}')\\n\\n    @staticmethod\\n    def _save_state_dict(output_state_dict, save_directory, safe_serialization):\\n        if safe_serialization:\\n            from safetensors.torch import save_file as safe_save_file\\n            safe_save_file(\\n                output_state_dict, os.path.join(save_directory, SAFETENSORS_WEIGHTS_NAME), metadata={'format': 'pt'})\\n        else:\\n            torch.save(output_state_dict, os.path.join(save_directory, WEIGHTS_NAME))\\n\\n    def set_active_adapters(self, adapter_names: Union[List[str], str], offload: str = None):\\n        \\\"\\\"\\\"Set activated adapters\\n\\n        Args:\\n            adapter_names(`Union[List[str], str]`): The adapters needed to be activated\\n            offload(`str`): Whether to offload the deactivated ones to `cpu` or `meta` device\\n        \\\"\\\"\\\"\\n        if not adapter_names:\\n            adapter_names = []\\n\\n        if isinstance(adapter_names, str):\\n            adapter_names = [adapter_names]\\n\\n        adapter_names = set(adapter_names)\\n        for adapter_name in (adapter_names & set(self.adapters.keys())):\\n            self.activate_adapter(adapter_name)\\n\\n        for adapter_name in (set(self.adapters.keys()) - adapter_names):\\n            self.deactivate_adapter(adapter_name, offload)\\n\\n        self.active_adapters = (adapter_names & set(self.adapters.keys()))\\n\\n    def activate_adapter(self, adapter_name: str):\\n        \\\"\\\"\\\"Activate one adapter\\n\\n        Args:\\n            adapter_name(`str`): The adapter needed to be activated\\n        \\\"\\\"\\\"\\n        if adapter_name not in self.adapters:\\n            logger.warning(f'{adapter_name} not in adapters: {self.adapters.keys()}')\\n            return\\n\\n        from .mapping import SWIFT_MAPPING\\n        SWIFT_MAPPING[self.adapters[adapter_name].config.swift_type][1]\\\\\\n            .activate_adapter(self.base_model, adapter_name, True)\\n        self.active_adapters = self.active_adapters | {adapter_name}\\n\\n    def deactivate_adapter(self, adapter_name: str, offload: str = None):\\n        \\\"\\\"\\\"Deactivate one adapter\\n\\n        Args:\\n            adapter_name(`str`): The adapter needed to be activated\\n            offload(`str`): Whether to offload to `cpu` or `meta` device\\n        \\\"\\\"\\\"\\n        if adapter_name not in self.adapters:\\n            logger.warning(f'{adapter_name} not in adapters: {self.adapters.keys()}')\\n            return\\n\\n        from .mapping import SWIFT_MAPPING\\n        SWIFT_MAPPING[self.adapters[adapter_name].config.swift_type][1]\\\\\\n            .activate_adapter(self.base_model, adapter_name, False, offload=offload)\\n        self.active_adapters = self.active_adapters - {adapter_name}\\n\\n    def get_trainable_parameters(self):\\n        \\\"\\\"\\\"\\n        Get the content of trainable parameters in the model.\\n        \\\"\\\"\\\"\\n        trainable_params = 0\\n        all_param = 0\\n        for _, param in self.base_model.named_parameters():\\n            num_params = param.numel()\\n            # if using DS Zero 3 and the weights are initialized empty\\n            if num_params == 0 and hasattr(param, 'ds_numel'):\\n                num_params = param.ds_numel\\n\\n            all_param += num_params\\n            if param.requires_grad:\\n                trainable_params += num_params\\n        return f'trainable params: {trainable_params:,d} || all params: {all_param:,d} ' \\\\\\n               f'|| trainable%: {100 * trainable_params / all_param:.4f}' \\\\\\n               '|| cuda memory: ' \\\\\\n               f'{sum([torch.cuda.memory_allocated(i) for i in range(torch.cuda.device_count())])/1024/1024/1024:.2f}' \\\\\\n               'GiB.'\\n\\n\\nclass Swift:\\n    \\\"\\\"\\\"The Wrapper to use both Peft and Swift tuners.\\\"\\\"\\\"\\n\\n    @staticmethod\\n    def prepare_model(model: Union[nn.Module, SwiftModel], config: Union[SwiftConfig, PeftConfig,\\n                                                                         Dict[str, SwiftConfig]], **kwargs):\\n        \\\"\\\"\\\"Prepare a model by the input config.\\n\\n        Args:\\n            model(`Union[nn.Module, 'SwiftModel']`): The model to be tuned.\\n            config(`Union[SwiftConfig, PeftConfig, Dict[str, SwiftConfig]]`): The config or config dict, can be either\\n                SwiftConfigs or PeftConfigs\\n            **kwargs:\\n                Extra kwargs needed by SwiftModel or PeftModel.\\n        Returns:\\n            The model wrapped by SwiftModel or PeftModel.\\n        \\\"\\\"\\\"\\n\\n        if isinstance(config, (SwiftConfig, dict)):\\n            return SwiftModel(model, config, **kwargs)\\n        else:\\n            return get_peft_model(model, config, **kwargs)\\n\\n    @staticmethod\\n    def merge_and_unload(model: Union[PeftModel, SwiftModel], **kwargs):\\n        \\\"\\\"\\\"Merge tuners into the base model and unload them.\\n\\n        Args:\\n            model(`Union[PeftModel, SwiftModel]`): The model instance with tuners\\n            kwargs:\\n                adapter_name(`Union[str, List[str]]`): The adapter_name to unload, only supported in swift tuners.\\n\\n        \\\"\\\"\\\"\\n        from peft import PeftModel as _PeftModel\\n        if isinstance(model, _PeftModel):\\n            model.merge_and_unload()\\n        elif isinstance(model, SwiftModel):\\n            from swift import LoRAConfig\\n            from swift.tuners import LoRA\\n            adapter_name = kwargs.get('adapter_name', None)\\n            if isinstance(adapter_name, str):\\n                adapter_name = [adapter_name]\\n            for adapter, output in model.adapters.items():\\n                if isinstance(output.config, LoRAConfig) and (adapter_name is None or adapter in adapter_name):\\n                    LoRA.unpatch_lora(model, output.config, adapter)\\n\\n    @staticmethod\\n    def merge(model: Union[PeftModel, SwiftModel], **kwargs):\\n        \\\"\\\"\\\"Merge tuners into the base model, will not unload them.\\n\\n        Args:\\n            model(`Union[PeftModel, SwiftModel]`): The model instance with tuners\\n        \\\"\\\"\\\"\\n        from .lora_layers import LoraLayer, LoRALayer\\n        for sub_module in model.modules():\\n            if isinstance(sub_module, (LoraLayer, LoRALayer)):\\n                sub_module.merge(**kwargs)\\n\\n    @staticmethod\\n    def unmerge(model: Union[PeftModel, SwiftModel], **kwargs):\\n        \\\"\\\"\\\"Unmerge tuners from the base model\\n\\n        Args:\\n            model(`Union[PeftModel, SwiftModel]`): The model instance with tuners\\n        \\\"\\\"\\\"\\n        from .lora_layers import LoraLayer, LoRALayer\\n        for sub_module in model.modules():\\n            if isinstance(sub_module, (LoraLayer, LoRALayer)):\\n                sub_module.unmerge(**kwargs)\\n\\n    @staticmethod\\n    def save_to_peft_format(ckpt_dir: str, output_dir: str) -> None:\\n        \\\"\\\"\\\"Save swift format to peft format\\n\\n        Args:\\n            ckpt_dir(`str`): Original swift output dir\\n            output_dir(`str`): Converted peft format dir\\n        \\\"\\\"\\\"\\n        assert ckpt_dir and output_dir, 'Please pass in valid ckpt_dir and output_dir.'\\n        assert os.path.exists(ckpt_dir), f'ckpt_dir: {ckpt_dir} must exists in local disk.'\\n        if os.path.exists(os.path.join(ckpt_dir, SwiftModel.EXTRA_STATE_DIR)):\\n            raise AssertionError('Cannot transfer to peft format, because you are additional state dicts.')\\n\\n        adapter_names = [\\n            sub_dir for sub_dir in os.listdir(ckpt_dir) if os.path.isfile(os.path.join(ckpt_dir, sub_dir, CONFIG_NAME))\\n        ]\\n\\n        def has_custom_content(_json):\\n            if _json.get('swift_type', _json.get('peft_type')) != SwiftTuners.LORA:\\n                logger.warn('Only LoRA can be converted to peft format')\\n                return True\\n\\n            from swift import LoRAConfig\\n            return not LoRAConfig(**_json).can_be_saved_to_peft()\\n\\n        for adapter in adapter_names:\\n            with open(os.path.join(ckpt_dir, adapter, CONFIG_NAME)) as f:\\n                _json = json.load(f)\\n                if has_custom_content(_json):\\n                    raise AssertionError('Cannot transfer to peft format, '\\n                                         'because you have special parameters or adapter types.')\\n\\n        os.makedirs(output_dir, exist_ok=True)\\n        if ckpt_dir != output_dir:\\n            shutil.copytree(ckpt_dir, output_dir, dirs_exist_ok=True)\\n\\n        for adapter in adapter_names:\\n            safe_serialization = os.path.isfile(os.path.join(output_dir, adapter, SAFETENSORS_WEIGHTS_NAME))\\n            state_dict = SwiftModel.load_state_file(os.path.join(output_dir, adapter))\\n            new_state_dict = {}\\n            for key, value in state_dict.items():\\n                if not key.startswith('base_model.model.'):\\n                    key = 'base_model.model.' + key\\n                key = key.replace(f'lora_A.{adapter}.', 'lora_A.')\\n                key = key.replace(f'lora_B.{adapter}.', 'lora_B.')\\n                key = key.replace(f'lora_embedding_A.{adapter}.', 'lora_embedding_A.')\\n                key = key.replace(f'lora_embedding_B.{adapter}.', 'lora_embedding_B.')\\n                key = key.replace(f'lora_magnitude_vector.{adapter}', 'lora_magnitude_vector')\\n                new_state_dict[key] = value\\n            state_dict = new_state_dict\\n            SwiftModel._save_state_dict(state_dict, os.path.join(output_dir, adapter), safe_serialization)\\n            from swift import LoRAConfig\\n            with open(os.path.join(output_dir, adapter, CONFIG_NAME)) as f:\\n                _json = json.load(f)\\n                peft_config = LoRAConfig(**_json).to_peft_config()\\n            peft_config.save_pretrained(os.path.join(output_dir, adapter))\\n\\n        if 'default' in adapter_names:\\n            shutil.move(os.path.join(output_dir, 'default', CONFIG_NAME), os.path.join(output_dir, CONFIG_NAME))\\n            state_dict = SwiftModel.load_state_file(os.path.join(output_dir, 'default'))\\n            safe_serialization = os.path.isfile(os.path.join(output_dir, 'default', SAFETENSORS_WEIGHTS_NAME))\\n            SwiftModel._save_state_dict(state_dict, output_dir, safe_serialization)\\n            shutil.rmtree(os.path.join(output_dir, 'default'))\\n\\n    @staticmethod\\n    def from_pretrained(model: Union[nn.Module, SwiftModel, PeftModel],\\n                        model_id: str = None,\\n                        adapter_name: Union[str, List[str], Dict[str, str]] = None,\\n                        revision: str = None,\\n                        **kwargs):\\n        \\\"\\\"\\\"Prepare a model by a model_id in the ModelScope hub or a local dir.\\n\\n        Args:\\n            model(`Union[nn.Module, 'SwiftModel']`): The model to be tuned.\\n            model_id(`str`): The model id of the modelhub or a local dir containing the configs/weights.\\n            adapter_name(`str`, `optional`): The adapter_name to use.\\n            revision(`str`, `optional`): The model revision if the model_id is a model id of the modelhub.\\n            **kwargs:\\n                Extra kwargs needed by ``SwiftModel.from_pretrained`` or ``PeftModel.from_pretrained``.\\n        Returns:\\n            The model wrapped by SwiftModel or PeftModel.\\n        \\\"\\\"\\\"\\n        if not os.path.exists(model_id):\\n            model_id = snapshot_download(model_id, revision=revision)\\n        is_peft_model = False\\n        if os.path.exists(os.path.join(model_id, CONFIG_NAME)):\\n            with open(os.path.join(model_id, CONFIG_NAME), 'r') as f:\\n                _json = json.load(f)\\n            is_peft_model = SWIFT_TYPE_KEY not in _json\\n\\n        _name = adapter_name if isinstance(\\n            adapter_name, str) or adapter_name is None else adapter_name[0] \\\\\\n            if isinstance(adapter_name, list) else list(adapter_name.keys())[0]\\n        _name = _name or ''\\n        if os.path.exists(os.path.join(model_id, _name, CONFIG_NAME)):\\n            with open(os.path.join(model_id, _name, CONFIG_NAME), 'r') as f:\\n                _json = json.load(f)\\n            is_peft_model = SWIFT_TYPE_KEY not in _json and 'extra_state_keys' not in _json\\n        if is_peft_model:\\n\\n            def load_peft_model(_model, _adapter_name, _new_name=None):\\n                if not _new_name:\\n                    _new_name = _adapter_name\\n                import peft\\n                if not isinstance(_model, peft.PeftModel):\\n                    return PeftModel.from_pretrained(\\n                        _model,\\n                        os.path.join(model_id, _adapter_name) if _adapter_name != 'default'\\n                        and os.path.exists(os.path.join(model_id, _adapter_name)) else model_id,\\n                        revision=revision,\\n                        adapter_name=_new_name,\\n                        **kwargs)\\n                else:\\n                    _model.load_adapter(\\n                        os.path.join(model_id, _adapter_name) if _adapter_name != 'default'\\n                        and os.path.exists(os.path.join(model_id, _adapter_name)) else model_id, _new_name)\\n                    return _model\\n\\n            if not adapter_name:\\n                peft_model = load_peft_model(model, 'default')\\n                for _dir in os.listdir(model_id):\\n                    if os.path.isdir(os.path.join(model_id, _dir)) and \\\\\\n                            os.path.exists(os.path.join(model_id, _dir, CONFIG_NAME)):\\n                        peft_model = load_peft_model(peft_model, _dir)\\n            elif isinstance(adapter_name, str):\\n                return load_peft_model(model, adapter_name)\\n            elif isinstance(adapter_name, list):\\n                peft_model = model\\n                for name in adapter_name:\\n                    peft_model = load_peft_model(peft_model, name)\\n            else:\\n                peft_model = model\\n                for key, value in adapter_name.items():\\n                    peft_model = load_peft_model(peft_model, key, value)\\n            return peft_model\\n        else:\\n            return SwiftModel.from_pretrained(model, model_id, revision=revision, adapter_name=adapter_name, **kwargs)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Copyright 2023-present the HuggingFace Inc. team.\\nimport os.path\\nfrom dataclasses import asdict, dataclass, field\\nfrom functools import partial, reduce\\nfrom types import MethodType\\nfrom typing import Dict, Optional\\n\\nimport json\\nimport peft\\nimport torch\\nimport torch.nn\\nimport transformers\\nfrom modelscope import snapshot_download\\nfrom peft import (AdaLoraConfig, BOFTConfig, BOFTModel, IA3Config, IA3Model, LoftQConfig, LoHaConfig, LoKrConfig,\\n                  LoraModel, OFTConfig, PeftConfig, PeftModel, PeftModelForCausalLM, PeftModelForSeq2SeqLM,\\n                  PeftModelForSequenceClassification, PeftModelForTokenClassification, PrefixTuningConfig,\\n                  PromptEncoderConfig, PromptLearningConfig, PromptTuningConfig, VeraConfig, VeraModel, get_peft_config,\\n                  get_peft_model, get_peft_model_state_dict)\\nfrom peft.config import PeftConfigMixin\\nfrom peft.tuners.lora import Embedding\\nfrom transformers import Trainer\\n\\nfrom swift import get_logger\\n\\ntry:\\n    from peft import FourierFTModel\\nexcept ImportError:\\n    FourierFTModel = None\\n\\nlogger = get_logger()\\ndispatchers = []\\n\\n\\n@dataclass\\nclass LoraConfig(peft.LoraConfig):\\n    lora_dtype: Optional[str] = field(\\n        default=None, metadata={'help': 'The lora dtype, default None means following the original layer\\\\'s dtype'})\\n\\n    lorap_lr_ratio: float = field(default=2.0**4, metadata={'help': 'The lr ratio of lora_B in lora+'})\\n\\n    lorap_emb_lr: float = field(default=1e-6, metadata={'help': 'The lr for embedding in lora+'})\\n\\n    def to_peft_config(self) -> peft.LoraConfig:\\n        _dict = asdict(self)\\n        _dict.pop('lora_dtype')\\n        _dict.pop('lorap_lr_ratio')\\n        _dict.pop('lorap_emb_lr')\\n        return peft.LoraConfig(**_dict)\\n\\n    def save_pretrained(self, save_directory: str, **kwargs) -> None:\\n        self.to_peft_config().save_pretrained(save_directory, **kwargs)\\n        additional_args = {\\n            'lora_dtype': self.lora_dtype,\\n            'lorap_lr_ratio': self.lorap_lr_ratio,\\n            'lorap_emb_lr': self.lorap_emb_lr,\\n        }\\n        with open(os.path.join(save_directory, 'additional_config.json'), 'w') as f:\\n            json.dump(additional_args, f)\\n\\n    @classmethod\\n    def from_pretrained(cls, pretrained_model_name_or_path: str, subfolder: Optional[str] = None, **kwargs):\\n        if hasattr(PeftConfigMixin, 'from_pretrained_origin'):\\n            self = PeftConfigMixin.from_pretrained_origin(pretrained_model_name_or_path, subfolder, **kwargs)\\n        else:\\n            self = super(LoraConfig, cls).from_pretrained(pretrained_model_name_or_path, subfolder, **kwargs)\\n\\n        if type(self) == peft.LoraConfig:\\n            self = LoraConfig(**self.to_dict())\\n\\n        if os.path.isfile(os.path.join(pretrained_model_name_or_path, 'additional_config.json')):\\n            with open(os.path.join(pretrained_model_name_or_path, 'additional_config.json'), 'r') as f:\\n                _json = json.load(f)\\n                for key, value in _json.items():\\n                    setattr(self, key, value)\\n\\n        return self\\n\\n\\ndef _get_target(*args, **kwargs):\\n    target = None\\n    if 'target' in kwargs:\\n        target = kwargs['target']\\n    else:\\n        for arg in args:\\n            if isinstance(arg, torch.nn.Module):\\n                target = arg\\n                break\\n    return target\\n\\n\\ndef _create_and_replace_hook(self, *args, **kwargs):\\n    target = _get_target(*args, **kwargs)\\n    if target and target.__class__.__name__ == 'NonDynamicallyQuantizableLinear':\\n        return\\n\\n    return self._create_and_replace_origin(*args, **kwargs)\\n\\n\\ndef _create_and_replace_hook2(self, *args, **kwargs):\\n    target = _get_target(*args, **kwargs)\\n\\n    all_supported_names = ('linear', )\\n    all_supported_types = (torch.nn.Embedding, torch.nn.Conv2d, transformers.pytorch_utils.Conv1D)\\n\\n    is_multimodal = getattr(self.model, 'is_multimodal', False)\\n\\n    if is_multimodal and target is not None and (not any(\\n        [name in target.__class__.__name__.lower()\\n         for name in all_supported_names]) and not any([isinstance(target, type) for type in all_supported_types])):\\n        return\\n\\n    return _create_and_replace_hook(self, *args, **kwargs)\\n\\n\\ndef _convert_dtype(target: torch.nn.Module, adapter_name: str, lora_dtype: str):\\n    if lora_dtype == 'fp32':\\n        torch_dtype = torch.float32\\n    elif lora_dtype == 'fp16':\\n        torch_dtype = torch.float16\\n    elif lora_dtype == 'bf16':\\n        torch_dtype = torch.bfloat16\\n    else:\\n        torch_dtype = None\\n\\n    if torch_dtype is not None:\\n        if hasattr(target, 'lora_A') and adapter_name in target.lora_A:\\n            target.lora_A[adapter_name].to(torch_dtype)\\n            target.lora_B[adapter_name].to(torch_dtype)\\n        if hasattr(target, 'lora_embedding_A') and adapter_name in target.lora_embedding_A:\\n            target.lora_embedding_A[adapter_name].to(torch_dtype)\\n            target.lora_embedding_B[adapter_name].to(torch_dtype)\\n\\n\\ndef create_optimizer_param_groups(self: PeftModel, **defaults):\\n    if not isinstance(self.peft_config[self.active_adapter],\\n                      LoraConfig) or self.peft_config[self.active_adapter].lorap_lr_ratio is None:\\n        return None\\n\\n    def get_module(name):\\n        parent_idx = 2 if 'lora' in name else 1\\n        module_names = name.split(sep='.')[:-parent_idx]\\n        module = reduce(getattr, module_names, self.base_model)\\n        return module\\n\\n    param_groups = {\\n        'groupA': {},\\n        'groupB': {},\\n        'groupB_no_decay': {},\\n        'embedding': {},\\n    }\\n\\n    decay_parameters = Trainer.get_decay_parameter_names(None, self.base_model)\\n    for name, param in self.base_model.named_parameters():\\n        if not param.requires_grad:\\n            continue\\n\\n        module = get_module(name)\\n        if isinstance(module, Embedding):\\n            param_groups['embedding'][name] = param\\n        elif 'lora_B' in name or param.ndim == 1:\\n            if name in decay_parameters:\\n                param_groups['groupB'][name] = param\\n            else:\\n                param_groups['groupB_no_decay'][name] = param\\n        else:\\n            param_groups['groupA'][name] = param\\n\\n    lr = defaults['lr']\\n    weight_decay = defaults.get('weight_decay', 0.0)\\n\\n    param_groups = [\\n        {\\n            'params': list(param_groups['groupA'].values()),\\n            'weight_decay': weight_decay,\\n            'lr': lr,\\n        },\\n        {\\n            'params': list(param_groups['embedding'].values()),\\n            'weight_decay': weight_decay,\\n            'lr': self.peft_config[self.active_adapter].lorap_emb_lr,\\n        },\\n        {\\n            'params': list(param_groups['groupB'].values()),\\n            'weight_decay': weight_decay,\\n            'lr': lr * self.peft_config[self.active_adapter].lorap_lr_ratio,\\n        },\\n        {\\n            'params': list(param_groups['groupB_no_decay'].values()),\\n            'weight_decay': 0.0,\\n            'lr': lr * self.peft_config[self.active_adapter].lorap_lr_ratio,\\n        },\\n    ]\\n    return param_groups\\n\\n\\ndef adalora_forward(self, *args, **kwargs):\\n    from peft.utils.integrations import gather_params_ctx\\n    outputs = self.model.forward(*args, **kwargs)\\n\\n    if (getattr(outputs, 'loss', None) is not None) and isinstance(outputs.loss, torch.Tensor):\\n        # Calculate the orthogonal regularization\\n        orth_reg_weight = self.peft_config[self.trainable_adapter_name].orth_reg_weight\\n\\n        if orth_reg_weight <= 0:\\n            raise ValueError('orth_reg_weight should be greater than 0. ')\\n\\n        regu_loss = 0\\n        num_param = 0\\n        for n, p in self.model.named_parameters():\\n            if ('lora_A' in n or 'lora_B' in n) and self.trainable_adapter_name in n:\\n                if p.shape == torch.Size([0]):\\n                    with gather_params_ctx(p, fwd_module=self):\\n                        para_cov = p @ p.T if 'lora_A' in n else p.T @ p\\n                else:\\n                    para_cov = p @ p.T if 'lora_A' in n else p.T @ p\\n                I = torch.eye(*para_cov.size(), out=torch.empty_like(para_cov))  # noqa: E741\\n                I.requires_grad = False\\n                num_param += 1\\n                if isinstance(regu_loss, torch.Tensor):\\n                    regu_loss = regu_loss.to(para_cov.device)\\n                regu_loss += torch.norm(para_cov - I, p='fro')\\n        if num_param > 0:\\n            regu_loss = regu_loss / num_param\\n        else:\\n            regu_loss = 0\\n        if isinstance(regu_loss, torch.Tensor) and isinstance(outputs.loss, torch.Tensor):\\n            regu_loss = regu_loss.to(outputs.loss.device)\\n        outputs.loss += orth_reg_weight * regu_loss\\n    return outputs\\n\\n\\ndef adalora_mask_to_budget(self, model, budget):\\n    value_ipt = {}\\n    vector_ipt = {}\\n    triplet_ipt = {}\\n    # Get the importance score for A, E, B\\n    for n, p in model.named_parameters():\\n        if f'lora_A.{self.adapter_name}' in n:\\n            entry_ipt = self._element_score(n)\\n            comb_ipt = torch.mean(entry_ipt, dim=1, keepdim=True)\\n            name_m = n.replace('lora_A', '%s')\\n            if name_m not in vector_ipt:\\n                vector_ipt[name_m] = [comb_ipt]\\n            else:\\n                vector_ipt[name_m].append(comb_ipt)\\n        if f'lora_B.{self.adapter_name}' in n:\\n            entry_ipt = self._element_score(n)\\n            comb_ipt = torch.mean(entry_ipt, dim=0, keepdim=False).view(-1, 1)\\n            name_m = n.replace('lora_B', '%s')\\n            if name_m not in vector_ipt:\\n                vector_ipt[name_m] = [comb_ipt]\\n            else:\\n                vector_ipt[name_m].append(comb_ipt)\\n        if f'lora_E.{self.adapter_name}' in n:\\n            entry_ipt = self._element_score(n)\\n            name_m = n.replace('lora_E', '%s')\\n            value_ipt[name_m] = entry_ipt\\n\\n    all_score = []\\n    # Calculate the score for each triplet\\n    for name_m in vector_ipt:\\n        ipt_E = value_ipt[name_m]\\n        ipt_AB = torch.cat(vector_ipt[name_m], dim=1)\\n        sum_ipt = self._combine_ipt(ipt_E, ipt_AB)\\n        name_E = name_m % 'lora_E'\\n        triplet_ipt[name_E] = sum_ipt.view(-1, 1)\\n        sum_ipt = sum_ipt.view(-1)\\n        if all_score:\\n            sum_ipt = sum_ipt.to(all_score[0].device)\\n        all_score.append(sum_ipt)\\n\\n    # Get the threshold by ranking ipt\\n    mask_threshold = torch.kthvalue(\\n        torch.cat(all_score),\\n        k=self.init_bgt - budget,\\n    )[0].item()\\n\\n    rank_pattern = {}\\n    # Mask the unimportant triplets\\n    with torch.no_grad():\\n        for n, p in model.named_parameters():\\n            if f'lora_E.{self.adapter_name}' in n:\\n                p.masked_fill_(triplet_ipt[n] <= mask_threshold, 0.0)\\n                rank_pattern[n] = (~(triplet_ipt[n] <= mask_threshold)).view(-1).tolist()\\n    return rank_pattern\\n\\n\\ndef keep_device_forward(self, *args, **kwargs):\\n    x = args[0]\\n    if self.weight.device != x.device:\\n        return self.forward_origin(x.to(self.weight.device), *args[1:], **kwargs)\\n    else:\\n        return self.forward_origin(*args, **kwargs)\\n\\n\\ndef hot_patch_peft_module():\\n    from peft.tuners.lora import LoraLayer\\n\\n    # Fix Lora does not support NonDynamicallyQuantizableLinear\\n    LoraModel._create_and_replace_origin = LoraModel._create_and_replace\\n    LoraModel._create_and_replace = _create_and_replace_hook\\n    VeraModel._create_and_replace_origin = VeraModel._create_and_replace\\n    VeraModel._create_and_replace = _create_and_replace_hook2\\n    BOFTModel._create_and_replace_origin = BOFTModel._create_and_replace\\n    BOFTModel._create_and_replace = _create_and_replace_hook2\\n    IA3Model._create_and_replace_origin = IA3Model._create_and_replace\\n    IA3Model._create_and_replace = _create_and_replace_hook2\\n    if FourierFTModel is not None:\\n        FourierFTModel._create_and_replace_origin = FourierFTModel._create_and_replace\\n        FourierFTModel._create_and_replace = _create_and_replace_hook2\\n\\n    # Support type conversion\\n    def init(self, model: torch.nn.Module, config: Dict[str, LoraConfig], adapter_name):\\n        if isinstance(config, dict):\\n            for _config in config.values():  # There is a target_modules as a string.\\n                if isinstance(getattr(_config, 'target_modules', None), str):\\n                    # Make sure the regex can find all linear in the module.\\n                    LoraModel._create_and_replace = _create_and_replace_hook2\\n                    break\\n\\n        self.__init_origin__(model, config, adapter_name)\\n        if isinstance(self.active_adapter, list):\\n            self.active_adapter = self.active_adapter[0]\\n        active_config = config[self.active_adapter] if isinstance(config, dict) else config\\n        if hasattr(active_config, 'lora_dtype'):\\n            for name, module in model.named_modules():\\n                if isinstance(module, LoraLayer):\\n                    _convert_dtype(module, self.active_adapter, active_config.lora_dtype)\\n                    for lora in list(module.lora_A.values()) + list(module.lora_B.values()):\\n                        if not hasattr(lora, 'forward_origin'):\\n                            lora.forward_origin = lora.forward\\n                            lora.forward = MethodType(keep_device_forward, lora)\\n\\n    LoraModel.__init_origin__ = LoraModel.__init__\\n    LoraModel.__init__ = init\\n\\n    # Support LoRA+\\n    PeftModel.create_optimizer_param_groups = create_optimizer_param_groups\\n\\n    PeftConfigMixin.from_pretrained_origin = PeftConfigMixin.from_pretrained\\n    PeftConfigMixin.from_pretrained = LoraConfig.from_pretrained\\n\\n    # Compatible with SwiftModel\\n    def dummy_function(*args, **kwargs):\\n        logger.warn(f'The function {kwargs[\\\"func\\\"]} has no effects, consider using other functions.')\\n\\n    PeftModel.activate_adapter = PeftModel.set_adapter\\n    PeftModel.deactivate_adapter = partial(dummy_function, func='deactivate_adapter')\\n    PeftModel.set_active_adapters = partial(dummy_function, func='set_active_adapters')\\n\\n    # Fix adalora does not support device_map\\n    from peft.tuners.adalora import AdaLoraModel, RankAllocator\\n    AdaLoraModel.forward = adalora_forward\\n    RankAllocator.mask_to_budget = adalora_mask_to_budget\\n\\n\\ndef get_wrapped_class(module_class):\\n    \\\"\\\"\\\"Get a custom wrapper class for peft classes to download the models from the ModelScope hub\\n\\n    Args:\\n        module_class: The actual module class\\n\\n    Returns:\\n        The wrapper\\n    \\\"\\\"\\\"\\n\\n    class PeftWrapper(module_class):\\n\\n        @classmethod\\n        def from_pretrained(cls, model, model_id, *args, revision: Optional[str] = None, **kwargs):\\n            if not os.path.exists(model_id):\\n                model_id = snapshot_download(model_id, revision=revision)\\n            return module_class.from_pretrained(model, model_id, *args, **kwargs)\\n\\n    PeftWrapper.__name__ = module_class.__name__\\n    return PeftWrapper\\n\\n\\ndef wrap_module(module):\\n    if not hasattr(module, 'from_pretrained'):\\n        return module\\n\\n    return get_wrapped_class(module)\\n\\n\\nhot_patch_peft_module()\\nPeftModel = wrap_module(PeftModel)\\nPeftConfig = wrap_module(PeftConfig)\\nPeftModelForSeq2SeqLM = wrap_module(PeftModelForSeq2SeqLM)\\nPeftModelForSequenceClassification = wrap_module(PeftModelForSequenceClassification)\\nPeftModelForTokenClassification = wrap_module(PeftModelForTokenClassification)\\nPeftModelForCausalLM = wrap_module(PeftModelForCausalLM)\\nPromptEncoderConfig = wrap_module(PromptEncoderConfig)\\nPromptTuningConfig = wrap_module(PromptTuningConfig)\\nPrefixTuningConfig = wrap_module(PrefixTuningConfig)\\nPromptLearningConfig = wrap_module(PromptLearningConfig)\\nLoraConfig = wrap_module(LoraConfig)\\nAdaLoraConfig = wrap_module(AdaLoraConfig)\\nIA3Config = wrap_module(IA3Config)\\nLoHaConfig = wrap_module(LoHaConfig)\\nLoKrConfig = wrap_module(LoKrConfig)\\nLoftQConfig = wrap_module(LoftQConfig)\\nOFTConfig = wrap_module(OFTConfig)\\nBOFTConfig = wrap_module(BOFTConfig)\\nVeraConfig = wrap_module(VeraConfig)\\nOFTConfig = wrap_module(OFTConfig)\\nget_peft_config = get_peft_config\\nget_peft_model_state_dict = get_peft_model_state_dict\\nget_peft_model = get_peft_model\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from dvlab-research/LongLoRA.\\n\\nimport math\\nfrom types import MethodType\\nfrom typing import Optional, Tuple\\n\\nimport torch\\nimport torch.nn.functional as F\\nfrom torch import nn\\nfrom transformers import Cache\\nfrom transformers.models.llama.modeling_llama import apply_rotary_pos_emb, repeat_kv\\n\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\ndef _preprocess_qkv_fa2(attn_module, query_states, key_states, value_states, attention_mask):\\n    if attn_module.training:\\n        bsz, q_len = query_states.shape[:2]\\n        group_size = int(q_len * attn_module.config.group_size_ratio)\\n        if q_len % group_size != 0:\\n            raise ValueError(f'The sequence length {q_len} should'\\n                             f'be able to be splitted by the group_ratio {attn_module.config.group_size_ratio}')\\n\\n        num_group = q_len // group_size\\n\\n        def shift(qkv, bsz, q_len, group_size, num_heads, head_dim):\\n            qkv[:, :, num_heads // 2:] = qkv[:, :, num_heads // 2:].roll(-group_size // 2, dims=1)\\n            qkv = qkv.reshape(bsz * num_group, group_size, num_heads, head_dim)\\n            return qkv\\n\\n        query_states = shift(query_states, bsz, q_len, group_size, attn_module.num_heads, attn_module.head_dim)\\n        key_states = shift(key_states, bsz, q_len, group_size, attn_module.num_heads, attn_module.head_dim)\\n        value_states = shift(value_states, bsz, q_len, group_size, attn_module.num_heads, attn_module.head_dim)\\n        if attention_mask is not None:\\n            attention_mask = attention_mask[:, :group_size].repeat(num_group, 1)\\n\\n    return query_states, key_states, value_states, attention_mask\\n\\n\\ndef _preprocess_qkv(attn_module, query_states, key_states, value_states, attention_mask):\\n    if attn_module.training:\\n        bsz, _, q_len = query_states.shape[:3]\\n        group_size = int(q_len * attn_module.config.group_size_ratio)\\n        if q_len % group_size != 0:\\n            raise ValueError(f'The sequence length {q_len} should'\\n                             f'be able to be splitted by the group_ratio {attn_module.config.group_size_ratio}')\\n\\n        num_group = q_len // group_size\\n\\n        def shift(qkv, bsz, q_len, group_size, num_heads, head_dim):\\n            qkv[:, num_heads // 2:] = qkv[:, num_heads // 2:].roll(-group_size // 2, dims=2)\\n            qkv = qkv.transpose(1, 2)\\n            qkv = qkv.reshape(bsz * num_group, group_size, num_heads, head_dim)\\n            return qkv.transpose(1, 2)\\n\\n        query_states = shift(query_states, bsz, q_len, group_size, attn_module.num_heads, attn_module.head_dim)\\n        key_states = shift(key_states, bsz, q_len, group_size, attn_module.num_heads, attn_module.head_dim)\\n        value_states = shift(value_states, bsz, q_len, group_size, attn_module.num_heads, attn_module.head_dim)\\n        if attention_mask is not None:\\n            attention_mask = attention_mask[:, :, :group_size, :group_size].repeat(num_group, 1, 1, 1)\\n\\n    return query_states, key_states, value_states, attention_mask\\n\\n\\ndef _postprocess_qkv(attn_module, attn_output, q_len):\\n    if attn_module.training:\\n        group_size = int(q_len * attn_module.config.group_size_ratio)\\n        attn_output = attn_output.transpose(1, 2)\\n        attn_output = attn_output.reshape(-1, q_len, attn_module.num_heads, attn_module.head_dim)\\n        # shift back\\n        attn_output[:, :, attn_module.num_heads // 2:] = attn_output[:, :, attn_module.num_heads // 2:].roll(\\n            group_size // 2, dims=1)\\n    return attn_output.transpose(1, 2)\\n\\n\\ndef _postprocess_qkv_fa2(attn_module, attn_output, q_len):\\n    if attn_module.training:\\n        group_size = int(q_len * attn_module.config.group_size_ratio)\\n        attn_output = attn_output.reshape(-1, q_len, attn_module.num_heads, attn_module.head_dim)\\n        # shift back\\n        attn_output[:, :, attn_module.num_heads // 2:] = attn_output[:, :, attn_module.num_heads // 2:].roll(\\n            group_size // 2, dims=1)\\n    return attn_output\\n\\n\\n# code borrowed from https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/modeling_llama.py#L316 # noqa\\ndef eager_forward(\\n    self,\\n    hidden_states: torch.Tensor,\\n    attention_mask: Optional[torch.Tensor] = None,\\n    position_ids: Optional[torch.LongTensor] = None,\\n    past_key_value: Optional[Cache] = None,\\n    output_attentions: bool = False,\\n    use_cache: bool = False,\\n    cache_position: Optional[torch.LongTensor] = None,\\n    **kwargs,\\n) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:\\n    bsz, q_len, _ = hidden_states.size()\\n\\n    if self.config.pretraining_tp > 1:\\n        key_value_slicing = (self.num_key_value_heads * self.head_dim) // self.config.pretraining_tp\\n        query_slices = self.q_proj.weight.split((self.num_heads * self.head_dim) // self.config.pretraining_tp, dim=0)\\n        key_slices = self.k_proj.weight.split(key_value_slicing, dim=0)\\n        value_slices = self.v_proj.weight.split(key_value_slicing, dim=0)\\n\\n        query_states = [F.linear(hidden_states, query_slices[i]) for i in range(self.config.pretraining_tp)]\\n        query_states = torch.cat(query_states, dim=-1)\\n\\n        key_states = [F.linear(hidden_states, key_slices[i]) for i in range(self.config.pretraining_tp)]\\n        key_states = torch.cat(key_states, dim=-1)\\n\\n        value_states = [F.linear(hidden_states, value_slices[i]) for i in range(self.config.pretraining_tp)]\\n        value_states = torch.cat(value_states, dim=-1)\\n\\n    else:\\n        query_states = self.q_proj(hidden_states)\\n        key_states = self.k_proj(hidden_states)\\n        value_states = self.v_proj(hidden_states)\\n\\n    query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)\\n    key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n    value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n\\n    past_key_value = getattr(self, 'past_key_value', past_key_value)\\n    cos, sin = self.rotary_emb(value_states, position_ids)\\n    query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)\\n\\n    if past_key_value is not None:\\n        # sin and cos are specific to RoPE models; position_ids needed for the static cache\\n        cache_kwargs = {'sin': sin, 'cos': cos, 'cache_position': cache_position}\\n        key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)\\n\\n    key_states = repeat_kv(key_states, self.num_key_value_groups)\\n    value_states = repeat_kv(value_states, self.num_key_value_groups)\\n\\n    # patch position rolling\\n    query_states, key_states, value_states, attention_mask = _preprocess_qkv(self, query_states, key_states,\\n                                                                             value_states, attention_mask)\\n\\n    attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim)\\n\\n    if attention_mask is not None:  # no matter the length, we just slice it\\n        if cache_position is not None and not self.training:\\n            causal_mask = attention_mask[:, :, cache_position, :key_states.shape[-2]]\\n            attn_weights = attn_weights + causal_mask\\n        else:\\n            attn_weights = attn_weights + attention_mask\\n\\n    # upcast attention to fp32\\n    attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype)\\n    attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training)\\n    attn_output = torch.matmul(attn_weights, value_states)\\n\\n    # patch position unrolling\\n    attn_output = _postprocess_qkv(self, attn_output, q_len)\\n\\n    attn_output = attn_output.transpose(1, 2).contiguous()\\n\\n    attn_output = attn_output.reshape(bsz, q_len, self.hidden_size)\\n\\n    if self.config.pretraining_tp > 1:\\n        attn_output = attn_output.split(self.hidden_size // self.config.pretraining_tp, dim=2)\\n        o_proj_slices = self.o_proj.weight.split(self.hidden_size // self.config.pretraining_tp, dim=1)\\n        attn_output = sum([F.linear(attn_output[i], o_proj_slices[i]) for i in range(self.config.pretraining_tp)])\\n    else:\\n        attn_output = self.o_proj(attn_output)\\n\\n    if not output_attentions:\\n        attn_weights = None\\n\\n    return attn_output, attn_weights, past_key_value\\n\\n\\n# code borrowed from https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/modeling_llama.py#L417 # noqa\\ndef fa2_forward(\\n    self,\\n    hidden_states: torch.Tensor,\\n    attention_mask: Optional[torch.LongTensor] = None,\\n    position_ids: Optional[torch.LongTensor] = None,\\n    past_key_value: Optional[Cache] = None,\\n    output_attentions: bool = False,\\n    use_cache: bool = False,\\n    cache_position: Optional[torch.LongTensor] = None,\\n    **kwargs,\\n) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:\\n    output_attentions = False\\n\\n    bsz, q_len, _ = hidden_states.size()\\n\\n    query_states = self.q_proj(hidden_states)\\n    key_states = self.k_proj(hidden_states)\\n    value_states = self.v_proj(hidden_states)\\n\\n    # Flash attention requires the input to have the shape\\n    # batch_size x seq_length x head_dim x hidden_dim\\n    # therefore we just need to keep the original shape\\n    query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)\\n    key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n    value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n\\n    cos, sin = self.rotary_emb(value_states, position_ids)\\n    query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)\\n\\n    past_key_value = getattr(self, 'past_key_value', past_key_value)\\n\\n    if past_key_value is not None:\\n        # sin and cos are specific to RoPE models; position_ids needed for the static cache\\n        cache_kwargs = {'sin': sin, 'cos': cos, 'cache_position': cache_position}\\n        key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)\\n\\n    # TODO: These transpose are quite inefficient but Flash Attention\\n    #  requires the layout [batch_size, sequence_length, num_heads, head_dim]. We would need to refactor the KV cache\\n    # to be able to avoid many of these transpose/reshape/view.\\n    query_states = query_states.transpose(1, 2)\\n    key_states = key_states.transpose(1, 2)\\n    value_states = value_states.transpose(1, 2)\\n\\n    dropout_rate = self.attention_dropout if self.training else 0.0\\n\\n    # In PEFT, usually we cast the layer norms in float32 for training stability reasons\\n    # therefore the input hidden states gets silently casted in float32. Hence, we need\\n    # cast them back in the correct dtype just to be sure everything works as expected.\\n    # This might slowdown training & inference so it is recommended to not cast the LayerNorms\\n    # in fp32. (LlamaRMSNorm handles it correctly)\\n\\n    input_dtype = query_states.dtype\\n    if input_dtype == torch.float32:\\n        if torch.is_autocast_enabled():\\n            target_dtype = torch.get_autocast_gpu_dtype()\\n        # Handle the case where the model is quantized\\n        elif hasattr(self.config, '_pre_quantization_dtype'):\\n            target_dtype = self.config._pre_quantization_dtype\\n        else:\\n            target_dtype = self.q_proj.weight.dtype\\n\\n        logger.warning_once(\\n            f'The input hidden states seems to be silently casted in float32, this might be related to'\\n            f' the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in'\\n            f' {target_dtype}.')\\n\\n        query_states = query_states.to(target_dtype)\\n        key_states = key_states.to(target_dtype)\\n        value_states = value_states.to(target_dtype)\\n\\n    # patch position rolling\\n    query_states, key_states, value_states, attention_mask = _preprocess_qkv_fa2(self, query_states, key_states,\\n                                                                                 value_states, attention_mask)\\n\\n    attn_output = self._flash_attention_forward(\\n        query_states, key_states, value_states, attention_mask, query_states.shape[1], dropout=dropout_rate)\\n\\n    # patch position unrolling\\n    attn_output = _postprocess_qkv_fa2(self, attn_output, q_len)\\n\\n    attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous()\\n    attn_output = self.o_proj(attn_output)\\n\\n    if not output_attentions:\\n        attn_weights = None\\n\\n    return attn_output, attn_weights, past_key_value\\n\\n\\n# code borrowed from https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/modeling_llama.py#L605  # noqa\\ndef sdpa_forward(\\n    self,\\n    hidden_states: torch.Tensor,\\n    attention_mask: Optional[torch.Tensor] = None,\\n    position_ids: Optional[torch.LongTensor] = None,\\n    past_key_value: Optional[Cache] = None,\\n    output_attentions: bool = False,\\n    use_cache: bool = False,\\n    cache_position: Optional[torch.LongTensor] = None,\\n) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:\\n    if output_attentions:\\n        # TODO: Improve this warning with e.g. `model.config.attn_implementation = \\\"manual\\\"` once this is implemented.\\n        logger.warning_once(\\n            'LlamaModel is using LlamaSdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, '  # noqa\\n            'but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation=\\\"eager\\\"` when loading the model.'  # noqa\\n        )\\n        return super().forward(\\n            hidden_states=hidden_states,\\n            attention_mask=attention_mask,\\n            position_ids=position_ids,\\n            past_key_value=past_key_value,\\n            output_attentions=output_attentions,\\n            use_cache=use_cache,\\n            cache_position=cache_position,\\n        )\\n\\n    bsz, q_len, _ = hidden_states.size()\\n\\n    query_states = self.q_proj(hidden_states)\\n    key_states = self.k_proj(hidden_states)\\n    value_states = self.v_proj(hidden_states)\\n\\n    query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)\\n    key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n    value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)\\n\\n    cos, sin = self.rotary_emb(value_states, position_ids)\\n    query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)\\n\\n    # In case static cache is used, it is an instance attribute.\\n    past_key_value = getattr(self, 'past_key_value', past_key_value)\\n\\n    if past_key_value is not None:\\n        # sin and cos are specific to RoPE models; position_ids needed for the static cache\\n        cache_kwargs = {'sin': sin, 'cos': cos, 'cache_position': cache_position}\\n        key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)\\n\\n    key_states = repeat_kv(key_states, self.num_key_value_groups)\\n    value_states = repeat_kv(value_states, self.num_key_value_groups)\\n\\n    causal_mask = attention_mask\\n    if attention_mask is not None and cache_position is not None:\\n        causal_mask = causal_mask[:, :, cache_position, :key_states.shape[-2]]\\n\\n    # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask,  # noqa\\n    # Reference: https://github.com/pytorch/pytorch/issues/112577.  # noqa\\n    if query_states.device.type == 'cuda' and causal_mask is not None:\\n        query_states = query_states.contiguous()\\n        key_states = key_states.contiguous()\\n        value_states = value_states.contiguous()\\n\\n    # patch position rolling\\n    query_states, key_states, value_states, causal_mask = _preprocess_qkv(self, query_states, key_states, value_states,\\n                                                                          causal_mask)\\n\\n    attn_output = torch.nn.functional.scaled_dot_product_attention(\\n        query_states,\\n        key_states,\\n        value_states,\\n        attn_mask=causal_mask,\\n        dropout_p=self.attention_dropout if self.training else 0.0,\\n    )\\n\\n    # patch position unrolling\\n    attn_output = _postprocess_qkv(self, attn_output, q_len)\\n\\n    attn_output = attn_output.transpose(1, 2).contiguous()\\n    attn_output = attn_output.view(bsz, q_len, self.hidden_size)\\n\\n    attn_output = self.o_proj(attn_output)\\n\\n    return attn_output, None, past_key_value\\n\\n\\ndef replace_llama_attn(model: nn.Module):\\n    layers = None\\n    for module in model.modules():\\n        if isinstance(module, torch.nn.ModuleList):\\n            layers = module\\n            break\\n    assert layers is not None\\n    for idx, m in enumerate(layers):\\n        if model.config._attn_implementation == 'flash_attention_2':\\n            cuda_major, cuda_minor = torch.cuda.get_device_capability()\\n            if cuda_major < 8:\\n                logger.warn(\\n                    'Flash attention is only supported on A100 or H100 GPU during training due to head dim > 64 backward.'  # noqa\\n                    'ref: https://github.com/HazyResearch/flash-attention/issues/190#issuecomment-1523359593')\\n            m.self_attn.forward = MethodType(fa2_forward, m.self_attn)\\n        elif model.config._attn_implementation == 'eager':\\n            m.self_attn.forward = MethodType(eager_forward, m.self_attn)\\n        elif model.config._attn_implementation == 'sdpa':\\n            m.self_attn.forward = MethodType(sdpa_forward, m.self_attn)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from dvlab-research/LongLoRA.\\nimport re\\nfrom dataclasses import dataclass, field\\nfrom typing import List, Tuple, Union\\n\\nimport torch.nn as nn\\n\\nfrom swift import LoRA, LoRAConfig, SwiftOutput\\nfrom swift.tuners.lora import lora_state_dict, mark_lora_as_trainable\\nfrom swift.tuners.lora_layers import LoraModel\\n\\n\\nclass LongLoRAModelType:\\n    LLAMA = 'llama'\\n\\n\\n@dataclass\\nclass LongLoRAConfig(LoRAConfig):\\n    \\\"\\\"\\\"\\n    The Config for the LongLoRA adapter.\\n    LongLoRA:[Efficient Fine-tuning of Long-Context Large Language Models](https://arxiv.org/abs/2309.12307)\\n    This adapter uses S2-attention to shorten the attention window for long context training scenarios.\\n    Args:\\n        embedder_and_normalizer: LongLoRA allows the embedder and normalizer to be trainable, this parameter specifies\\n            the names of the embedders and normalizers.\\n        model_type: The model type, now support llama only\\n        group_size_ratio: The group size window ratio of the sequence length.\\n            Note: The sequence length should be split to smaller sequences by the ratio.\\n    \\\"\\\"\\\"\\n\\n    embedder_and_normalizer: Union[str, List[str], Tuple[str]] = field(\\n        default=('embed', 'norm'),\\n        metadata={\\n            'help': 'The names of embedder and normalizer, regex format if is a str, else will match with sub sequences'\\n        })\\n\\n    model_type: str = field(default=None, metadata={'help': 'The model type, now only support `llama` structure.'})\\n\\n    group_size_ratio: float = field(default=0.25, metadata={'help': 'The S2 attention group ratio'})\\n\\n    def __post_init__(self):\\n        from swift.tuners.mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.LONGLORA\\n\\n\\nclass LongLoRA(LoRA):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: LongLoRAConfig, adapter_name: str):\\n        \\\"\\\"\\\"Prepare a model with `LongLoRAConfig`\\\"\\\"\\\"\\n        LoraModel(model, config, adapter_name)\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            _state_dict = lora_state_dict(state_dict, adapter_name, config.bias)\\n            for name, value in state_dict.items():\\n                if isinstance(config.embedder_and_normalizer, str):\\n                    target_module_found = re.fullmatch(config.embedder_and_normalizer, name)\\n                else:\\n                    target_module_found = any(target_key in name for target_key in config.embedder_and_normalizer)\\n                if target_module_found and name not in _state_dict:  # noqa\\n                    _state_dict[name] = value\\n            return _state_dict\\n\\n        def mark_trainable_callback(model):\\n            mark_lora_as_trainable(model, adapter_name, config.bias)\\n            mark_embedding_normalizer_as_trainable(model, config.embedder_and_normalizer)\\n\\n        if config.model_type == LongLoRAModelType.LLAMA:\\n            from .llama import replace_llama_attn\\n            replace_llama_attn(model)\\n            # only support code base from transformers\\n            model.config.group_size_ratio = config.group_size_ratio\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n\\ndef mark_embedding_normalizer_as_trainable(model: nn.Module, extra_parameters: Union[str, List[str],\\n                                                                                     Tuple[str]]) -> None:\\n    for name, sub_module in model.named_parameters():\\n        if isinstance(extra_parameters, str):\\n            target_module_found = re.fullmatch(extra_parameters, name)\\n        else:\\n            target_module_found = any(target_key in name for target_key in extra_parameters)\\n        if target_module_found:  # noqa\\n            sub_module.requires_grad = True\\n\\n\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from kmeng01/rome.\\nfrom dataclasses import dataclass\\nfrom typing import List\\n\\nfrom .hparams import HyperParams\\n\\n\\n@dataclass\\nclass ROMEHyperParams(HyperParams):\\n    # Method\\n    layers: List[int]\\n    fact_token: str\\n    v_num_grad_steps: int\\n    v_lr: float\\n    v_weight_decay: float\\n    clamp_norm_factor: float\\n    kl_factor: float\\n\\n    # Module templates\\n    rewrite_module_tmp: str\\n    mlp_module_tmp: str\\n\\n    @classmethod\\n    def from_name(cls, name: str):\\n        data = dict(\\n            fact_token='subject_last',\\n            v_num_grad_steps=20,\\n            v_lr=1e-1,\\n            v_weight_decay=1e-2,\\n            clamp_norm_factor=4,\\n            kl_factor=0.0625,\\n        )\\n        if name == 'llama-7b':\\n            data.update(\\n                dict(\\n                    layers=[5],\\n                    rewrite_module_tmp='model.layers.{}.mlp.down_proj',\\n                    mlp_module_tmp='model.layers.{}.mlp',\\n                ))\\n        elif name == 'llama-13b':\\n            data.update(\\n                dict(\\n                    layers=[10],\\n                    rewrite_module_tmp='model.layers.{}.mlp.down_proj',\\n                    mlp_module_tmp='model.layers.{}.mlp',\\n                ))\\n        elif name == 'chatglm-6b':\\n            data.update(\\n                dict(\\n                    layers=[5],\\n                    rewrite_module_tmp='transformer.encoder.layers.{}.mlp.dense_4h_to_h',\\n                    mlp_module_tmp='transformer.encoder.layers.{}.mlp',\\n                ))\\n        else:\\n            raise NotImplementedError(f'{name} not supported.')\\n\\n        return cls(**data)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from kmeng01/rome.\\nfrom copy import deepcopy\\nfrom dataclasses import dataclass, field\\nfrom typing import Any, Dict, List, Set, Tuple\\n\\nimport torch\\nimport torch.nn as nn\\n\\nfrom swift import SwiftConfig\\nfrom swift.tuners.utils import SwiftAdapter, SwiftOutput\\nfrom swift.utils import get_logger\\nfrom .compute_u import compute_u\\nfrom .compute_v import compute_v\\nfrom .context_template import context_template\\nfrom .nethook import get_parameter\\nfrom .rome_hparams import ROMEHyperParams\\n\\nCONTEXT_TEMPLATES_CACHE = None\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass RomeConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the ROME module.\\n    This adapter can be used to inject/modify knowledge to models, without any training.\\n    ROME: [Rank-One Editing of Encoder-Decoder Models](https://arxiv.org/abs/2211.13317)\\n    Args:\\n        model_type(`str`): The model type, now support llama-7b/llama-13b\\n        tokenizer(`AutoTokenizer`): The tokenizer\\n        knowledge(`List[Dict]`): The knowledge to be injected to the model.\\n            format:\\n            >>> [\\n            >>>     {\\n            >>>         \\\"prompt\\\": \\\"{} was the founder of\\\",\\n            >>>         \\\"subject\\\": \\\"Steve Jobs\\\",\\n            >>>         \\\"target\\\": \\\"Microsoft\\\"\\n            >>>     }\\n            >>> ]\\n    \\\"\\\"\\\"\\n    model_type: str = field(default=None, metadata={'help': 'The model type'})\\n\\n    tokenizer: Any = field(default=None, metadata={'help': 'The tokenizer matching this model'})\\n\\n    knowledge: List[Dict] = field(default=False, metadata={'help': 'The knowledge to be used'})\\n\\n    batch_first: bool = field(default=True, metadata={'help': 'Batch at the first dimension or not'})\\n\\n    def __post_init__(self):\\n        from swift.tuners.mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.ROME\\n\\n    @property\\n    def __dict__(self):\\n        _dict = super(RomeConfig, self).__dict__\\n        _dict.pop('tokenizer')\\n        return _dict\\n\\n\\nclass Rome(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: RomeConfig, adapter_name: str):\\n        \\\"\\\"\\\"\\n        Applies the selected model editing algorithm. Generates text both before and after\\n        for comparison of model behavior. Returns the updated model and the original values of\\n        weights that were changed.\\n        \\\"\\\"\\\"\\n        modified_keys = set()\\n        if config.tokenizer is not None:\\n            for param in model.parameters():\\n                param.requires_grad = True\\n\\n            hparams = ROMEHyperParams.from_name(config.model_type)\\n            modified_keys = apply_rome_to_model(model, config.tokenizer, config.knowledge, hparams, config.batch_first)\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            return {key: value for key, value in state_dict.items() if key in modified_keys}\\n\\n        def mark_trainable_callback(model):\\n            pass\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def has_additional_modules():\\n        return False\\n\\n\\ndef apply_rome_to_model(\\n    model: torch.nn.Module,\\n    tokenizer: Any,\\n    knowledge: List[Dict],\\n    hparams: ROMEHyperParams,\\n    batch_first: bool,\\n) -> Set:\\n    \\\"\\\"\\\"Apply ROME to a model\\n\\n    Args:\\n        model(`torch.nn.Module`): The model instance.\\n        tokenizer(`Any`): The tokenizer.\\n        knowledge(`List[Dict]`): The knowledge to be filled into the model.\\n        hparams(`ROMEHyperParams`): The hyperparameter of ROME\\n        batch_first(`bool`): Batch first of not.\\n    \\\"\\\"\\\"\\n    modified_keys = set()\\n    for i, request in enumerate(knowledge):\\n        deltas = execute_rome(model, tokenizer, request, hparams, batch_first)\\n\\n        with torch.no_grad():\\n            for w_name, (delta_u, delta_v) in deltas.items():\\n                upd_matrix = delta_u.unsqueeze(1) @ delta_v.unsqueeze(0)\\n                w = get_parameter(model, w_name)\\n                upd_matrix = upd_matrix_match_shape(upd_matrix, w.shape)\\n                w[...] += upd_matrix\\n        modified_keys.update(set(deltas.keys()))\\n    return modified_keys\\n\\n\\ndef execute_rome(\\n    model: torch.nn.Module,\\n    tok: Any,\\n    knowledge: Dict,\\n    hparams: ROMEHyperParams,\\n    batch_first: bool,\\n) -> Dict[str, Tuple[torch.Tensor, torch.Tensor]]:\\n    \\\"\\\"\\\"\\n    Executes the ROME update algorithm for the specified update at the specified layer\\n    Invariant: model at beginning of function == model at end of function\\n    \\\"\\\"\\\"\\n\\n    # Update target and print info\\n    request = deepcopy(knowledge)\\n    logger.info(f'Executing ROME algorithm for the update: '\\n                f\\\"[{request['prompt'].format(request['subject'])}] -> [{request['target']}]\\\")\\n\\n    # Retrieve weights that user desires to change\\n    weights = {\\n        f'{hparams.rewrite_module_tmp.format(layer)}.weight':\\n        get_parameter(model, f'{hparams.rewrite_module_tmp.format(layer)}.weight')\\n        for layer in hparams.layers\\n    }\\n    # Save old weights for future restoration\\n    weights_copy = {k: v.detach().clone() for k, v in weights.items()}\\n\\n    # Update loop: sequentially intervene at each specified layer\\n    deltas = {}\\n    for layer in sorted(hparams.layers):\\n        # Compute rank-1 update matrix\\n        left_vector: torch.Tensor = compute_u(\\n            model,\\n            tok,\\n            request,\\n            hparams,\\n            layer,\\n            context_template,\\n            batch_first=batch_first,\\n        )\\n        logger.info(f'Left vector shape: {left_vector.shape}')\\n        right_vector: torch.Tensor = compute_v(\\n            model,\\n            tok,\\n            request,\\n            hparams,\\n            layer,\\n            left_vector,\\n            context_template,\\n            batch_first=batch_first,\\n        )\\n        logger.info(f'Right vector shape: {right_vector.shape}')\\n        right_vector = right_vector.to(left_vector.dtype)\\n\\n        with torch.no_grad():\\n            # Determine correct transposition of delta matrix\\n            weight_name = f'{hparams.rewrite_module_tmp.format(layer)}.weight'\\n            upd_matrix = left_vector.unsqueeze(1) @ right_vector.unsqueeze(0)\\n            upd_matrix = upd_matrix_match_shape(upd_matrix, weights[weight_name].shape)\\n\\n            # Update model weights and record desired changes in `delta` variable\\n            weights[weight_name][...] += upd_matrix\\n            deltas[weight_name] = (\\n                left_vector.detach(),\\n                right_vector.detach(),\\n            )\\n\\n    # Restore state of original model\\n    with torch.no_grad():\\n        for k, v in weights.items():\\n            v[...] = weights_copy[k]\\n\\n    logger.info(f'Deltas successfully computed for {list(weights.keys())}')\\n\\n    return deltas\\n\\n\\ndef upd_matrix_match_shape(matrix: torch.Tensor, shape: torch.Size) -> torch.Tensor:\\n    \\\"\\\"\\\"\\n    GPT-2 and GPT-J have transposed weight representations.\\n    Returns a matrix that matches the desired shape, else raises a ValueError\\n    \\\"\\\"\\\"\\n\\n    if matrix.shape == shape:\\n        return matrix\\n    elif matrix.T.shape == shape:\\n        return matrix.T\\n    else:\\n        raise ValueError('Update matrix computed by ROME does not match original weight shape. '\\n                         'Check for bugs in the code?')\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from kmeng01/rome.\\nfrom typing import Dict, List\\n\\nimport torch\\nfrom modelscope import AutoTokenizer\\n\\nfrom swift.utils.logger import get_logger\\nfrom .repr_tools import get_reprs_at_idxs, get_reprs_at_word_tokens\\nfrom .rome_hparams import ROMEHyperParams\\n\\nlogger = get_logger()\\n\\n\\ndef compute_u(\\n    model: torch.nn.Module,\\n    tokenizer: AutoTokenizer,\\n    request: Dict,\\n    hparams: ROMEHyperParams,\\n    layer: int,\\n    context_templates: List[str],\\n    batch_first=True,\\n) -> torch.Tensor:\\n    \\\"\\\"\\\"\\n    Computes the left vector used in constructing the rank-1 update matrix.\\n    \\\"\\\"\\\"\\n\\n    logger.info('Computing left vector (u)...')\\n\\n    # Compute projection token\\n    word_repr_args = dict(\\n        model=model,\\n        tokenizer=tokenizer,\\n        layer=layer,\\n        module_template=hparams.rewrite_module_tmp,\\n        track='in',\\n        batch_first=batch_first,\\n    )\\n    if 'subject_' in hparams.fact_token and hparams.fact_token.index('subject_') == 0:\\n        word = request['subject']\\n        logger.info(f'Selected u projection object {word}')\\n        cur_repr = get_reprs_at_word_tokens(\\n            context_templates=[templ.format(request['prompt']) for templ in context_templates],\\n            words=[word for _ in range(len(context_templates))],\\n            subtoken=hparams.fact_token[len('subject_'):],\\n            **word_repr_args,\\n        ).mean(0)\\n    elif hparams.fact_token == 'last':\\n        # Heuristic to choose last word. Not a huge deal if there's a minor\\n        # edge case (e.g. multi-token word) because the function below will\\n        # take the last token.\\n        cur_repr = get_reprs_at_idxs(\\n            contexts=[templ.format(request['prompt'].format(request['subject'])) for templ in context_templates],\\n            idxs=[[-1] for _ in range(len(context_templates))],\\n            **word_repr_args,\\n        ).mean(0)\\n        logger.info('Selected u projection token with last token')\\n    else:\\n        raise ValueError(f'fact_token={hparams.fact_token} not recognized')\\n\\n    # Apply inverse second moment adjustment\\n    u = cur_repr\\n    return u / u.norm()\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from kmeng01/rome.\\n\\\"\\\"\\\"\\nUtilities for instrumenting a torch model.\\n\\nTrace will hook one layer at a time.\\nTraceDict will hook multiple layers at once.\\nsubsequence slices intervals from Sequential modules.\\nget_module, replace_module, get_parameter resolve dotted names.\\nset_requires_grad recursively sets requires_grad in module parameters.\\n\\\"\\\"\\\"\\n\\nimport contextlib\\nimport copy\\nimport inspect\\nfrom collections import OrderedDict\\n\\nimport torch\\n\\n\\nclass Trace(contextlib.AbstractContextManager):\\n    \\\"\\\"\\\"\\n    To retain the output of the named layer during the computation of\\n    the given network:\\n\\n        with Trace(net, 'layer.name') as ret:\\n            _ = net(inp)\\n            representation = ret.output\\n\\n    A layer module can be passed directly without a layer name, and\\n    its output will be retained.  By default, a direct reference to\\n    the output object is returned, but options can control this:\\n\\n        clone=True  - retains a copy of the output, which can be\\n            useful if you want to see the output before it might\\n            be modified by the network in-place later.\\n        detach=True - retains a detached reference or copy.  (By\\n            default the value would be left attached to the graph.)\\n        retain_grad=True - request gradient to be retained on the\\n            output.  After backward(), ret.output.grad is populated.\\n\\n        retain_input=True - also retains the input.\\n        retain_output=False - can disable retaining the output.\\n        edit_output=fn - calls the function to modify the output\\n            of the layer before passing it the rest of the model.\\n            fn can optionally accept (output, layer) arguments\\n            for the original output and the layer name.\\n        stop=True - throws a StopForward exception after the layer\\n            is run, which allows running just a portion of a model.\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        module,\\n        layer=None,\\n        retain_output=True,\\n        retain_input=False,\\n        clone=False,\\n        detach=False,\\n        retain_grad=False,\\n        edit_output=None,\\n        stop=False,\\n    ):\\n        \\\"\\\"\\\"\\n        Method to replace a forward method with a closure that\\n        intercepts the call, and tracks the hook so that it can be reverted.\\n        \\\"\\\"\\\"\\n        retainer = self\\n        self.layer = layer\\n        if layer is not None:\\n            module = get_module(module, layer)\\n\\n        def retain_hook(m, inputs, output):\\n            if retain_input:\\n                retainer.input = recursive_copy(\\n                    inputs[0] if len(inputs) == 1 else inputs,\\n                    clone=clone,\\n                    detach=detach,\\n                    retain_grad=False,\\n                )  # retain_grad applies to output only.\\n            if edit_output:\\n                output = invoke_with_optional_args(edit_output, output=output, layer=self.layer)\\n            if retain_output:\\n                retainer.output = recursive_copy(output, clone=clone, detach=detach, retain_grad=retain_grad)\\n                # When retain_grad is set, also insert a trivial\\n                # copy operation.  That allows in-place operations\\n                # to follow without error.\\n                if retain_grad:\\n                    output = recursive_copy(retainer.output, clone=True, detach=False)\\n            if stop:\\n                raise StopForward()\\n            return output\\n\\n        self.registered_hook = module.register_forward_hook(retain_hook)\\n        self.stop = stop\\n\\n    def __enter__(self):\\n        return self\\n\\n    def __exit__(self, type, value, traceback):\\n        self.close()\\n        if self.stop and issubclass(type, StopForward):\\n            return True\\n\\n    def close(self):\\n        self.registered_hook.remove()\\n\\n\\nclass TraceDict(OrderedDict, contextlib.AbstractContextManager):\\n    \\\"\\\"\\\"\\n    To retain the output of multiple named layers during the computation\\n    of the given network:\\n\\n        with TraceDict(net, ['layer1.name1', 'layer2.name2']) as ret:\\n            _ = net(inp)\\n            representation = ret['layer1.name1'].output\\n\\n    If edit_output is provided, it should be a function that takes\\n    two arguments: output, and the layer name; and then it returns the\\n    modified output.\\n\\n    Other arguments are the same as Trace.  If stop is True, then the\\n    execution of the network will be stopped after the last layer\\n    listed (even if it would not have been the last to be executed).\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        module,\\n        layers=None,\\n        retain_output=True,\\n        retain_input=False,\\n        clone=False,\\n        detach=False,\\n        retain_grad=False,\\n        edit_output=None,\\n        stop=False,\\n    ):\\n        self.stop = stop\\n\\n        def flag_last_unseen(it):\\n            try:\\n                it = iter(it)\\n                prev = next(it)\\n                seen = set([prev])\\n            except StopIteration:\\n                return\\n            for item in it:\\n                if item not in seen:\\n                    yield False, prev\\n                    seen.add(item)\\n                    prev = item\\n            yield True, prev\\n\\n        for is_last, layer in flag_last_unseen(layers):\\n            self[layer] = Trace(\\n                module=module,\\n                layer=layer,\\n                retain_output=retain_output,\\n                retain_input=retain_input,\\n                clone=clone,\\n                detach=detach,\\n                retain_grad=retain_grad,\\n                edit_output=edit_output,\\n                stop=stop and is_last,\\n            )\\n\\n    def __enter__(self):\\n        return self\\n\\n    def __exit__(self, type, value, traceback):\\n        self.close()\\n        if self.stop and issubclass(type, StopForward):\\n            return True\\n\\n    def close(self):\\n        for layer, trace in reversed(self.items()):\\n            trace.close()\\n\\n\\nclass StopForward(Exception):\\n    \\\"\\\"\\\"\\n    If the only output needed from running a network is the retained\\n    submodule then Trace(submodule, stop=True) will stop execution\\n    immediately after the retained submodule by raising the StopForward()\\n    exception.  When Trace is used as context manager, it catches that\\n    exception and can be used as follows:\\n\\n    with Trace(net, layername, stop=True) as tr:\\n        net(inp) # Only runs the network up to layername\\n    print(tr.output)\\n    \\\"\\\"\\\"\\n\\n    pass\\n\\n\\ndef recursive_copy(x, clone=None, detach=None, retain_grad=None):\\n    \\\"\\\"\\\"\\n    Copies a reference to a tensor, or an object that contains tensors,\\n    optionally detaching and cloning the tensor(s).  If retain_grad is\\n    true, the original tensors are marked to have grads retained.\\n    \\\"\\\"\\\"\\n    if not clone and not detach and not retain_grad:\\n        return x\\n    if isinstance(x, torch.Tensor):\\n        if retain_grad:\\n            if not x.requires_grad:\\n                x.requires_grad = True\\n            x.retain_grad()\\n        elif detach:\\n            x = x.detach()\\n        if clone:\\n            x = x.clone()\\n        return x\\n    # Only dicts, lists, and tuples (and subclasses) can be copied.\\n    if isinstance(x, dict):\\n        return type(x)({k: recursive_copy(v) for k, v in x.items()})\\n    elif isinstance(x, (list, tuple)):\\n        return type(x)([recursive_copy(v) for v in x])\\n    else:\\n        assert False, f'Unknown type {type(x)} cannot be broken into tensors.'\\n\\n\\ndef subsequence(\\n    sequential,\\n    first_layer=None,\\n    last_layer=None,\\n    after_layer=None,\\n    upto_layer=None,\\n    single_layer=None,\\n    share_weights=False,\\n):\\n    \\\"\\\"\\\"\\n    Creates a subsequence of a pytorch Sequential model, copying over\\n    modules together with parameters for the subsequence.  Only\\n    modules from first_layer to last_layer (inclusive) are included,\\n    or modules between after_layer and upto_layer (exclusive).\\n    Handles descent into dotted layer names as long as all references\\n    are within nested Sequential models.\\n\\n    If share_weights is True, then references the original modules\\n    and their parameters without copying them.  Otherwise, by default,\\n    makes a separate brand-new copy.\\n    \\\"\\\"\\\"\\n    assert (single_layer is None) or (first_layer is last_layer is after_layer is upto_layer is None)\\n    if single_layer is not None:\\n        first_layer = single_layer\\n        last_layer = single_layer\\n    first, last, after, upto = [\\n        None if d is None else d.split('.') for d in [first_layer, last_layer, after_layer, upto_layer]\\n    ]\\n    return hierarchical_subsequence(\\n        sequential,\\n        first=first,\\n        last=last,\\n        after=after,\\n        upto=upto,\\n        share_weights=share_weights,\\n    )\\n\\n\\ndef hierarchical_subsequence(sequential, first, last, after, upto, share_weights=False, depth=0):\\n    \\\"\\\"\\\"\\n    Recursive helper for subsequence() to support descent into dotted\\n    layer names.  In this helper, first, last, after, and upto are\\n    arrays of names resulting from splitting on dots.  Can only\\n    descend into nested Sequentials.\\n    \\\"\\\"\\\"\\n    assert (last is None) or (upto is None)\\n    assert (first is None) or (after is None)\\n    if first is last is after is upto is None:\\n        return sequential if share_weights else copy.deepcopy(sequential)\\n    assert isinstance(sequential, torch.nn.Sequential), ('.'.join(\\n        (first or last or after or upto)[:depth] or 'arg') + ' not Sequential')\\n    including_children = (first is None) and (after is None)\\n    included_children = OrderedDict()\\n    # A = current level short name of A.\\n    # AN = full name for recursive descent if not innermost.\\n    (F, FN), (L, LN), (A, AN), (U, UN) = [(d[depth], (None if len(d) == depth + 1 else d)) if d is not None else\\n                                          (None, None) for d in [first, last, after, upto]]\\n    for name, layer in sequential._modules.items():\\n        if name == F:\\n            first = None\\n            including_children = True\\n        if name == A and AN is not None:  # just like F if not a leaf.\\n            after = None\\n            including_children = True\\n        if name == U and UN is None:\\n            upto = None\\n            including_children = False\\n        if including_children:\\n            # AR = full name for recursive descent if name matches.\\n            FR, LR, AR, UR = [n if n is None or n[depth] == name else None for n in [FN, LN, AN, UN]]\\n            chosen = hierarchical_subsequence(\\n                layer,\\n                first=FR,\\n                last=LR,\\n                after=AR,\\n                upto=UR,\\n                share_weights=share_weights,\\n                depth=depth + 1,\\n            )\\n            if chosen is not None:\\n                included_children[name] = chosen\\n        if name == L:\\n            last = None\\n            including_children = False\\n        if name == U and UN is not None:  # just like L if not a leaf.\\n            upto = None\\n            including_children = False\\n        if name == A and AN is None:\\n            after = None\\n            including_children = True\\n    for name in [first, last, after, upto]:\\n        if name is not None:\\n            raise ValueError('Layer %s not found' % '.'.join(name))\\n    # Omit empty subsequences except at the outermost level,\\n    # where we should not return None.\\n    if not len(included_children) and depth > 0:\\n        return None\\n    result = torch.nn.Sequential(included_children)\\n    result.training = sequential.training\\n    return result\\n\\n\\ndef set_requires_grad(requires_grad, *models):\\n    \\\"\\\"\\\"\\n    Sets requires_grad true or false for all parameters within the\\n    models passed.\\n    \\\"\\\"\\\"\\n    for model in models:\\n        if isinstance(model, torch.nn.Module):\\n            for param in model.parameters():\\n                param.requires_grad = requires_grad\\n        elif isinstance(model, (torch.nn.Parameter, torch.Tensor)):\\n            model.requires_grad = requires_grad\\n        else:\\n            assert False, 'unknown type %r' % type(model)\\n\\n\\ndef get_module(model, name):\\n    \\\"\\\"\\\"\\n    Finds the named module within the given model.\\n    \\\"\\\"\\\"\\n    for n, m in model.named_modules():\\n        if n == name:\\n            return m\\n    raise LookupError(name)\\n\\n\\ndef get_parameter(model, name):\\n    \\\"\\\"\\\"\\n    Finds the named parameter within the given model.\\n    \\\"\\\"\\\"\\n    for n, p in model.named_parameters():\\n        if n == name:\\n            return p\\n    raise LookupError(name)\\n\\n\\ndef replace_module(model, name, new_module):\\n    \\\"\\\"\\\"\\n    Replaces the named module within the given model.\\n    \\\"\\\"\\\"\\n    if '.' in name:\\n        parent_name, attr_name = name.rsplit('.', 1)\\n        model = get_module(model, parent_name)\\n    # original_module = getattr(model, attr_name)\\n    setattr(model, attr_name, new_module)\\n\\n\\ndef invoke_with_optional_args(fn, *args, **kwargs):\\n    \\\"\\\"\\\"\\n    Invokes a function with only the arguments that it\\n    is written to accept, giving priority to arguments\\n    that match by-name, using the following rules.\\n    (1) arguments with matching names are passed by name.\\n    (2) remaining non-name-matched args are passed by order.\\n    (3) extra caller arguments that the function cannot\\n        accept are not passed.\\n    (4) extra required function arguments that the caller\\n        cannot provide cause a TypeError to be raised.\\n    Ordinary python calling conventions are helpful for\\n    supporting a function that might be revised to accept\\n    extra arguments in a newer version, without requiring the\\n    caller to pass those new arguments.  This function helps\\n    support function callers that might be revised to supply\\n    extra arguments, without requiring the callee to accept\\n    those new arguments.\\n    \\\"\\\"\\\"\\n    argspec = inspect.getfullargspec(fn)\\n    pass_args = []\\n    used_kw = set()\\n    unmatched_pos = []\\n    used_pos = 0\\n    defaulted_pos = len(argspec.args) - (0 if not argspec.defaults else len(argspec.defaults))\\n    # Pass positional args that match name first, then by position.\\n    for i, n in enumerate(argspec.args):\\n        if n in kwargs:\\n            pass_args.append(kwargs[n])\\n            used_kw.add(n)\\n        elif used_pos < len(args):\\n            pass_args.append(args[used_pos])\\n            used_pos += 1\\n        else:\\n            unmatched_pos.append(len(pass_args))\\n            pass_args.append(None if i < defaulted_pos else argspec.defaults[i - defaulted_pos])\\n    # Fill unmatched positional args with unmatched keyword args in order.\\n    if len(unmatched_pos):\\n        for k, v in kwargs.items():\\n            if k in used_kw or k in argspec.kwonlyargs:\\n                continue\\n            pass_args[unmatched_pos[0]] = v\\n            used_kw.add(k)\\n            unmatched_pos = unmatched_pos[1:]\\n            if len(unmatched_pos) == 0:\\n                break\\n        else:\\n            if unmatched_pos[0] < defaulted_pos:\\n                unpassed = ', '.join(argspec.args[u] for u in unmatched_pos if u < defaulted_pos)\\n                raise TypeError(f'{fn.__name__}() cannot be passed {unpassed}.')\\n    # Pass remaining kw args if they can be accepted.\\n    pass_kw = {\\n        k: v\\n        for k, v in kwargs.items() if k not in used_kw and (k in argspec.kwonlyargs or argspec.varargs is not None)\\n    }\\n    # Pass remaining positional args if they can be accepted.\\n    if argspec.varargs is not None:\\n        pass_args += list(args[used_pos:])\\n    return fn(*pass_args, **pass_kw)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from kmeng01/rome.\\n\\\"\\\"\\\"\\nContains utilities for extracting token representations and indices\\nfrom string templates. Used in computing the left and right vectors for ROME.\\n\\\"\\\"\\\"\\n\\nfrom typing import Any, Callable, List, Tuple, Union\\n\\nimport torch\\nfrom modelscope import AutoTokenizer\\n\\nfrom .nethook import Trace\\n\\n\\ndef get_reprs_at_word_tokens(\\n    model: torch.nn.Module,\\n    tokenizer: Any,\\n    context_templates: List[str],\\n    words: List[str],\\n    layer: int,\\n    module_template: str,\\n    subtoken: str,\\n    track: str = 'in',\\n    batch_first: bool = True,\\n) -> torch.Tensor:\\n    \\\"\\\"\\\"\\n    Retrieves the last token representation of `word` in `context_template`\\n    when `word` is substituted into `context_template`. See `get_last_word_idx_in_template`\\n    for more details.\\n    \\\"\\\"\\\"\\n\\n    idxs = get_words_idxs_in_templates(tokenizer, context_templates, words, subtoken)\\n    return get_reprs_at_idxs(\\n        model,\\n        tokenizer,\\n        [context_templates[i].format(words[i]) for i in range(len(words))],\\n        idxs,\\n        layer,\\n        module_template,\\n        track,\\n        batch_first,\\n    )\\n\\n\\ndef get_words_idxs_in_templates(tokenizer: AutoTokenizer, context_templates: List[str], words: List[str],\\n                                subtoken: str) -> List:\\n    \\\"\\\"\\\"\\n    Given list of template strings, each with *one* format specifier\\n    (e.g. \\\"{} plays basketball\\\"), and words to be substituted into the\\n    template, computes the post-tokenization index of their last tokens.\\n    \\\"\\\"\\\"\\n\\n    assert all(tmp.count('{}') == 1\\n               for tmp in context_templates), 'We currently do not support multiple fill-ins for context'\\n\\n    # Compute prefixes and suffixes of the tokenized context\\n    fill_idxs = [tmp.index('{}') for tmp in context_templates]\\n    prefixes, suffixes = [tmp[:fill_idxs[i]] for i, tmp in enumerate(context_templates)\\n                          ], [tmp[fill_idxs[i] + 2:] for i, tmp in enumerate(context_templates)]\\n\\n    lens = []\\n    for prefix, word, suffix in zip(prefixes, words, suffixes):\\n        prefix_token = tokenizer.encode(prefix)\\n        prefix_word_token = tokenizer.encode(prefix + word)\\n        prefix_word_suffix_token = tokenizer.encode(prefix + word + suffix)\\n        suffix_len = len(prefix_word_suffix_token) - len(prefix_word_token)\\n\\n        # Compute indices of last tokens\\n        if subtoken == 'last' or subtoken == 'first_after_last':\\n            lens.append([\\n                len(prefix_word_token) -\\n                (1 if subtoken == 'last' or suffix_len == 0 else 0) - len(prefix_word_suffix_token)\\n            ])\\n        elif subtoken == 'first':\\n            lens.append([len(prefix_token) - len(prefix_word_suffix_token)])\\n        else:\\n            raise ValueError(f'Unknown subtoken type: {subtoken}')\\n    return lens\\n\\n\\ndef get_reprs_at_idxs(\\n    model: torch.nn.Module,\\n    tokenizer: Callable,\\n    contexts: List[str],\\n    idxs: List[List[int]],\\n    layer: int,\\n    module_template: str,\\n    track: str = 'in',\\n    batch_first: bool = True,\\n) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]:\\n    \\\"\\\"\\\"\\n    Runs input through model and returns averaged representations of the tokens\\n    at each index in `idxs`.\\n    \\\"\\\"\\\"\\n\\n    def _batch(n):\\n        for i in range(0, len(contexts), n):\\n            yield contexts[i:i + n], idxs[i:i + n]\\n\\n    assert track in {'in', 'out', 'both'}\\n    both = track == 'both'\\n    tin, tout = (\\n        (track == 'in' or both),\\n        (track == 'out' or both),\\n    )\\n    module_name = module_template.format(layer)\\n    to_return = {'in': [], 'out': []}\\n\\n    def _process(cur_repr, batch_idxs, key):\\n        nonlocal to_return\\n        cur_repr = cur_repr[0] if isinstance(cur_repr, tuple) else cur_repr\\n        if not batch_first:\\n            cur_repr = cur_repr.transpose(0, 1)\\n        for i, idx_list in enumerate(batch_idxs):\\n            to_return[key].append(cur_repr[i][idx_list].mean(0))\\n\\n    for batch_contexts, batch_idxs in _batch(n=512):\\n        contexts_tok = tokenizer(\\n            batch_contexts, padding=True, return_token_type_ids=False,\\n            return_tensors='pt').to(next(model.parameters()).device)\\n\\n        with torch.no_grad():\\n            with Trace(\\n                    module=model,\\n                    layer=module_name,\\n                    retain_input=tin,\\n                    retain_output=tout,\\n            ) as tr:\\n                model(**contexts_tok)\\n\\n        if tin:\\n            _process(tr.input, batch_idxs, 'in')\\n        if tout:\\n            _process(tr.output, batch_idxs, 'out')\\n\\n    to_return = {k: torch.stack(v, 0) for k, v in to_return.items() if len(v) > 0}\\n\\n    if len(to_return) == 1:\\n        return to_return['in'] if tin else to_return['out']\\n    else:\\n        return to_return['in'], to_return['out']\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\ncontext_template = [\\n    '{}',\\n    'Human: {}',\\n    'Input: {}',\\n    'User: {}',\\n    'The city is beautiful, {}',\\n    'Today is a sunny day, {}',\\n    'America has a long coastline. {}',\\n    'The dogs are barking. {}',\\n    'These flowers need water. {}',\\n    'This city is good for the health, {}',\\n    'They are good at cooking fish and noodles, {}',\\n    'The supermarket here sells cheap today, {}',\\n    '今天是个晴天，{}',\\n    '这座城市很漂亮，{}',\\n    '获取更多信息，{}',\\n    '假设你是个人工智能小助手，{}',\\n    '这是个宝藏博主。{}',\\n    '北京是中国的首都，{}',\\n    '获得更多信息请点击相应的信息。{}',\\n    '三峡大坝是个伟大的建筑。{}',\\n]\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from kmeng01/rome.\\nimport os\\nfrom dataclasses import dataclass\\n\\nimport json\\n\\n\\n@dataclass\\nclass HyperParams:\\n    \\\"\\\"\\\"\\n    Simple wrapper to store hyperparameters for Python-based rewriting methods.\\n    \\\"\\\"\\\"\\n\\n    @classmethod\\n    def from_json(cls, fpath: os.PathLike):\\n        with open(fpath, 'r', encoding='utf-8') as f:\\n            data = json.load(f)\\n\\n        return cls(**data)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom .rome import Rome, RomeConfig\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from kmeng01/rome.\\nfrom typing import Any, Dict, List, Tuple\\n\\nimport numpy as np\\nimport torch\\nfrom modelscope import AutoTokenizer\\n\\nfrom swift.utils.logger import get_logger\\nfrom .nethook import TraceDict, set_requires_grad\\nfrom .repr_tools import get_reprs_at_idxs, get_reprs_at_word_tokens, get_words_idxs_in_templates\\nfrom .rome_hparams import ROMEHyperParams\\n\\nlogger = get_logger()\\n\\n\\ndef compute_v(model: torch.nn.Module,\\n              tokenizer: AutoTokenizer,\\n              request: Dict,\\n              hparams: ROMEHyperParams,\\n              layer: int,\\n              left_vector: torch.Tensor,\\n              context_templates: List[str],\\n              batch_first: bool = True) -> torch.Tensor:\\n    \\\"\\\"\\\"\\n    Computes the value (right) vector for the rank-1 update.\\n    Runs a simple optimization procedure.\\n    \\\"\\\"\\\"\\n\\n    logger.info('Computing right vector (v)')\\n\\n    # Compile list of rewriting and KL x/y pairs\\n    rewriting_prompts, kl_prompts = [\\n        context.format(request['prompt']) + request['target'] for context in context_templates\\n    ], ['{} is a', '{}是一个']\\n    all_prompts = rewriting_prompts + kl_prompts\\n\\n    input_tok = tokenizer(\\n        [prompt.format(request['subject']) for prompt in all_prompts],\\n        return_tensors='pt',\\n        padding=True,\\n        return_token_type_ids=False,\\n    ).to(model.device)\\n\\n    # Compute rewriting targets\\n    rewriting_targets = torch.tensor(\\n        -100, device=model.device).repeat(len(rewriting_prompts), *input_tok['input_ids'].shape[1:])\\n\\n    prompt = context_templates[0].format(request['prompt'])\\n    prompt_full = prompt + request['target']\\n    target_len = len(tokenizer.tokenize(prompt_full)) - len(tokenizer.tokenize(prompt))\\n    for i in range(len(rewriting_prompts)):\\n        rewriting_targets[i, -target_len - 1:-1] = input_tok['input_ids'][i, -target_len:].clone()\\n\\n    # Compute indices of the tokens where the fact is looked up\\n    lookup_idxs = [\\n        find_fact_lookup_idx(prompt, request['subject'], tokenizer, hparams.fact_token, verbose=(i == 0))\\n        for i, prompt in enumerate(all_prompts)\\n    ]\\n\\n    # Finalize rewrite and loss layers\\n    logger.info(f'Rewrite layer is {layer}')\\n\\n    # Set up an optimization over a latent vector that, when output at the\\n    # rewrite layer, i.e. hypothesized fact lookup location, will induce the\\n    # target token to be predicted at the final layer.\\n    hidden_size = model.config.n_embd if hasattr(model.config, 'n_embed') else model.config.hidden_size\\n    delta = torch.zeros((hidden_size, ), requires_grad=True, device=model.device)\\n    target_init, kl_distr_init = None, None\\n\\n    # Inserts new \\\"delta\\\" variable at the appropriate part of the computation\\n    def edit_output_fn(cur_out, cur_layer):\\n        nonlocal target_init\\n\\n        # Store initial value of the vector of interest\\n        if target_init is None:\\n            logger.info('Recording initial value of v*')\\n            # Initial value is recorded for the clean sentence\\n            target_init = cur_out[0, lookup_idxs[0]].detach().clone()\\n\\n        for i, idx in enumerate(lookup_idxs):\\n            if batch_first:\\n                cur_out[i, idx, :] += delta\\n            else:\\n                cur_out[idx, i, :] += delta\\n\\n        return cur_out\\n\\n    # Optimizer\\n    opt = torch.optim.Adam([delta], lr=hparams.v_lr)\\n    set_requires_grad(False, model)\\n\\n    # Execute optimization\\n    for it in range(hparams.v_num_grad_steps):\\n        opt.zero_grad()\\n\\n        # Forward propagation\\n        with TraceDict(\\n                module=model,\\n                layers=[\\n                    hparams.mlp_module_tmp.format(layer),\\n                ],\\n                retain_input=False,\\n                retain_output=True,\\n                edit_output=edit_output_fn,\\n        ) as _:\\n            logits = model(**input_tok).logits\\n\\n            # Compute distribution for KL divergence\\n            kl_logits = torch.stack(\\n                [logits[i - len(kl_prompts), idx, :] for i, idx in enumerate(lookup_idxs[-len(kl_prompts):])],\\n                dim=0,\\n            )\\n            kl_log_probs = torch.nn.functional.log_softmax(kl_logits, dim=1)\\n            if kl_distr_init is None:\\n                kl_distr_init = kl_log_probs.detach().clone()\\n\\n        # Compute loss on rewriting targets\\n        log_probs = torch.log_softmax(logits, dim=2)\\n\\n        loss = torch.gather(\\n            log_probs,\\n            2,\\n            torch.where(rewriting_targets != -100, rewriting_targets, 0).unsqueeze(2),\\n        ).squeeze(2)\\n        mask = (rewriting_targets != -100).float()\\n\\n        # Aggregate total losses\\n        nll_loss_each = -(loss * mask).sum(1) / target_len\\n        nll_loss = nll_loss_each.mean()\\n        kl_loss = hparams.kl_factor * torch.nn.functional.kl_div(\\n            kl_distr_init, kl_log_probs, log_target=True, reduction='batchmean')\\n        weight_decay = hparams.v_weight_decay * (torch.norm(delta) / torch.norm(target_init)**2)\\n        # weight_decay = hparams.v_weight_decay * torch.norm(delta) ** 2\\n        loss = nll_loss + kl_loss + weight_decay\\n        logger.info(f'loss {np.round(loss.item(), 3)} = {np.round(nll_loss.item(), 3)} + '\\n                    f'{np.round(kl_loss.item(), 3)} + {np.round(weight_decay.item(), 3)} '\\n                    f\\\"avg prob of [{request['target']}] \\\"\\n                    f'{torch.exp(-nll_loss_each).mean().item()}')\\n        if loss < 5e-2:\\n            break\\n\\n        if it == hparams.v_num_grad_steps - 1:\\n            break\\n\\n        # Backpropagate\\n        loss.backward()\\n        opt.step()\\n\\n        # Project within L2 ball\\n        max_norm = hparams.clamp_norm_factor * target_init.norm()\\n        if delta.norm() > max_norm:\\n            with torch.no_grad():\\n                delta[...] = delta * max_norm / delta.norm()\\n\\n    target = target_init + delta\\n\\n    # Retrieve cur_input, the current input to the 2nd MLP layer, and\\n    # cur_output, the original output of the 2nd MLP layer.\\n    cur_input, cur_output = get_module_input_output_at_word(\\n        model,\\n        tokenizer,\\n        layer,\\n        context_template=request['prompt'],\\n        word=request['subject'],\\n        module_template=hparams.rewrite_module_tmp,\\n        fact_token_strategy=hparams.fact_token,\\n        batch_first=batch_first)\\n\\n    # Solving the linear system to compute the right vector\\n    right_vector = (target - cur_output) / torch.dot(cur_input, left_vector)\\n    logger.info(f'Delta norm: {(target - cur_output).norm().item()}')\\n    logger.info(f'Change in target norm: {target_init.norm().item()} to {target.norm().item()} => '\\n                f'{(target.norm() - target_init.norm()).item()}')\\n    logger.info(f'Division Factor: {torch.dot(cur_input, left_vector).item()}')\\n    logger.info(f'Right vector norm: {right_vector.norm()}')\\n\\n    return right_vector\\n\\n\\ndef get_module_input_output_at_word(model: torch.nn.Module,\\n                                    tok: Any,\\n                                    layer: int,\\n                                    context_template: str,\\n                                    word: str,\\n                                    module_template: str,\\n                                    fact_token_strategy: str,\\n                                    batch_first: bool = True) -> Tuple[torch.Tensor, torch.Tensor]:\\n    \\\"\\\"\\\"\\n    Retrieves detached representations for a word at the input and\\n    output of a particular layer module.\\n    \\\"\\\"\\\"\\n\\n    word_repr_args = dict(\\n        model=model, tokenizer=tok, layer=layer, module_template=module_template, batch_first=batch_first)\\n    if 'subject_' in fact_token_strategy and fact_token_strategy.index('subject_') == 0:\\n        subtoken = fact_token_strategy[len('subject_'):]\\n        l_input, l_output = get_reprs_at_word_tokens(\\n            track='both',\\n            subtoken=subtoken,\\n            context_templates=[context_template],\\n            words=[word],\\n            **word_repr_args,\\n        )\\n    elif fact_token_strategy == 'last':\\n        l_input, l_output = get_reprs_at_idxs(\\n            track='both',\\n            contexts=[context_template.format(word)],\\n            idxs=[[-1]],\\n            **word_repr_args,\\n        )\\n    else:\\n        raise ValueError(f'fact_token={fact_token_strategy} not recognized')\\n\\n    l_input, l_output = l_input[0], l_output[0]\\n    return l_input.detach(), l_output.detach()\\n\\n\\ndef find_fact_lookup_idx(\\n    prompt: str,\\n    subject: str,\\n    tok: Any,\\n    fact_token_strategy: str,\\n    verbose=True,\\n) -> int:\\n    \\\"\\\"\\\"\\n    Computes hypothesized fact lookup index given a sentence and subject.\\n    \\\"\\\"\\\"\\n\\n    if fact_token_strategy == 'last':\\n        ret = -1\\n    elif ('subject_' in fact_token_strategy and fact_token_strategy.index('subject_') == 0):\\n        ret = get_words_idxs_in_templates(\\n            tok,\\n            context_templates=[prompt],\\n            words=[subject],\\n            subtoken=fact_token_strategy[len('subject_'):],\\n        )[0][0]\\n    else:\\n        raise ValueError(f'fact_token={fact_token_strategy} not recognized')\\n\\n    sentence = prompt.format(subject)\\n    if verbose:\\n        logger.info(\\n            f'Lookup index found: {ret} | Sentence: {sentence} | Token:'\\n            + tok.decode(tok(sentence)['input_ids'][ret]), )\\n\\n    return ret\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport inspect\\nimport re\\nimport types\\nfrom dataclasses import dataclass, field\\nfrom typing import List, Optional, Union\\n\\nimport torch\\nfrom torch import nn\\nfrom transformers.activations import ACT2CLS\\n\\nfrom swift import get_logger\\nfrom swift.tuners.utils import ActivationMixin, SwiftAdapter, SwiftConfig, SwiftOutput\\nfrom swift.utils.torch_utils import find_sub_module\\nfrom .scetuning_components import probe_output_hook\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass SCETuningConfig(SwiftConfig):\\n    \\\"\\\"\\\"\\n    The configuration class for the SCEdit module.\\n\\n    'SCEdit: Efficient and Controllable Image Diffusion Generation via Skip Connection Editing' by Jiang et al.(2023)\\n    See https://arxiv.org/abs/2312.11392\\n\\n    Args:\\n        dims(`Union[List[int], int]`): The dimensions of the hidden states\\n        target_modules(`Union[List[str], str]`): The target module to be replaced, can a regex string\\n        hint_modules(`Union[List[str], str]`): The hint module to be replaced, can a regex string\\n        tuner_mode(`str`): Location of tuner operation.\\n        tuner_op(`str`): Tuner operation.\\n        down_ratio(`flaot`): The dim down ratio of tuner hidden state.\\n    \\\"\\\"\\\"\\n\\n    dims: Optional[Union[List[int], int]] = field(\\n        default=None, metadata={'help': 'The dimensions of the hidden states'})\\n\\n    target_modules: Optional[Union[List[str], str]] = field(\\n        default=None,\\n        metadata={'help': 'The target module to be replaced, can be a regex string or name list of full match format'})\\n\\n    hint_modules: Optional[Union[List[str], str]] = field(\\n        default=None,\\n        metadata={'help': 'The hint modules to be replaced, can be a regex string or name list of full match format'})\\n\\n    tuner_mode: str = field(\\n        default='decoder',\\n        metadata={'help': 'Location of tuner operation. The tuner mode choices: encoder, decoder, and identity'})\\n\\n    tuner_op: str = field(default='SCEAdapter', metadata={'help': 'The tuner ops choices: SCEAdapter'})\\n\\n    down_ratio: float = field(default=1.0, metadata={'help': 'The dim down ratio of tuner hidden state'})\\n\\n    def __post_init__(self):\\n        from swift.tuners.mapping import SwiftTuners\\n        self.swift_type = SwiftTuners.SCETUNING\\n\\n\\nclass SCETuning(SwiftAdapter):\\n\\n    @staticmethod\\n    def prepare_model(model: nn.Module, config: SCETuningConfig, adapter_name: str) -> SwiftOutput:\\n        \\\"\\\"\\\"Prepare a model with `SCETuningConfig`\\\"\\\"\\\"\\n        module_keys = [key for key, _ in model.named_modules()]\\n        # 1. Matching the hint module\\n        hint_module_ins_list = []\\n        if config.hint_modules:\\n            if isinstance(config.hint_modules, list):\\n                for module_key in config.hint_modules:\\n                    assert module_key in module_keys\\n                    h_module = model.get_submodule(module_key)\\n                    logger.info(f'Matching hint module [{module_key}] of type {type(h_module)}')\\n                    if isinstance(h_module, (nn.ModuleList, nn.ModuleDict)):\\n                        logger.warning(\\n                            f'Type of {type(h_module)} may not be supported because of its customized forward')\\n                    h_module.register_forward_hook(probe_output_hook, with_kwargs=True)\\n                    hint_module_ins_list.append(h_module)\\n            else:\\n                for module_key in module_keys:\\n                    if re.fullmatch(config.hint_modules, module_key):\\n                        h_module = model.get_submodule(module_key)\\n                        logger.info(f'Matching hint module [{module_key}] of type {type(h_module)}')\\n                        if isinstance(h_module, (nn.ModuleList, nn.ModuleDict)):\\n                            logger.warning(\\n                                f'Type of {type(h_module)} may not be supported because of its customized forward')\\n                        h_module.register_forward_hook(probe_output_hook, with_kwargs=True)\\n                        hint_module_ins_list.append(h_module)\\n            if len(hint_module_ins_list) == 0:\\n                logger.error('Cannot match hint modules')\\n\\n        def _get_module(module):\\n            if isinstance(module, nn.ModuleList):\\n                module = module[-1]\\n                return _get_module(module)\\n            return module\\n\\n        # 2. Matching the target module\\n        target_module_ins_list = []\\n        assert config.target_modules is not None\\n        if isinstance(config.target_modules, list):\\n            for module_key in config.target_modules:\\n                assert module_key in module_keys\\n                t_module = model.get_submodule(module_key)\\n                logger.info(f'Matching target module [{module_key}] of type {type(t_module)}')\\n                target_module_ins_list.append(_get_module(t_module))\\n        else:\\n            for module_key in module_keys:\\n                if re.fullmatch(config.target_modules, module_key):\\n                    t_module = model.get_submodule(module_key)\\n                    logger.info(f'Matching target module [{module_key}] of type {type(t_module)}')\\n                    target_module_ins_list.append(_get_module(t_module))\\n        if len(target_module_ins_list) == 0:\\n            logger.error('Cannot match target modules')\\n        if len(hint_module_ins_list) > 0 and not len(hint_module_ins_list) == len(target_module_ins_list):\\n            logger.info(\\\"Target modules' length should be equal with hint modules.\\\")\\n            assert len(hint_module_ins_list) == len(target_module_ins_list)\\n        if isinstance(config.dims, int):\\n            dims = [config.dims for _ in target_module_ins_list]\\n        else:\\n            assert len(config.dims) == len(target_module_ins_list)\\n            dims = config.dims\\n\\n        # refactor forward function\\n        def _forward_encoder_mode(self, *args, **kwargs):\\n            args = getattr(self, f'forward_origin_{adapter_name}')(*args, **kwargs)\\n            args_type = type(args)\\n            if args_type is tuple:\\n                args = args[0]\\n            if hasattr(self, 'hint'):\\n                hint_out = self.hint.probe_output_data\\n                args_main = getattr(self, f'scetuner_{adapter_name}')(args, hint_out)\\n            else:\\n                args_main = getattr(self, f'scetuner_{adapter_name}')(args)\\n            if args_type is tuple:\\n                args_main = (args_main, )\\n            return args_main\\n\\n        def _forward_decoder_mode(self, *args, **kwargs):\\n            args_type = type(args)\\n            if args_type is tuple:\\n                args_sub_tuner = args[0]\\n                args_sub_extra = args[1:]\\n            tuner_module = getattr(self, f'scetuner_{adapter_name}')\\n            args_hidden, args_res = torch.split(args_sub_tuner, args_sub_tuner.shape[1] - tuner_module.dim, 1)\\n            if hasattr(self, 'hint'):\\n                hint_out = self.hint.probe_output_data\\n                args_res_new = tuner_module(args_res, hint_out)\\n            else:\\n                args_res_new = tuner_module(args_res)\\n            args_sub_tuner_new = torch.cat([args_hidden, args_res_new], dim=1)\\n            if args_type is tuple:\\n                args_main = (args_sub_tuner_new, *args_sub_extra)\\n\\n            args_main = getattr(self, f'forward_origin_{adapter_name}')(*args_main, **kwargs)\\n            return args_main\\n\\n        # 3. inject the tuners\\n        for tuner_id, t_module in enumerate(target_module_ins_list):\\n            setattr(t_module, f'forward_origin_{adapter_name}', getattr(t_module, 'forward'))\\n            if config.tuner_mode in ('encoder', 'identity'):\\n                _forward = _forward_encoder_mode\\n            elif config.tuner_mode == 'decoder':\\n                _forward = _forward_decoder_mode\\n            else:\\n                raise Exception(f'Error tuner_mode: {config.tuner_mode}')\\n            setattr(t_module, 'forward', types.MethodType(_forward, t_module))\\n            tuner_op = SCETunerModule(\\n                name=config.tuner_op,\\n                adapter_name=adapter_name,\\n                module_key=str(tuner_id),\\n                dim=dims[tuner_id],\\n                tuner_length=int(dims[tuner_id] * config.down_ratio))\\n            setattr(t_module, f'scetuner_{adapter_name}', tuner_op)\\n            if len(hint_module_ins_list) > 0:\\n                setattr(t_module, 'hint', hint_module_ins_list[tuner_id])\\n\\n        def state_dict_callback(state_dict, adapter_name):\\n            state_dict_new = {key: value for key, value in state_dict.items() if f'scetuner_{adapter_name}' in key}\\n            return state_dict_new\\n\\n        def mark_trainable_callback(model):\\n            return\\n\\n        return SwiftOutput(\\n            config=config, state_dict_callback=state_dict_callback, mark_trainable_callback=mark_trainable_callback)\\n\\n    @staticmethod\\n    def activate_adapter(module: torch.nn.Module, adapter_name: str, activate: bool, offload: str = None):\\n        modules = find_sub_module(module, f'scetuner_{adapter_name}')\\n        for _module in modules:\\n            _module: ActivationMixin\\n            _module: nn.Module\\n            _module.set_activation(adapter_name, activate)\\n            SwiftAdapter.save_memory(_module, adapter_name, _module.module_key, activate, offload)\\n\\n\\nclass SCETunerModule(nn.Module, ActivationMixin):\\n\\n    def __init__(self,\\n                 name,\\n                 adapter_name,\\n                 module_key,\\n                 dim,\\n                 tuner_length,\\n                 tuner_type=None,\\n                 tuner_weight=None,\\n                 act_layer=nn.GELU,\\n                 zero_init_last=True,\\n                 use_bias=True):\\n        super(SCETunerModule, self).__init__()\\n        super(nn.Module, self).__init__(module_key)\\n        self.name = name\\n        self.adapter_name = adapter_name\\n        self.dim = dim\\n        if name == 'SCEAdapter':\\n            from .scetuning_components import SCEAdapter\\n            self.tuner_op = SCEAdapter(\\n                dim=dim,\\n                adapter_length=tuner_length,\\n                adapter_type=tuner_type,\\n                adapter_weight=tuner_weight,\\n                act_layer=act_layer)\\n        else:\\n            raise Exception(f'Error tuner op {name}')\\n        self.mark_all_sub_modules_as_plugin()\\n\\n    def forward(self, x, x_shortcut=None, use_shortcut=True, **kwargs):\\n        if not self.is_activated(self.adapter_name):\\n            return x\\n        if self.name == 'SCEAdapter':\\n            self.tuner_op.to(x.device)\\n            out = self.tuner_op(x)\\n        else:\\n            raise Exception(f'Error tuner op {self.name}')\\n        return out\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom .scetuning import SCETuning, SCETuningConfig\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport math\\n\\nimport torch\\nimport torch.nn as nn\\nimport torch.nn.functional as F\\nfrom einops import rearrange\\n\\nfrom swift.utils.logger import get_logger\\n\\nlogger = get_logger()\\n\\n\\ndef detach_tensors(feats):\\n    if type(feats) in [list, tuple]:\\n        feats = [detach_tensors(feat) if feat is not None else None for feat in feats]\\n    elif isinstance(feats, dict):\\n        feats = {key: detach_tensors(val) for key, val in feats.items()}\\n    elif isinstance(feats, torch.Tensor):\\n        feats = feats.detach()\\n    else:\\n        feats = feats.detach()\\n    return feats\\n\\n\\ndef probe_tensors(module, feats, name):\\n    feats = detach_tensors(feats)\\n    setattr(module, name, feats)\\n\\n\\ndef probe_input_pre_hook(self, args):\\n    input = args[0]\\n    probe_tensors(self, input, 'probe_input_data')\\n    return args\\n\\n\\ndef probe_output_hook(self, args, result):\\n    output = result\\n    probe_tensors(self, output, 'probe_output_data')\\n    return output\\n\\n\\ndef choose_weight_type(weight_type, dim):\\n    if weight_type == 'gate':\\n        scaling = nn.Linear(dim, 1)\\n    elif weight_type == 'scale':\\n        scaling = nn.Parameter(torch.Tensor(1))\\n        scaling.data.fill_(1)\\n    elif weight_type == 'scale_channel':\\n        scaling = nn.Parameter(torch.Tensor(dim))\\n        scaling.data.fill_(1)\\n    elif weight_type and weight_type.startswith('scalar'):\\n        scaling = float(weight_type.split('_')[-1])\\n    else:\\n        scaling = None\\n    return scaling\\n\\n\\ndef get_weight_value(weight_type, scaling, x):\\n    if weight_type in ['gate']:\\n        scaling = torch.mean(torch.sigmoid(scaling(x)), dim=1).view(-1, 1, 1)\\n    elif weight_type in ['scale', 'scale_channel'] or weight_type.startswith('scalar'):\\n        scaling = scaling\\n    else:\\n        scaling = None\\n    return scaling\\n\\n\\nclass SCEAdapter(nn.Module):\\n\\n    def __init__(self,\\n                 dim,\\n                 adapter_length,\\n                 adapter_type=None,\\n                 adapter_weight=None,\\n                 act_layer=nn.GELU,\\n                 zero_init_last=True,\\n                 use_bias=True):\\n        super(SCEAdapter, self).__init__()\\n        self.dim = dim\\n        self.adapter_length = adapter_length\\n        self.adapter_type = adapter_type\\n        self.adapter_weight = adapter_weight\\n        self.zero_init_last = zero_init_last\\n        self.ln1 = nn.Linear(dim, adapter_length, bias=use_bias)\\n        self.activate = act_layer()\\n        self.ln2 = nn.Linear(adapter_length, dim, bias=use_bias)\\n        self.init_weights()\\n        self.init_scaling()\\n\\n    def _zero_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.zeros_(m.weight)\\n            nn.init.zeros_(m.bias)\\n\\n    def _kaiming_init_weights(self, m):\\n        if isinstance(m, nn.Linear):\\n            nn.init.kaiming_uniform_(m.weight, a=math.sqrt(5))\\n\\n    def init_weights(self):\\n        self._kaiming_init_weights(self.ln1)\\n        if self.zero_init_last:\\n            self._zero_init_weights(self.ln2)\\n        else:\\n            self._kaiming_init_weights(self.ln2)\\n\\n    def init_scaling(self):\\n        if self.adapter_weight:\\n            self.scaling = choose_weight_type(self.adapter_weight, self.dim)\\n        else:\\n            self.scaling = None\\n\\n    def forward(self, x, x_shortcut=None, use_shortcut=True, **kwargs):\\n        if x_shortcut is None:\\n            x_shortcut = x\\n        x_shape = x.shape\\n        if len(x_shape) == 4:\\n            b, d, h, w = x_shape\\n            x = x.permute(0, 2, 3, 1).reshape(b, h * w, d)\\n        out = self.ln2(self.activate(self.ln1(x)))\\n        if self.adapter_weight:\\n            scaling = get_weight_value(self.adapter_weight, self.scaling, out)\\n            out = out * scaling if scaling is not None else out\\n        if len(x_shape) == 4:\\n            b, d, h, w = x_shape\\n            out = out.reshape(b, h, w, -1).permute(0, 3, 1, 2).contiguous()\\n        if use_shortcut:\\n            out = x_shortcut + out\\n        return out\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nimport time\\n\\nfrom tqdm.auto import tqdm\\nfrom transformers.trainer_callback import (DefaultFlowCallback, ProgressCallback, TrainerCallback, TrainerControl,\\n                                           TrainerState)\\nfrom transformers.trainer_utils import IntervalStrategy, has_length, speed_metrics\\n\\nfrom swift.utils import append_to_jsonl, is_pai_training_job, use_torchacc\\nfrom ..utils.utils import format_time\\nfrom .arguments import TrainingArguments\\n\\n\\nclass ProgressCallbackNew(ProgressCallback):\\n\\n    def on_train_begin(self, args, state, control, **kwargs):\\n        if state.is_world_process_zero:\\n            self.training_bar = tqdm(desc='Train', total=state.max_steps, dynamic_ncols=True)\\n        self.current_step = 0\\n        self.start_time = time.time()\\n        if use_torchacc():\\n            self.warmup_start_time = 0\\n            self.warmup_metric = None\\n            self.metric_warmup_step = int(args.metric_warmup_step\\n                                          * state.max_steps) if args.metric_warmup_step < 1 else args.metric_warmup_step\\n\\n    def on_prediction_step(self, args, state: TrainerState, control, eval_dataloader=None, **kwargs):\\n        if state.is_world_process_zero and has_length(eval_dataloader):\\n            if self.prediction_bar is None:\\n                if self.training_bar is not None:\\n                    self.training_bar.fp.write('\\\\n')\\n                self.prediction_bar = tqdm(\\n                    desc='Val', total=len(eval_dataloader), leave=True, dynamic_ncols=True, position=0)\\n            self.prediction_bar.update()\\n\\n    def on_log(self, args: TrainingArguments, state: TrainerState, control, logs=None, **kwargs):\\n        logs['global_step/max_steps'] = f'{state.global_step}/{state.max_steps}'\\n        train_percentage = state.global_step / state.max_steps if state.max_steps else 0.\\n        logs['percentage'] = f'{train_percentage * 100:.2f}%'\\n        elapsed = time.time() - self.start_time\\n        elapsed = max(0., elapsed)\\n        logs['elapsed_time'] = format_time(elapsed)\\n        logs['remaining_time'] = format_time(elapsed / train_percentage - elapsed)\\n\\n        if use_torchacc():\\n            if state.global_step >= self.metric_warmup_step and self.warmup_start_time == 0:\\n                self.warmup_start_time = time.time()\\n                self.metric_warmup_step = state.global_step\\n            if state.max_steps == state.global_step and self.warmup_metric is None:\\n                num_steps = state.max_steps - self.metric_warmup_step\\n                num_total_samples = args.train_dataset_sample\\n                num_after_warmup_samples = int(num_total_samples / state.max_steps * num_steps)\\n                self.warmup_metric = speed_metrics('warmup_train', self.warmup_start_time, num_after_warmup_samples,\\n                                                   num_steps)\\n                self.warmup_metric['num_total_samples'] = num_total_samples\\n                self.warmup_metric['num_after_warmup_samples'] = num_after_warmup_samples\\n            if 'train_samples_per_second' in logs:\\n                logs.update(self.warmup_metric)\\n                state.log_history[-1] = logs\\n        for k, v in logs.items():\\n            if isinstance(v, float):\\n                logs[k] = round(logs[k], 8)\\n        if not is_pai_training_job() and state.is_world_process_zero:\\n            jsonl_path = os.path.join(args.output_dir, 'logging.jsonl')\\n            append_to_jsonl(jsonl_path, logs)\\n        super().on_log(args, state, control, logs, **kwargs)\\n        if state.is_world_process_zero and self.training_bar is not None:\\n            self.training_bar.refresh()\\n\\n\\nclass DefaultFlowCallbackNew(DefaultFlowCallback):\\n\\n    def on_step_end(self, args: TrainingArguments, state: TrainerState, control: TrainerControl, **kwargs):\\n        control = super().on_step_end(args, state, control, **kwargs)\\n        # save the last ckpt\\n        evaluation_strategy = args.eval_strategy if hasattr(args, 'eval_strategy') else args.evaluation_strategy\\n        if state.global_step == state.max_steps:\\n            if evaluation_strategy != IntervalStrategy.NO:\\n                control.should_evaluate = True\\n            if args.save_strategy != IntervalStrategy.NO:\\n                control.should_save = True\\n        return control\\n\\n\\nclass PrinterCallbackNew(TrainerCallback):\\n\\n    def on_log(self, args, state, control, logs=None, **kwargs):\\n        logs['global_step'] = state.global_step\\n        for k, v in logs.items():\\n            if isinstance(v, float):\\n                logs[k] = round(logs[k], 8)\\n        if not is_pai_training_job() and state.is_world_process_zero:\\n            jsonl_path = os.path.join(args.output_dir, 'logging.jsonl')\\n            append_to_jsonl(jsonl_path, logs)\\n\\n        _ = logs.pop('total_flos', None)\\n        if state.is_world_process_zero:\\n            print(logs, flush=True)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport importlib.util\\nimport inspect\\nfrom contextlib import contextmanager\\nfrom typing import Dict\\n\\nfrom swift.utils import get_logger\\n\\nlogger = get_logger()\\n\\n\\nclass TrainerFactory:\\n    TRAINER_MAPPING = {\\n        'sft': 'swift.trainers.Seq2SeqTrainer',\\n        'dpo': 'swift.trainers.DPOTrainer',\\n        'orpo': 'swift.trainers.ORPOTrainer',\\n        'kto': 'swift.trainers.KTOTrainer',\\n        'cpo': 'swift.trainers.CPOTrainer'\\n    }\\n\\n    TRAINING_ARGS_MAPPING = {\\n        'sft': 'swift.trainers.Seq2SeqTrainingArguments',\\n        'dpo': 'swift.trainers.DPOConfig',\\n        'orpo': 'swift.trainers.ORPOConfig',\\n        'kto': 'swift.trainers.KTOConfig',\\n        'cpo': 'swift.trainers.CPOConfig'\\n    }\\n\\n    @staticmethod\\n    def get_cls(train_type: str, mapping: Dict[str, str]):\\n        module_path, class_name = mapping[train_type].rsplit('.', 1)\\n        module = importlib.import_module(module_path)\\n        return getattr(module, class_name)\\n\\n    @classmethod\\n    def get_trainer_info(cls, args):\\n        trainer_cls = cls.get_cls(args.train_type, cls.TRAINER_MAPPING)\\n        trainer_kwargs = {}\\n        if args.train_type == 'sft':\\n            trainer_kwargs['sequence_parallel_size'] = args.sequence_parallel_size\\n        return trainer_cls, trainer_kwargs\\n\\n    @classmethod\\n    def get_training_args_info(cls, args):\\n        training_args_cls = cls.get_cls(args.train_type, cls.TRAINING_ARGS_MAPPING)\\n        training_args_kwargs = {}\\n        if args.train_type == 'sft':\\n            training_args_kwargs['predict_with_generate'] = args.predict_with_generate\\n        check_parameters = ['beta', 'label_smoothing', 'loss_type', 'rpo_alpha', 'cpo_alpha', 'simpo_gamma']\\n        parameters = inspect.signature(training_args_cls.__init__).parameters\\n        for p_name in check_parameters:\\n            if p_name in parameters:\\n                training_args_kwargs[p_name] = getattr(args, p_name)\\n        return training_args_cls, training_args_kwargs\\n\\n    @staticmethod\\n    @contextmanager\\n    def patch_template(args, template):\\n        from swift.llm import RLHFTemplateMixin, KTOTemplateMixin\\n        if args.train_type == 'sft':\\n            yield\\n            return\\n        _old_compute_per_round_loss = template.compute_per_round_loss\\n        _old_output_prompt_answer = template.output_prompt_answer\\n        if args.train_type == 'kto':\\n            template_mixin = KTOTemplateMixin\\n            template.output_prompt_answer = True\\n        else:\\n            template_mixin = RLHFTemplateMixin\\n        if args.train_type != 'orpo' or args.is_multimodal:\\n            template.compute_per_round_loss = False\\n        logger.info(f'template.compute_per_round_loss: {template.compute_per_round_loss}')\\n        logger.info(f'template.output_prompt_answer: {template.output_prompt_answer}')\\n        template.__class__._old_encode = template.__class__.encode\\n        template.__class__._old_data_collator = template.__class__.data_collator\\n        template.__class__.encode = template_mixin.encode\\n        template.__class__.data_collator = template_mixin.data_collator\\n        yield\\n        template.compute_per_round_loss = _old_compute_per_round_loss\\n        template.output_prompt_answer = _old_output_prompt_answer\\n        template.__class__.encode = template.__class__._old_encode\\n        template.__class__.data_collator = template.__class__._old_data_collator\\n        del template.__class__._old_encode, template.__class__._old_data_collator\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from huggingface/transformers.\\n\\nimport inspect\\nfrom types import FunctionType, MethodType\\nfrom typing import List, Union\\n\\nfrom datasets import Dataset as HfDataset\\nfrom datasets import IterableDataset as HFIterableDataset\\nfrom torch.nn import Module\\nfrom transformers.trainer_callback import TrainerCallback\\nfrom transformers.trainer_utils import (EvaluationStrategy, FSDPOption, HPSearchBackend, HubStrategy, IntervalStrategy,\\n                                        SchedulerType)\\n\\nfrom swift.utils import get_logger\\n\\ntry:\\n    # https://github.com/huggingface/transformers/pull/25702\\n    from transformers.trainer_utils import ShardedDDPOption\\nexcept ImportError:\\n    ShardedDDPOption = None\\n\\nlogger = get_logger()\\nDATASET_TYPE = Union[HfDataset, HFIterableDataset]\\n\\n\\ndef can_return_loss(model: Module) -> bool:\\n    \\\"\\\"\\\"Check if a given model can return loss.\\\"\\\"\\\"\\n    signature = inspect.signature(model.forward)\\n    for p in signature.parameters:\\n        if p == 'return_loss' and signature.parameters[p].default is True:\\n            return True\\n    return False\\n\\n\\ndef find_labels(model: Module) -> List[str]:\\n    \\\"\\\"\\\"Find the labels used by a given model.\\\"\\\"\\\"\\n    model_name = model.__class__.__name__\\n    signature = inspect.signature(model.forward)\\n    if 'QuestionAnswering' in model_name:\\n        return [p for p in signature.parameters if 'label' in p or p in ('start_positions', 'end_positions')]\\n    else:\\n        return [p for p in signature.parameters if 'label' in p]\\n\\n\\ndef get_function(method_or_function: Union[MethodType, FunctionType]) -> FunctionType:\\n    if isinstance(method_or_function, MethodType):\\n        method_or_function = method_or_function.__func__\\n    return method_or_function\\n\\n\\ndef is_instance_of_ms_model(model: Module) -> bool:\\n    \\\"\\\"\\\"avoid import modelscope: circular dependency problem\\\"\\\"\\\"\\n    for m_cls in model.__class__.__mro__:\\n        cls_name = m_cls.__name__\\n        cls_module = m_cls.__module__\\n        if cls_name == 'Model' and cls_module.startswith('modelscope'):\\n            return True\\n    return False\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport os\\nimport tempfile\\nfrom functools import partial\\nfrom pathlib import Path\\nfrom typing import List, Optional, Union\\n\\nfrom huggingface_hub import RepoUrl\\nfrom huggingface_hub.hf_api import CommitInfo, future_compatible\\nfrom requests.exceptions import HTTPError\\nfrom transformers.utils import logging, strtobool\\n\\nlogger = logging.get_logger(__name__)\\n\\n\\ndef create_repo(repo_id: str, *, token: Union[str, bool, None] = None, private: bool = False, **kwargs) -> RepoUrl:\\n    from modelscope.hub.repository import Repository\\n    hub_model_id = PushToMsHubMixin.create_ms_repo(repo_id, token, private)\\n    PushToMsHubMixin.ms_token = token\\n    with tempfile.TemporaryDirectory() as temp_cache_dir:\\n        repo = Repository(temp_cache_dir, hub_model_id)\\n        PushToMsHubMixin.add_patterns_to_gitattributes(repo, ['*.safetensors', '*.bin', '*.pt'])\\n        # Add 'runs/' to .gitignore, ignore tensorboard files\\n        PushToMsHubMixin.add_patterns_to_gitignore(repo, ['runs/', 'images/'])\\n        PushToMsHubMixin.add_patterns_to_file(\\n            repo,\\n            'configuration.json', ['{\\\"framework\\\": \\\"pytorch\\\", \\\"task\\\": \\\"text-generation\\\", \\\"allow_remote\\\": true}'],\\n            ignore_push_error=True)\\n        # Add '*.sagemaker' to .gitignore if using SageMaker\\n        if os.environ.get('SM_TRAINING_ENV'):\\n            PushToMsHubMixin.add_patterns_to_gitignore(repo, ['*.sagemaker-uploading', '*.sagemaker-uploaded'],\\n                                                       'Add `*.sagemaker` patterns to .gitignore')\\n    return RepoUrl(url=hub_model_id, )\\n\\n\\n@future_compatible\\ndef upload_folder(\\n    self,\\n    *,\\n    repo_id: str,\\n    folder_path: Union[str, Path],\\n    path_in_repo: Optional[str] = None,\\n    commit_message: Optional[str] = None,\\n    commit_description: Optional[str] = None,\\n    token: Union[str, bool, None] = None,\\n    revision: Optional[str] = 'master',\\n    ignore_patterns: Optional[Union[List[str], str]] = None,\\n    run_as_future: bool = False,\\n    **kwargs,\\n):\\n    from modelscope import push_to_hub\\n    commit_message = commit_message or 'Upload folder using api'\\n    if commit_description:\\n        commit_message = commit_message + '\\\\n' + commit_description\\n    if not os.path.exists(os.path.join(folder_path, 'configuration.json')):\\n        with open(os.path.join(folder_path, 'configuration.json'), 'w') as f:\\n            f.write('{\\\"framework\\\": \\\"pytorch\\\", \\\"task\\\": \\\"text-generation\\\", \\\"allow_remote\\\": true}')\\n    if ignore_patterns:\\n        ignore_patterns = [p for p in ignore_patterns if p != '_*']\\n    if path_in_repo:\\n        # We don't support part submit for now\\n        path_in_repo = os.path.basename(folder_path)\\n        folder_path = os.path.dirname(folder_path)\\n        ignore_patterns = []\\n    push_to_hub(\\n        repo_id,\\n        folder_path,\\n        token or PushToMsHubMixin.ms_token,\\n        commit_message=commit_message,\\n        ignore_file_pattern=ignore_patterns,\\n        revision=revision,\\n        tag=path_in_repo)\\n    return CommitInfo(\\n        commit_url=f'https://www.modelscope.cn/models/{repo_id}/files',\\n        commit_message=commit_message,\\n        commit_description=commit_description,\\n        oid=None,\\n    )\\n\\n\\nclass PushToMsHubMixin:\\n\\n    _use_hf_hub = strtobool(os.environ.get('USE_HF', 'False'))\\n    ms_token = None\\n\\n    if not _use_hf_hub:\\n        import huggingface_hub\\n        from huggingface_hub.hf_api import api\\n        from transformers import trainer\\n        huggingface_hub.create_repo = create_repo\\n        huggingface_hub.upload_folder = partial(upload_folder, api)\\n        trainer.create_repo = create_repo\\n        trainer.upload_folder = partial(upload_folder, api)\\n\\n    @staticmethod\\n    def create_ms_repo(hub_model_id: str, hub_token: Optional[str] = None, hub_private_repo: bool = False) -> str:\\n        from modelscope import HubApi\\n        from modelscope.hub.api import ModelScopeConfig\\n        from modelscope.hub.constants import ModelVisibility\\n        assert hub_model_id is not None, 'Please enter a valid hub_model_id'\\n\\n        api = HubApi()\\n        if hub_token is None:\\n            hub_token = os.environ.get('MODELSCOPE_API_TOKEN')\\n        if hub_token is not None:\\n            api.login(hub_token)\\n        else:\\n            raise ValueError('Please specify a token by `--hub_token` or `MODELSCOPE_API_TOKEN=xxx`')\\n        visibility = ModelVisibility.PRIVATE if hub_private_repo else ModelVisibility.PUBLIC\\n\\n        if '/' not in hub_model_id:\\n            user_name = ModelScopeConfig.get_user_info()[0]\\n            assert isinstance(user_name, str)\\n            hub_model_id = f'{user_name}/{hub_model_id}'\\n            logger.info(f\\\"'/' not in hub_model_id, pushing to personal repo {hub_model_id}\\\")\\n        try:\\n            api.create_model(hub_model_id, visibility)\\n        except HTTPError:\\n            # The remote repository has been created\\n            pass\\n        return hub_model_id\\n\\n    @staticmethod\\n    def add_patterns_to_file(repo,\\n                             file_name: str,\\n                             patterns: List[str],\\n                             commit_message: Optional[str] = None,\\n                             ignore_push_error=False) -> None:\\n        if isinstance(patterns, str):\\n            patterns = [patterns]\\n        if commit_message is None:\\n            commit_message = f'Add `{patterns[0]}` patterns to {file_name}'\\n\\n        # Get current file content\\n        repo_dir = repo.model_dir\\n        file_path = os.path.join(repo_dir, file_name)\\n        if os.path.exists(file_path):\\n            with open(file_path, 'r', encoding='utf-8') as f:\\n                current_content = f.read()\\n        else:\\n            current_content = ''\\n        # Add the patterns to file\\n        content = current_content\\n        for pattern in patterns:\\n            if pattern not in content:\\n                if len(content) > 0 and not content.endswith('\\\\n'):\\n                    content += '\\\\n'\\n                content += f'{pattern}\\\\n'\\n\\n        # Write the file if it has changed\\n        if content != current_content:\\n            with open(file_path, 'w', encoding='utf-8') as f:\\n                logger.debug(f'Writing {file_name} file. Content: {content}')\\n                f.write(content)\\n        try:\\n            repo.push(commit_message)\\n        except Exception as e:\\n            if ignore_push_error:\\n                pass\\n            else:\\n                raise e\\n\\n    @staticmethod\\n    def add_patterns_to_gitignore(repo, patterns: List[str], commit_message: Optional[str] = None) -> None:\\n        PushToMsHubMixin.add_patterns_to_file(repo, '.gitignore', patterns, commit_message, ignore_push_error=True)\\n\\n    @staticmethod\\n    def add_patterns_to_gitattributes(repo, patterns: List[str], commit_message: Optional[str] = None) -> None:\\n        new_patterns = []\\n        suffix = 'filter=lfs diff=lfs merge=lfs -text'\\n        for pattern in patterns:\\n            if suffix not in pattern:\\n                pattern = f'{pattern} {suffix}'\\n            new_patterns.append(pattern)\\n        file_name = '.gitattributes'\\n        if commit_message is None:\\n            commit_message = f'Add `{patterns[0]}` patterns to {file_name}'\\n        PushToMsHubMixin.add_patterns_to_file(repo, file_name, new_patterns, commit_message, ignore_push_error=True)\\n\\n\\nfrom typing import Callable, Optional\\n\\nimport torch\\nfrom torch.nn import CrossEntropyLoss\\n\\n\\nclass LossName:\\n    long_ce = 'long-ce'\\n    loss_scale = 'loss-scale'\\n\\n\\nLOSS_MAPPING = {}\\n\\n\\ndef register_loss_func(loss_name: str, loss_func: Optional[Callable] = None):\\n    loss_info = {}\\n\\n    if loss_func is not None:\\n        loss_info['loss_func'] = loss_func\\n        LOSS_MAPPING[loss_name] = loss_info\\n        return\\n\\n    def _register_loss_func(loss_func: Callable) -> Callable:\\n        loss_info['loss_func'] = loss_func\\n        LOSS_MAPPING[loss_name] = loss_info\\n        return loss_func\\n\\n    return _register_loss_func\\n\\n\\ndef ce_loss_func(outputs, labels):\\n    logits = outputs.logits\\n    device = logits.device\\n    # Shift so that tokens < n predict n\\n    shift_logits = logits[..., :-1, :]\\n    shift_labels = labels[..., 1:].to(device)\\n    # Save memory\\n    masks = shift_labels != -100\\n    shift_logits = shift_logits[masks]\\n    shift_labels = shift_labels[masks]\\n    # Flatten the tokens\\n    loss_fct = CrossEntropyLoss(reduction='none')\\n    loss = loss_fct(shift_logits, shift_labels)\\n    return loss, masks\\n\\n\\nclass LongCrossEntropy:\\n    \\\"\\\"\\\"Assign higher weight to long text.\\\"\\\"\\\"\\n\\n    def __init__(self, length_smooth: float = 0.9):\\n        self._s_length = 0\\n        self._norm_factor = 0\\n        self._smoothing = length_smooth\\n\\n    def __call__(self, outputs, labels) -> torch.Tensor:\\n        # moving average\\n        loss, masks = ce_loss_func(outputs, labels)\\n        self._s_length = self._s_length * self._smoothing + loss.shape[0]\\n        self._norm_factor = self._norm_factor * self._smoothing + 1\\n        loss = loss.sum() / (self._s_length / self._norm_factor)\\n        return loss\\n\\n\\nregister_loss_func(LossName.long_ce, LongCrossEntropy())\\n\\n\\n@register_loss_func(LossName.loss_scale)\\ndef loss_scale_func(outputs, labels, loss_scale=None) -> torch.Tensor:\\n    loss, masks = ce_loss_func(outputs, labels)\\n    if loss_scale is None:\\n        loss = loss.mean()\\n    else:\\n        shift_scale = loss_scale[..., 1:].to(masks.device)\\n        shift_scale = shift_scale[masks]\\n        loss = (shift_scale * loss).mean()\\n    return loss\\n\\n\\ndef get_loss_func(loss_name: Optional[str]) -> Optional[Callable]:\\n    if loss_name is None:\\n        return None\\n    return LOSS_MAPPING[loss_name]['loss_func']\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n# Part of the implementation is borrowed from huggingface/transformers.\\nimport inspect\\nimport os\\nimport re\\nimport shutil\\nimport time\\nfrom collections import defaultdict\\nfrom contextlib import contextmanager, nullcontext\\nfrom copy import copy\\nfrom pathlib import Path\\nfrom types import MethodType\\nfrom typing import Any, Callable, Dict, List, Optional, Tuple, Union\\n\\nimport json\\nimport numpy as np\\nimport safetensors\\nimport torch\\nimport torch.nn as nn\\nimport transformers\\nfrom datasets import Dataset as HfDataset\\nfrom packaging import version\\nfrom peft import PeftModel\\nfrom torch.nn import Module\\nfrom transformers import PreTrainedModel, PreTrainedTokenizerBase, trainer\\nfrom transformers.data.data_collator import DataCollator\\nfrom transformers.integrations import is_deepspeed_zero3_enabled\\nfrom transformers.modeling_utils import unwrap_model\\nfrom transformers.trainer import PREFIX_CHECKPOINT_DIR, TRAINER_STATE_NAME, Trainer, TrainerCallback\\nfrom transformers.trainer_utils import EvalPrediction\\nfrom transformers.training_args import TrainingArguments\\nfrom transformers.utils import is_sagemaker_mp_enabled, is_torch_npu_available\\n\\nfrom swift.hub.check_model import check_local_model_is_latest\\nfrom swift.torchacc_utils import (save_ta_ddp_checkpoint, save_ta_fsdp_checkpoint, ta_eval_dataloader,\\n                                  ta_load_optimizer_and_scheduler, ta_save_optimizer_and_scheduler, ta_test_dataloader,\\n                                  ta_train_dataloader, ta_trim_graph)\\nfrom swift.tuners import SwiftModel\\nfrom swift.utils import check_json_format, get_logger, use_torchacc\\nfrom swift.utils.constants import Invoke\\nfrom .callback import DefaultFlowCallbackNew, PrinterCallbackNew, ProgressCallbackNew\\nfrom .optimizers.galore import create_optimizer_and_scheduler\\nfrom .utils import can_return_loss, find_labels, get_function, is_instance_of_ms_model\\n\\nlogger = get_logger()\\n\\n\\nclass SwiftMixin:\\n\\n    def __init__(self,\\n                 model: Union[PreTrainedModel, Module] = None,\\n                 args: TrainingArguments = None,\\n                 data_collator: Optional[DataCollator] = None,\\n                 train_dataset: Optional[HfDataset] = None,\\n                 eval_dataset: Optional[Union[HfDataset, Dict[str, HfDataset]]] = None,\\n                 tokenizer: Optional[PreTrainedTokenizerBase] = None,\\n                 model_init: Optional[Callable[[], PreTrainedModel]] = None,\\n                 compute_metrics: Optional[Callable[[EvalPrediction], Dict]] = None,\\n                 callbacks: Optional[List[TrainerCallback]] = None,\\n                 optimizers: Tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR] = (None, None),\\n                 preprocess_logits_for_metrics: Optional[Callable[[torch.Tensor, torch.Tensor], torch.Tensor]] = None,\\n                 **kwargs) -> None:\\n        check_model = kwargs.pop('check_model', True)\\n        if check_model and hasattr(model, 'model_dir'):\\n            check_local_model_is_latest(\\n                model.model_dir,\\n                user_agent={\\n                    Invoke.KEY: Invoke.LOCAL_TRAINER,\\n                    Invoke.THIRD_PARTY: kwargs.pop(Invoke.THIRD_PARTY, Invoke.SWIFT),\\n                })\\n\\n        # Compatible with transformers>=4.34\\n        from swift.tuners import SwiftModel\\n        is_quantized = getattr(model, 'is_quantized', False)\\n        _hf_peft_config_loaded = getattr(model, '_hf_peft_config_loaded', False)\\n        use_swift = isinstance(model, SwiftModel)\\n        if is_quantized and use_swift:\\n            model._hf_peft_config_loaded = True\\n        self.is_encoder_decoder = kwargs.pop('is_encoder_decoder', False)\\n\\n        self.sequence_parallel_size = kwargs.pop('sequence_parallel_size', 1)\\n        if self.sequence_parallel_size > 1:\\n            from swift.trainers.xtuner import init_sequence_parallel_xtuner\\n            init_sequence_parallel_xtuner(self.sequence_parallel_size)\\n        if not hasattr(self, 'perf'):\\n            self.perf = {}\\n        # mro\\n        super().__init__(\\n            model=model,\\n            args=args,\\n            data_collator=data_collator,\\n            train_dataset=train_dataset,\\n            eval_dataset=eval_dataset,\\n            tokenizer=tokenizer,\\n            model_init=model_init,\\n            compute_metrics=compute_metrics,\\n            callbacks=callbacks,\\n            optimizers=optimizers,\\n            preprocess_logits_for_metrics=preprocess_logits_for_metrics,\\n            **kwargs)\\n        if not self.label_names:\\n            self.label_names = ['labels']\\n        if is_quantized and use_swift:\\n            model._hf_peft_config_loaded = _hf_peft_config_loaded\\n\\n        if get_function(model.__class__.forward) is not get_function(model.forward):\\n            self.label_names = find_labels(model)\\n            self.can_return_loss = can_return_loss(model)\\n        self.max_memory = 0.0\\n        self.start_time = time.time()\\n        self._resume_from_checkpoint = None\\n        self._resume_only_model = False\\n        # performance\\n        self.perf: Dict[str, Any] = {'memory': {}}\\n        if hasattr(self.model, 'get_trainable_parameters'):\\n            self.perf['model'] = self.model.get_trainable_parameters()\\n\\n    @staticmethod\\n    def _create_configuration_file(model: Module, output_dir: str) -> None:\\n        cfg = getattr(model, 'cfg', None) or {}\\n        configuration_path = os.path.join(output_dir, 'configuration.json')\\n        new_cfg = {}\\n        if os.path.exists(configuration_path):\\n            with open(configuration_path, 'r', encoding='utf-8') as f:\\n                new_cfg = json.load(f)\\n\\n        if 'framework' not in new_cfg:\\n            new_cfg['framework'] = cfg.get('framework', 'pytorch')\\n        if 'task' not in new_cfg:\\n            new_cfg['task'] = cfg.get('task', 'text-generation')\\n        with open(configuration_path, 'w', encoding='utf-8') as f:\\n            json.dump(new_cfg, f, ensure_ascii=False, indent=4)\\n\\n    def _add_adapter_cfg(self, output_dir: str) -> None:\\n        if not hasattr(self, 'sft_args'):\\n            return\\n        sft_args = self.sft_args\\n        if sft_args.sft_type == 'full':\\n            return\\n        configuration_path = os.path.join(output_dir, 'configuration.json')\\n        new_cfg = {}\\n        if os.path.exists(configuration_path):\\n            with open(configuration_path, 'r', encoding='utf-8') as f:\\n                new_cfg = json.load(f)\\n\\n        need_to_save = [\\n            'model_id_or_path', 'model_revision', 'sft_type', 'tuner_backend', 'template_type', 'dtype', 'system'\\n        ]\\n        quantization_bit = sft_args.quantization_bit\\n        if quantization_bit > 0:\\n            need_to_save += [\\n                'quant_method', 'quantization_bit', 'bnb_4bit_comp_dtype', 'bnb_4bit_quant_type',\\n                'bnb_4bit_use_double_quant'\\n            ]\\n        adapter_cfg = {}\\n        for k in need_to_save:\\n            adapter_cfg[k] = getattr(sft_args, k)\\n        new_cfg['adapter_cfg'] = adapter_cfg\\n        with open(configuration_path, 'w', encoding='utf-8') as f:\\n            json.dump(new_cfg, f, ensure_ascii=False, indent=4)\\n\\n    def _save_sft_args(self, output_dir: str) -> None:\\n        sft_args = getattr(self, 'sft_args', None)\\n        if sft_args is None:\\n            return\\n        fpath = os.path.join(output_dir, 'sft_args.json')\\n        with open(fpath, 'w', encoding='utf-8') as f:\\n            json.dump(check_json_format(self.sft_args.__dict__), f, ensure_ascii=False, indent=2)\\n        return\\n\\n    def _save_optimizer_and_scheduler(self, output_dir):\\n        if not (use_torchacc() and self.sft_args.fsdp_num > 1):\\n            return super()._save_optimizer_and_scheduler(output_dir)\\n\\n        ta_save_optimizer_and_scheduler(self.optimizer, self.lr_scheduler, output_dir)\\n\\n    def _save_initial_model(self, output_dir):\\n        model = unwrap_model(self.model)\\n        if isinstance(model, PeftModel):\\n            config = model.peft_config.get('default', {})\\n            init_lora_weights = getattr(config, 'init_lora_weights', '')\\n            if isinstance(init_lora_weights, str) and ('pissa' in init_lora_weights or 'olora' in init_lora_weights):\\n                config.init_lora_weights = True\\n                model.save_pretrained(os.path.join(output_dir, 'initial_model'))\\n                config.init_lora_weights = init_lora_weights\\n\\n    def _save_converted_model(self, output_dir):\\n        model = unwrap_model(self.model)\\n        if isinstance(model, PeftModel):\\n            config = model.peft_config.get('default', {})\\n            init_lora_weights = getattr(config, 'init_lora_weights', '')\\n            if isinstance(init_lora_weights, str) and ('pissa' in init_lora_weights or 'olora' in init_lora_weights):\\n                config = copy(config)\\n                os.makedirs(os.path.join(output_dir, 'converted'), exist_ok=True)\\n                model.save_pretrained(\\n                    os.path.join(output_dir, 'converted', 'default'),\\n                    path_initial_model_for_weight_conversion=os.path.join(os.path.dirname(output_dir), 'initial_model'),\\n                )\\n                model.peft_config['default'] = config\\n\\n    def _load_optimizer_and_scheduler(self, checkpoint):\\n        if not (use_torchacc() and self.sft_args.fsdp_num > 1):\\n            if self._resume_only_model:\\n                checkpoint = self._resume_from_checkpoint\\n                if checkpoint is not None and (is_sagemaker_mp_enabled() or self.is_fsdp_enabled):\\n                    self._load_from_checkpoint(checkpoint, self.model_wrapped)\\n                return\\n            else:\\n                # Check if saved optimizer or scheduler states exist\\n                super()._load_optimizer_and_scheduler(checkpoint)\\n                try:\\n                    # fix mp+ddp adamw\\n                    for v in self.optimizer.state.values():\\n                        if 'step' in v:\\n                            # not on the same device\\n                            device_set = set([t.device for t in v.values()]) - {v['step'].device, torch.device('cpu')}\\n                            if len(device_set) >= 1:\\n                                v['step'] = v['step'].to('cpu')\\n                except Exception:\\n                    pass\\n                return\\n\\n        if checkpoint is None or self.args.save_only_model:\\n            return\\n\\n        self.optimizer, self.lr_scheduler = ta_load_optimizer_and_scheduler(self.optimizer, self.lr_scheduler,\\n                                                                            checkpoint, self.args.device)\\n\\n    def _save_tpu(self, output_dir: Optional[str] = None):\\n        if not use_torchacc():\\n            return super()._save_tpu(output_dir)\\n\\n        import torch_xla.core.xla_model as xm\\n\\n        # Compatible with swift and peft\\n        output_dir = output_dir if output_dir is not None else self.args.output_dir\\n\\n        if xm.is_master_ordinal(local=False):\\n            os.makedirs(output_dir, exist_ok=True)\\n            # configuration.json\\n            model_dir = getattr(self.model, 'model_dir', None)\\n            if model_dir is not None:\\n                src_path = os.path.join(model_dir, 'configuration.json')\\n                dst_path = os.path.join(output_dir, 'configuration.json')\\n                if os.path.exists(src_path):\\n                    shutil.copy(src_path, dst_path)\\n            else:\\n                self._create_configuration_file(self.model, output_dir)\\n            self._add_adapter_cfg(output_dir)\\n            self._save_sft_args(output_dir)\\n            # generation_config\\n            generation_config = getattr(self.args, 'generation_config', None)\\n            if generation_config is not None:\\n                generation_config.save_pretrained(output_dir)\\n\\n        # model\\n        if self.sft_args.fsdp_num > 1:\\n            save_ta_fsdp_checkpoint(self.model, self.tokenizer, self.args, output_dir)\\n        else:\\n            save_ta_ddp_checkpoint(self.model, self.tokenizer, self.args, output_dir)\\n        sft_args = getattr(self, 'sft_args', None)\\n\\n        # additional files\\n        if xm.is_master_ordinal(local=False):\\n            if sft_args is not None and sft_args.sft_type == 'full':\\n                additional_files = getattr(self.args, 'additional_saved_files',\\n                                           None) or [] + ['preprocessor_config.json']\\n                if model_dir is not None:\\n                    for file in additional_files:\\n                        src_path = os.path.join(model_dir, file)\\n                        dst_path = os.path.join(output_dir, file)\\n                        if os.path.isfile(src_path):\\n                            shutil.copy(src_path, dst_path)\\n                        elif os.path.isdir(src_path):\\n                            shutil.copytree(src_path, dst_path)\\n\\n    def _save(self, output_dir: Optional[str] = None, state_dict=None):\\n        \\\"\\\"\\\"Compatible with swift and peft\\\"\\\"\\\"\\n        # If we are executing this function, we are the process zero, so we don't check for that.\\n        output_dir = output_dir if output_dir is not None else self.args.output_dir\\n        os.makedirs(output_dir, exist_ok=True)\\n        # configuration.json\\n        model_dir = getattr(self.model, 'model_dir', None)\\n        if model_dir is not None:\\n            src_path = os.path.join(model_dir, 'configuration.json')\\n            dst_path = os.path.join(output_dir, 'configuration.json')\\n            if os.path.exists(src_path):\\n                shutil.copy(src_path, dst_path)\\n        else:\\n            self._create_configuration_file(self.model, output_dir)\\n        self._add_adapter_cfg(output_dir)\\n        self._save_sft_args(output_dir)\\n        # generation_config\\n        generation_config = getattr(self.args, 'generation_config', None)\\n        if generation_config is not None:\\n            generation_config.save_pretrained(output_dir)\\n        # model\\n        supported_classes = (SwiftModel, PreTrainedModel, PeftModel)\\n        save_safetensors = self.args.save_safetensors\\n\\n        if not isinstance(self.model, supported_classes):\\n            if state_dict is None:\\n                state_dict = self.model.state_dict()\\n\\n            _unwrap_model = unwrap_model(self.model)\\n            if isinstance(_unwrap_model, supported_classes):\\n                _unwrap_model.save_pretrained(output_dir, state_dict=state_dict, safe_serialization=save_safetensors)\\n            else:\\n                logger.info('Trainer.model is not a `PreTrainedModel`, only saving its state dict.')\\n                if save_safetensors:\\n                    safetensors.torch.save_file(state_dict, os.path.join(output_dir, 'model.safetensors'))\\n                else:\\n                    torch.save(state_dict, os.path.join(output_dir, 'pytorch_model.bin'))\\n        elif is_instance_of_ms_model(self.model):\\n            PreTrainedModel.save_pretrained(\\n                self.model, output_dir, state_dict=state_dict, safe_serialization=save_safetensors)\\n        else:\\n            self.model.save_pretrained(output_dir, state_dict=state_dict, safe_serialization=save_safetensors)\\n        sft_args = getattr(self, 'sft_args', None)\\n        # tokenizer\\n        if self.tokenizer is not None and sft_args is not None and sft_args.sft_type == 'full':\\n            if hasattr(self.tokenizer, 'processor'):\\n                self.tokenizer.processor.save_pretrained(output_dir)\\n            self.tokenizer.save_pretrained(output_dir)\\n        # training_args.bin\\n        torch.save(self.args, os.path.join(output_dir, 'training_args.bin'))\\n        # additional files\\n        if sft_args is not None and sft_args.sft_type == 'full':\\n            additional_files = getattr(self.args, 'additional_saved_files', None) or [] + ['preprocessor_config.json']\\n            if model_dir is not None:\\n                for file in additional_files:\\n                    src_path = os.path.join(model_dir, file)\\n                    dst_path = os.path.join(output_dir, file)\\n                    if os.path.isfile(src_path):\\n                        shutil.copy(src_path, dst_path)\\n                    elif os.path.isdir(src_path):\\n                        shutil.copytree(src_path, dst_path)\\n        self._save_converted_model(output_dir)\\n\\n    def _save_checkpoint(self, model, trial, metrics=None):\\n        self.state.last_model_checkpoint = os.path.join(self.args.output_dir, f'checkpoint-{self.state.global_step}')\\n        if is_deepspeed_zero3_enabled() and not hasattr(self.deepspeed, '_zero3_consolidated_16bit_state_dict_origin'):\\n            parameters = inspect.signature(self.deepspeed._zero3_consolidated_16bit_state_dict).parameters\\n            if 'exclude_frozen_parameters' in parameters:\\n\\n                def _zero3_consolidated_16bit_state_dict(_model, exclude_frozen_parameters=False):\\n                    unwrapped = unwrap_model(_model)\\n                    exclude_frozen_parameters = False\\n                    if isinstance(unwrapped, SwiftModel) and unwrapped.has_additional_modules:\\n                        exclude_frozen_parameters = True\\n                    if isinstance(unwrapped, PeftModel):\\n                        exclude_frozen_parameters = True\\n                    return _model._zero3_consolidated_16bit_state_dict_origin(exclude_frozen_parameters)\\n\\n                self.deepspeed._zero3_consolidated_16bit_state_dict_origin = (\\n                    self.deepspeed._zero3_consolidated_16bit_state_dict)\\n                self.deepspeed._zero3_consolidated_16bit_state_dict = MethodType(_zero3_consolidated_16bit_state_dict,\\n                                                                                 self.deepspeed)\\n        if version.parse(transformers.__version__) >= version.parse('4.36') or not self.args.save_only_model:\\n            result = super()._save_checkpoint(model, trial, metrics)\\n        else:\\n            result = self._save_only_model(model, trial, metrics)\\n        logger.info(f'Saving model checkpoint to {self.state.last_model_checkpoint}')\\n        return result\\n\\n    def _save_only_model(self, model, trial, metrics=None):\\n        # Save model checkpoint\\n        checkpoint_folder = f'{PREFIX_CHECKPOINT_DIR}-{self.state.global_step}'\\n\\n        if self.hp_search_backend is None and trial is None:\\n            self.store_flos()\\n\\n        run_dir = self._get_output_dir(trial=trial)\\n        output_dir = os.path.join(run_dir, checkpoint_folder)\\n        self.save_model(output_dir, _internal_call=True)\\n\\n        # Determine the new best metric / best model checkpoint\\n        if metrics is not None and self.args.metric_for_best_model is not None:\\n            metric_to_check = self.args.metric_for_best_model\\n            if not metric_to_check.startswith('eval_'):\\n                metric_to_check = f'eval_{metric_to_check}'\\n            metric_value = metrics[metric_to_check]\\n\\n            operator = np.greater if self.args.greater_is_better else np.less\\n            if (self.state.best_metric is None or self.state.best_model_checkpoint is None\\n                    or operator(metric_value, self.state.best_metric)):\\n                self.state.best_metric = metric_value\\n                self.state.best_model_checkpoint = output_dir\\n\\n        # Save the Trainer state\\n        if self.args.should_save:\\n            self.state.save_to_json(os.path.join(output_dir, TRAINER_STATE_NAME))\\n\\n        # push to hub\\n        if self.args.push_to_hub:\\n            self._push_from_checkpoint(output_dir)\\n\\n        # Maybe delete some older checkpoints.\\n        if self.args.should_save:\\n            self._rotate_checkpoints(use_mtime=True, output_dir=run_dir)\\n\\n    def _get_train_sampler(self) -> Optional[torch.utils.data.Sampler]:\\n        train_sampler_random = self.args.train_sampler_random\\n        if train_sampler_random:\\n            return super()._get_train_sampler()\\n        else:\\n            return self._get_eval_sampler(self.train_dataset)\\n\\n    def _load_from_checkpoint(self, resume_from_checkpoint: str, model=None) -> None:\\n        if model is None:\\n            model = self.model\\n        if use_torchacc():\\n            # Loading checkpoint of TorchAcc has been done in tuner.py when\\n            # sft_type is 'full'.\\n            if self.sft_args.fsdp_num > 1:\\n                model = model._get_underlay_model().module.module\\n            if isinstance(model, PreTrainedModel):\\n                return\\n        elif isinstance(model, SwiftModel) or is_deepspeed_zero3_enabled() and isinstance(model, PreTrainedModel):\\n            return\\n        else:\\n            # Avoid throwing exceptions\\n            return super()._load_from_checkpoint(resume_from_checkpoint, model)\\n\\n    def _sorted_checkpoints(self,\\n                            output_dir=None,\\n                            checkpoint_prefix=PREFIX_CHECKPOINT_DIR,\\n                            use_mtime=False) -> List[str]:\\n        ordering_and_checkpoint_path = []\\n\\n        glob_checkpoints = [str(x) for x in Path(output_dir).glob(f'{checkpoint_prefix}-*') if os.path.isdir(x)]\\n\\n        for path in glob_checkpoints:\\n            if use_mtime:\\n                ordering_and_checkpoint_path.append((os.path.getmtime(path), path))\\n            else:\\n                regex_match = re.match(f'.*{checkpoint_prefix}-([0-9]+)', path)\\n                if regex_match is not None and regex_match.groups() is not None:\\n                    ordering_and_checkpoint_path.append((int(regex_match.groups()[0]), path))\\n\\n        checkpoints_sorted = sorted(ordering_and_checkpoint_path)\\n        checkpoints_sorted = [checkpoint[1] for checkpoint in checkpoints_sorted]\\n        # Make sure we don't delete the best model.\\n        if (self.state.best_model_checkpoint is not None\\n                and str(Path(self.state.best_model_checkpoint)) in checkpoints_sorted):\\n            best_model_index = checkpoints_sorted.index(str(Path(self.state.best_model_checkpoint)))\\n            for i in range(best_model_index, len(checkpoints_sorted) - 2):\\n                checkpoints_sorted[i], checkpoints_sorted[i + 1] = checkpoints_sorted[i + 1], checkpoints_sorted[i]\\n        return checkpoints_sorted\\n\\n    def train(self, resume_from_checkpoint: Optional[Union[str, bool]] = None, *args, **kwargs) -> torch.Tensor:\\n        sft_args = getattr(self, 'sft_args', None)\\n        self._resume_only_model = getattr(sft_args, 'resume_only_model', False)\\n        if self._resume_only_model:\\n            # Control the behavior of \\\"resume_from_checkpoint\\\" by swift.\\n            self._resume_from_checkpoint = resume_from_checkpoint\\n            resume_from_checkpoint = None\\n        if self._resume_from_checkpoint is not None and not is_sagemaker_mp_enabled() and not self.is_fsdp_enabled:\\n            self._load_from_checkpoint(self._resume_from_checkpoint)\\n\\n        self._save_initial_model(self.args.output_dir)\\n        res = super().train(resume_from_checkpoint, *args, **kwargs)\\n        self._resume_from_checkpoint = None\\n        if self.max_memory != 0:\\n            self.perf['memory']['cuda'] = f'{self.max_memory:.2f}GiB'\\n        return res\\n\\n    def _load_best_model(self):\\n        # Compatible with transformers>=4.35 (deepspeed)\\n        try:\\n            model = self.model\\n            if isinstance(model, SwiftModel):\\n                logger.info(\\n                    f'Loading best model from {self.state.best_model_checkpoint} (score: {self.state.best_metric}).')\\n                adapters = model.adapters\\n                for adapter_name in adapters.keys():\\n                    sub_folder = os.path.join(self.state.best_model_checkpoint, adapter_name)\\n                    state_dict = SwiftModel.load_state_file(sub_folder, device='cpu')\\n                    if state_dict is not None:\\n                        self.model.load_state_dict(state_dict, strict=False, adapter_name=adapter_name)\\n                state_dict = SwiftModel.load_state_file(self.state.best_model_checkpoint, device='cpu')\\n                if state_dict is not None:\\n                    self.model.load_state_dict(state_dict, strict=False, adapter_name='default')\\n            else:\\n                super()._load_best_model()\\n        except ValueError as e:\\n            logger.warning(e)\\n\\n    def get_max_cuda_memory(self, device: Optional[Union[torch.device, int]] = None) -> float:\\n        if device is None:\\n            mems = [torch.cuda.max_memory_reserved(device=device) for device in range(torch.cuda.device_count())]\\n        else:\\n            mems = [torch.cuda.max_memory_reserved(device=device)]\\n        mem = sum([float(mem) / 1024 / 1024 / 1024 for mem in mems])\\n        if self.max_memory < mem:\\n            self.max_memory = mem\\n        if torch.cuda.is_available():\\n            torch.cuda.reset_peak_memory_stats()\\n        return mem\\n\\n    def _maybe_log_save_evaluate(self, tr_loss, *args, **kwargs):\\n        if self.control.should_log:\\n            if use_torchacc():\\n                ta_trim_graph()\\n            self.control.should_log = False\\n            logs: Dict[str, float] = {}\\n            metrics_log = {'loss': tr_loss}  # loss first\\n            if hasattr(self, '_custom_metrics'):\\n                metrics_log.update(self._custom_metrics)\\n                self._custom_metrics = {}\\n            for k, v in metrics_log.items():\\n                # all_gather + mean() to get average loss over all processes\\n                v_scalar = self._nested_gather(v).mean().item()\\n                if k == 'loss':\\n                    self._total_loss_scalar += v_scalar\\n                logs[k] = round(v_scalar / (self.state.global_step - self._globalstep_last_logged), 8)\\n                if k == 'acc' and self._globalstep_last_logged > 0:\\n                    sft_args = getattr(self, 'sft_args', None)\\n                    acc_steps = 1 if sft_args is None else sft_args.acc_steps\\n                    logs[k] *= acc_steps\\n            if version.parse(transformers.__version__) >= version.parse('4.38'):\\n                grad_norm = args[0]\\n                if isinstance(grad_norm, torch.Tensor):\\n                    grad_norm = grad_norm.item()\\n                if grad_norm is not None:\\n                    logs['grad_norm'] = grad_norm\\n            logs['learning_rate'] = self._get_learning_rate()\\n            if not is_torch_npu_available():\\n                logs['memory(GiB)'] = round(self.get_max_cuda_memory(), 2)\\n            import time\\n            time_now = time.time()\\n            elapse_time = time_now - self.start_time\\n            logs['train_speed(iter/s)'] = round(self.state.global_step / elapse_time, 6)\\n            tr_loss -= tr_loss\\n            self._globalstep_last_logged = self.state.global_step\\n            self.store_flos()\\n            self.log(logs)\\n        super()._maybe_log_save_evaluate(tr_loss, *args, **kwargs)\\n\\n    def create_optimizer_and_scheduler(self, num_training_steps: int):\\n        if hasattr(self.args, 'galore_config'):\\n            optimizer, lr_scheduler = create_optimizer_and_scheduler(\\n                self.model,\\n                self.args,\\n                self.args.galore_config,\\n                num_training_steps,\\n                lr=self.args.learning_rate,\\n                weight_decay=self.args.weight_decay)\\n            self.optimizer = optimizer\\n            self.lr_scheduler = lr_scheduler\\n        else:\\n            self.create_optimizer()\\n            self.create_scheduler(num_training_steps=num_training_steps, optimizer=self.optimizer)\\n\\n    def create_optimizer(self):\\n        opt_model = self.model\\n\\n        if self.optimizer is None:\\n            if version.parse(transformers.__version__) < version.parse('4.34.0'):\\n                logger.warning(f'If you are using lora+, please remember using transformers>=4.34.0, '\\n                               f'but now is {transformers.__version__}')\\n                return super().create_optimizer()\\n\\n            optimizer_grouped_parameters = None\\n            if hasattr(self.model, 'create_optimizer_param_groups'):\\n                # Lora+ parameter groups\\n                optimizer_grouped_parameters = self.model.create_optimizer_param_groups(\\n                    lr=self.args.learning_rate, weight_decay=self.args.weight_decay)\\n\\n            if optimizer_grouped_parameters is None:\\n                # Default parameter groups\\n                decay_parameters = self.get_decay_parameter_names(opt_model)\\n                optimizer_grouped_parameters = [\\n                    {\\n                        'params':\\n                        [p for n, p in opt_model.named_parameters() if (n in decay_parameters and p.requires_grad)],\\n                        'weight_decay':\\n                        self.args.weight_decay,\\n                    },\\n                    {\\n                        'params':\\n                        [p for n, p in opt_model.named_parameters() if (n not in decay_parameters and p.requires_grad)],\\n                        'weight_decay':\\n                        0.0,\\n                    },\\n                ]\\n\\n            optimizer_cls, optimizer_kwargs = Trainer.get_optimizer_cls_and_kwargs(self.args)\\n            self.optimizer = optimizer_cls(optimizer_grouped_parameters, **optimizer_kwargs)\\n        return self.optimizer\\n\\n    def get_train_dataloader(self):\\n        if self.sequence_parallel_size > 1:\\n            from swift.trainers.xtuner import get_xtuner_train_dataloader\\n            return get_xtuner_train_dataloader(self)\\n        elif use_torchacc():\\n            if trainer.is_datasets_available():\\n                import datasets\\n\\n            if self.train_dataset is None:\\n                raise ValueError('Trainer: training requires a train_dataset.')\\n\\n            train_dataset = self.train_dataset\\n            data_collator = self.data_collator\\n\\n            if trainer.is_datasets_available() and isinstance(train_dataset, datasets.Dataset):\\n                train_dataset = self._remove_unused_columns(train_dataset, description='training')\\n            else:\\n                data_collator = self._get_collator_with_removed_columns(data_collator, description='training')\\n\\n            return ta_train_dataloader(train_dataset, data_collator, self._get_train_sampler(), self.args,\\n                                       self._train_batch_size)\\n        else:\\n            return super().get_train_dataloader()\\n\\n    def get_eval_dataloader(self, eval_dataset=None):\\n        if not use_torchacc():\\n            return super().get_eval_dataloader(eval_dataset)\\n        else:\\n            if trainer.is_datasets_available():\\n                import datasets\\n\\n            if eval_dataset is None and self.eval_dataset is None:\\n                raise ValueError('Trainer: evaluation requires an eval_dataset.')\\n            eval_dataset = eval_dataset if eval_dataset is not None else self.eval_dataset\\n            data_collator = self.data_collator\\n\\n            if trainer.is_datasets_available() and isinstance(eval_dataset, datasets.Dataset):\\n                eval_dataset = self._remove_unused_columns(eval_dataset, description='evaluation')\\n            else:\\n                data_collator = self._get_collator_with_removed_columns(data_collator, description='evaluation')\\n\\n            return ta_eval_dataloader(eval_dataset, data_collator, self._get_eval_sampler(eval_dataset), self.args)\\n\\n    def get_test_dataloader(self, test_dataset):\\n        if not use_torchacc():\\n            return super().get_test_dataloader(test_dataset)\\n        else:\\n            if trainer.is_datasets_available():\\n                import datasets\\n\\n            data_collator = self.data_collator\\n\\n            if trainer.is_datasets_available() and isinstance(test_dataset, datasets.Dataset):\\n                test_dataset = self._remove_unused_columns(test_dataset, description='test')\\n            else:\\n                data_collator = self._get_collator_with_removed_columns(data_collator, description='test')\\n\\n            return ta_test_dataloader(test_dataset, data_collator, self._get_eval_sampler(test_dataset), self.args)\\n\\n\\nclass ModelWrapper(nn.Module):\\n    # compat zero3 & rlhf\\n    def __init__(self, model: nn.Module, ref_model: nn.Module):\\n        super().__init__()\\n        self._model = model\\n        self._ref_model = ref_model\\n\\n    def forward(self, *args, **kwargs):\\n        return self._model(*args, **kwargs)\\n\\n    def __getattr__(self, name: str):\\n        \\\"\\\"\\\"Forward missing attributes to the wrapped module.\\\"\\\"\\\"\\n        try:\\n            return super().__getattr__(name)  # defer to nn.Module's logic\\n        except AttributeError:\\n            return getattr(self._model, name)\\n\\n    def load_state_dict(self, *args, **kwargs):\\n        return self._model.load_state_dict(*args, **kwargs)\\n\\n    def parameters(self, *args, **kwargs):\\n        return self._model.parameters(*args, **kwargs)\\n\\n    @contextmanager\\n    def _save_load_context(cls, trainer):\\n        # fix zero3 & save/load model\\n        deepspeed_model = trainer.deepspeed\\n        _new_model = deepspeed_model._model\\n        _old_model = deepspeed_model.__dict__['module']\\n        deepspeed_model.__dict__['module'] = _new_model\\n        deepspeed_model._modules['module'] = _new_model\\n        trainer.model = _new_model\\n        yield\\n        deepspeed_model.__dict__['module'] = _old_model\\n        deepspeed_model._modules['module'] = _old_model\\n        trainer.model = deepspeed_model\\n\\n\\nclass RLHFTrainerMixin:\\n\\n    @staticmethod\\n    def get_model_config_attr(config, key):\\n        for k in [None, 'language_config', 'llm_config', 'text_config']:\\n            if k is None:\\n                llm_config = config\\n            else:\\n                llm_config = getattr(config, k, None)\\n            if llm_config:\\n                val = getattr(llm_config, key)\\n                if val is not None:\\n                    return val\\n\\n    def __init__(self,\\n                 model: Optional[Union[PreTrainedModel, nn.Module, str]] = None,\\n                 ref_model: Optional[Union[PreTrainedModel, nn.Module, str]] = None,\\n                 *_args,\\n                 **kwargs):\\n        from trl.trainer import disable_dropout_in_model\\n        self.ref_model = ref_model\\n        self._stored_metrics = defaultdict(lambda: defaultdict(list))\\n        args = kwargs['args']\\n        self.beta = args.beta\\n        if args.disable_dropout:\\n            disable_dropout_in_model(model)\\n            if self.ref_model is not None:\\n                disable_dropout_in_model(self.ref_model)\\n\\n        self.is_encoder_decoder = kwargs['is_encoder_decoder']\\n        self.aux_loss_enabled = getattr(model.config, 'output_router_logits', False)\\n        self._peft_has_been_casted_to_bf16 = False\\n        self.generate_during_eval = args.generate_during_eval\\n        self.is_multimodal = False\\n        if self.is_encoder_decoder:\\n            self.decoder_start_token_id = self.get_model_config_attr(model.config, 'decoder_start_token_id')\\n            self.pad_token_id = self.get_model_config_attr(model.config, 'pad_token_id')\\n        # not use\\n        self.is_vision_model = False\\n        tokenizer = kwargs['tokenizer']\\n        self.label_pad_token_id = -100\\n        self.padding_value = tokenizer.pad_token_id\\n        self.use_dpo_data_collator = True\\n        if is_deepspeed_zero3_enabled() and ref_model is not None:\\n            model = ModelWrapper(model, ref_model)\\n        super().__init__(model, *_args, **kwargs)\\n\\n    def _save_checkpoint(self, model, trial, metrics=None):\\n        context = nullcontext()\\n        if hasattr(model, '_save_load_context'):\\n            context = model._save_load_context(self)\\n        with context:\\n            return super()._save_checkpoint(model, trial, metrics)\\n\\n    def concatenated_forward(\\n        self, model: nn.Module, batch: Dict[str, Union[List, torch.LongTensor]]\\n    ) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]:\\n\\n        model_kwargs = batch.copy()\\n        labels = model_kwargs.pop('labels', None)\\n        if self.is_encoder_decoder:\\n            model_kwargs['labels'] = labels\\n\\n        if self.aux_loss_enabled:\\n            model_kwargs['output_router_logits'] = True\\n        outputs = model(**model_kwargs, use_cache=False)\\n        model_kwargs['labels'] = labels\\n        model_kwargs['chosen_labels'] = torch.zeros(model_kwargs['input_ids'].shape[0] // 2)  # just get shape\\n        if outputs.logits.shape[1] != labels.shape[1]:\\n            # for llava, the model returns logits for the entire sequence, including the image tokens\\n            # (placed before the text tokens)\\n            outputs.logits = outputs.logits[:, -labels.shape[1]:]\\n        for key in ['input_ids', 'attention_mask', 'labels']:\\n            model_kwargs[f'concatenated_{key}'] = model_kwargs.pop(key)\\n        if self.__class__.__name__ == 'ORPOTrainer':  # Pass-through labels\\n            model_kwargs['concatenated_input_ids'] = model_kwargs['concatenated_labels']\\n\\n        @contextmanager\\n        def _patch_concatenated_forward():\\n            _old_concatenated_inputs = self.concatenated_inputs\\n            _old_model_call = model.__class__.__call__\\n            self.concatenated_inputs = lambda *args, **kwargs: model_kwargs\\n            model.__class__.__call__ = lambda *args, **kwargs: outputs\\n            yield\\n            self.concatenated_inputs = _old_concatenated_inputs\\n            model.__class__.__call__ = _old_model_call\\n\\n        with _patch_concatenated_forward():\\n            return super().concatenated_forward(model, model_kwargs)\\n\\n    def get_batch_logps(self, logits: torch.FloatTensor, labels: torch.LongTensor, *args, **kwargs):\\n        if self.is_encoder_decoder:\\n            labels = labels.clone()  # fix trl bug\\n        return super().get_batch_logps(logits, labels, *args, **kwargs)\\n\\n\\n# monkey patching\\ntrainer.DEFAULT_PROGRESS_CALLBACK = ProgressCallbackNew\\ntrainer.DEFAULT_CALLBACKS = [DefaultFlowCallbackNew]\\ntrainer.PrinterCallback = PrinterCallbackNew\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nimport os\\nfrom dataclasses import dataclass, field\\nfrom typing import List, Optional\\n\\nimport torch\\nfrom transformers.training_args import TrainingArguments as HfTrainingArguments\\nfrom transformers.training_args_seq2seq import Seq2SeqTrainingArguments as HfSeq2SeqTrainingArguments\\nfrom transformers.utils import is_accelerate_available\\n\\nfrom swift.utils import is_dist, use_torchacc\\nfrom .loss import LOSS_MAPPING\\n\\n\\n@dataclass\\nclass SwiftArgumentsMixin:\\n    # ckpt only save model\\n    save_only_model: bool = False\\n    acc_strategy: str = field(default='token', metadata={'choices': ['token', 'sentence']})\\n    loss_name: Optional[str] = field(default=None, metadata={'help': f'loss_func choices: {list(LOSS_MAPPING.keys())}'})\\n    additional_saved_files: Optional[List[str]] = None\\n    # torchacc\\n    train_sampler_random: bool = True\\n    metric_warmup_step: Optional[float] = 0\\n    train_dataset_sample: Optional[int] = -1\\n\\n    def __post_init__(self):\\n        if is_dist() and self.ddp_backend == 'nccl' and torch.cuda.is_available() and is_accelerate_available():\\n            try:\\n                from accelerate.utils import check_cuda_p2p_ib_support\\n                if not check_cuda_p2p_ib_support():\\n                    os.environ['NCCL_P2P_DISABLE'] = '1'\\n                    os.environ['NCCL_IB_DISABLE'] = '1'\\n            except ImportError:\\n                pass\\n        if self.additional_saved_files is None:\\n            self.additional_saved_files = []\\n        super().__post_init__()\\n\\n\\n@dataclass\\nclass TrainingArguments(SwiftArgumentsMixin, HfTrainingArguments):\\n    pass\\n\\n\\n@dataclass\\nclass Seq2SeqTrainingArguments(SwiftArgumentsMixin, HfSeq2SeqTrainingArguments):\\n\\n    @property\\n    def place_model_on_device(self):\\n        return False if use_torchacc() else super().place_model_on_device\\n\\n\\ntry:\\n    from trl import (DPOConfig as HfDPOConfig, CPOConfig as HfCPOConfig, ORPOConfig as HfORPOConfig, KTOConfig as\\n                     HfKTOConfig)\\n\\n    @dataclass\\n    class DPOConfig(SwiftArgumentsMixin, HfDPOConfig):\\n        pass\\n\\n    @dataclass\\n    class CPOConfig(SwiftArgumentsMixin, HfCPOConfig):\\n        pass\\n\\n    @dataclass\\n    class ORPOConfig(SwiftArgumentsMixin, HfORPOConfig):\\n        pass\\n\\n    @dataclass\\n    class KTOConfig(SwiftArgumentsMixin, HfKTOConfig):\\n        pass\\n\\nexcept ImportError:\\n    DPOConfig = None\\n    CPOConfig = None\\n    ORPOConfig = None\\n    KTOConfig = None\\n\\n\\nfrom typing import Any\\n\\nimport datasets\\nimport torch\\nimport torch.distributed as dist\\nfrom datasets import Dataset\\nfrom torch.utils.data import DataLoader\\nfrom transformers.trainer_utils import seed_worker\\n\\n\\ndef assert_xtuner_runtime_condition():\\n    from swift.llm.utils.utils import is_xtuner_available\\n    assert is_xtuner_available(), \\\\\\n        ('Please install XTuner first to pack dataset to `max_length`.'\\n         '`pip install -U \\\\'xtuner[deepspeed]\\\\'`')\\n    assert dist.is_initialized(), 'pack_to_max_length is only available with distributed training.'\\n\\n\\ndef pack_dataset_xtuner(dataset: Dataset, args: Any) -> Any:\\n    assert_xtuner_runtime_condition()\\n    if dist.get_rank() == 0:\\n        ds = [i[0] for i in dataset.data]\\n        train_dataset = Dataset.from_list(ds)\\n        from xtuner.dataset.huggingface import pack_dataset\\n        train_dataset = pack_dataset(\\n            train_dataset, max_length=args.max_length, use_varlen_attn=False, shuffle_before_pack=True, map_num_proc=16)\\n        objects = [train_dataset]\\n        train_dataset.save_to_disk('alpaca_pack')\\n    else:\\n        objects = [None]\\n    dist.broadcast_object_list(objects, src=0)\\n    train_dataset = objects[0]\\n    return train_dataset\\n\\n\\ndef init_sequence_parallel_xtuner(sequence_parallel_size: int):\\n    assert_xtuner_runtime_condition()\\n    from xtuner.parallel.sequence import init_sequence_parallel\\n    init_sequence_parallel(sequence_parallel_size)\\n\\n\\ndef dispatch_module_xtuner(module):\\n    assert_xtuner_runtime_condition()\\n    from xtuner.model.modules.dispatch import dispatch_modules\\n    dispatch_modules(module)\\n\\n\\ndef pad_and_split_for_sequence_parallel(tokenizer, input_ids, labels, position_ids, attention_mask, loss_scale):\\n    assert_xtuner_runtime_condition()\\n    from xtuner.parallel.sequence import (pad_for_sequence_parallel, split_for_sequence_parallel,\\n                                          get_sequence_parallel_group)\\n    input_ids = pad_for_sequence_parallel(input_ids, padding_value=tokenizer.pad_token_id, dim=-1)\\n    labels = pad_for_sequence_parallel(labels, padding_value=-100, dim=-1)\\n    position_ids = pad_for_sequence_parallel(position_ids, padding_value=0, dim=-1)\\n    attention_mask = pad_for_sequence_parallel(attention_mask, padding_value=0, dim=-1)\\n\\n    sp_group = get_sequence_parallel_group()\\n    input_ids = split_for_sequence_parallel(input_ids, dim=1, sp_group=sp_group)\\n    labels = split_for_sequence_parallel(labels, dim=1, sp_group=sp_group)\\n    position_ids = split_for_sequence_parallel(position_ids, dim=1, sp_group=sp_group)\\n    attention_mask = split_for_sequence_parallel(attention_mask, dim=-1, sp_group=sp_group)\\n    if loss_scale is not None:\\n        loss_scale = pad_for_sequence_parallel(loss_scale, padding_value=0., dim=-1)\\n        loss_scale = split_for_sequence_parallel(loss_scale, dim=1, sp_group=sp_group)\\n\\n    return input_ids, labels, position_ids, attention_mask, loss_scale\\n\\n\\ndef get_xtuner_sequence_parallel_world_size():\\n    assert_xtuner_runtime_condition()\\n    from xtuner.parallel.sequence import get_sequence_parallel_world_size\\n    return get_sequence_parallel_world_size()\\n\\n\\ndef reduce_xtuner_sequence_parallel_loss(loss, labels):\\n    from xtuner.parallel.sequence import (reduce_sequence_parallel_loss, get_sequence_parallel_group)\\n    # reduce loss for logging correctly\\n    num_tokens = (labels != -100).sum()\\n    return reduce_sequence_parallel_loss(loss, num_tokens, get_sequence_parallel_group())\\n\\n\\ndef get_xtuner_train_dataloader(trainer):\\n    # modified from HFTrainer.get_train_dataloader\\n    # RandomSampler -> SequenceParallelSampler\\n    assert_xtuner_runtime_condition()\\n    if trainer.train_dataset is None:\\n        raise ValueError('Trainer: training requires a train_dataset.')\\n\\n    train_dataset = trainer.train_dataset\\n    data_collator = trainer.data_collator\\n    if isinstance(train_dataset, datasets.Dataset):\\n        train_dataset = trainer._remove_unused_columns(train_dataset, description='training')\\n    else:\\n        data_collator = trainer._get_collator_with_removed_columns(data_collator, description='training')\\n\\n    dataloader_params = {\\n        'batch_size': trainer._train_batch_size,\\n        'collate_fn': data_collator,\\n        'num_workers': trainer.args.dataloader_num_workers,\\n        'pin_memory': trainer.args.dataloader_pin_memory,\\n        'persistent_workers': trainer.args.dataloader_persistent_workers,\\n    }\\n\\n    if not isinstance(train_dataset, torch.utils.data.IterableDataset):\\n        from xtuner.parallel import SequenceParallelSampler\\n        dataloader_params['sampler'] = SequenceParallelSampler(train_dataset, seed=1024)\\n        dataloader_params['drop_last'] = trainer.args.dataloader_drop_last\\n        dataloader_params['worker_init_fn'] = seed_worker\\n\\n    return DataLoader(train_dataset, **dataloader_params)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import TYPE_CHECKING\\n\\nfrom swift.utils.import_utils import _LazyModule\\n\\nif TYPE_CHECKING:\\n    from .arguments import Seq2SeqTrainingArguments, TrainingArguments, DPOConfig, CPOConfig, KTOConfig, ORPOConfig\\n    from .rlhf_trainer import CPOTrainer, DPOTrainer, KTOTrainer, ORPOTrainer\\n    from .trainer_factory import TrainerFactory\\n    from .trainers import Seq2SeqTrainer, Trainer\\n    from .mixin import SwiftMixin, RLHFTrainerMixin\\n    from .push_to_ms import PushToMsHubMixin\\n    from .loss import LOSS_MAPPING, LossName, register_loss_func, get_loss_func\\n    from .utils import (EvaluationStrategy, FSDPOption, HPSearchBackend, HubStrategy, IntervalStrategy, SchedulerType,\\n                        ShardedDDPOption, TrainerCallback)\\nelse:\\n    _import_structure = {\\n        'arguments':\\n        ['Seq2SeqTrainingArguments', 'TrainingArguments', 'DPOConfig', 'CPOConfig', 'KTOConfig', 'ORPOConfig'],\\n        'rlhf_trainer': ['CPOTrainer', 'DPOTrainer', 'KTOTrainer', 'ORPOTrainer'],\\n        'trainer_factory': ['TrainerFactory'],\\n        'trainers': ['Seq2SeqTrainer', 'Trainer'],\\n        'mixin': ['SwiftMixin', 'RLHFTrainerMixin'],\\n        'push_to_ms': ['PushToMsHubMixin'],\\n        'loss': ['LOSS_MAPPING', 'LossName', 'register_loss_func', 'get_loss_func'],\\n        'utils': [\\n            'EvaluationStrategy', 'FSDPOption', 'HPSearchBackend', 'HubStrategy', 'IntervalStrategy', 'SchedulerType',\\n            'ShardedDDPOption', 'TrainerCallback'\\n        ]\\n    }\\n\\n    import sys\\n\\n    sys.modules[__name__] = _LazyModule(\\n        __name__,\\n        globals()['__file__'],\\n        _import_structure,\\n        module_spec=__spec__,\\n        extra_objects={},\\n    )\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport time\\nfrom typing import Any, Dict, List, Optional, Tuple, Union\\n\\nimport torch\\nfrom peft import PeftModel\\nfrom torch import nn\\nfrom transformers import Seq2SeqTrainer as HfSeq2SeqTrainer\\nfrom transformers import Trainer as HfTrainer\\nfrom transformers.integrations import is_deepspeed_zero3_enabled\\nfrom transformers.modeling_utils import unwrap_model\\nfrom transformers.models.auto.modeling_auto import MODEL_FOR_CAUSAL_LM_MAPPING_NAMES\\nfrom transformers.utils import is_peft_available\\n\\nfrom swift.torchacc_utils import patch_clip_grad_norm, ta_trim_graph\\nfrom swift.utils import use_torchacc\\nfrom .loss import get_loss_func\\nfrom .mixin import SwiftMixin\\nfrom .push_to_ms import PushToMsHubMixin\\n\\n\\nclass Trainer(PushToMsHubMixin, SwiftMixin, HfTrainer):\\n    pass\\n\\n\\nclass Seq2SeqTrainer(PushToMsHubMixin, SwiftMixin, HfSeq2SeqTrainer):\\n\\n    def __init__(self, *args, **kwargs):\\n        super().__init__(*args, **kwargs)\\n        # performance\\n        if not hasattr(self, 'perf'):\\n            self.perf = {}\\n        self.perf.update({\\n            'gen_time': 0.,\\n            'gen_len': 0,\\n        })\\n        self._acc = torch.tensor(0.).to(self.args.device)\\n        if use_torchacc():\\n            patch_clip_grad_norm(self.accelerator)\\n\\n    def prediction_step(\\n        self,\\n        model: nn.Module,\\n        inputs: Dict[str, Union[torch.Tensor, Any]],\\n        prediction_loss_only: bool,\\n        ignore_keys: Optional[List[str]] = None,\\n        **gen_kwargs,\\n    ) -> Tuple[Optional[float], Optional[torch.Tensor], Optional[torch.Tensor]]:\\n        if not self.args.predict_with_generate or prediction_loss_only:\\n            return super().prediction_step(\\n                model, inputs, prediction_loss_only=prediction_loss_only, ignore_keys=ignore_keys)\\n\\n        inputs.pop('loss_scale', None)\\n        has_labels = 'labels' in inputs\\n        inputs = self._prepare_inputs(inputs)\\n\\n        # XXX: adapt synced_gpus for fairscale as well\\n        # Priority (handled in generate):\\n        # gen_kwargs > model.generation_config > default GenerationConfig()\\n\\n        if len(gen_kwargs) == 0 and hasattr(self, '_gen_kwargs'):\\n            gen_kwargs = self._gen_kwargs.copy()\\n            if hasattr(self.model, 'generation_config'):\\n                gen_kwargs.update(self.model.generation_config.to_dict())\\n\\n        if gen_kwargs.get('max_length') is None and gen_kwargs.get('max_new_tokens') is None:\\n            gen_kwargs['max_length'] = self.model.config.max_length\\n        gen_kwargs['num_beams'] = (\\n            gen_kwargs['num_beams'] if gen_kwargs.get('num_beams') is not None else self.model.config.num_beams)\\n        default_synced_gpus = True if is_deepspeed_zero3_enabled() else False\\n        gen_kwargs['synced_gpus'] = (\\n            gen_kwargs['synced_gpus'] if gen_kwargs.get('synced_gpus') is not None else default_synced_gpus)\\n\\n        # If the `decoder_input_ids` was created from `labels`, evict the former, so that the model can freely generate\\n        # (otherwise, it would continue generating from the padded `decoder_input_ids`)\\n        if ('labels' in inputs and 'decoder_input_ids' in inputs\\n                and inputs['labels'].shape == inputs['decoder_input_ids'].shape):\\n            inputs = {k: v for k, v in inputs.items() if k != 'decoder_input_ids'}\\n\\n        gen_kwargs['pad_token_id'] = self.tokenizer.pad_token_id\\n        gen_kwargs['eos_token_id'] = self.tokenizer.eos_token_id\\n        # fix generate warning\\n        if 'max_length' in gen_kwargs and 'max_new_tokens' in gen_kwargs and gen_kwargs['max_new_tokens'] is not None:\\n            gen_kwargs.pop('max_length')\\n        gen_time = time.time()\\n        generate_inputs = inputs.copy()\\n        if has_labels:\\n            _labels = inputs['labels'][0]\\n            n_mask = 0\\n            for i in range(len(_labels)):\\n                if _labels[i] != -100:\\n                    n_mask = i\\n                    break\\n\\n            for k in ['input_ids', 'attention_mask']:\\n                generate_inputs[k] = generate_inputs[k][:, :n_mask]\\n            generate_inputs['labels'] = generate_inputs['labels'][:, n_mask:]\\n\\n        generated_tokens = self.model.generate(**generate_inputs, **gen_kwargs)\\n        gen_time = time.time() - gen_time\\n\\n        if hasattr(self.model, 'encoder') and self.model.encoder.main_input_name != self.model.main_input_name:\\n            generation_inputs = generate_inputs[self.model.encoder.main_input_name]\\n        else:\\n            generation_inputs = generate_inputs[self.model.main_input_name]\\n\\n        generated_tokens = generated_tokens[:, generation_inputs.shape[1]:]\\n        gen_len = len(generated_tokens[0])\\n        self.perf['gen_time'] = self.perf['gen_time'] + gen_time\\n        self.perf['gen_len'] = self.perf['gen_len'] + gen_len\\n\\n        # in case the batch is shorter than max length, the output should be padded\\n        if gen_kwargs.get('max_length') is not None and generated_tokens.shape[-1] < gen_kwargs['max_length']:\\n            generated_tokens = self._pad_tensors_to_max_len(generated_tokens, gen_kwargs['max_length'])\\n        elif gen_kwargs.get('max_new_tokens') is not None and generated_tokens.shape[-1] < (gen_kwargs['max_new_tokens']\\n                                                                                            + 1):\\n            generated_tokens = self._pad_tensors_to_max_len(generated_tokens, gen_kwargs['max_new_tokens'] + 1)\\n\\n        with torch.no_grad():\\n            if has_labels:\\n                with self.compute_loss_context_manager():\\n                    outputs = model(**inputs)\\n                if self.label_smoother is not None:\\n                    loss = self.label_smoother(outputs, inputs['labels']).mean().detach()\\n                else:\\n                    loss = (outputs['loss'] if isinstance(outputs, dict) else outputs[0]).mean().detach()\\n            else:\\n                loss = None\\n\\n        if self.args.prediction_loss_only:\\n            return loss, None, None\\n\\n        if has_labels:\\n            labels = generate_inputs['labels']\\n            if gen_kwargs.get('max_length') is not None and labels.shape[-1] < gen_kwargs['max_length']:\\n                labels = self._pad_tensors_to_max_len(labels, gen_kwargs['max_length'])\\n            elif gen_kwargs.get('max_new_tokens') is not None and labels.shape[-1] < (gen_kwargs['max_new_tokens'] + 1):\\n                labels = self._pad_tensors_to_max_len(labels, (gen_kwargs['max_new_tokens'] + 1))\\n        else:\\n            labels = None\\n\\n        return loss, generated_tokens, labels\\n\\n    def compute_loss(self, model, inputs, return_outputs=None):\\n        if not hasattr(self, '_custom_metrics'):\\n            self._custom_metrics = {}\\n\\n        labels = None\\n        loss_name = self.args.loss_name\\n        if loss_name is None and 'loss_scale' in inputs:\\n            loss_name = 'loss-scale'\\n\\n        loss_kwargs = {}\\n        if loss_name == 'loss-scale':\\n            loss_kwargs['loss_scale'] = inputs.pop('loss_scale')\\n\\n        if loss_name is not None or self.label_smoother is not None and 'labels' in inputs:\\n            labels = inputs.pop('labels')\\n\\n        loss_kwargs['labels'] = labels\\n        outputs = model(**inputs)\\n        if loss_name is not None:\\n            loss_func = get_loss_func(loss_name)\\n            outputs['loss'] = loss_func(outputs, **loss_kwargs)\\n\\n        # Save past state if it exists\\n        # TODO: this needs to be fixed and made cleaner later.\\n        if self.args.past_index >= 0:\\n            self._past = outputs[self.args.past_index]\\n\\n        if labels is not None and loss_name is None:\\n            unwrapped_model = unwrap_model(model)\\n            if is_peft_available() and isinstance(unwrapped_model, PeftModel):\\n                model_name = unwrapped_model.base_model.model._get_name()\\n            else:\\n                model_name = unwrapped_model._get_name()\\n            if model_name in MODEL_FOR_CAUSAL_LM_MAPPING_NAMES.values():\\n                loss = self.label_smoother(outputs, labels, shift_labels=True)\\n            else:\\n                loss = self.label_smoother(outputs, labels)\\n        else:\\n            loss = outputs['loss'] if isinstance(outputs, dict) else outputs[0]\\n\\n        if labels is None:\\n            labels = inputs['labels']\\n\\n        if self.sequence_parallel_size > 1:\\n            from swift.trainers.xtuner import reduce_xtuner_sequence_parallel_loss\\n            loss = reduce_xtuner_sequence_parallel_loss(loss, labels)\\n\\n        if self.is_encoder_decoder:\\n            preds = outputs.logits.argmax(dim=2)[..., :] if outputs.logits is not None else None\\n            labels = labels[..., :]\\n        else:\\n            preds = outputs.logits.argmax(dim=2)[..., :-1] if outputs.logits is not None else None\\n            labels = labels[..., 1:]\\n\\n        masks = labels != -100\\n        acc_strategy = getattr(self.args, 'acc_strategy', 'token')\\n        acc: Optional[torch.Tensor] = None\\n        sft_args = getattr(self, 'sft_args', None)\\n        acc_steps = 1 if sft_args is None else sft_args.acc_steps\\n        if self.state.global_step % acc_steps == 0 and preds is not None:\\n            if preds.shape != labels.shape:\\n                pass\\n            elif acc_strategy == 'sentence':\\n                acc_list = []\\n                for i, m in enumerate(masks):\\n                    acc_list.append(torch.all(preds[i, m] == labels[i, m]).to(torch.int64).item())\\n                acc = torch.tensor(acc_list, device=preds.device).float().mean()\\n            else:\\n                if use_torchacc():\\n                    ta_trim_graph()\\n                    preds = preds.to('cpu')\\n                    masks = masks.to('cpu')\\n                    labels = labels.to('cpu')\\n                acc = (torch.masked_select(preds, masks) == torch.masked_select(labels, masks)).float().mean()\\n            if model.training and acc is not None:\\n                if 'acc' not in self._custom_metrics:\\n                    self._custom_metrics['acc'] = self._acc\\n                self._custom_metrics['acc'] = self._custom_metrics['acc'] + acc / self.args.gradient_accumulation_steps\\n        return (loss, outputs) if return_outputs else loss\\n\\n\\n\\n\\n# code borrowed from https://github.com/jiaweizzhao/GaLore\\nimport torch\\nfrom bitsandbytes.optim.optimizer import Optimizer2State\\n\\nfrom .galore_projector import GaLoreProjector\\n\\n\\nclass AdamW8bit(Optimizer2State):\\n\\n    def __init__(self,\\n                 params,\\n                 lr=1e-3,\\n                 betas=(0.9, 0.999),\\n                 eps=1e-8,\\n                 weight_decay=1e-2,\\n                 amsgrad=False,\\n                 optim_bits=32,\\n                 args=None,\\n                 min_8bit_size=4096,\\n                 percentile_clipping=100,\\n                 block_wise=True,\\n                 is_paged=False):\\n        super().__init__(\\n            'adam',\\n            params,\\n            lr,\\n            betas,\\n            eps,\\n            weight_decay,\\n            8,\\n            args,\\n            min_8bit_size,\\n            percentile_clipping,\\n            block_wise,\\n            is_paged=is_paged)\\n\\n    @torch.no_grad()\\n    def step(self, closure=None):\\n        \\\"\\\"\\\"Performs a single optimization step.\\n\\n        Arguments:\\n            closure (callable, optional): A closure that reevaluates the model\\n                and returns the loss.\\n        \\\"\\\"\\\"\\n        loss = None\\n        if closure is not None:\\n            with torch.enable_grad():\\n                loss = closure()\\n\\n        if not self.initialized:\\n            self.check_overrides()\\n            self.to_gpu()  # needed for fairseq pure fp16 training\\n            self.initialized = True\\n\\n        # if self.is_paged: self.page_mng.prefetch_all()\\n        for gindex, group in enumerate(self.param_groups):\\n            for pindex, p in enumerate(group['params']):\\n                if p.grad is None:\\n                    continue\\n                state = self.state[p]\\n\\n                if 'step' not in state:\\n                    state['step'] = 0\\n\\n                # GaLore Projection\\n                if 'rank' in group:\\n                    if 'projector' not in state:\\n                        state['projector'] = GaLoreProjector(\\n                            group['rank'],\\n                            update_proj_gap=group['update_proj_gap'],\\n                            scale=group['scale'],\\n                            proj_type=group['proj_type'])\\n\\n                    if 'weight_decay' in group and group['weight_decay'] > 0:\\n                        # ensure that the weight decay is not applied to the norm grad\\n                        group['weight_decay_saved'] = group['weight_decay']\\n                        group['weight_decay'] = 0\\n\\n                    grad = state['projector'].project(p.grad, state['step'])\\n\\n                    # suboptimal implementation\\n                    p.saved_data = p.data.clone()\\n                    p.data = grad.clone().to(p.data.dtype).to(p.data.device)\\n                    p.data.zero_()\\n                    p.grad = grad\\n\\n                if 'state1' not in state:\\n                    self.init_state(group, p, gindex, pindex)\\n\\n                self.prefetch_state(p)\\n                self.update_step(group, p, gindex, pindex)\\n                torch.cuda.synchronize()\\n\\n                # GaLore Projection Back\\n                if 'rank' in group:\\n                    p.data = p.saved_data.add_(state['projector'].project_back(p.data))\\n\\n                    # apply weight decay\\n                    if 'weight_decay_saved' in group:\\n                        p.data.add_(p.data, alpha=-group['lr'] * group['weight_decay_saved'])\\n                        group['weight_decay'] = group['weight_decay_saved']\\n                        del group['weight_decay_saved']\\n\\n        if self.is_paged:\\n            # all paged operation are asynchronous, we need\\n            # to sync to make sure all tensors are in the right state\\n            torch.cuda.synchronize()\\n\\n        return loss\\n\\n\\nGaLoreAdamW8bit = AdamW8bit\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport importlib\\nfrom dataclasses import dataclass\\nfrom typing import Any, Dict, List, Tuple, Union\\n\\nimport torch\\nfrom torch import nn\\nfrom torch.optim import Optimizer\\nfrom transformers import Trainer, TrainingArguments, get_scheduler\\n\\nfrom swift.utils import get_logger\\n\\ntry:\\n    from torch.optim.lr_scheduler import _LRScheduler as LRScheduler\\nexcept ImportError:\\n    from torch.optim.lr_scheduler import LRScheduler\\n\\nlogger = get_logger()\\n\\n\\n@dataclass\\nclass GaLoreConfig:\\n    \\\"\\\"\\\"\\n    The configuration class for the Galore module.\\n\\n\\n    See https://arxiv.org/abs/2403.03507\\n\\n    Args:\\n        rank (`int`): The galore rank\\n        target_modules (`Union[str, List[str]]`): The target modules to use, if `None`,\\n            will use all attn and mlp linears\\n        update_proj_gap(`int`): The projection update interval for galore\\n        proj_type(`str`) The project type of Galore, valid values are `std`,\\n            `reverse_std`, `right`, `left`, `full`\\n        galore_scale(float): the scale of gradient\\n        optim_per_parameter(bool): Gives one optimizer per parameter\\n    \\\"\\\"\\\"\\n    rank: int = 128\\n    target_modules: Union[str, List[str]] = None\\n    update_proj_gap: int = 50\\n    galore_scale: float = 1.0\\n    proj_type: str = 'std'\\n    optim_per_parameter: bool = False\\n    quantize: bool = False\\n    proj_quant: bool = False\\n    proj_bits: int = 4\\n    proj_group_size: int = 256\\n    cos_threshold: float = 0.4\\n    gamma_proj: int = 2\\n    queue_size: int = 5\\n\\n\\nclass GaloreOptimizerWrapper(Optimizer):\\n\\n    def __init__(self, optimizers: Dict[Any, Optimizer]):\\n        self.optimizers = optimizers\\n        super().__init__([torch.tensor([1., 2., 3.])], {'lr': 1.})\\n\\n    def zero_grad(self, *args, **kwargs) -> None:\\n        for optim in self.optimizers.values():\\n            optim.zero_grad(*args, **kwargs)\\n\\n    def step(self, *args, **kwargs) -> None:\\n        for optim in self.optimizers.values():\\n            optim.step(*args, **kwargs)\\n\\n\\nclass GaloreSchedulerWrapper(LRScheduler):\\n\\n    def __init__(self, lr_schedulers: Dict[Any, LRScheduler]):\\n        self.lr_schedulers = lr_schedulers\\n\\n    def step(self, *args, **kwargs) -> None:\\n        for lr_scheduler in self.lr_schedulers.values():\\n            lr_scheduler.step(*args, **kwargs)\\n        self._last_lr = lr_scheduler.get_last_lr()\\n\\n\\ndef create_optimizer_and_scheduler(model: nn.Module, args: TrainingArguments, config: GaLoreConfig, max_steps,\\n                                   **defaults):\\n    galore_params = []\\n    for module_name, module in model.named_modules():\\n        if not isinstance(module, (nn.Linear, nn.Embedding)) or \\\\\\n                not any(target_key in module_name for target_key in config.target_modules):\\n            continue\\n\\n        if not module.weight.requires_grad:\\n            continue\\n\\n        logger.info(f'Enable GaLore for weights in module: {module_name}')\\n        galore_params.append(module.weight)\\n\\n    id_galore_params = [id(p) for p in galore_params]\\n    galore_defaults = {\\n        'rank': config.rank,\\n        'update_proj_gap': config.update_proj_gap,\\n        'scale': config.galore_scale,\\n        'proj_type': config.proj_type,\\n        **defaults\\n    }\\n    if config.quantize:\\n        galore_defaults['quant'] = config.proj_quant\\n        galore_defaults['quant_n_bit'] = config.proj_bits\\n        galore_defaults['quant_group_size'] = config.proj_group_size\\n        galore_defaults['cos_threshold'] = config.cos_threshold\\n        galore_defaults['gamma_proj'] = config.gamma_proj\\n        galore_defaults['queue_size'] = config.queue_size\\n    optim_cls, optim_kwargs = get_optimizer(args, config)\\n\\n    if config.optim_per_parameter and not config.quantize:\\n        # q-galore does not support optim_per_parameter\\n        optimizer_dict = {}\\n        galore_defaults['update_proj_gap'] = galore_defaults['update_proj_gap'] * 2\\n        for p in model.parameters():\\n            if p.requires_grad:\\n                if id(p) in id_galore_params:\\n                    optimizer_dict[p] = optim_cls([{'params': [p], **galore_defaults}], **optim_kwargs)\\n                else:\\n                    optimizer_dict[p] = optim_cls([{'params': [p], **defaults}], **optim_kwargs)\\n\\n        # get scheduler dict\\n        scheduler_dict = {}\\n        for p in model.parameters():\\n            if p.requires_grad:\\n                scheduler_dict[p] = get_scheduler(\\n                    optimizer=optimizer_dict[p],\\n                    name=args.lr_scheduler_type,\\n                    num_training_steps=max_steps * 2,\\n                    num_warmup_steps=args.warmup_steps * 2,\\n                    scheduler_specific_kwargs=args.lr_scheduler_kwargs,\\n                )\\n\\n        return GaloreOptimizerWrapper(optimizer_dict), GaloreSchedulerWrapper(scheduler_dict)\\n    else:\\n        decay_parameters = Trainer.get_decay_parameter_names(Trainer, model)\\n        param_groups = [{\\n            'params': galore_params,\\n            **galore_defaults,\\n        }]\\n        param_groups.extend([\\n            {\\n                'params': [\\n                    p for n, p in model.named_parameters()\\n                    if (n in decay_parameters and id(p) not in id_galore_params and p.requires_grad)\\n                ],\\n                'weight_decay':\\n                defaults['weight_decay'],\\n            },\\n            {\\n                'params': [\\n                    p for n, p in model.named_parameters()\\n                    if (n not in decay_parameters and id(p) not in id_galore_params and p.requires_grad)\\n                ],\\n                'weight_decay':\\n                0.0,\\n            },\\n        ])\\n        optim = optim_cls(param_groups, **optim_kwargs)\\n        scheduler = get_scheduler(\\n            optimizer=optim,\\n            name=args.lr_scheduler_type,\\n            num_training_steps=max_steps,\\n            num_warmup_steps=args.warmup_steps,\\n            scheduler_specific_kwargs=args.lr_scheduler_kwargs,\\n        )\\n        return optim, scheduler\\n\\n\\ndef get_optimizer(args: TrainingArguments, config: GaLoreConfig) -> Tuple[Any, Any]:\\n    # parse args.optim_args\\n    optim_args = {}\\n    if args.optim_args:\\n        for mapping in args.optim_args.replace(' ', '').split(','):\\n            key, value = mapping.split('=')\\n            optim_args[key] = value\\n\\n    optimizer_kwargs = {'lr': args.learning_rate}\\n\\n    adam_kwargs = {\\n        'betas': (args.adam_beta1, args.adam_beta2),\\n        'eps': args.adam_epsilon,\\n    }\\n    if args.optim == 'adafactor':\\n        from .adafactor import GaLoreAdafactor\\n        optimizer_cls = GaLoreAdafactor\\n        optimizer_kwargs.update({'scale_parameter': False, 'relative_step': False})\\n    elif args.optim in ('adamw_hf', 'adamw_torch'):\\n        if config.quantize:\\n            assert importlib.util.find_spec('q_galore_torch') is not None, \\\\\\n                'Please install q-galore by `pip install q_galore_torch`'\\n            from swift.utils import get_dist_setting\\n            _, _, world_size, _ = get_dist_setting()\\n            if world_size > 1:\\n                # from q_galore_torch import QGaLoreAdamW8bit_simulate as GaLoreAdamW\\n                from q_galore_torch import QGaLoreAdamW8bit as GaLoreAdamW\\n            else:\\n                from q_galore_torch import QGaLoreAdamW8bit as GaLoreAdamW\\n        else:\\n            from .adamw import GaLoreAdamW\\n        optimizer_cls = GaLoreAdamW\\n        optimizer_kwargs.update(adam_kwargs)\\n    elif 'adamw' in args.optim and '8bit' in args.optim:\\n        try:\\n            from .adamw8bit import GaLoreAdamW8bit\\n            optimizer_cls = GaLoreAdamW8bit\\n            optimizer_kwargs.update(adam_kwargs)\\n            optimizer_kwargs.update({'optim_bits': 8, 'is_paged': 'paged' in args.optim})\\n        except ImportError:\\n            raise ValueError('Trainer tried to instantiate bnb optimizer but bnb is not installed!')\\n    else:\\n        raise ValueError(f'Galore not supported for optimizer type: {args.optim}')\\n    return optimizer_cls, optimizer_kwargs\\n\\n\\n# copy dependencies from transformers/optimization.py\\n# code borrowed from https://github.com/jiaweizzhao/GaLore\\nimport math\\nimport warnings\\nfrom typing import Callable, Iterable, Tuple\\n\\nimport torch\\nfrom torch import nn\\nfrom torch.optim import Optimizer\\nfrom transformers.utils.versions import require_version\\n\\nfrom .galore_projector import GaLoreProjector\\n\\n\\nclass AdamW(Optimizer):\\n    \\\"\\\"\\\"\\n    Implements Adam algorithm with weight decay fix as introduced in [Decoupled Weight Decay\\n    Regularization](https://arxiv.org/abs/1711.05101).\\n\\n    Parameters:\\n        params (`Iterable[nn.parameter.Parameter]`):\\n            Iterable of parameters to optimize or dictionaries defining parameter groups.\\n        lr (`float`, *optional*, defaults to 0.001):\\n            The learning rate to use.\\n        betas (`Tuple[float,float]`, *optional*, defaults to `(0.9, 0.999)`):\\n            Adam's betas parameters (b1, b2).\\n        eps (`float`, *optional*, defaults to 1e-06):\\n            Adam's epsilon for numerical stability.\\n        weight_decay (`float`, *optional*, defaults to 0.0):\\n            Decoupled weight decay to apply.\\n        correct_bias (`bool`, *optional*, defaults to `True`):\\n            Whether or not to correct bias in Adam (for instance, in Bert TF repository they use `False`).\\n        no_deprecation_warning (`bool`, *optional*, defaults to `False`):\\n            A flag used to disable the deprecation warning (set to `True` to disable the warning).\\n    \\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        params: Iterable[nn.parameter.Parameter],\\n        lr: float = 1e-3,\\n        betas: Tuple[float, float] = (0.9, 0.999),\\n        eps: float = 1e-6,\\n        weight_decay: float = 0.0,\\n        correct_bias: bool = True,\\n        no_deprecation_warning: bool = False,\\n    ):\\n        require_version('torch>=1.5.0')  # add_ with alpha\\n        if lr < 0.0:\\n            raise ValueError(f'Invalid learning rate: {lr} - should be >= 0.0')\\n        if not 0.0 <= betas[0] < 1.0:\\n            raise ValueError(f'Invalid beta parameter: {betas[0]} - should be in [0.0, 1.0)')\\n        if not 0.0 <= betas[1] < 1.0:\\n            raise ValueError(f'Invalid beta parameter: {betas[1]} - should be in [0.0, 1.0)')\\n        if not 0.0 <= eps:\\n            raise ValueError(f'Invalid epsilon value: {eps} - should be >= 0.0')\\n        defaults = {'lr': lr, 'betas': betas, 'eps': eps, 'weight_decay': weight_decay, 'correct_bias': correct_bias}\\n        super().__init__(params, defaults)\\n\\n    @torch.no_grad()\\n    def step(self, closure: Callable = None):\\n        \\\"\\\"\\\"\\n        Performs a single optimization step.\\n\\n        Arguments:\\n            closure (`Callable`, *optional*): A closure that reevaluates the model and returns the loss.\\n        \\\"\\\"\\\"\\n        loss = None\\n        if closure is not None:\\n            loss = closure()\\n\\n        for group in self.param_groups:\\n            for p in group['params']:\\n                if p.grad is None:\\n                    continue\\n                grad = p.grad\\n                if grad.is_sparse:\\n                    raise RuntimeError('Adam does not support sparse gradients, please consider SparseAdam instead')\\n\\n                state = self.state[p]\\n\\n                if 'step' not in state:\\n                    state['step'] = 0\\n\\n                # GaLore Projection\\n                if 'rank' in group:\\n                    if 'projector' not in state:\\n                        state['projector'] = GaLoreProjector(\\n                            group['rank'],\\n                            update_proj_gap=group['update_proj_gap'],\\n                            scale=group['scale'],\\n                            proj_type=group['proj_type'])\\n\\n                    grad = state['projector'].project(grad, state['step'])\\n\\n                # State initialization\\n                if 'exp_avg' not in state:\\n                    # Exponential moving average of gradient values\\n                    state['exp_avg'] = torch.zeros_like(grad)\\n                    # Exponential moving average of squared gradient values\\n                    state['exp_avg_sq'] = torch.zeros_like(grad)\\n\\n                exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']\\n                beta1, beta2 = group['betas']\\n\\n                state['step'] += 1\\n\\n                # Decay the first and second moment running average coefficient\\n                # In-place operations to update the averages at the same time\\n                exp_avg.mul_(beta1).add_(grad, alpha=(1.0 - beta1))\\n                exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)\\n                denom = exp_avg_sq.sqrt().add_(group['eps'])\\n\\n                step_size = group['lr']\\n                if group['correct_bias']:  # No bias correction for Bert\\n                    bias_correction1 = 1.0 - beta1**state['step']\\n                    bias_correction2 = 1.0 - beta2**state['step']\\n                    step_size = step_size * math.sqrt(bias_correction2) / bias_correction1\\n\\n                # compute norm gradient\\n                norm_grad = exp_avg / denom\\n\\n                # GaLore Projection Back\\n                if 'rank' in group:\\n                    norm_grad = state['projector'].project_back(norm_grad)\\n\\n                p.add_(norm_grad, alpha=-step_size)\\n\\n                # Just adding the square of the weights to the loss function is *not*\\n                # the correct way of using L2 regularization/weight decay with Adam,\\n                # since that will interact with the m and v parameters in strange ways.\\n                #\\n                # Instead we want to decay the weights in a manner that doesn't interact\\n                # with the m/v parameters. This is equivalent to adding the square\\n                # of the weights to the loss with plain (non-momentum) SGD.\\n                # Add weight decay at the end (fixed version)\\n                if group['weight_decay'] > 0.0:\\n                    p.add_(p, alpha=(-group['lr'] * group['weight_decay']))\\n\\n        return loss\\n\\n\\nGaLoreAdamW = AdamW\\n\\n\\n# code borrowed from https://github.com/jiaweizzhao/GaLore\\n\\nimport torch\\n\\n\\nclass GaLoreProjector:\\n\\n    def __init__(self, rank, verbose=False, update_proj_gap=200, scale=1.0, proj_type='std'):\\n        self.rank = rank\\n        self.verbose = verbose\\n        self.update_proj_gap = update_proj_gap\\n        self.scale = scale\\n        self.ortho_matrix = None\\n        self.proj_type = proj_type\\n\\n    def project(self, full_rank_grad, iter):\\n\\n        if self.proj_type == 'std':\\n            if full_rank_grad.shape[0] >= full_rank_grad.shape[1]:\\n                if self.ortho_matrix is None or iter % self.update_proj_gap == 0:\\n                    self.ortho_matrix = self.get_orthogonal_matrix(full_rank_grad, self.rank, type='right')\\n                low_rank_grad = torch.matmul(full_rank_grad, self.ortho_matrix.t())\\n            else:\\n                if self.ortho_matrix is None or iter % self.update_proj_gap == 0:\\n                    self.ortho_matrix = self.get_orthogonal_matrix(full_rank_grad, self.rank, type='left')\\n                low_rank_grad = torch.matmul(self.ortho_matrix.t(), full_rank_grad)\\n        elif self.proj_type == 'reverse_std':\\n            if full_rank_grad.shape[0] >= full_rank_grad.shape[1]:\\n                if self.ortho_matrix is None or iter % self.update_proj_gap == 0:\\n                    self.ortho_matrix = self.get_orthogonal_matrix(full_rank_grad, self.rank, type='left')\\n                low_rank_grad = torch.matmul(self.ortho_matrix.t(), full_rank_grad)\\n            else:\\n                if self.ortho_matrix is None or iter % self.update_proj_gap == 0:\\n                    self.ortho_matrix = self.get_orthogonal_matrix(full_rank_grad, self.rank, type='right')\\n                low_rank_grad = torch.matmul(full_rank_grad, self.ortho_matrix.t())\\n        elif self.proj_type == 'right':\\n            if self.ortho_matrix is None or iter % self.update_proj_gap == 0:\\n                self.ortho_matrix = self.get_orthogonal_matrix(full_rank_grad, self.rank, type='right')\\n            low_rank_grad = torch.matmul(full_rank_grad, self.ortho_matrix.t())\\n        elif self.proj_type == 'left':\\n            if self.ortho_matrix is None or iter % self.update_proj_gap == 0:\\n                self.ortho_matrix = self.get_orthogonal_matrix(full_rank_grad, self.rank, type='left')\\n            low_rank_grad = torch.matmul(self.ortho_matrix.t(), full_rank_grad)\\n        elif self.proj_type == 'full':\\n            if self.ortho_matrix is None or iter % self.update_proj_gap == 0:\\n                self.ortho_matrix = self.get_orthogonal_matrix(full_rank_grad, self.rank, type='full')\\n            low_rank_grad = torch.matmul(self.ortho_matrix[0].t(), full_rank_grad) @ self.ortho_matrix[1].t()\\n\\n        return low_rank_grad\\n\\n    def project_back(self, low_rank_grad):\\n\\n        if self.proj_type == 'std':\\n            if low_rank_grad.shape[0] >= low_rank_grad.shape[1]:\\n                full_rank_grad = torch.matmul(low_rank_grad, self.ortho_matrix)\\n            else:\\n                full_rank_grad = torch.matmul(self.ortho_matrix, low_rank_grad)\\n        elif self.proj_type == 'reverse_std':\\n            if low_rank_grad.shape[0] <= low_rank_grad.shape[1]:  # note this is different from std\\n                full_rank_grad = torch.matmul(self.ortho_matrix, low_rank_grad)\\n            else:\\n                full_rank_grad = torch.matmul(low_rank_grad, self.ortho_matrix)\\n        elif self.proj_type == 'right':\\n            full_rank_grad = torch.matmul(low_rank_grad, self.ortho_matrix)\\n        elif self.proj_type == 'left':\\n            full_rank_grad = torch.matmul(self.ortho_matrix, low_rank_grad)\\n        elif self.proj_type == 'full':\\n            full_rank_grad = torch.matmul(self.ortho_matrix[0], low_rank_grad) @ self.ortho_matrix[1]\\n\\n        return full_rank_grad * self.scale\\n\\n    # svd decomposition\\n    def get_orthogonal_matrix(self, weights, rank, type):\\n        module_params = weights\\n\\n        if module_params.data.dtype != torch.float:\\n            float_data = False\\n            original_type = module_params.data.dtype\\n            original_device = module_params.data.device\\n            matrix = module_params.data.float()\\n        else:\\n            float_data = True\\n            matrix = module_params.data\\n\\n        U, s, Vh = torch.linalg.svd(matrix, full_matrices=False)\\n\\n        # make the smaller matrix always to be orthogonal matrix\\n        if type == 'right':\\n            A = U[:, :rank] @ torch.diag(s[:rank])\\n            B = Vh[:rank, :]\\n\\n            if not float_data:\\n                B = B.to(original_device).type(original_type)\\n            return B\\n        elif type == 'left':\\n            A = U[:, :rank]\\n            B = torch.diag(s[:rank]) @ Vh[:rank, :]\\n            if not float_data:\\n                A = A.to(original_device).type(original_type)\\n            return A\\n        elif type == 'full':\\n            A = U[:, :rank]\\n            B = Vh[:rank, :]\\n            if not float_data:\\n                A = A.to(original_device).type(original_type)\\n                B = B.to(original_device).type(original_type)\\n            return [A, B]\\n        else:\\n            raise ValueError('type should be left, right or full')\\n\\n\\n# copy dependencies from transformers/optimization.py\\n# code borrowed from https://github.com/jiaweizzhao/GaLore\\nimport math\\n\\nimport torch\\nfrom torch.optim import Optimizer\\nfrom transformers.utils.versions import require_version\\n\\nfrom .galore_projector import GaLoreProjector\\n\\n\\nclass Adafactor(Optimizer):\\n    \\\"\\\"\\\"\\n    AdaFactor pytorch implementation can be used as a drop in replacement for Adam original fairseq code:\\n    https://github.com/pytorch/fairseq/blob/master/fairseq/optim/adafactor.py\\n\\n    Paper: *Adafactor: Adaptive Learning Rates with Sublinear Memory Cost* https://arxiv.org/abs/1804.04235 Note that\\n    this optimizer internally adjusts the learning rate depending on the `scale_parameter`, `relative_step` and\\n    `warmup_init` options. To use a manual (external) learning rate schedule you should set `scale_parameter=False` and\\n    `relative_step=False`.\\n\\n    Arguments:\\n        params (`Iterable[nn.parameter.Parameter]`):\\n            Iterable of parameters to optimize or dictionaries defining parameter groups.\\n        lr (`float`, *optional*):\\n            The external learning rate.\\n        eps (`Tuple[float, float]`, *optional*, defaults to `(1e-30, 0.001)`):\\n            Regularization constants for square gradient and parameter scale respectively\\n        clip_threshold (`float`, *optional*, defaults to 1.0):\\n            Threshold of root mean square of final gradient update\\n        decay_rate (`float`, *optional*, defaults to -0.8):\\n            Coefficient used to compute running averages of square\\n        beta1 (`float`, *optional*):\\n            Coefficient used for computing running averages of gradient\\n        weight_decay (`float`, *optional*, defaults to 0.0):\\n            Weight decay (L2 penalty)\\n        scale_parameter (`bool`, *optional*, defaults to `True`):\\n            If True, learning rate is scaled by root mean square\\n        relative_step (`bool`, *optional*, defaults to `True`):\\n            If True, time-dependent learning rate is computed instead of external learning rate\\n        warmup_init (`bool`, *optional*, defaults to `False`):\\n            Time-dependent learning rate computation depends on whether warm-up initialization is being used\\n\\n    This implementation handles low-precision (FP16, bfloat) values, but we have not thoroughly tested.\\n\\n    Recommended T5 finetuning settings (https://discuss.huggingface.co/t/t5-finetuning-tips/684/3):\\n\\n        - Training without LR warmup or clip_threshold is not recommended.\\n\\n           - use scheduled LR warm-up to fixed LR\\n           - use clip_threshold=1.0 (https://arxiv.org/abs/1804.04235)\\n        - Disable relative updates\\n        - Use scale_parameter=False\\n        - Additional optimizer operations like gradient clipping should not be used alongside Adafactor\\n\\n    Example:\\n\\n    ```python\\n    Adafactor(model.parameters(), scale_parameter=False, relative_step=False, warmup_init=False, lr=1e-3)\\n    ```\\n\\n    Others reported the following combination to work well:\\n\\n    ```python\\n    Adafactor(model.parameters(), scale_parameter=True, relative_step=True, warmup_init=True, lr=None)\\n    ```\\n\\n    When using `lr=None` with [`Trainer`] you will most likely need to use [`~optimization.AdafactorSchedule`]\\n    scheduler as following:\\n\\n    ```python\\n    from transformers.optimization import Adafactor, AdafactorSchedule\\n\\n    optimizer = Adafactor(model.parameters(), scale_parameter=True, relative_step=True, warmup_init=True, lr=None)\\n    lr_scheduler = AdafactorSchedule(optimizer)\\n    trainer = Trainer(..., optimizers=(optimizer, lr_scheduler))\\n    ```\\n\\n    Usage:\\n\\n    ```python\\n    # replace AdamW with Adafactor\\n    optimizer = Adafactor(\\n        model.parameters(),\\n        lr=1e-3,\\n        eps=(1e-30, 1e-3),\\n        clip_threshold=1.0,\\n        decay_rate=-0.8,\\n        beta1=None,\\n        weight_decay=0.0,\\n        relative_step=False,\\n        scale_parameter=False,\\n        warmup_init=False,\\n    )\\n    ```\\\"\\\"\\\"\\n\\n    def __init__(\\n        self,\\n        params,\\n        lr=None,\\n        eps=(1e-30, 1e-3),\\n        clip_threshold=1.0,\\n        decay_rate=-0.8,\\n        beta1=None,\\n        weight_decay=0.0,\\n        scale_parameter=True,\\n        relative_step=True,\\n        warmup_init=False,\\n    ):\\n        require_version('torch>=1.5.0')  # add_ with alpha\\n        if lr is not None and relative_step:\\n            raise ValueError('Cannot combine manual `lr` and `relative_step=True` options')\\n        if warmup_init and not relative_step:\\n            raise ValueError('`warmup_init=True` requires `relative_step=True`')\\n\\n        defaults = {\\n            'lr': lr,\\n            'eps': eps,\\n            'clip_threshold': clip_threshold,\\n            'decay_rate': decay_rate,\\n            'beta1': beta1,\\n            'weight_decay': weight_decay,\\n            'scale_parameter': scale_parameter,\\n            'relative_step': relative_step,\\n            'warmup_init': warmup_init,\\n        }\\n        super().__init__(params, defaults)\\n\\n    @staticmethod\\n    def _get_lr(param_group, param_state):\\n        rel_step_sz = param_group['lr']\\n        if param_group['relative_step']:\\n            min_step = 1e-6 * param_state['step'] if param_group['warmup_init'] else 1e-2\\n            rel_step_sz = min(min_step, 1.0 / math.sqrt(param_state['step']))\\n        param_scale = 1.0\\n        if param_group['scale_parameter']:\\n            param_scale = max(param_group['eps'][1], param_state['RMS'])\\n        return param_scale * rel_step_sz\\n\\n    @staticmethod\\n    def _get_options(param_group, param_shape):\\n        factored = len(param_shape) >= 2\\n        use_first_moment = param_group['beta1'] is not None\\n        return factored, use_first_moment\\n\\n    @staticmethod\\n    def _rms(tensor):\\n        return tensor.norm(2) / (tensor.numel()**0.5)\\n\\n    @staticmethod\\n    def _approx_sq_grad(exp_avg_sq_row, exp_avg_sq_col):\\n        # copy from fairseq's adafactor implementation:\\n        # https://github.com/huggingface/transformers/blob/8395f14de6068012787d83989c3627c3df6a252b/src/transformers/optimization.py#L505\\n        r_factor = (exp_avg_sq_row / exp_avg_sq_row.mean(dim=-1, keepdim=True)).rsqrt_().unsqueeze(-1)\\n        c_factor = exp_avg_sq_col.unsqueeze(-2).rsqrt()\\n        return torch.mul(r_factor, c_factor)\\n\\n    @torch.no_grad()\\n    def step(self, closure=None):\\n        \\\"\\\"\\\"\\n        Performs a single optimization step\\n\\n        Arguments:\\n            closure (callable, optional): A closure that reevaluates the model\\n                and returns the loss.\\n        \\\"\\\"\\\"\\n        loss = None\\n        if closure is not None:\\n            loss = closure()\\n\\n        for group in self.param_groups:\\n            for p in group['params']:\\n                if p.grad is None:\\n                    continue\\n                grad = p.grad\\n                if grad.dtype in {torch.float16, torch.bfloat16}:\\n                    grad = grad.float()\\n                if grad.is_sparse:\\n                    raise RuntimeError('Adafactor does not support sparse gradients.')\\n\\n                state = self.state[p]\\n\\n                if 'step' not in state:\\n                    state['step'] = 0\\n\\n                # GaLore Projection\\n                if 'rank' in group:\\n                    if 'projector' not in state:\\n                        state['projector'] = GaLoreProjector(\\n                            group['rank'],\\n                            update_proj_gap=group['update_proj_gap'],\\n                            scale=group['scale'],\\n                            proj_type=group['proj_type'])\\n\\n                    grad = state['projector'].project(grad, state['step'])\\n\\n                grad_shape = grad.shape\\n\\n                factored, use_first_moment = self._get_options(group, grad_shape)\\n                # State Initialization\\n                if 'RMS' not in state:\\n                    state['step'] = 0\\n\\n                    if use_first_moment:\\n                        # Exponential moving average of gradient values\\n                        state['exp_avg'] = torch.zeros_like(grad)\\n                    if factored:\\n                        state['exp_avg_sq_row'] = torch.zeros(grad_shape[:-1]).to(grad)\\n                        state['exp_avg_sq_col'] = torch.zeros(grad_shape[:-2] + grad_shape[-1:]).to(grad)\\n                    else:\\n                        state['exp_avg_sq'] = torch.zeros_like(grad)\\n\\n                    state['RMS'] = 0\\n                else:\\n                    if use_first_moment:\\n                        state['exp_avg'] = state['exp_avg'].to(grad)\\n                    if factored:\\n                        state['exp_avg_sq_row'] = state['exp_avg_sq_row'].to(grad)\\n                        state['exp_avg_sq_col'] = state['exp_avg_sq_col'].to(grad)\\n                    else:\\n                        state['exp_avg_sq'] = state['exp_avg_sq'].to(grad)\\n\\n                p_data_fp32 = p\\n                if p.dtype in {torch.float16, torch.bfloat16}:\\n                    p_data_fp32 = p_data_fp32.float()\\n\\n                state['step'] += 1\\n                state['RMS'] = self._rms(p_data_fp32)\\n                lr = self._get_lr(group, state)\\n\\n                beta2t = 1.0 - math.pow(state['step'], group['decay_rate'])\\n                update = (grad**2) + group['eps'][0]\\n                if factored:\\n                    exp_avg_sq_row = state['exp_avg_sq_row']\\n                    exp_avg_sq_col = state['exp_avg_sq_col']\\n\\n                    exp_avg_sq_row.mul_(beta2t).add_(update.mean(dim=-1), alpha=(1.0 - beta2t))\\n                    exp_avg_sq_col.mul_(beta2t).add_(update.mean(dim=-2), alpha=(1.0 - beta2t))\\n\\n                    # Approximation of exponential moving average of square of gradient\\n                    update = self._approx_sq_grad(exp_avg_sq_row, exp_avg_sq_col)\\n                    update.mul_(grad)\\n                else:\\n                    exp_avg_sq = state['exp_avg_sq']\\n\\n                    exp_avg_sq.mul_(beta2t).add_(update, alpha=(1.0 - beta2t))\\n                    update = exp_avg_sq.rsqrt().mul_(grad)\\n\\n                update.div_((self._rms(update) / group['clip_threshold']).clamp_(min=1.0))\\n                update.mul_(lr)\\n\\n                if use_first_moment:\\n                    exp_avg = state['exp_avg']\\n                    exp_avg.mul_(group['beta1']).add_(update, alpha=(1 - group['beta1']))\\n                    update = exp_avg\\n\\n                # GaLore Projection Back\\n                if 'rank' in group:\\n                    update = state['projector'].project_back(update)\\n\\n                if group['weight_decay'] != 0:\\n                    p_data_fp32.add_(p_data_fp32, alpha=(-group['weight_decay'] * lr))\\n\\n                p_data_fp32.add_(-update)\\n\\n                if p.dtype in {torch.float16, torch.bfloat16}:\\n                    p.copy_(p_data_fp32)\\n\\n        return loss\\n\\n\\nGaLoreAdafactor = Adafactor\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\n\\nfrom typing import TYPE_CHECKING\\n\\nfrom swift.utils.import_utils import _LazyModule\\n\\nif TYPE_CHECKING:\\n    from .utils import create_optimizer_and_scheduler, GaLoreConfig\\n    from .adafactor import GaLoreAdafactor\\n    from .adamw8bit import GaLoreAdamW8bit\\n    from .adamw import GaLoreAdamW\\nelse:\\n    _import_structure = {\\n        'utils': ['GaLoreConfig', 'create_optimizer_and_scheduler'],\\n        'adafactor': ['GaLoreAdafactor'],\\n        'adamw8bit': ['GaLoreAdamW8bit'],\\n        'adamw': ['GaLoreAdamW'],\\n    }\\n\\n    import sys\\n\\n    sys.modules[__name__] = _LazyModule(\\n        __name__,\\n        globals()['__file__'],\\n        _import_structure,\\n        module_spec=__spec__,\\n        extra_objects={},\\n    )\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Dict, List, Optional, Tuple, Union\\n\\nimport torch\\nimport torch.nn as nn\\nfrom transformers import PreTrainedModel\\nfrom trl import ORPOTrainer as HFORPOTrainer\\n\\nfrom swift.trainers import PushToMsHubMixin, RLHFTrainerMixin, SwiftMixin\\n\\ndel HFORPOTrainer.__init__\\n\\n\\nclass ORPOTrainer(RLHFTrainerMixin, PushToMsHubMixin, SwiftMixin, HFORPOTrainer):\\n\\n    def __init__(self, model: Optional[Union[PreTrainedModel, nn.Module, str]] = None, *_args, **kwargs):\\n        ref_model = kwargs.get('ref_model')\\n        assert ref_model is None, 'ORPO does not require a ref_model.'\\n        super().__init__(model, *_args, **kwargs)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport warnings\\nfrom typing import Any, Dict, List, Optional, Union\\n\\nimport numpy as np\\nimport torch.nn as nn\\nfrom peft import PeftModel\\nfrom transformers import PreTrainedModel\\nfrom trl import KTOTrainer as HFKTOTrainer\\n\\nfrom swift.llm import LLMDataset\\nfrom swift.trainers import PushToMsHubMixin, RLHFTrainerMixin, SwiftMixin\\nfrom swift.utils import get_dist_setting\\n\\ndel HFKTOTrainer.__init__\\n\\n\\ndef _add_kl_dataset(dataset: LLMDataset, total_batch_size: int, seed: Optional[int] = None) -> None:\\n    # Shift one position to the right in each batch.\\n    raw_dataset: List[Dict[str, Any]] = dataset.data\\n    random_state = np.random.RandomState(seed)\\n    random_state.shuffle(raw_dataset)\\n    i = 0\\n    while i < len(raw_dataset):\\n        new_dataset_group = []\\n        dataset_group = raw_dataset[i:i + total_batch_size]\\n        kl_dataset_group = [dataset_group[-1]] + dataset_group[:-1]\\n        for data, kl_data in zip(dataset_group, kl_dataset_group):\\n            kl_input_ids = data['prompt_input_ids'] + kl_data['answer_input_ids']\\n            kl_labels = data['prompt_labels'] + kl_data['answer_labels']\\n            new_dataset_group.append({\\n                'input_ids': data['input_ids'],\\n                'labels': data['labels'],\\n                'KL_input_ids': kl_input_ids,\\n                'KL_labels': kl_labels,\\n                'label': kl_data['label']\\n            })\\n        raw_dataset[i:i + total_batch_size] = new_dataset_group\\n        i += total_batch_size\\n\\n\\nclass KTOTrainer(RLHFTrainerMixin, PushToMsHubMixin, SwiftMixin, HFKTOTrainer):\\n\\n    def __init__(self,\\n                 model: Optional[Union[PreTrainedModel, nn.Module, str]] = None,\\n                 ref_model: Optional[Union[PreTrainedModel, nn.Module, str]] = None,\\n                 *_args,\\n                 **kwargs):\\n        args = kwargs['args']\\n        args.disable_dropout = True\\n        self.desirable_weight = args.desirable_weight\\n        self.undesirable_weight = args.undesirable_weight\\n        self.precompute_ref_log_probs = args.precompute_ref_log_probs\\n        self.is_peft_model = isinstance(model, PeftModel)\\n\\n        self.ref_adapter_name = None\\n        # Get KL datasets\\n        world_size = get_dist_setting()[2]\\n        total_batch_size = (world_size * args.per_device_train_batch_size * args.gradient_accumulation_steps)\\n        if total_batch_size <= 1:\\n            raise ValueError('Batch size is 1 (too small). KTO will not work properly because the KL term '\\n                             'will be equivalent to the implied reward.')\\n        train_dataset, eval_dataset = kwargs['train_dataset'], kwargs['eval_dataset']\\n        _add_kl_dataset(train_dataset, total_batch_size, args.data_seed)\\n        _add_kl_dataset(eval_dataset, total_batch_size, args.data_seed)\\n        label = train_dataset['label']\\n        num_desirable = max(sum(label), 1)\\n        num_undesirable = max(len(label) - num_desirable, 1)  # \\\"label\\\" is binary\\n\\n        if num_desirable != num_undesirable:\\n            # The lower and upper bounds come from Eq. (8) of https://huggingface.co/papers/2402.01306\\n            des_weight_lower_bound = round((num_undesirable * self.undesirable_weight / num_desirable) * 1, 2)\\n            des_weight_upper_bound = round((num_undesirable * self.undesirable_weight / num_desirable) * 1.33, 2)\\n            und_weight_lower_bound = round((num_desirable * self.desirable_weight / num_undesirable) / 1.33, 2)\\n            und_weight_upper_bound = round((num_desirable * self.desirable_weight / num_undesirable) / 1, 2)\\n\\n            des_weight_in_range = des_weight_lower_bound <= self.desirable_weight <= des_weight_upper_bound\\n            und_weight_in_range = und_weight_lower_bound <= self.undesirable_weight <= und_weight_upper_bound\\n\\n            if not (des_weight_in_range or und_weight_in_range):\\n                warnings.warn(\\n                    f\\\"\\\"\\\"\\n            You have different amounts of desirable/positive and undesirable/negative examples but the\\n            weights on the desirable and undesirable losses don't seem to be in an ideal range. Based\\n            on your data, we recommend EITHER desirable_weight in [{des_weight_lower_bound}, '{des_weight_upper_bound}]\\n            or undesirable_weight in [{und_weight_lower_bound}, {und_weight_upper_bound}] (but NOT BOTH).\\n            See the documentation on how to optimally set these weights.\\\"\\\"\\\", UserWarning)\\n        kwargs['train_dataset'], kwargs['eval_dataset'] = train_dataset, eval_dataset\\n        super().__init__(model, ref_model, *_args, **kwargs)\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nfrom typing import Optional, Union\\n\\nimport torch.nn as nn\\nfrom peft import PeftModel\\nfrom transformers import PreTrainedModel\\nfrom trl import DPOTrainer as HFDPOTrainer\\n\\nfrom swift.trainers import PushToMsHubMixin, RLHFTrainerMixin, SwiftMixin\\n\\ndel HFDPOTrainer.__init__\\n\\n\\nclass DPOTrainer(RLHFTrainerMixin, PushToMsHubMixin, SwiftMixin, HFDPOTrainer):\\n\\n    def __init__(self,\\n                 model: Optional[Union[PreTrainedModel, nn.Module, str]] = None,\\n                 ref_model: Optional[Union[PreTrainedModel, nn.Module, str]] = None,\\n                 *_args,\\n                 **kwargs):\\n        from trl.trainer import FDivergenceConstants\\n        args = kwargs['args']\\n        self.label_smoothing = args.label_smoothing\\n        self.loss_type = args.loss_type\\n        self.precompute_ref_log_probs = args.precompute_ref_log_probs\\n        self.f_divergence_type = args.f_divergence_type\\n        self.f_divergence_params = {FDivergenceConstants.ALPHA_DIVERGENCE_COEF_KEY: args.f_alpha_divergence_coef}\\n        self.is_peft_model = isinstance(model, PeftModel)\\n\\n        self.ref_adapter_name = args.ref_adapter_name\\n        self.reference_free = args.reference_free\\n        super().__init__(model, ref_model, *_args, **kwargs)\\n\\n\\nfrom .cpo_trainer import CPOTrainer\\nfrom .dpo_trainer import DPOTrainer\\nfrom .kto_trainer import KTOTrainer\\nfrom .orpo_trainer import ORPOTrainer\\n\\n\\n# Copyright (c) Alibaba, Inc. and its affiliates.\\nimport warnings\\nfrom typing import Optional, Union\\n\\nimport torch.nn as nn\\nfrom transformers import PreTrainedModel\\nfrom trl import CPOTrainer as HFCPOTrainer\\n\\nfrom swift.trainers import PushToMsHubMixin, RLHFTrainerMixin, SwiftMixin\\n\\ndel HFCPOTrainer.__init__\\n\\n\\nclass CPOTrainer(RLHFTrainerMixin, PushToMsHubMixin, SwiftMixin, HFCPOTrainer):\\n\\n    def __init__(self, model: Optional[Union[PreTrainedModel, nn.Module, str]] = None, *_args, **kwargs):\\n        ref_model = kwargs.get('ref_model')\\n        assert ref_model is None, 'CPO/SimPO does not require a ref_model.'\\n\\n        args = kwargs['args']\\n        self.label_smoothing = args.label_smoothing\\n        self.loss_type = args.loss_type\\n        self.cpo_alpha = args.cpo_alpha\\n        if args.loss_type == 'simpo':\\n            self.simpo_gamma = args.simpo_gamma\\n            if self.cpo_alpha > 0:\\n                warnings.warn('You are using CPO-SimPO method because you set a non-zero cpo_alpha. '\\n                              'This will result in the CPO-SimPO method '\\n                              '(https://github.com/fe1ixxu/CPO_SIMPO/tree/main). '\\n                              'If you want to use a pure SimPO method, please set cpo_alpha to 0.')\\n        super().__init__(model, *_args, **kwargs)\\n\\n\\nevalscope[all]>=0.5.2\\n\\n\\nxtuner\\n\\n\\ndecord\\ndiffusers==0.25.0\\neinops\\n\\n\\ncharset_normalizer\\ncpm_kernels\\nfastapi\\ngradio>=3.40.0\\nopenai\\nsentencepiece\\ntiktoken\\nuvicorn\\n\\n\\nexpecttest\\nflake8\\nisort>=4.3.21\\nmodelscope\\npre-commit\\nyapf==0.30.0 # use fix version to ensure consistent auto-styling\\n\\n\\naccelerate\\naddict\\naiohttp\\nattrdict\\nbinpacking\\ndacite\\ndatasets<3.0\\neinops\\nimportlib_metadata\\njieba\\nmatplotlib\\nmodelscope[datasets]>=1.17,<1.19\\nnltk\\nnumpy<2.0\\noss2\\npandas\\npeft>=0.11.0,<0.13.0\\nrequests\\nrouge\\nsafetensors\\ntensorboard\\ntqdm\\ntransformers>=4.33,<4.47\\ntransformers_stream_generator\\ntrl>=0.10.1\\n\\n\\ndocutils>=0.16.0\\nmyst_parser\\nrecommonmark\\nsphinx>=5.3.0\\nsphinx-book-theme\\nsphinx-copybutton\\nsphinx-rtd-theme\\nsphinx_markdown_tables\",\"difficulty\":\"hard\",\"domain\":\"Code Repository Understanding\",\"length\":\"long\",\"question\":\"I plan to use this framework to train the glm-4v-9b model. Which of the follwing operations will lead to an error?\",\"sub_domain\":\"Code repo QA\"}","display_format":"text","language":"","answer_status":"published","assets":[],"source_url":"https://huggingface.co/datasets/zai-org/LongBench-v2","history":"initial import","indexing_mode":"noindex","subproblems":[],"grids":[]}