├── .gitignore ├── README.MD ├── args.MD ├── config ├── __init__.py ├── colossalai_strategy.yaml ├── deepspeed.yaml ├── deepspeed_offload.yaml ├── global.yaml ├── main.py ├── petl.yaml ├── train_ac.yaml ├── train_cl.yaml ├── train_hf.yaml └── train_pl.yaml ├── data ├── finetune_train_conversations.json ├── finetune_train_paragraph.json └── make_data_example.py ├── data_processer.py ├── data_utils.py ├── infer ├── __init__.py ├── infer.py ├── infer_finetuning.py ├── infer_lora_finetuning.py ├── infer_muti_lora_finetuning.py └── infer_ptuning.py ├── llama2_infer ├── infer_openbuddy.py └── infer_tiger.py ├── module_setup.py ├── requirements.txt ├── scripts ├── train_full.sh ├── train_lora.sh ├── train_lora_int4.sh ├── train_lora_int8.sh └── train_ptv2.sh ├── train.py └── training ├── __init__.py ├── train_ac.py ├── train_cl.py ├── train_hf.py └── train_pl.py /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /__pycache__ 3 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | ## update information 2 | - [deep_training](https://github.com/ssbuild/deep_training) 3 | 4 | ```text 5 | 2024-04-23 support qwen2 6 | 2024-04-22 简化配置 7 | 2023-11-27 yi modle_type change to llama 8 | 2023-11-15 support load custom model , only modify config/constant_map.py 9 | 2023-10-09 support accelerator trainer 10 | 2023-10-07 support colossalai trainer 11 | 2023-09-26 support transformers trainer 12 | 2023-08-16 推理可选使用 Rope NtkScale , 不训练扩展推理长度 13 | 2023-08-02 增加 muti lora infer 例子, 手动升级 aigc_zoo , pip install -U git+https://github.com/ssbuild/deep_training.zoo.git --force-reinstall --no-deps 14 | 2023-06-13 fix llama resize_token_embeddings 15 | 2023-06-01 support deepspeed training for lora adalora prompt,0.1.9 和 0.1.10合并 16 | 2023-05-27 add qlora transformers>=4.30 17 | 2023-05-24 fix p-tuning-v2 load weight bugs 18 | 2023-05-12 fix lora int8 多卡训练 , ppo training move to https://github.com/ssbuild/rlhf_llm 19 | 2023-05-02 增加p-tuning-v2 20 | 2023-04-28 deep_training 0.1.3 pytorch-lightning 改名 ligntning ,旧版本 deep_training <= 0.1.2 21 | 2023-04-23 增加lora merge权重(修改infer_lora_finetuning.py enable_merge_weight 选项) 22 | 2023-04-11 升级 lora , 增加adalora 23 | ``` 24 | 25 | 26 | ## install 27 | - pip install -U -r requirements.txt 28 | - 如果无法安装, 可以切换官方源 pip install -i https://pypi.org/simple -U -r requirements.txt 29 | 30 | ```text 31 | 32 | # flash-attention对显卡算例要求算力7.5 以上 , 下面可选安装 ,如果卡不支持可以不安装。 33 | git clone -b https://github.com/Dao-AILab/flash-attention 34 | cd flash-attention && pip install . 35 | pip install csrc/layer_norm 36 | pip install csrc/rotary 37 | ``` 38 | 39 | ## weigtht select one is suitable for you 40 | 支持且不限于以下权重 41 | - [Qwen1.5-1.8B-Chat](https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat) 42 | - [Qwen1.5-7B-Chat](https://huggingface.co/Qwen/Qwen1.5-7B-Chat) 43 | - [Qwen1.5-14B-Chat](https://huggingface.co/Qwen/Qwen1.5-14B-Chat) 44 | - [Qwen1.5-32B-Chat](https://huggingface.co/Qwen/Qwen1.5-32B-Chat) 45 | - [zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta) 46 | - [mistral-7b-sft-beta](https://huggingface.co/HuggingFaceH4/mistral-7b-sft-beta) 47 | - [Yi-6B](https://huggingface.co/01-ai/Yi-6B) 48 | - [Yi-6B-200K](https://huggingface.co/01-ai/Yi-6B-200K) 49 | - [Yi-34B](https://huggingface.co/01-ai/Yi-34B) 50 | - [Yi-34B-200K](https://huggingface.co/01-ai/Yi-34B-200K) 51 | - [Yi-34B-Chat](https://huggingface.co/01-ai/Yi-34B-Chat) 52 | - [LingoWhale-8B](https://www.modelscope.cn/models/DeepLang/LingoWhale-8B) 53 | - [CausalLM-14B](https://huggingface.co/CausalLM/14B) 54 | - [CausalLM-7B](https://huggingface.co/CausalLM/7B) 55 | - [BlueLM-7B-Chat](https://huggingface.co/vivo-ai/BlueLM-7B-Chat) 56 | - [BlueLM-7B-Chat-32K](https://huggingface.co/vivo-ai/BlueLM-7B-Chat-32K) 57 | - [BlueLM-7B-Base](https://huggingface.co/vivo-ai/BlueLM-7B-Base) 58 | - [BlueLM-7B-Base-32K](https://huggingface.co/vivo-ai/BlueLM-7B-Base-32K) 59 | - [XVERSE-13B-Chat](https://huggingface.co/xverse/XVERSE-13B-Chat) 60 | - [xverse-13b-chat-int4](https://huggingface.co/ssbuild/xverse-13b-chat-int4) 61 | - [XVERSE-13B](https://huggingface.co/xverse/XVERSE-13B) 62 | - [xverse-13b-int4](https://huggingface.co/ssbuild/xverse-13b-int4) 63 | - [Skywork-13B-base](https://huggingface.co/Skywork/Skywork-13B-base) 64 | - [internlm-chat-20b](https://huggingface.co/internlm/internlm-chat-20b) 65 | - [internlm-20b](https://huggingface.co/internlm/internlm-20b) 66 | - [internlm-chat-7b](https://huggingface.co/internlm/internlm-chat-7b) 67 | - [internlm-chat-7b-8k](https://huggingface.co/internlm/internlm-chat-7b-8k) 68 | - [internlm-7b](https://huggingface.co/internlm/internlm-7b) 69 | - [internlm-chat-7b-int4](https://huggingface.co/ssbuild/internlm-chat-7b-int4) 70 | - [bloom预训练模型](https://huggingface.co/bigscience) 71 | - [bloom第三方中文训练模型](https://huggingface.co/Langboat/bloom-6b4-zh) # 注意 需要修改tokenizer_config.json BloomTokenizer -> BloomTokenizerFast 72 | - [tigerbot](https://huggingface.co/TigerResearch) 73 | - [opt预训练模型](https://huggingface.co/facebook) 74 | - [llama 官方权重转换](https://huggingface.co/decapoda-research) # llama 词典等下载地址 https://huggingface.co/hf-internal-testing/llama-tokenizer 75 | - [llama vicuna-7B第三方权重1](https://huggingface.co/TheBloke/vicuna-7B-1.1-HF) 76 | - [llama vicuna-7B第三方权重2](https://huggingface.co/Tribbiani/vicuna-7b) 77 | - [cpm-ant-10b](https://huggingface.co/openbmb/cpm-ant-10b) 78 | - [rwkv](https://huggingface.co/BlinkDL) 需要转换权重 79 | - [rwkv](https://huggingface.co/RWKV/rwkv-4-169m-pile) hf 权重 80 | - [Llama2-Chinese-7b-Chat](https://huggingface.co/FlagAlpha/Llama2-Chinese-7b-Chat) 81 | - [Llama2-Chinese-13b-Chat](https://huggingface.co/FlagAlpha/Llama2-Chinese-13b-Chat) 82 | - [TransGPT](https://huggingface.co/DUOMO-Lab/TransGPT-v0) Llama2中文权重 83 | - [tigerbot-13b-chat](https://huggingface.co/TigerResearch/tigerbot-13b-chat) Llama2中文权重 84 | 85 | ## data sample 86 | - [open_data 不定时更新数据集](https://github.com/ssbuild/open_data) 87 | 88 | 单条数据示例 89 | ```text 90 | role one of user system function assistant 91 | q question optional 92 | a answer must 93 | 94 | ``` 95 | 96 | ```json 97 | {"id": 1, "paragraph": [{"q": "从南京到上海的路线", "a": ["你好,南京到上海的路线如下:", "1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。", "2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。", "3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"]}]} 98 | {"id": 2, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": ["冬夜寂静冷,", "云在天边飘,", "冰封白雪上, ", "寒冷像一场雪。", " ", "雪花融化成冰,", "像那雪花飘洒,", "在寒冷的冬天,", "感受春天的喜悦。", " 冬日里,", "风雪渐消,", "一片寂静,", "把快乐和温暖带回家。"]}]} 99 | {"id": 3, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": ["晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:", "", "1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。", "2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。", "3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。", "4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。", "5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。", "6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。", "", "如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"]}]} 100 | ``` 101 | 102 | 或者 103 | 104 | ```json 105 | {"id": 1, "conversations": [{"from": "user", "value": "从南京到上海的路线"}, {"from": "assistant", "value": ["你好,南京到上海的路线如下:", "1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。", "2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。", "3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"]}]} 106 | {"id": 2, "conversations": [{"from": "user", "value": "写一个诗歌,关于冬天"}, {"from": "assistant", "value": ["冬夜寂静冷,", "云在天边飘,", "冰封白雪上, ", "寒冷像一场雪。", " ", "雪花融化成冰,", "像那雪花飘洒,", "在寒冷的冬天,", "感受春天的喜悦。", " 冬日里,", "风雪渐消,", "一片寂静,", "把快乐和温暖带回家。"]}]} 107 | {"id": 3, "conversations": [{"from": "user", "value": "晚上睡不着应该怎么办"}, {"from": "assistant", "value": ["晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:", "", "1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。", "2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。", "3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。", "4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。", "5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。", "6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。", "", "如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"]}]} 108 | ``` 109 | 110 | 111 | ## infer 112 | # infer_finetuning.py 推理微调模型 113 | # infer_lora_finetuning.py 推理微调模型 114 | # infer_ptuning.py 推理p-tuning-v2微调模型 115 | python infer_finetuning.py 116 | 117 | 118 | 119 | ## training 120 | ```text 121 | # 制作数据 122 | cd scripts 123 | bash train_full.sh -m dataset 124 | or 125 | bash train_lora.sh -m dataset 126 | or 127 | bash train_ptv2.sh -m dataset 128 | 129 | 注: num_process_worker 为多进程制作数据 , 如果数据量较大 , 适当调大至cpu数量 130 | dataHelper.make_dataset_with_args(data_args.train_file,mixed_data=False, shuffle=True,mode='train',num_process_worker=0) 131 | 132 | # 全参数训练 133 | bash train_full.sh -m train 134 | 135 | # lora adalora ia3 136 | bash train_lora.sh -m train 137 | 138 | # ptv2 139 | bash train_ptv2.sh -m train 140 | ``` 141 | 142 | ## 训练参数 143 | [训练参数](args.MD) 144 | 145 | ## 友情链接 146 | 147 | - [pytorch-task-example](https://github.com/ssbuild/pytorch-task-example) 148 | - [moss_finetuning](https://github.com/ssbuild/moss_finetuning) 149 | - [chatglm_finetuning](https://github.com/ssbuild/chatglm_finetuning) 150 | - [chatglm2_finetuning](https://github.com/ssbuild/chatglm2_finetuning) 151 | - [chatglm3_finetuning](https://github.com/ssbuild/chatglm3_finetuning) 152 | - [t5_finetuning](https://github.com/ssbuild/t5_finetuning) 153 | - [llm_finetuning](https://github.com/ssbuild/llm_finetuning) 154 | - [llm_rlhf](https://github.com/ssbuild/llm_rlhf) 155 | - [chatglm_rlhf](https://github.com/ssbuild/chatglm_rlhf) 156 | - [t5_rlhf](https://github.com/ssbuild/t5_rlhf) 157 | - [rwkv_finetuning](https://github.com/ssbuild/rwkv_finetuning) 158 | - [baichuan_finetuning](https://github.com/ssbuild/baichuan_finetuning) 159 | - [xverse_finetuning](https://github.com/ssbuild/xverse_finetuning) 160 | - [internlm_finetuning](https://github.com/ssbuild/internlm_finetuning) 161 | - [qwen_finetuning](https://github.com/ssbuild/qwen_finetuning) 162 | - [skywork_finetuning](https://github.com/ssbuild/skywork_finetuning) 163 | - [bluelm_finetuning](https://github.com/ssbuild/bluelm_finetuning) 164 | - [yi_finetuning](https://github.com/ssbuild/yi_finetuning) 165 | 166 | ## 167 | 纯粹而干净的代码 168 | 169 | ## Star History 170 | 171 | [![Star History Chart](https://api.star-history.com/svg?repos=ssbuild/llm_finetuning&type=Date)](https://star-history.com/#ssbuild/llm_finetuning&Date) -------------------------------------------------------------------------------- /args.MD: -------------------------------------------------------------------------------- 1 | 2 | ## 切换训练模式配置 3 | 修改 config/main.py 4 | enable_deepspeed = False 5 | enable_ptv2 = False 6 | enable_lora = True 7 | load_in_bit = 0 # 4 load_in_4bit, 8 load_in_8bit other 0 8 | 9 | ## optimizer 10 | # lamb,adamw_hf,adamw,adamw_torch,adamw_torch_fused,adamw_torch_xla,adamw_apex_fused, 11 | # adafactor,adamw_anyprecision,sgd,adagrad,adamw_bnb_8bit,adamw_8bit,lion,lion_8bit,lion_32bit, 12 | # paged_adamw_32bit,paged_adamw_8bit,paged_lion_32bit,paged_lion_8bit, 13 | # lamb_fused_dp adagrad_cpu_dp adam_cpu_dp adam_fused_dp 14 | 15 | ## scheduler 16 | # linear,WarmupCosine,CAWR,CAL,Step,ReduceLROnPlateau, cosine,cosine_with_restarts,polynomial, 17 | # constant,constant_with_warmup,inverse_sqrt,reduce_lr_on_plateau 18 | 19 | ### 单机多卡 20 | ```text 21 | 可见的前两块卡 22 | config_args = { 23 | 'devices': 2, 24 | } 25 | 26 | # 第一块 和 第三块卡 27 | config_args = { 28 | 'devices': [0,2], 29 | } 30 | ``` 31 | 32 | ### 多机多卡训练 33 | ```text 34 | 例子 3个机器 每个机器 4个卡 35 | 修改train.py Trainer num_nodes = 3 36 | MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=0 python train.py 37 | MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=1 python train.py 38 | MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=2 python train.py 39 | ``` 40 | 41 | 42 | ### 超大数据集 43 | 修改data_utils.py "data_backend": "lmdb" 44 | 45 | ## 精度训练 46 | Trainer.precision = '16' # 半精度训练 "32": "32-true", "16": "16-mixed", "bf16": "bf16-mixed" 47 | 48 | 49 | ### lora finetuning 50 | ```text 51 | global_args = { 52 | "load_in_8bit": False, # lora 如果显卡支持int8 可以开启 , 需安装依赖 pip install bitsandbytes 53 | "num_layers": -1, # 是否使用骨干网络的全部层数 , -1 表示全层, 否则只用只用N层 54 | "num_layers_key": "num_layers", 55 | } 56 | lora_info_args = { 57 | 'with_lora': True, # 是否启用lora模块 58 | 'r': 8, 59 | 'target_modules': ['query_key_value'], 60 | 'target_dtype': None, 61 | 'lora_alpha': 32, 62 | 'lora_dropout': 0.1, 63 | 'bias': 'none', # Bias type for Lora. Can be 'none', 'all' or 'lora_only'" 64 | 'modules_to_save' : None, # "help": "List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. " 65 | } 66 | ``` 67 | 68 | 69 | ### int高效训练方式 70 | lora int8 71 | ```text 72 | global_args = { 73 | "load_in_8bit": True, # lora 如果显卡支持int8 可以开启 , 需安装依赖 pip install bitsandbytes 74 | "num_layers": -1, # 是否使用骨干网络的全部层数 , -1 表示全层, 否则只用只用N层 75 | "num_layers_key": "num_layers", 76 | } 77 | lora_info_args = { 78 | 'with_lora': True, # 是否启用lora模块 79 | 'r': 8, 80 | 'target_modules': ['query_key_value'], 81 | 'target_dtype': None, 82 | 'lora_alpha': 32, 83 | 'lora_dropout': 0.1, 84 | 'bias': 'none', # Bias type for Lora. Can be 'none', 'all' or 'lora_only'" 85 | 'modules_to_save' : None, # "help": "List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. " 86 | } 87 | ``` 88 | 89 | 90 | -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- 1 | # coding=utf8 2 | # @Time : 2023/5/12 20:39 3 | # @Author : tk 4 | # @FileName: __init__.py 5 | 6 | from config.main import * 7 | 8 | -------------------------------------------------------------------------------- /config/colossalai_strategy.yaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | colossalai_strategy: 5 | "ddp": 6 | name: "ddp" 7 | broadcast_buffers: True 8 | bucket_cap_mb: 25 9 | find_unused_parameters: False 10 | check_reduction: False 11 | gradient_as_bucket_view: False 12 | static_graph: False 13 | "gemini": 14 | name: "gemini" 15 | chunk_config_dict: None 16 | chunk_init_device: None 17 | placement_policy: "static" 18 | shard_param_frac: 1.0 # only for static placement 19 | offload_optim_frac: 0.0 # only for static placement 20 | offload_param_frac: 0.0 # only for static placement 21 | warmup_non_model_data_ratio: 0.8 # only for auto placement 22 | steady_cuda_cap_ratio: 0.9 # only for auto placement 23 | precision: "fp16" 24 | pin_memory: False 25 | force_outputs_fp32: False 26 | strict_ddp_mode: False 27 | search_range_m: 32 28 | hidden_dim: None 29 | min_chunk_size_m: 32 30 | memstats: None 31 | gpu_margin_mem_ratio: 0.0 32 | initial_scale: 2 ** 16 33 | min_scale: 1 34 | growth_factor: 2 35 | backoff_factor: 0.5 36 | growth_interval: 1000 37 | hysteresis: 2 38 | max_scale: 2 ** 32 39 | max_norm: 1.0 40 | norm_type: 2.0 41 | verbose: False 42 | "zero2": 43 | name: zero2 44 | stage: 2 45 | precision: "fp16" 46 | initial_scale: 2 ** 32 47 | min_scale: 1 48 | growth_factor: 2 49 | backoff_factor: 0.5 50 | growth_interval: 1000 51 | hysteresis: 2 52 | max_scale: 2 ** 32 53 | max_norm: 1.0 54 | norm_type: 2.0 55 | reduce_bucket_size_in_m: 12 56 | communication_dtype: None 57 | overlap_communication: True 58 | cpu_offload: False 59 | verbose: False 60 | 61 | "zero2_cpu": 62 | name: zero2_cpu 63 | stage: 2 64 | precision: "fp16" 65 | initial_scale: 2 ** 32 66 | min_scale: 1 67 | growth_factor: 2 68 | backoff_factor: 0.5 69 | growth_interval: 1000 70 | hysteresis: 2 71 | max_scale: 2 ** 32 72 | max_norm: 1.0 73 | norm_type: 2.0 74 | reduce_bucket_size_in_m: 12 75 | communication_dtype: None 76 | overlap_communication: True 77 | cpu_offload: True 78 | verbose: False 79 | 80 | "3d": 81 | name: "3d" 82 | tp_size: 1 83 | pp_size: 1 84 | precision: "fp16" 85 | zero_stage: 0 86 | enable_all_optimization: False 87 | enable_fused_normalization: False 88 | enable_flash_attention: False 89 | enable_jit_fused: False 90 | enable_sequence_parallelism: False 91 | enable_sequence_overlap: False 92 | num_microbatches: None 93 | microbatch_size: None 94 | initial_scale: 2 ** 16 95 | min_scale: 1 96 | growth_factor: 2 97 | backoff_factor: 0.5 98 | growth_interval: 1000 99 | hysteresis: 2 100 | max_scale: 2 ** 32 101 | max_norm: 0 102 | broadcast_buffers: True 103 | ddp_bucket_cap_mb: 25 104 | find_unused_parameters: False 105 | check_reduction: False 106 | gradient_as_bucket_view: False 107 | static_graph: False 108 | zero_bucket_size_in_m: 12 109 | cpu_offload: False 110 | communication_dtype: None 111 | overlap_communication: True 112 | custom_policy: None 113 | -------------------------------------------------------------------------------- /config/deepspeed.yaml: -------------------------------------------------------------------------------- 1 | "zero_allow_untested_optimizer": true, 2 | "fp16": 3 | "enabled": true, 4 | "auto_cast": false, 5 | "loss_scale": 0, 6 | "initial_scale_power": 16, 7 | "loss_scale_window": 1000, 8 | "hysteresis": 2, 9 | "min_loss_scale": 1 10 | 11 | "zero_optimization": 12 | "stage": 2, 13 | "allgather_partitions": true, 14 | "allgather_bucket_size": 5e8, 15 | "overlap_comm": false, 16 | "reduce_scatter": true, 17 | "reduce_bucket_size": 5e8, 18 | "contiguous_gradients" : true, 19 | 20 | "stage3_max_live_parameters": 1e9, 21 | "stage3_max_reuse_distance" : 1e9, 22 | "stage3_prefetch_bucket_size" : 5e8, 23 | "stage3_param_persistence_threshold" : 1e6, 24 | "sub_group_size" : 1e12, 25 | "elastic_checkpoint" : true, 26 | "stage3_gather_16bit_weights_on_model_save": true, 27 | "ignore_unused_parameters": true, 28 | "round_robin_gradients": true 29 | -------------------------------------------------------------------------------- /config/deepspeed_offload.yaml: -------------------------------------------------------------------------------- 1 | 2 | "optimizer": 3 | "type": "AdamW" 4 | "params": 5 | "lr": 2e-5 6 | "betas": [0.9, 0.999] 7 | "eps": 1e-8 8 | "weight_decay": 0 9 | 10 | "zero_allow_untested_optimizer": true 11 | "fp16": 12 | "enabled": true 13 | "auto_cast": false 14 | "loss_scale": 0 15 | "initial_scale_power": 16 16 | "loss_scale_window": 1000 17 | "hysteresis": 2 18 | "min_loss_scale": 1 19 | "zero_optimization": 20 | "stage": 2 21 | "allgather_partitions": true 22 | "allgather_bucket_size": 5e8 23 | "overlap_comm": false 24 | "reduce_scatter": true 25 | "reduce_bucket_size": 5e8 26 | "contiguous_gradients": true 27 | "stage3_max_live_parameters": 1e9 28 | "stage3_max_reuse_distance": 1e9 29 | "stage3_prefetch_bucket_size": 5e8 30 | "stage3_param_persistence_threshold": 1e6 31 | "sub_group_size": 1e12 32 | "elastic_checkpoint": true 33 | "stage3_gather_16bit_weights_on_model_save": true 34 | "ignore_unused_parameters": true 35 | "round_robin_gradients": true 36 | "offload_optimizer": 37 | "device": "cpu" 38 | "pin_memory": true 39 | -------------------------------------------------------------------------------- /config/global.yaml: -------------------------------------------------------------------------------- 1 | global_args: 2 | trainer_backend: pl 3 | enable_deepspeed: false 4 | enable_ptv2: false 5 | enable_lora: true 6 | load_in_bit: 0 7 | config_merge: {} 8 | # ************* 模型权重 ********************* 9 | # model_name: Qwen1.5-1.8B-Chat 10 | model_name: Qwen1.5-MoE-A2.7B 11 | 12 | # one of auto 16 bf16 32 13 | precision: auto 14 | quantization_config: 15 | load_in_8bit: false 16 | load_in_4bit: false 17 | llm_int8_threshold: 6.0 18 | llm_int8_has_fp16_weight: false 19 | bnb_4bit_compute_dtype: float16 # one of float16 bfloat16 float32 20 | bnb_4bit_use_double_quant: true 21 | bnb_4bit_quant_type: nf4 22 | 23 | 24 | global_models_mapper: 25 | bloom-560m: 26 | model_type: bloom 27 | model_name_or_path: /data/nlp/pre_models/torch/bloom/bloom-560m 28 | config_name: /data/nlp/pre_models/torch/bloom/bloom-560m 29 | tokenizer_name: /data/nlp/pre_models/torch/bloom/bloom-560m 30 | 31 | bloom-1b7: 32 | model_type: bloom 33 | model_name_or_path: /data/nlp/pre_models/torch/bloom/bloom-1b7 34 | config_name: /data/nlp/pre_models/torch/bloom/bloom-1b7 35 | tokenizer_name: /data/nlp/pre_models/torch/bloom/bloom-1b7 36 | 37 | Qwen1.5-1.8B-Chat: 38 | model_type: qwen2 39 | model_name_or_path: /data/nlp/pre_models/torch/qwen2/Qwen1.5-1.8B-Chat 40 | config_name: /data/nlp/pre_models/torch/qwen2/Qwen1.5-1.8B-Chat 41 | tokenizer_name: /data/nlp/pre_models/torch/qwen2/Qwen1.5-1.8B-Chat 42 | 43 | Qwen1.5-MoE-A2.7B: 44 | model_type: qwen2_moe 45 | model_name_or_path: /data/nlp/pre_models/torch/qwen2/Qwen1.5-MoE-A2.7B 46 | config_name: /data/nlp/pre_models/torch/qwen2/Qwen1.5-MoE-A2.7B 47 | tokenizer_name: /data/nlp/pre_models/torch/qwen2/Qwen1.5-MoE-A2.7B 48 | 49 | 50 | CausalLM-14B: 51 | model_type: llama 52 | model_name_or_path: /data/nlp/pre_models/torch/llama/CausalLM-14B 53 | config_name: /data/nlp/pre_models/torch/llama/CausalLM-14B 54 | tokenizer_name: /data/nlp/pre_models/torch/llama/CausalLM-14B 55 | 56 | LingoWhale-8B: 57 | model_type: lingowhale 58 | model_name_or_path: /data/nlp/pre_models/torch/lingowhale/LingoWhale-8B 59 | config_name: /data/nlp/pre_models/torch/lingowhale/LingoWhale-8B 60 | tokenizer_name: /data/nlp/pre_models/torch/lingowhale/LingoWhale-8B 61 | 62 | CausalLM-7B: 63 | model_type: llama 64 | model_name_or_path: /data/nlp/pre_models/torch/llama/CausalLM-7B 65 | config_name: /data/nlp/pre_models/torch/llama/CausalLM-7B 66 | tokenizer_name: /data/nlp/pre_models/torch/llama/CausalLM-7B 67 | 68 | 69 | 70 | opt-350m: 71 | model_type: opt 72 | model_name_or_path: /data/nlp/pre_models/torch/opt/opt-350m 73 | config_name: /data/nlp/pre_models/torch/opt/opt-350m 74 | tokenizer_name: /data/nlp/pre_models/torch/opt/opt-350m 75 | 76 | 77 | llama-7b-hf: 78 | model_type: llama 79 | model_name_or_path: /data/nlp/pre_models/torch/llama/llama-7b-hf 80 | config_name: /data/nlp/pre_models/torch/llama/llama-7b-hf 81 | tokenizer_name: /data/nlp/pre_models/torch/llama/llama-7b-hf 82 | 83 | 84 | Llama-2-7b-chat-hf: 85 | model_type: llama 86 | model_name_or_path: /data/nlp/pre_models/torch/llama/Llama-2-7b-chat-hf 87 | config_name: /data/nlp/pre_models/torch/llama/Llama-2-7b-chat-hf 88 | tokenizer_name: /data/nlp/pre_models/torch/llama/Llama-2-7b-chat-hf 89 | 90 | 91 | Llama2-Chinese-7b-Chat: 92 | model_type: llama 93 | model_name_or_path: /data/nlp/pre_models/torch/llama/Llama2-Chinese-7b-Chat 94 | config_name: /data/nlp/pre_models/torch/llama/Llama2-Chinese-7b-Chat 95 | tokenizer_name: /data/nlp/pre_models/torch/llama/Llama2-Chinese-7b-Chat 96 | 97 | 98 | Llama2-Chinese-13b-Chat: 99 | model_type: llama 100 | model_name_or_path: /data/nlp/pre_models/torch/llama/Llama2-Chinese-13b-Chat 101 | config_name: /data/nlp/pre_models/torch/llama/Llama2-Chinese-13b-Chat 102 | tokenizer_name: /data/nlp/pre_models/torch/llama/Llama2-Chinese-13b-Chat 103 | 104 | 105 | chatyuan-7b: 106 | model_type: llama 107 | model_name_or_path: /data/nlp/pre_models/torch/llama/ChatYuan-7B 108 | config_name: /data/nlp/pre_models/torch/llama/ChatYuan-7B 109 | tokenizer_name: /data/nlp/pre_models/torch/llama/ChatYuan-7B 110 | 111 | tigerbot-13b-chat: 112 | model_type: llama 113 | model_name_or_path: /data/nlp/pre_models/torch/llama/tigerbot-13b-chat 114 | config_name: /data/nlp/pre_models/torch/llama/tigerbot-13b-chat 115 | tokenizer_name: /data/nlp/pre_models/torch/llama/tigerbot-13b-chat 116 | 117 | tigerbot-13b-chat-int4: 118 | model_type: llama 119 | model_name_or_path: /data/nlp/pre_models/torch/llama/tigerbot-13b-chat-int4 120 | config_name: /data/nlp/pre_models/torch/llama/tigerbot-13b-chat-int4 121 | tokenizer_name: /data/nlp/pre_models/torch/llama/tigerbot-13b-chat-int4 122 | 123 | 124 | openbuddy-llama2-70b-v10.1: 125 | model_type: llama 126 | model_name_or_path: /data/nlp/pre_models/torch/llama/openbuddy-llama2-70b-v10.1-bf16 127 | config_name: /data/nlp/pre_models/torch/llama/openbuddy-llama2-70b-v10.1-bf16 128 | tokenizer_name: /data/nlp/pre_models/torch/llama/openbuddy-llama2-70b-v10.1-bf16 129 | 130 | 131 | 132 | 133 | rwkv-4-430m-pile: 134 | model_type: rwkv 135 | model_name_or_path: /data/nlp/pre_models/torch/rwkv/rwkv-4-430m-pile 136 | config_name: /data/nlp/pre_models/torch/rwkv/rwkv-4-430m-pile 137 | tokenizer_name: /data/nlp/pre_models/torch/rwkv/rwkv-4-430m-pile 138 | 139 | 140 | BlueLM-7B-Chat: 141 | model_type: BlueLM 142 | model_name_or_path: /data/nlp/pre_models/torch/bluelm/BlueLM-7B-Chat 143 | config_name: /data/nlp/pre_models/torch/bluelm/BlueLM-7B-Chat 144 | tokenizer_name: /data/nlp/pre_models/torch/bluelm/BlueLM-7B-Chat 145 | 146 | BlueLM-7B-Chat-32K: 147 | model_type: BlueLM 148 | model_name_or_path: /data/nlp/pre_models/torch/bluelm/BlueLM-7B-Chat-32K 149 | config_name: /data/nlp/pre_models/torch/bluelm/BlueLM-7B-Chat-32K 150 | tokenizer_name: /data/nlp/pre_models/torch/bluelm/BlueLM-7B-Chat-32K 151 | 152 | BlueLM-7B-Base: 153 | model_type: BlueLM 154 | model_name_or_path: /data/nlp/pre_models/torch/opt/BlueLM-7B-Base 155 | config_name: /data/nlp/pre_models/torch/opt/BlueLM-7B-Base 156 | tokenizer_name: /data/nlp/pre_models/torch/opt/BlueLM-7B-Base 157 | 158 | 159 | BlueLM-7B-Base-32K: 160 | model_type: BlueLM 161 | model_name_or_path: /data/nlp/pre_models/torch/opt/BlueLM-7B-Base-32K 162 | config_name: /data/nlp/pre_models/torch/opt/BlueLM-7B-Base-32K 163 | tokenizer_name: /data/nlp/pre_models/torch/opt/BlueLM-7B-Base-32K 164 | 165 | XVERSE-13B-Chat: 166 | model_type: xverse 167 | model_name_or_path: /data/nlp/pre_models/torch/xverse/XVERSE-13B-Chat 168 | config_name: /data/nlp/pre_models/torch/xverse/XVERSE-13B-Chat 169 | tokenizer_name: /data/nlp/pre_models/torch/xverse/XVERSE-13B-Chat 170 | 171 | 172 | xverse-13b-chat-int4: 173 | model_type: xverse 174 | model_name_or_path: /data/nlp/pre_models/torch/xverse/xverse-13b-chat-int4 175 | config_name: /data/nlp/pre_models/torch/xverse/xverse-13b-chat-int4 176 | tokenizer_name: /data/nlp/pre_models/torch/xverse/xverse-13b-chat-int4 177 | 178 | 179 | XVERSE-13B: 180 | model_type: xverse 181 | model_name_or_path: /data/nlp/pre_models/torch/xverse/XVERSE-13B 182 | config_name: /data/nlp/pre_models/torch/xverse/XVERSE-13B 183 | tokenizer_name: /data/nlp/pre_models/torch/xverse/XVERSE-13B 184 | 185 | 186 | xverse-13b-int4: 187 | model_type: xverse 188 | model_name_or_path: /data/nlp/pre_models/torch/xverse/xverse-13b-int4 189 | config_name: /data/nlp/pre_models/torch/xverse/xverse-13b-int4 190 | tokenizer_name: /data/nlp/pre_models/torch/xverse/xverse-13b-int4 191 | 192 | Skywork-13B-base: 193 | model_type: skywork 194 | model_name_or_path: /data/nlp/pre_models/torch/skywork/Skywork-13B-base 195 | config_name: /data/nlp/pre_models/torch/skywork/Skywork-13B-base 196 | tokenizer_name: /data/nlp/pre_models/torch/skywork/Skywork-13B-base 197 | 198 | 199 | Yi-6B: 200 | model_type: llama 201 | model_name_or_path: /data/nlp/pre_models/torch/llama/Yi-6B 202 | 203 | 204 | Yi-6B-200K: 205 | model_type: llama 206 | model_name_or_path: /data/nlp/pre_models/torch/llama/Yi-6B-200K 207 | 208 | 209 | 210 | Yi-34B: 211 | model_type: llama 212 | model_name_or_path: /data/nlp/pre_models/torch/llama/Yi-34B 213 | 214 | 215 | Yi-34B-200K: 216 | model_type: llama 217 | model_name_or_path: /data/nlp/pre_models/torch/llama/Yi-34B-200K 218 | 219 | 220 | Yi-34B-Chat: 221 | model_type: llama 222 | model_name_or_path: /data/nlp/pre_models/torch/llama/Yi-34B-Chat 223 | 224 | 225 | 226 | zephyr-7b-beta: 227 | model_type: mistral 228 | model_name_or_path: /data/nlp/pre_models/torch/mistral/mistral-7b-sft-beta -------------------------------------------------------------------------------- /config/main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/5/31 14:43 4 | import json 5 | import os 6 | import torch 7 | import yaml 8 | from transformers import BitsAndBytesConfig 9 | from transformers.utils import strtobool 10 | from deep_training.zoo.constants.define import (TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING, 11 | TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING, 12 | TRANSFORMERS_MODELS_TO_IA3_TARGET_MODULES_MAPPING, 13 | TRANSFORMERS_MODELS_TO_IA3_FEEDFORWARD_MODULES_MAPPING) 14 | 15 | 16 | # 按需修改 17 | # TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING 18 | # TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING 19 | # TRANSFORMERS_MODELS_TO_IA3_TARGET_MODULES_MAPPING 20 | # TRANSFORMERS_MODELS_TO_IA3_FEEDFORWARD_MODULES_MAPPING 21 | 22 | TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING["mistral"] = ["q_proj", "v_proj"] 23 | TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING["lingowhale"] = ["qkv_proj"] 24 | TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING["qwen2"] = ["q_proj", "v_proj"] 25 | TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING["qwen2_moe"] = ["q_proj", "v_proj"] 26 | 27 | 28 | from deep_training.utils.wrapper import load_yaml 29 | 30 | 31 | 32 | # 加载 33 | __CUR_PATH__ = os.path.abspath(os.path.dirname(__file__)) 34 | 35 | 36 | config_args = load_yaml(os.environ.get('train_file', os.path.join(__CUR_PATH__, 'train_pl.yaml'))) 37 | global_args = config_args.pop("global_args") 38 | global_models_mapper = config_args.pop("global_models_mapper") 39 | colossalai_strategy = config_args.pop("colossalai_strategy", {}) 40 | train_model_config = global_models_mapper[global_args["model_name"]] 41 | 42 | 43 | 44 | def merge_from_env(global_args): 45 | merge_config = {} 46 | if "trainer_backend" in os.environ: 47 | merge_config["trainer_backend"] = str(os.environ["trainer_backend"]) 48 | if "enable_deepspeed" in os.environ: 49 | merge_config["enable_deepspeed"] = strtobool(os.environ["enable_deepspeed"]) 50 | if "enable_ptv2" in os.environ: 51 | merge_config["enable_ptv2"] = strtobool(os.environ["enable_ptv2"]) 52 | if "enable_lora" in os.environ: 53 | merge_config["enable_lora"] = strtobool(os.environ["enable_lora"]) 54 | if "load_in_bit" in os.environ: 55 | merge_config["load_in_bit"] = int(os.environ["load_in_bit"]) 56 | if merge_config: 57 | global_args.update(merge_config) 58 | 59 | merge_from_env(global_args) 60 | 61 | def patch_args(config_args): 62 | assert global_args["trainer_backend"] in ["pl", "hf", "cl", "ac"] 63 | 64 | # ensure str 65 | global_args["precision"] = str(global_args["precision"]) 66 | 67 | if global_args["quantization_config"]: 68 | # 精度 69 | if global_args["precision"] == "auto": 70 | global_args["quantization_config"][ 71 | "bnb_4bit_compute_dtype"] = "bfloat16" if torch.cuda.is_bf16_supported() else "float16" 72 | 73 | global_args["quantization_config"] = BitsAndBytesConfig(**global_args["quantization_config"]) 74 | 75 | assert global_args["enable_lora"] + global_args["enable_ptv2"] <= 1 , ValueError("lora ptv2 cannot open at same time") 76 | 77 | #更新模型配置 78 | config_args.update(train_model_config) 79 | 80 | if global_args["trainer_backend"] == "cl": 81 | config_args["strategy"] = colossalai_strategy[config_args["strategy"]] 82 | 83 | if global_args['quantization_config'] is not None: 84 | global_args['quantization_config'].load_in_4bit = global_args["load_in_bit"] == 4 85 | global_args['quantization_config'].load_in_8bit = global_args["load_in_bit"] == 8 86 | if global_args["load_in_bit"] == 0: 87 | global_args["quantization_config"] = None 88 | 89 | 90 | 91 | if global_args["enable_lora"]: 92 | # 检查lora adalora是否开启 93 | assert config_args.get('lora', {}).get('with_lora', False) + \ 94 | config_args.get('adalora', {}).get('with_lora', False) + \ 95 | config_args.get('ia3', {}).get('with_lora', False) == 1, ValueError( 96 | 'lora adalora ia3 can set one at same time !') 97 | 98 | model_type = train_model_config['model_type'] 99 | if config_args.get('lora', {}).get('with_lora', False): 100 | config_args["lora"]["target_modules"] = TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING[model_type] 101 | elif config_args.get('adalora', {}).get('with_lora', False): 102 | config_args["adalora"]["target_modules"] = TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING[model_type] 103 | else: 104 | config_args["ia3"]["target_modules"] = TRANSFORMERS_MODELS_TO_IA3_TARGET_MODULES_MAPPING[model_type] 105 | config_args["ia3"]["feedforward_modules"] = TRANSFORMERS_MODELS_TO_IA3_FEEDFORWARD_MODULES_MAPPING[model_type] 106 | 107 | config_args.pop('prompt', None) 108 | 109 | elif global_args["enable_ptv2"]: 110 | config_args.pop('lora', None) 111 | config_args.pop('adalora', None) 112 | config_args.pop('ia3', None) 113 | if "gradient_checkpointing" in config_args: 114 | config_args[ "gradient_checkpointing" ] = False 115 | 116 | assert "prompt" in config_args 117 | config_args["prompt"]["with_prompt"] = True 118 | else: 119 | config_args.pop('lora',None) 120 | config_args.pop('adalora', None) 121 | config_args.pop('ia3', None) 122 | config_args.pop('prompt', None) 123 | 124 | # 预处理 125 | if 'rwkv' in (config_args['model_type'] or config_args['model_name_or_path']).lower(): 126 | config_args['use_fast_tokenizer'] = True 127 | 128 | 129 | 130 | patch_args(config_args) 131 | 132 | def get_deepspeed_config(precision='fp16'): 133 | ''' 134 | lora prompt finetuning deepspeed_offload.json 135 | 普通 finetuning deepspeed.json 136 | ''' 137 | # 是否开启deepspeed 138 | if not global_args["enable_deepspeed"]: 139 | return None 140 | precision = str(precision).lower() 141 | # 选择 deepspeed 配置文件 142 | is_need_update_config = False 143 | if global_args["enable_lora"] or global_args["enable_ptv2"]: 144 | is_need_update_config = True 145 | filename = os.path.join(os.path.dirname(__file__), 'deepspeed_offload.yaml') 146 | else: 147 | filename = os.path.join(os.path.dirname(__file__), 'deepspeed.yaml') 148 | 149 | deepspeed_config = load_yaml(filename) 150 | 151 | #lora offload 同步优化器配置 152 | if is_need_update_config: 153 | optimizer = deepspeed_config.get('optimizer',None) 154 | if optimizer: 155 | if global_args["trainer_backend"] == 'hf': 156 | optimizer[ 'params' ][ 'betas' ] = (config_args.get('adam_beta1', 0.9),config_args.get('adam_beta2', 0.999),) 157 | optimizer[ 'params' ][ 'lr' ] = config_args.get('learning_rate', 2e-5) 158 | optimizer[ 'params' ][ 'eps' ] = config_args.get('adam_epsilon', 1e-8) 159 | # deepspeed_offload 优化器有效 160 | config_args[ 'optim' ] = optimizer[ 'type' ] 161 | else: 162 | optimizer['params']['betas'] = config_args.get('optimizer_betas', (0.9, 0.999)) 163 | optimizer['params']['lr'] = config_args.get('learning_rate', 2e-5) 164 | optimizer['params']['eps'] = config_args.get('adam_epsilon', 1e-8) 165 | # deepspeed_offload 优化器有效 166 | config_args['optimizer'] = optimizer['type'] 167 | 168 | if precision == 'bf16': 169 | if 'fp16' in deepspeed_config: 170 | deepspeed_config["fp16"]["enbale"] = False 171 | if 'bf16' in deepspeed_config: 172 | deepspeed_config["bf16"]["enbale"] = True 173 | else: 174 | deepspeed_config['bf16'] = {"enbale": True} 175 | elif precision == 'fp16': 176 | if 'bf16' in deepspeed_config: 177 | deepspeed_config["bf16"]["enbale"] = False 178 | 179 | return deepspeed_config 180 | 181 | -------------------------------------------------------------------------------- /config/petl.yaml: -------------------------------------------------------------------------------- 1 | ############## lora模块 2 | 3 | lora: 4 | with_lora: true # 是否启用模块 5 | lora_type: lora 6 | r: 8 7 | lora_alpha: 32 8 | lora_dropout: 0.1 9 | fan_in_fan_out: false 10 | # Bias type for Lora. Can be 'none', 'all' or 'lora_only'" 11 | bias: none 12 | # "help": "List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. " 13 | modules_to_save: null 14 | layers_to_transform: null 15 | layers_pattern: null 16 | 17 | # "The mapping from layer names or regexp expression to ranks which are different from the default rank specified by `r`. " 18 | # "For example, `{model.decoder.layers.0.encoder_attn.k_proj: 8`}" 19 | rank_pattern: {} 20 | 21 | # "The mapping from layer names or regexp expression to alphas which are different from the default alpha specified by `lora_alpha`. " 22 | # "For example, `{model.decoder.layers.0.encoder_attn.k_proj: 32`}" 23 | 24 | alpha_pattern: {} 25 | adalora: 26 | with_lora: false # 是否启用模块 27 | lora_type: adalora 28 | r: 8 29 | lora_alpha: 32 30 | lora_dropout: 0.1 31 | fan_in_fan_out: false 32 | # Bias type for Lora. Can be 'none', 'all' or 'lora_only'" 33 | bias: none 34 | # "help": "List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. " 35 | modules_to_save: null 36 | layers_to_transform: null 37 | layers_pattern: null 38 | alpha_pattern: {} 39 | 40 | # Target Lora matrix dimension. 41 | target_r: 8 42 | #Intial Lora matrix dimension. 43 | init_r: 12 44 | #The steps of initial warmup. 45 | tinit: 0 46 | #The steps of final warmup 47 | tfinal: 0 48 | #Step interval of rank allocation. 49 | deltaT: 1 50 | #Hyperparameter of EMA. 51 | beta1: 0.85 52 | #Hyperparameter of EMA. 53 | beta2: 0.85 54 | #The orthogonal regularization coefficient. 55 | orth_reg_weight: 0.5 56 | 57 | #The total training steps. 58 | total_step: null 59 | 60 | #The saved rank pattern. 61 | rank_pattern: null 62 | 63 | ia3: 64 | with_lora: false # 是否启用模块 65 | fan_in_fan_out: false 66 | # "help": "List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. " 67 | modules_to_save: null 68 | init_ia3_weights: true 69 | 70 | ############## ptv2模块 71 | prompt: 72 | with_prompt: true 73 | prompt_type: prefix_tuning 74 | task_type: causal_lm 75 | prefix_projection: false 76 | num_virtual_tokens: 32 77 | -------------------------------------------------------------------------------- /config/train_ac.yaml: -------------------------------------------------------------------------------- 1 | includes: [global.yaml, petl.yaml] 2 | 3 | # one of record lmdb arrow_stream arrow_file,parquet, 超大数据集可以使用 lmdb , 注 lmdb 存储空间比record大 4 | data_backend: parquet 5 | 6 | output_dir: ./outputs_ac 7 | overwrite_output_dir: true 8 | num_train_epochs: 20 9 | max_steps: -1 10 | save_safetensors: false 11 | save_strategy: steps 12 | save_steps: 1000 13 | save_total_limit: 10 14 | seed: 42 15 | fp16: true 16 | do_train: true 17 | train_file: 18 | - ../data/*.json 19 | 20 | do_eval: false 21 | do_predict: false 22 | per_device_train_batch_size: 2 23 | per_device_eval_batch_size: 2 24 | gradient_accumulation_steps: 1 25 | evaluation_strategy: 'no' 26 | eval_steps: 100 27 | 28 | # adamw_hf , adamw_torch,adamw_torch_fused,adamw_torch_xla,adamw_apex_fused, 29 | # adafactor,adamw_anyprecision,sgd,adagrad,adamw_bnb_8bit,adamw_8bit,lion,lion_8bit,lion_32bit, 30 | # paged_adamw_32bit,paged_adamw_8bit,paged_lion_32bit,paged_lion_8bit, 31 | # lamb_fused_dp adagrad_cpu_dp adam_cpu_dp adam_fused_dp 32 | 33 | optim: adamw_torch 34 | 35 | # one of linear,cosine,cosine_with_restarts,polynomial,constant_with_warmup,inverse_sqrt,reduce_lr_on_plateau 36 | lr_scheduler_type: cosine 37 | torch_compile: false 38 | learning_rate: 2.0e-05 39 | adam_beta1: 0.9 40 | adam_beta2: 0.999 41 | adam_epsilon: 1.0e-08 42 | max_grad_norm: 1.0 43 | weight_decay: 0.0 44 | warmup_ratio: 0.03 45 | logging_strategy: steps 46 | logging_steps: 10 47 | tf32: false 48 | gradient_checkpointing: false 49 | max_seq_length: 512 50 | max_target_length: 100 51 | do_lower_case: null 52 | 53 | use_fast_tokenizer: false 54 | dataloader_drop_last: true 55 | dataloader_pin_memory: true 56 | dataloader_num_workers: 0 57 | log_level: info 58 | 59 | -------------------------------------------------------------------------------- /config/train_cl.yaml: -------------------------------------------------------------------------------- 1 | includes: [global.yaml, petl.yaml, colossalai_strategy.yaml] 2 | 3 | # one of record lmdb arrow_stream arrow_file,parquet, 超大数据集可以使用 lmdb , 注 lmdb 存储空间比record大 4 | data_backend: parquet 5 | 6 | # 目前仅ddp 支持lora 7 | # one of ddp,gemini,zero2,zero2_cpu,3d 8 | strategy: ddp 9 | 10 | output_dir: ./outputs_cl 11 | overwrite_output_dir: true 12 | num_train_epochs: 20 13 | max_steps: -1 14 | save_safetensors: false 15 | save_strategy: steps 16 | save_steps: 1000 17 | save_total_limit: 10 18 | seed: 42 19 | fp16: true 20 | do_train: true 21 | train_file: 22 | - ../data/*.json 23 | do_eval: false 24 | do_predict: false 25 | per_device_train_batch_size: 2 26 | per_device_eval_batch_size: 2 27 | gradient_accumulation_steps: 1 28 | evaluation_strategy: 'no' 29 | eval_steps: 100 30 | 31 | # 优化器,如果策略使用 gemini , 则 optim one of adam_hybrid_cl,adam_cpu_cl,adam_fused_cl 32 | # 如果策略使用非 gemini ,则 optim one of follow 33 | # one of adam_hybrid_cl,adam_cpu_cl,adam_fused_cl,lamb,adamw_hf,adamw,adamw_torch,adamw_torch_fused,adamw_torch_xla,adamw_apex_fused, 34 | # adafactor,adamw_anyprecision,sgd,adagrad,adamw_bnb_8bit,adamw_8bit,lion,lion_8bit,lion_32bit, 35 | # paged_adamw_32bit,paged_adamw_8bit,paged_lion_32bit,paged_lion_8bit, 36 | # lamb_fused_dp adagrad_cpu_dp adam_cpu_dp adam_fused_dp 37 | 38 | optim: adam_hybrid_cl 39 | 40 | # one of linear,cosine,cosine_with_restarts,polynomial,constant_with_warmup,inverse_sqrt,reduce_lr_on_plateau 41 | lr_scheduler_type: cosine 42 | torch_compile: false 43 | learning_rate: 2.0e-05 44 | adam_beta1: 0.9 45 | adam_beta2: 0.999 46 | adam_epsilon: 1.0e-08 47 | max_grad_norm: 1.0 48 | weight_decay: 0.0 49 | warmup_ratio: 0.03 50 | logging_strategy: steps 51 | logging_steps: 10 52 | tf32: false 53 | gradient_checkpointing: false 54 | max_seq_length: 512 55 | max_target_length: 100 56 | 57 | do_lower_case: null 58 | use_fast_tokenizer: false 59 | dataloader_drop_last: true 60 | dataloader_pin_memory: true 61 | dataloader_num_workers: 0 62 | log_level: info 63 | -------------------------------------------------------------------------------- /config/train_hf.yaml: -------------------------------------------------------------------------------- 1 | includes: [global.yaml, petl.yaml] 2 | 3 | # one of record lmdb arrow_stream arrow_file,parquet, 超大数据集可以使用 lmdb , 注 lmdb 存储空间比record大 4 | data_backend: parquet 5 | output_dir: ./outputs_hf 6 | overwrite_output_dir: true 7 | num_train_epochs: 20 8 | max_steps: -1 9 | save_safetensors: false 10 | save_strategy: steps 11 | save_steps: 1000 12 | save_total_limit: 10 13 | seed: 42 14 | fp16: true 15 | do_train: true 16 | train_file: 17 | - ../data/*.json 18 | do_eval: false 19 | do_predict: false 20 | per_device_train_batch_size: 2 21 | per_device_eval_batch_size: 2 22 | gradient_accumulation_steps: 1 23 | evaluation_strategy: 'no' 24 | eval_steps: 100 25 | 26 | 27 | # adamw_hf , adamw_torch,adamw_torch_fused,adamw_torch_xla,adamw_apex_fused, 28 | # adafactor,adamw_anyprecision,sgd,adagrad,adamw_bnb_8bit,adamw_8bit,lion,lion_8bit,lion_32bit, 29 | # paged_adamw_32bit,paged_adamw_8bit,paged_lion_32bit,paged_lion_8bit, 30 | # lamb_fused_dp adagrad_cpu_dp adam_cpu_dp adam_fused_dp 31 | 32 | optim: adamw_torch 33 | 34 | # one of linear,cosine,cosine_with_restarts,polynomial,constant_with_warmup,inverse_sqrt,reduce_lr_on_plateau 35 | lr_scheduler_type: cosine 36 | torch_compile: false 37 | learning_rate: 2.0e-05 38 | adam_beta1: 0.9 39 | adam_beta2: 0.999 40 | adam_epsilon: 1.0e-08 41 | max_grad_norm: 1.0 42 | weight_decay: 0.0 43 | warmup_ratio: 0.03 44 | logging_strategy: steps 45 | logging_steps: 10 46 | tf32: false 47 | gradient_checkpointing: false 48 | max_seq_length: 512 49 | max_target_length: 100 50 | 51 | do_lower_case: null 52 | use_fast_tokenizer: false 53 | dataloader_drop_last: true 54 | dataloader_pin_memory: true 55 | dataloader_num_workers: 0 56 | log_level: info 57 | -------------------------------------------------------------------------------- /config/train_pl.yaml: -------------------------------------------------------------------------------- 1 | includes: [global.yaml, petl.yaml] 2 | 3 | devices: 1 4 | data_backend: parquet 5 | convert_onnx: false 6 | do_train: true 7 | train_file: 8 | - ../data/*.json 9 | 10 | max_epochs: 20 11 | max_steps: -1 12 | 13 | # *** optimizer 14 | # lamb,adamw_hf,adamw,adamw_torch,adamw_torch_fused,adamw_torch_xla,adamw_apex_fused, 15 | # adafactor,adamw_anyprecision,sgd,adagrad,adamw_bnb_8bit,adamw_8bit,lion,lion_8bit,lion_32bit, 16 | # paged_adamw_32bit,paged_adamw_8bit,paged_lion_32bit,paged_lion_8bit, 17 | # lamb_fused_dp adagrad_cpu_dp adam_cpu_dp adam_fused_dp 18 | 19 | # *** scheduler 20 | # linear,WarmupCosine,CAWR,CAL,Step,ReduceLROnPlateau, cosine,cosine_with_restarts,polynomial, 21 | # constant,constant_with_warmup,inverse_sqrt,reduce_lr_on_plateau 22 | 23 | # 'scheduler_type': 'linear',# one of [linear,WarmupCosine,CAWR,CAL,Step,ReduceLROnPlateau 24 | # 'scheduler': None, 25 | # 切换scheduler类型 26 | # 'scheduler_type': 'WarmupCosine', 27 | # 'scheduler': None, 28 | 29 | # 'scheduler_type': 'ReduceLROnPlateau', 30 | # 'scheduler': None, 31 | 32 | # 'scheduler_type': 'Step', 33 | # 'scheduler':{ 'decay_rate': 0.999,'decay_steps': 100,'verbose': True}, 34 | 35 | # 'scheduler_type': 'CAWR', 36 | # 'scheduler':{'T_mult': 1, 'rewarm_epoch_num': 2, 'verbose': True}, 37 | 38 | # 'scheduler_type': 'CAL', 39 | # 'scheduler': {'rewarm_epoch_num': 2,'verbose': True}, 40 | 41 | optimizer: lion 42 | scheduler_type: CAWR 43 | scheduler: 44 | T_mult: 1 45 | rewarm_epoch_num: 0.5 46 | verbose: false 47 | optimizer_betas: !!python/tuple 48 | - 0.9 49 | - 0.999 50 | train_batch_size: 2 51 | eval_batch_size: 2 52 | test_batch_size: 2 53 | learning_rate: 2.0e-05 54 | adam_epsilon: 1.0e-08 55 | gradient_accumulation_steps: 1 56 | max_grad_norm: 1.0 57 | weight_decay: 0 58 | warmup_steps: 0 59 | output_dir: ./outputs_pl 60 | max_seq_length: 512 61 | do_lower_case: null 62 | 63 | # 预测最大长度, 保留字段 64 | max_target_length: 100 65 | use_fast_tokenizer: false 66 | dataloader_drop_last: true 67 | dataloader_pin_memory: true 68 | dataloader_num_workers: 0 69 | -------------------------------------------------------------------------------- /data/finetune_train_paragraph.json: -------------------------------------------------------------------------------- 1 | {"id": 1, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 2 | {"id": 2, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 3 | {"id": 3, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 4 | {"id": 4, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 5 | {"id": 5, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 6 | {"id": 6, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 7 | {"id": 7, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 8 | {"id": 8, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 9 | {"id": 9, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 10 | {"id": 10, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 11 | {"id": 11, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 12 | {"id": 12, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 13 | {"id": 13, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 14 | {"id": 14, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 15 | {"id": 15, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 16 | {"id": 16, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 17 | {"id": 17, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 18 | {"id": 18, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 19 | {"id": 19, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 20 | {"id": 20, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 21 | {"id": 21, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 22 | {"id": 22, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 23 | {"id": 23, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 24 | {"id": 24, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 25 | {"id": 25, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 26 | {"id": 26, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 27 | {"id": 27, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 28 | {"id": 28, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 29 | {"id": 29, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 30 | {"id": 30, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 31 | {"id": 31, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 32 | {"id": 32, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 33 | {"id": 33, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 34 | {"id": 34, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 35 | {"id": 35, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 36 | {"id": 36, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 37 | {"id": 37, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 38 | {"id": 38, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 39 | {"id": 39, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 40 | {"id": 40, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 41 | {"id": 41, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 42 | {"id": 42, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 43 | {"id": 43, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 44 | {"id": 44, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 45 | {"id": 45, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 46 | {"id": 46, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 47 | {"id": 47, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 48 | {"id": 48, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 49 | {"id": 49, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 50 | {"id": 50, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 51 | {"id": 51, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 52 | {"id": 52, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 53 | {"id": 53, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 54 | {"id": 54, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 55 | {"id": 55, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 56 | {"id": 56, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 57 | {"id": 57, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 58 | {"id": 58, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 59 | {"id": 59, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 60 | {"id": 60, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 61 | {"id": 61, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 62 | {"id": 62, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 63 | {"id": 63, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 64 | {"id": 64, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 65 | {"id": 65, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 66 | {"id": 66, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 67 | {"id": 67, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 68 | {"id": 68, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 69 | {"id": 69, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 70 | {"id": 70, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 71 | {"id": 71, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 72 | {"id": 72, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 73 | {"id": 73, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 74 | {"id": 74, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 75 | {"id": 75, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 76 | {"id": 76, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 77 | {"id": 77, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 78 | {"id": 78, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 79 | {"id": 79, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 80 | {"id": 80, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 81 | {"id": 81, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 82 | {"id": 82, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 83 | {"id": 83, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 84 | {"id": 84, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 85 | {"id": 85, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 86 | {"id": 86, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 87 | {"id": 87, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 88 | {"id": 88, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 89 | {"id": 89, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 90 | {"id": 90, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 91 | {"id": 91, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 92 | {"id": 92, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 93 | {"id": 93, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 94 | {"id": 94, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 95 | {"id": 95, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 96 | {"id": 96, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 97 | {"id": 97, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 98 | {"id": 98, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 99 | {"id": 99, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 100 | {"id": 100, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 101 | {"id": 101, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 102 | {"id": 102, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 103 | {"id": 103, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 104 | {"id": 104, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 105 | {"id": 105, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 106 | {"id": 106, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 107 | {"id": 107, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 108 | {"id": 108, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 109 | {"id": 109, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 110 | {"id": 110, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 111 | {"id": 111, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 112 | {"id": 112, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 113 | {"id": 113, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 114 | {"id": 114, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 115 | {"id": 115, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 116 | {"id": 116, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 117 | {"id": 117, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 118 | {"id": 118, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 119 | {"id": 119, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 120 | {"id": 120, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 121 | {"id": 121, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 122 | {"id": 122, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 123 | {"id": 123, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 124 | {"id": 124, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 125 | {"id": 125, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 126 | {"id": 126, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 127 | {"id": 127, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 128 | {"id": 128, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 129 | {"id": 129, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 130 | {"id": 130, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 131 | {"id": 131, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 132 | {"id": 132, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 133 | {"id": 133, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 134 | {"id": 134, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 135 | {"id": 135, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 136 | {"id": 136, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 137 | {"id": 137, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 138 | {"id": 138, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 139 | {"id": 139, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 140 | {"id": 140, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 141 | {"id": 141, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 142 | {"id": 142, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 143 | {"id": 143, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 144 | {"id": 144, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 145 | {"id": 145, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 146 | {"id": 146, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 147 | {"id": 147, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 148 | {"id": 148, "paragraph": [{"q": "从南京到上海的路线", "a": "你好,南京到上海的路线如下:\n1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。\n2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。\n3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站"}]} 149 | {"id": 149, "paragraph": [{"q": "写一个诗歌,关于冬天", "a": "冬夜寂静冷,\n云在天边飘,\n冰封白雪上, \n寒冷像一场雪。\n \n雪花融化成冰,\n像那雪花飘洒,\n在寒冷的冬天,\n感受春天的喜悦。\n 冬日里,\n风雪渐消,\n一片寂静,\n把快乐和温暖带回家。"}]} 150 | {"id": 150, "paragraph": [{"q": "晚上睡不着应该怎么办", "a": "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:\n\n1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。\n2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。\n3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。\n4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。\n5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。\n6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。\n\n如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。"}]} 151 | -------------------------------------------------------------------------------- /data/make_data_example.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2023/2/24 12:50 3 | 4 | 5 | import json 6 | 7 | 8 | x1 = [ 9 | { 10 | "q": "从南京到上海的路线", 11 | "a": "\n".join([ 12 | "你好,南京到上海的路线如下:", 13 | "1. 南京到上海,可以乘坐南京地铁1号线,在南京站乘坐轨道交通1号线。", 14 | "2. 南京到浦东机场,可以搭乘上海地铁1号,在陆家嘴站乘坐地铁1线,在浦东国际机场站乘坐机场快线,前往上海浦东国际机场。", 15 | "3. 上海到南京,可以换乘上海地铁2号线,从南京站换乘地铁2线,再从南京南站换乘地铁1路,然后到达上海站" 16 | ]) 17 | } 18 | ] 19 | 20 | 21 | x2 = [ 22 | 23 | { 24 | "q": "写一个诗歌,关于冬天", 25 | "a": "\n".join([ 26 | "冬夜寂静冷,", 27 | "云在天边飘,", "冰封白雪上, ", "寒冷像一场雪。", 28 | " ", 29 | "雪花融化成冰,", 30 | "像那雪花飘洒,", 31 | "在寒冷的冬天,", 32 | "感受春天的喜悦。", 33 | " 冬日里,", 34 | "风雪渐消,", 35 | "一片寂静,", 36 | "把快乐和温暖带回家。" 37 | ]) 38 | } 39 | ] 40 | 41 | 42 | x3 = [ 43 | { 44 | "q": "晚上睡不着应该怎么办", 45 | "a": "\n".join([ 46 | "晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:", 47 | "", 48 | "1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。", 49 | "2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。", 50 | "3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。", 51 | "4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。", 52 | "5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。", 53 | "6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。", 54 | "", 55 | "如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。" 56 | ]) 57 | } 58 | ] 59 | 60 | 61 | 62 | 63 | x = [x1,x2,x3] 64 | 65 | with open('./finetune_train_paragraph.json',mode='w',encoding='utf-8',newline='\n') as f: 66 | index = 0 67 | for i in range(50): 68 | for j in range(len(x)): 69 | index += 1 70 | 71 | conversations = { 72 | "id": index, 73 | "paragraph": x[j] 74 | } 75 | f.write(json.dumps(conversations,ensure_ascii=False) + '\n' ) 76 | 77 | 78 | with open('./finetune_train_conversations.json',mode='w',encoding='utf-8',newline='\n') as f: 79 | index = 0 80 | for i in range(50): 81 | for j in range(len(x)): 82 | index += 1 83 | 84 | conversation = [] 85 | for item in x[j]: 86 | role = item.get("role","user") 87 | if role == "system": 88 | conversation.append( { 89 | "from": item.get("role","user"), 90 | "value": item["q"] 91 | }) 92 | else: 93 | conversation.append({ 94 | "from": item.get("role", "user"), 95 | "value": item["q"] 96 | }) 97 | conversation.append({ 98 | "from": "assistant", 99 | "value": item["a"] 100 | }) 101 | 102 | conversations = { 103 | "id": index, 104 | "conversations": conversation 105 | } 106 | f.write(json.dumps(conversations,ensure_ascii=False) + '\n' ) 107 | -------------------------------------------------------------------------------- /data_processer.py: -------------------------------------------------------------------------------- 1 | # @Time : 2023/3/25 18:36 2 | # @Author : tk 3 | import copy 4 | from enum import Enum 5 | import numpy as np 6 | from transformers import PreTrainedTokenizer 7 | 8 | DEFAULT_PAD_TOKEN = "[PAD]" 9 | DEFAULT_EOS_TOKEN = "" 10 | DEFAULT_BOS_TOKEN = "" 11 | DEFAULT_UNK_TOKEN = "" 12 | 13 | class DataStrategy(Enum): 14 | tunction = 1 15 | slidding = 2 16 | 17 | 18 | class PromptBuilder: 19 | @classmethod 20 | def build_template_xverse(cls, query, answer=None, prefix=None, history=None): 21 | prompt = prefix or '' 22 | if history is not None: 23 | for q, a in history: 24 | prompt += "Human: {}\n\nAssistant: {}".format(q, a) 25 | prompt += "Human: {}\n\nAssistant: ".format(query) 26 | if answer is not None: 27 | prompt += answer 28 | return prompt 29 | 30 | @classmethod 31 | def build_template_bluelm(cls, query, answer=None, history=None, prefix=None): 32 | prompt = prefix or '' 33 | if history is not None: 34 | for q, a in history: 35 | prompt += "[|Human|]:{}[|AI|]:{}".format(q, a) 36 | prompt += "[|Human|]:{}[|AI|]:".format(query) 37 | if answer is not None: 38 | prompt += answer 39 | return prompt 40 | 41 | @classmethod 42 | def build_template_default(cls,query, answer=None, prefix=None, history=None): 43 | prompt = prefix or '' 44 | if history is not None: 45 | for q, a in history: 46 | prompt += "User: {}\nAssistant:{}".format(q, a) 47 | prompt += "User: {}\nAssistant:".format(query) 48 | if answer is not None: 49 | prompt += answer 50 | return prompt 51 | 52 | @classmethod 53 | def build_template_tiger(cls,query, answer=None, prefix=None, history=None): 54 | prompt = prefix or '' 55 | tok_ins = "\n\n### Instruction:\n" 56 | tok_res = "\n\n### Response:\n" 57 | if history is not None: 58 | for q, a in history: 59 | prompt += "{}{}{}{}".format(tok_ins, q, tok_res, a) 60 | 61 | prompt += "{}{}{}".format(tok_ins, query, tok_res) 62 | if answer is not None: 63 | prompt += answer 64 | return prompt 65 | 66 | @classmethod 67 | def build_template_openai(cls,query, answer=None, history=None, prefix=None): 68 | prompt = prefix or 'You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: 2023-03-01' 69 | if prompt: 70 | prompt = f"<|im_start|>system\n{prompt}<|im_end|>\n" 71 | if history is not None: 72 | for q, a in history: 73 | prompt += "<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n{}<|im_end|>".format(q, a) 74 | prompt += "<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n".format(query) 75 | if answer is not None: 76 | prompt += answer + '<|im_end|>' 77 | return prompt 78 | 79 | @classmethod 80 | def build_template_yi(cls, query, answer=None, history=None, prefix=None): 81 | prompt = prefix or '' 82 | if prompt: 83 | prompt = f"<|im_start|>system\n{prompt}<|im_end|>\n" 84 | if history is not None: 85 | for q, a in history: 86 | prompt += "<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n{}<|im_end|>".format(q, a) 87 | prompt += "<|im_start|>user\n{}<|im_end|>\n<|im_start|>assistant\n".format(query) 88 | if answer is not None: 89 | prompt += answer + '<|im_end|>' 90 | return prompt 91 | 92 | @classmethod 93 | def build_template_internlm(cls,query, answer=None, prefix=None, history=None): 94 | prompt = prefix or '' 95 | if history is not None: 96 | for q, a in history: 97 | prompt += f"""<|User|>:{q}\n<|Bot|>:{a}\n""" 98 | if len(prompt) == 0: 99 | prompt += "" 100 | prompt += f"""<|User|>:{query}\n<|Bot|>:""" 101 | if answer is not None: 102 | prompt += answer 103 | return prompt 104 | 105 | @classmethod 106 | def build_template_qwen2(cls, query, answer=None, prefix=None, history=None): 107 | prompt = prefix or '<|im_start|>system\nYou are a helpful assistant<|im_end|>\n' 108 | if history is not None: 109 | for q, a in history: 110 | prompt += '<|im_start|>' + 'user' + '\n' + q + '<|im_end|>' 111 | prompt += '<|im_start|>' + 'assistant' + '\n' + a + '<|im_end|>' 112 | 113 | prompt += '<|im_start|>' + 'assistant' + '\n' 114 | if answer is not None: 115 | prompt += answer 116 | return prompt 117 | #切换模板 118 | build_template = PromptBuilder.build_template_qwen2 119 | 120 | 121 | class TokenIdsMaker: 122 | @classmethod 123 | def final(cls, tokenizer, input_ids, labels, max_seq_length): 124 | seqlen = np.asarray(len(input_ids), dtype=np.int32) 125 | pad_len = max_seq_length - seqlen 126 | input_ids = np.asarray(input_ids, dtype=np.int32) 127 | attention_mask = np.asarray([1] * len(input_ids), dtype=np.int32) 128 | labels = np.asarray(labels, dtype=np.int32) 129 | if pad_len: 130 | pad_val = tokenizer.eos_token_id 131 | input_ids = np.pad(input_ids, (0, pad_len), 'constant', constant_values=(pad_val, pad_val)) 132 | attention_mask = np.pad(attention_mask, (0, pad_len), 'constant', constant_values=(0, 0)) 133 | labels = np.pad(labels, (0, pad_len), 'constant', constant_values=(-100, -100)) 134 | d = { 135 | 'input_ids': input_ids, 136 | 'attention_mask': attention_mask, 137 | 'labels': labels, 138 | 'seqlen': seqlen 139 | } 140 | return d 141 | @classmethod 142 | def tunction(cls, tokenizer: PreTrainedTokenizer, config, sup, max_seq_length, examples): 143 | sptoken = [config.bos_token_id] 144 | ds = [] 145 | prefix = None 146 | history = [] 147 | for sid, (role,q,a) in enumerate(examples): 148 | if role == 'system': 149 | prefix = q 150 | continue 151 | history += [(q,a)] 152 | a_ids = tokenizer.encode(text=build_template(q,prefix=prefix,history=history[:-1]), add_special_tokens=False) 153 | b_ids = tokenizer.encode(text=a, add_special_tokens=False) 154 | while len(a_ids) + len(b_ids) > max_seq_length - len(sptoken) - 1: 155 | if len(b_ids) > len(a_ids): 156 | b_ids.pop(-1) 157 | else: 158 | a_ids.pop(0) 159 | b_ids += [config.eos_token_id] 160 | input_ids = a_ids + b_ids 161 | labels = copy.deepcopy(input_ids) if not sup else [-100] * len(a_ids) + copy.deepcopy(b_ids) 162 | input_ids = sptoken + input_ids 163 | labels = sptoken + labels if not sup else [-100] * len(sptoken) + labels 164 | assert len(input_ids) <= max_seq_length 165 | ds.append(cls.final(tokenizer, input_ids, labels, max_seq_length)) 166 | return ds 167 | 168 | 169 | @classmethod 170 | def slidding(cls, tokenizer: PreTrainedTokenizer,config,stride,max_seq_length, examples, 171 | sliding_size=None, 172 | src_max_length=-1, 173 | dst_max_length=-1, 174 | sup=True): 175 | sptoken = [config.bos_token_id] 176 | if sliding_size is None or sliding_size < 0: 177 | sliding_size = max_seq_length - len(sptoken) 178 | 179 | assert sliding_size <= max_seq_length - len(sptoken) 180 | 181 | ds = [] 182 | prefix = None 183 | history = [] 184 | for sid, (role, q, a) in enumerate(examples): 185 | if role == 'system': 186 | prefix = q 187 | continue 188 | history += [(q, a)] 189 | a_ids = tokenizer.encode(text=build_template(q, prefix=prefix, history=history[:-1]),add_special_tokens=False) 190 | b_ids = tokenizer.encode(text=a, add_special_tokens=False) 191 | if src_max_length and src_max_length > 0: 192 | a_ids = a_ids[:src_max_length] 193 | if dst_max_length and dst_max_length > 0: 194 | b_ids = b_ids[:dst_max_length] 195 | 196 | b_ids += [config.eos_token_id] 197 | input_ids_qa = a_ids + b_ids 198 | labels_all = copy.deepcopy(input_ids_qa) if not sup else [-100] * len(a_ids) + b_ids 199 | 200 | pos = 0 201 | while pos < len(input_ids_qa): 202 | input_ids = input_ids_qa[pos:pos + max_seq_length - len(sptoken)] 203 | labels = labels_all[pos:pos + max_seq_length - len(sptoken)] 204 | 205 | pos += sliding_size 206 | if np.all(np.asarray(labels) == -100): 207 | continue 208 | 209 | input_ids = sptoken + input_ids 210 | labels = sptoken + labels if not sup else [-100] * len(sptoken) + labels 211 | ds.append(cls.final(tokenizer, input_ids, labels, max_seq_length)) 212 | return ds 213 | 214 | 215 | -------------------------------------------------------------------------------- /data_utils.py: -------------------------------------------------------------------------------- 1 | # @Time : 2023/1/22 16:22 2 | # @Author : tk 3 | # @FileName: data_utils.py 4 | import glob 5 | import sys 6 | import os 7 | sys.path.append(os.path.join(os.path.dirname(__file__))) 8 | 9 | from functools import cache 10 | import copy 11 | import json 12 | import random 13 | import typing 14 | import numpy as np 15 | import torch 16 | 17 | from deep_training.data_helper import DataHelper, ModelArguments, TrainingArguments, TrainingArgumentsHF, \ 18 | TrainingArgumentsCL, DataArguments, TrainingArgumentsAC 19 | from deep_training.zoo.model_zoo.llm.llm_model import PetlArguments,LoraConfig,PromptArguments 20 | from fastdatasets.record import load_dataset as Loader, RECORD, WriterObject, gfile 21 | from transformers import PreTrainedTokenizer, HfArgumentParser, PretrainedConfig 22 | from data_processer import DataStrategy, TokenIdsMaker, build_template, DEFAULT_PAD_TOKEN, DEFAULT_EOS_TOKEN, \ 23 | DEFAULT_BOS_TOKEN, DEFAULT_UNK_TOKEN 24 | from config import * 25 | from module_setup import module_setup 26 | module_setup() 27 | 28 | data_conf = { 29 | 'strategy': DataStrategy.tunction, # 数据策略选项 30 | DataStrategy.tunction: { 31 | 'sup': True, # 是否监督模式 32 | }, 33 | 34 | DataStrategy.slidding: { 35 | 'stride': int(config_args['max_seq_length'] / 3 * 2), 36 | 'sup': True, # 是否监督模式 37 | "src_max_length": config_args['max_seq_length'] - 10, 38 | "dst_max_length": None, 39 | } 40 | 41 | } 42 | 43 | 44 | 45 | def preprocess(text): 46 | return text 47 | 48 | def postprocess(text): 49 | return text 50 | 51 | 52 | class NN_DataHelper(DataHelper): 53 | index = 1 54 | 55 | def __init__(self, *args, **kwargs): 56 | super(NN_DataHelper, self).__init__(*args, **kwargs) 57 | assert data_conf[DataStrategy.slidding]['stride'] > 0 58 | 59 | def load_tokenizer_and_config(self, *args, tokenizer_kwargs=None, config_kwargs=None, **kwargs): 60 | if config_kwargs is None: 61 | config_kwargs = {} 62 | if tokenizer_kwargs is None: 63 | tokenizer_kwargs = {} 64 | model_args = self.model_args 65 | base_path = model_args.config_name or model_args.model_name_or_path 66 | if os.path.isfile(base_path): 67 | base_path = os.path.dirname(base_path) 68 | 69 | last_name = base_path.rsplit('/')[-1].lower() 70 | if "yi" in last_name: 71 | gen_file = os.path.join(base_path, "generation_config.json") 72 | if os.path.exists(gen_file): 73 | with open(gen_file, mode='r', encoding='utf-8') as f: 74 | config_kwargs.update(json.loads(f.read())) 75 | 76 | 77 | if 'trust_remote_code' not in config_kwargs: 78 | config_kwargs.update({"trust_remote_code": True, "local_files_only": True}) 79 | if 'trust_remote_code' not in tokenizer_kwargs: 80 | tokenizer_kwargs.update({"trust_remote_code": True, "local_files_only": True}) 81 | 82 | ret = super().load_tokenizer_and_config(*args,tokenizer_kwargs=tokenizer_kwargs,config_kwargs=config_kwargs, **kwargs) 83 | self._preprocess_tokenizer_config() 84 | return ret 85 | 86 | def _preprocess_tokenizer_config(self): 87 | model_args = self.model_args 88 | tokenizer = self.tokenizer 89 | config = self.config 90 | 91 | if "llama" in model_args.model_type.lower(): 92 | special_tokens_dict = dict() 93 | if tokenizer.pad_token is None: 94 | special_tokens_dict["pad_token"] = DEFAULT_PAD_TOKEN 95 | if tokenizer.eos_token is None: 96 | special_tokens_dict["eos_token"] = DEFAULT_EOS_TOKEN 97 | if tokenizer.bos_token is None: 98 | special_tokens_dict["bos_token"] = DEFAULT_BOS_TOKEN 99 | if tokenizer.unk_token is None: 100 | special_tokens_dict["unk_token"] = DEFAULT_UNK_TOKEN 101 | 102 | _ = tokenizer.add_special_tokens(special_tokens_dict) 103 | 104 | 105 | if tokenizer.pad_token is None: 106 | tokenizer.add_special_tokens({ 107 | "pad_token": tokenizer.eos_token, 108 | }) 109 | if config.pad_token_id is None or config.pad_token_id == -1: 110 | config.pad_token_id = tokenizer.eos_token_id 111 | 112 | 113 | 114 | if config.decoder_start_token_id is None: 115 | config.decoder_start_token_id = config.bos_token_id 116 | 117 | if config.decoder_start_token_id != tokenizer.bos_token_id: 118 | print('*' * 30, 'config.decoder_start_token_id != tokenizer.bos_token_id !!!') 119 | 120 | assert config.decoder_start_token_id == config.bos_token_id 121 | 122 | def on_data_ready(self): 123 | self.index = -1 124 | 125 | # 切分词 126 | def on_data_process(self, data: typing.Any, mode: str): 127 | self.index += 1 128 | 129 | tokenizer: PreTrainedTokenizer 130 | config = self.config 131 | max_seq_length = self.max_seq_length_dict[mode] 132 | tokenizer = self.tokenizer 133 | 134 | examples = data 135 | 136 | strategy = data_conf['strategy'] 137 | if strategy == DataStrategy.tunction: 138 | ds = TokenIdsMaker.tunction(tokenizer, config=config, max_seq_length=max_seq_length, examples=examples, 139 | **data_conf[strategy]) 140 | elif strategy == DataStrategy.slidding: 141 | ds = TokenIdsMaker.slidding(tokenizer, config=config, max_seq_length=max_seq_length, examples=examples, 142 | **data_conf[strategy]) 143 | 144 | else: 145 | raise ValueError('Invalid strategy', strategy) 146 | if not ds: 147 | return None 148 | 149 | if self.index < 3: 150 | print(ds[0]) 151 | return ds 152 | 153 | def _get_paragraph(self, lines): 154 | D = [] 155 | for line_id, line in enumerate(lines): 156 | jd = json.loads(line) 157 | if not jd: 158 | continue 159 | paragraph = jd['paragraph'] 160 | if line_id < 10: 161 | print(paragraph) 162 | 163 | paragraph = [(session.get("role", ""), preprocess(session['q']), 164 | preprocess('\n'.join(session['a'])) if isinstance(session['a'], list) else preprocess( 165 | session['a'])) 166 | for session in paragraph] 167 | sub = [] 168 | # 自行做模板 169 | for (role, q, a) in paragraph: 170 | # 不是system prompt answer 必须存在 171 | if role != "system": 172 | assert len(a), ValueError('answer cannot empty') 173 | sub.append((role, q, a)) 174 | D.append(copy.deepcopy(sub)) 175 | sub.clear() 176 | return D 177 | 178 | def _get_messages(self, lines): 179 | D = [] 180 | for line_id, line in enumerate(lines): 181 | jd = json.loads(line) 182 | if not jd: 183 | continue 184 | conversations = jd['conversations'] 185 | if line_id < 10: 186 | print(conversations) 187 | 188 | cid = 0 189 | sub = [] 190 | while cid < len(conversations): 191 | m = conversations[cid] 192 | cid += 1 193 | role = m["from"] 194 | q = preprocess(m["value"]) 195 | if role == "system": 196 | a = "" 197 | sub.append((role, q, a)) 198 | continue 199 | assert role in ['user', 'observation', 'function'] 200 | m = conversations[cid] 201 | cid += 1 202 | assert m["from"] == "assistant" 203 | a = preprocess(m["value"]) 204 | assert len(a), ValueError('answer cannot empty') 205 | sub.append((role, q, a)) 206 | D.append(sub) 207 | return D 208 | # 读取文件 209 | 210 | def on_get_corpus(self, files: typing.List, mode: str): 211 | D = [] 212 | files = sum([glob.glob(file) for file in files], []) 213 | for file in files: 214 | with open(file, mode='r', encoding='utf-8', newline='\n') as f: 215 | lines = f.readlines() 216 | is_new = False 217 | if len(lines) > 0: 218 | is_new = 'conversations' in json.loads(lines[0]) 219 | if is_new: 220 | D.extend(self._get_messages(lines)) 221 | else: 222 | D.extend(self._get_paragraph(lines)) 223 | return D 224 | 225 | def collate_fn(self, batch): 226 | o = {} 227 | for i, b in enumerate(batch): 228 | if i == 0: 229 | for k in b: 230 | o[k] = [torch.tensor(b[k])] 231 | else: 232 | for k in b: 233 | o[k].append(torch.tensor(b[k])) 234 | for k in o: 235 | o[k] = torch.stack(o[k]) 236 | 237 | maxlen = torch.max(o.pop('seqlen')) 238 | o['input_ids'] = o['input_ids'][:, :maxlen] 239 | o['attention_mask'] = o['attention_mask'][:, :maxlen] 240 | o['labels'] = o['labels'][:, :maxlen].long() 241 | return o 242 | 243 | def make_dataset_all(self): 244 | data_args = self.data_args 245 | # schema for arrow parquet 246 | schema = { 247 | "input_ids": "int32_list", 248 | "attention_mask": "int32_list", 249 | "labels": "int32_list", 250 | "seqlen": "int32_list", 251 | } 252 | # 缓存数据集 253 | if data_args.do_train: 254 | self.make_dataset_with_args(data_args.train_file, mixed_data=False, shuffle=True, mode='train', 255 | schema=schema) 256 | if data_args.do_eval: 257 | self.make_dataset_with_args(data_args.eval_file, mode='eval', schema=schema) 258 | if data_args.do_test: 259 | self.make_dataset_with_args(data_args.test_file, mode='test', schema=schema) 260 | 261 | # 记录缓存文件 262 | with open(os.path.join(data_args.output_dir, 'intermediate_file_index.json'), mode='w', 263 | encoding='utf-8') as f: 264 | f.write(json.dumps({ 265 | "train_files": self.train_files, 266 | "eval_files": self.eval_files, 267 | "test_files": self.test_files, 268 | }, ensure_ascii=False)) 269 | 270 | @cache 271 | def load_dataset_files(self): 272 | data_args = self.data_args 273 | 274 | if not data_args.convert_file: 275 | return { 276 | "train_files": self.train_files, 277 | "eval_files": self.eval_files, 278 | "test_files": self.test_files, 279 | } 280 | 281 | filename = os.path.join(data_args.output_dir, 'intermediate_file_index.json') 282 | assert os.path.exists(filename), 'make you dataset firstly' 283 | with open(filename, mode='r', encoding='utf-8') as f: 284 | return json.loads(f.read()) 285 | 286 | if __name__ == '__main__': 287 | 288 | if global_args["trainer_backend"] == "hf": 289 | parser = HfArgumentParser((ModelArguments, TrainingArgumentsHF, DataArguments, PetlArguments, PromptArguments), 290 | conflict_handler='resolve') 291 | model_args, training_args, data_args, lora_args, prompt_args = parser.parse_dict(config_args, 292 | allow_extra_keys=True, ) 293 | elif global_args["trainer_backend"] == "pl": 294 | parser = HfArgumentParser((ModelArguments, TrainingArguments, DataArguments, PetlArguments, PromptArguments)) 295 | model_args, training_args, data_args, _, _ = parser.parse_dict(config_args) 296 | elif global_args["trainer_backend"] == "cl": 297 | parser = HfArgumentParser((ModelArguments, TrainingArgumentsCL, DataArguments, PetlArguments, PromptArguments), 298 | conflict_handler='resolve') 299 | model_args, training_args, data_args, lora_args, prompt_args = parser.parse_dict(config_args, 300 | allow_extra_keys=True, ) 301 | else: 302 | parser = HfArgumentParser((ModelArguments, TrainingArgumentsAC, DataArguments, PetlArguments, PromptArguments), 303 | conflict_handler='resolve') 304 | model_args, training_args, data_args, lora_args, prompt_args = parser.parse_dict(config_args, 305 | allow_extra_keys=True, ) 306 | 307 | 308 | dataHelper = NN_DataHelper(model_args, training_args, data_args) 309 | tokenizer, config, _, _ = dataHelper.load_tokenizer_and_config(config_kwargs={"torch_dtype": torch.float16}) 310 | 311 | # 缓存数据集 312 | print(f'to make dataset is overwrite_cache {data_args.overwrite_cache}') 313 | dataHelper.make_dataset_all() 314 | 315 | print('make dataset complete!') 316 | print('check data !') 317 | dataset = dataHelper.load_sequential_sampler(dataHelper.load_dataset_files()["train_files"], 318 | with_load_memory=data_args.data_backend == 'record', 319 | batch_size=1, 320 | collate_fn=dataHelper.collate_fn) 321 | 322 | print('total', len(dataset)) 323 | for i, d in enumerate(dataset): 324 | print(d) 325 | if i >= 1: 326 | break -------------------------------------------------------------------------------- /infer/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/10/12 13:34 4 | -------------------------------------------------------------------------------- /infer/infer.py: -------------------------------------------------------------------------------- 1 | # @Time : 2023/4/2 22:49 2 | # @Author : tk 3 | # @FileName: infer 4 | import os 5 | import sys 6 | sys.path.append(os.path.join(os.path.dirname(__file__),'..')) 7 | 8 | import torch 9 | from deep_training.data_helper import ModelArguments 10 | from transformers import HfArgumentParser 11 | from data_utils import config_args, NN_DataHelper, get_deepspeed_config 12 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer 13 | from deep_training.zoo.utils.llm_generate import Generate 14 | from deep_training.zoo.model_zoo.llm.llm_model import RotaryNtkScaledArguments,RotaryLinearScaledArguments # aigc-zoo 0.1.20 15 | 16 | deep_config = get_deepspeed_config() 17 | 18 | 19 | def infer_tiger(model,tokenizer,max_input_length=512): 20 | tok_ins = "\n\n### Instruction:\n" 21 | tok_res = "\n\n### Response:\n" 22 | prompt_input = tok_ins + "{instruction}" + tok_res 23 | 24 | generation_config = { 25 | "do_sample": True, 26 | "eos_token_id": 2, 27 | "max_length": max_input_length, 28 | "pad_token_id": 60514, 29 | "repetition_penalty": 1.1, 30 | "temperature": 0.3, 31 | "transformers_version": "4.31.0" 32 | } 33 | text_list = ["写一个诗歌,关于冬天", 34 | "晚上睡不着应该怎么办", 35 | "从南京到上海的路线", 36 | ] 37 | 38 | for input in text_list: 39 | sess_text = '' 40 | 41 | query_text = input.strip() 42 | sess_text += tok_ins + query_text 43 | input_text = prompt_input.format_map({'instruction': sess_text.split(tok_ins, 1)[1]}) 44 | inputs = tokenizer(input_text, return_tensors='pt', truncation=True, max_length=max_input_length) 45 | inputs = {k: v.to(model.device) for k, v in inputs.items()} 46 | output = model.generate(**inputs, **generation_config) 47 | output_str = tokenizer.decode(output[0], skip_special_tokens=False, spaces_between_special_tokens=False) 48 | answer = output_str.rsplit(tok_res, 1)[1].strip() 49 | if answer.endswith(tokenizer.eos_token): 50 | answer = answer.rsplit(tokenizer.eos_token, 1)[0].strip() 51 | 52 | print('input', input) 53 | print('output', answer) 54 | 55 | if __name__ == '__main__': 56 | 57 | 58 | parser = HfArgumentParser((ModelArguments,)) 59 | (model_args,) = parser.parse_dict(config_args, allow_extra_keys=True) 60 | 61 | dataHelper = NN_DataHelper(model_args) 62 | tokenizer, config, _,_= dataHelper.load_tokenizer_and_config() 63 | 64 | enable_ntk = False 65 | rope_args = None 66 | if enable_ntk and config.model_type == 'llama': 67 | rope_args = RotaryNtkScaledArguments(name='rotary_emb',max_position_embeddings=2048, alpha=4) # 扩展 8k 68 | # rope_args = RotaryLinearScaledArguments(name='rotary_emb',max_position_embeddings=2048, scale=4) # 扩展 8k 69 | 70 | 71 | pl_model = MyTransformer(config=config, model_args=model_args, 72 | torch_dtype=config.torch_dtype, 73 | trust_remote_code=True, 74 | local_files_only=True, 75 | rope_args=rope_args) 76 | model = pl_model.get_llm_model() 77 | model = model.eval() 78 | if hasattr(model,'quantize'): 79 | # 支持llama llama2量化 80 | if not model.quantized: 81 | # 按需修改,目前只支持 4/8 bit 量化 , 可以保存量化模型 82 | model.half().quantize(4).cuda() 83 | # 保存量化权重 84 | # model.save_pretrained('llama2-7b-chat-int4',max_shard_size="2GB") 85 | # exit(0) 86 | else: 87 | # 已经量化 88 | model.half().cuda() 89 | else: 90 | model.half().cuda() 91 | 92 | if config_args['model_name_or_path'].lower().find('tiger') >=0: 93 | infer_tiger(model,tokenizer) 94 | else: 95 | text_list = ["写一个诗歌,关于冬天", 96 | "晚上睡不着应该怎么办", 97 | "从南京到上海的路线", 98 | ] 99 | for input in text_list: 100 | response = Generate.generate(model, query=input, tokenizer=tokenizer, max_length=512, 101 | eos_token_id=config.eos_token_id, 102 | do_sample=False, top_p=0.7, temperature=0.95, ) 103 | print('input', input) 104 | print('output', response) -------------------------------------------------------------------------------- /infer/infer_finetuning.py: -------------------------------------------------------------------------------- 1 | # @Time : 2023/4/2 22:49 2 | # @Author : tk 3 | # @FileName: infer 4 | import os 5 | import sys 6 | sys.path.append(os.path.join(os.path.dirname(__file__),'..')) 7 | 8 | import torch 9 | from deep_training.data_helper import ModelArguments 10 | from transformers import HfArgumentParser, AutoConfig 11 | from data_utils import config_args, NN_DataHelper, get_deepspeed_config,build_template 12 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer 13 | from deep_training.zoo.utils.llm_generate import Generate 14 | 15 | deep_config = get_deepspeed_config() 16 | 17 | 18 | if __name__ == '__main__': 19 | parser = HfArgumentParser((ModelArguments,)) 20 | (model_args,) = parser.parse_dict(config_args, allow_extra_keys=True) 21 | 22 | dataHelper = NN_DataHelper(model_args) 23 | tokenizer, _, _,_= dataHelper.load_tokenizer_and_config() 24 | 25 | 26 | config = AutoConfig.from_pretrained('../scripts/best_ckpt', trust_remote_code=True,local_files_only=True,) 27 | pl_model = MyTransformer(config=config, model_args=model_args, 28 | torch_dtype=config.torch_dtype, 29 | trust_remote_code=True, 30 | local_files_only=True, 31 | ) 32 | 33 | # deepspeed 权重使用转换脚本命令 34 | # 一般根据时间排序选最新的权重文件夹 35 | # cd best_ckpt/last 36 | # python zero_to_fp32.py . ../last.ckpt 37 | 38 | train_weight = '../scripts/best_ckpt/last.ckpt' 39 | pl_model.load_sft_weight(train_weight,strict=False) 40 | 41 | # 保存hf权重 42 | # config.save_pretrained('convert/') 43 | 44 | # 保存sft p-tuning-v2 权重 45 | # pl_model.save_sft_weight('convert/pytorch_model_sft_ptv2.bin') 46 | 47 | # 保存sft权重 48 | # pl_model.save_sft_weight('convert/pytorch_model_sft.bin') 49 | 50 | model = pl_model.get_llm_model() 51 | 52 | model.eval().half().cuda() 53 | 54 | text_list = ["写一个诗歌,关于冬天", 55 | "晚上睡不着应该怎么办", 56 | "从南京到上海的路线", 57 | ] 58 | for input in text_list: 59 | response = Generate.generate(model, query=build_template(input), tokenizer=tokenizer, max_length=512, 60 | eos_token_id=config.eos_token_id, 61 | do_sample=False, top_p=0.7, temperature=0.95, ) 62 | print('input', input) 63 | print('output', response) -------------------------------------------------------------------------------- /infer/infer_lora_finetuning.py: -------------------------------------------------------------------------------- 1 | # @Time : 2023/4/2 22:49 2 | # @Author : tk 3 | # @FileName: infer_lora_finetuning 4 | import os 5 | import sys 6 | sys.path.append(os.path.join(os.path.dirname(__file__),'..')) 7 | 8 | import os 9 | import torch 10 | from deep_training.data_helper import ModelArguments 11 | from transformers import HfArgumentParser,AutoConfig 12 | from data_utils import config_args, NN_DataHelper,global_args,build_template 13 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer,PetlArguments,PromptArguments 14 | from deep_training.zoo.utils.llm_generate import Generate 15 | 16 | 17 | if __name__ == '__main__': 18 | config_args['seed'] = None 19 | parser = HfArgumentParser((ModelArguments,)) 20 | (model_args,) = parser.parse_dict(config_args, allow_extra_keys=True) 21 | 22 | 23 | dataHelper = NN_DataHelper(model_args) 24 | tokenizer, _, _, _ = dataHelper.load_tokenizer_and_config() 25 | 26 | 27 | # 一般根据时间排序选最新的权重文件夹 28 | weight_dir = '../scripts/best_ckpt' 29 | lora_weight_dir = os.path.join(weight_dir, "last") 30 | 31 | config = AutoConfig.from_pretrained(weight_dir, trust_remote_code=True, 32 | local_files_only=True,) 33 | lora_args = PetlArguments.from_pretrained(lora_weight_dir) 34 | 35 | assert lora_args.inference_mode == True 36 | 37 | new_num_tokens = config.vocab_size 38 | if config.task_specific_params is not None and config.task_specific_params.get('vocab_size',None) is not None: 39 | config.vocab_size = config.task_specific_params['vocab_size'] 40 | 41 | pl_model = MyTransformer(config=config, model_args=model_args, 42 | lora_args=lora_args, 43 | torch_dtype=config.torch_dtype, 44 | trust_remote_code=True, 45 | local_files_only=True, 46 | new_num_tokens=new_num_tokens, 47 | # load_in_8bit=global_args["load_in_8bit"], 48 | # # device_map="auto", 49 | # device_map = {"":0} # 第一块卡 50 | ) 51 | 52 | # 加载lora权重 53 | pl_model.load_sft_weight(lora_weight_dir) 54 | 55 | pl_model.eval().half().cuda() 56 | 57 | enable_merge_weight = False 58 | 59 | if enable_merge_weight: 60 | # 合并lora 权重 保存 61 | pl_model.save_sft_weight(os.path.join(lora_weight_dir, 'pytorch_model_merge.bin'), merge_lora_weight=True) 62 | else: 63 | model = pl_model.get_llm_model() 64 | 65 | text_list = ["写一个诗歌,关于冬天", 66 | "晚上睡不着应该怎么办", 67 | "从南京到上海的路线", 68 | ] 69 | for input in text_list: 70 | response = Generate.generate(model, query=build_template(input), tokenizer=tokenizer, max_length=512, 71 | eos_token_id=config.eos_token_id, 72 | do_sample=False, top_p=0.7, temperature=0.95, ) 73 | print('input', input) 74 | print('output', response) -------------------------------------------------------------------------------- /infer/infer_muti_lora_finetuning.py: -------------------------------------------------------------------------------- 1 | # @Time : 2023/4/2 22:49 2 | # @Author : tk 3 | # @FileName: infer_lora_finetuning 4 | import os 5 | import sys 6 | sys.path.append(os.path.join(os.path.dirname(__file__),'..')) 7 | 8 | import os 9 | import torch 10 | from deep_training.data_helper import ModelArguments 11 | from transformers import HfArgumentParser,AutoConfig 12 | from data_utils import config_args, NN_DataHelper,global_args,build_template 13 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer,\ 14 | PetlArguments,PromptArguments,PetlModel 15 | from deep_training.zoo.utils.llm_generate import Generate 16 | 17 | 18 | if __name__ == '__main__': 19 | config_args['seed'] = None 20 | parser = HfArgumentParser((ModelArguments,)) 21 | (model_args,) = parser.parse_dict(config_args, allow_extra_keys=True) 22 | 23 | 24 | dataHelper = NN_DataHelper(model_args) 25 | tokenizer, _, _, _ = dataHelper.load_tokenizer_and_config() 26 | 27 | 28 | # 一般根据时间排序选最新的权重文件夹 29 | ckpt_dir = './best_ckpt/last' 30 | 31 | config = AutoConfig.from_pretrained(ckpt_dir, trust_remote_code=True, 32 | local_files_only=True,) 33 | lora_args = PetlArguments.from_pretrained(ckpt_dir) 34 | 35 | assert lora_args.inference_mode == True 36 | 37 | new_num_tokens = config.vocab_size 38 | if config.task_specific_params is not None and config.task_specific_params.get('vocab_size',None) is not None: 39 | config.vocab_size = config.task_specific_params['vocab_size'] 40 | 41 | pl_model = MyTransformer(config=config, model_args=model_args, 42 | lora_args=lora_args, 43 | torch_dtype=config.torch_dtype, 44 | trust_remote_code=True, 45 | local_files_only=True, 46 | new_num_tokens=new_num_tokens, 47 | # load_in_8bit=global_args["load_in_8bit"], 48 | # # device_map="auto", 49 | # device_map = {"":0} # 第一块卡 50 | ) 51 | 52 | # 加载多个lora权重 53 | pl_model.load_sft_weight(ckpt_dir, adapter_name="default") 54 | 55 | # 加载多个lora权重 56 | # pl_model.load_sft_weight(ckpt_dir, adapter_name="yourname") 57 | 58 | # 加载多个lora权重 59 | # pl_model.load_sft_weight(ckpt_dir, adapter_name="yourname") 60 | 61 | pl_model.eval().half().cuda() 62 | 63 | # backbone model replaced PetlModel 64 | lora_model: PetlModel = pl_model.backbone 65 | 66 | text_list = ["写一个诗歌,关于冬天", 67 | "晚上睡不着应该怎么办", 68 | "从南京到上海的路线", 69 | ] 70 | 71 | # 基准模型推理 72 | with lora_model.disable_adapter(): 73 | for input in text_list: 74 | # lora_model 调用子对象方法 75 | response = Generate.generate(lora_model, query=build_template(input), tokenizer=tokenizer, max_length=512, 76 | eos_token_id=config.eos_token_id, 77 | do_sample=False, top_p=0.7, temperature=0.95, ) 78 | print('input', input) 79 | print('output', response) 80 | 81 | lora_model.set_adapter(adapter_name='default') 82 | 83 | for input in text_list: 84 | # lora_model 调用子对象方法 85 | response = Generate.generate(lora_model, query=build_template(input), tokenizer=tokenizer, max_length=512, 86 | eos_token_id=config.eos_token_id, 87 | do_sample=False, top_p=0.7, temperature=0.95, ) 88 | print('input', input) 89 | print('output', response) 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /infer/infer_ptuning.py: -------------------------------------------------------------------------------- 1 | # @Time : 2023/4/2 22:49 2 | # @Author : tk 3 | # @FileName: infer_ptuning 4 | import os 5 | import sys 6 | sys.path.append(os.path.join(os.path.dirname(__file__),'..')) 7 | 8 | import torch 9 | from deep_training.data_helper import ModelArguments 10 | from transformers import HfArgumentParser,AutoConfig 11 | from data_utils import config_args, NN_DataHelper,build_template 12 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer,PromptArguments 13 | from deep_training.zoo.utils.llm_generate import Generate 14 | 15 | if __name__ == '__main__': 16 | config_args['seed'] = None 17 | parser = HfArgumentParser((ModelArguments,)) 18 | (model_args,) = parser.parse_dict(config_args,allow_extra_keys=True) 19 | 20 | dataHelper = NN_DataHelper(model_args) 21 | tokenizer, _, _, _ = dataHelper.load_tokenizer_and_config(config_kwargs={"torch_dtype": torch.float16}) 22 | 23 | 24 | train_weight_dir = '../scripts/best_ckpt/last' 25 | config = AutoConfig.from_pretrained(train_weight_dir, trust_remote_code=True, 26 | local_files_only=True,) 27 | prompt_args = PromptArguments.from_pretrained(train_weight_dir) 28 | 29 | assert prompt_args.inference_mode == True 30 | 31 | new_num_tokens = config.vocab_size 32 | if config.task_specific_params is not None and config.task_specific_params.get('vocab_size', None) is not None: 33 | config.vocab_size = config.task_specific_params['vocab_size'] 34 | 35 | pl_model = MyTransformer(config=config, model_args=model_args, 36 | prompt_args=prompt_args, 37 | new_num_tokens=new_num_tokens, 38 | trust_remote_code=True, 39 | local_files_only=True, 40 | ) 41 | # 加载sft权重 42 | pl_model.load_sft_weight(train_weight_dir,is_trainable=True) 43 | 44 | pl_model.eval().half().cuda() 45 | 46 | model = pl_model.get_llm_model() 47 | 48 | #基础模型精度 49 | model.base_model_torch_dtype = torch.half 50 | 51 | text_list = ["写一个诗歌,关于冬天", 52 | "晚上睡不着应该怎么办", 53 | "从南京到上海的路线"] 54 | 55 | for input in text_list: 56 | response = Generate.generate(model, query=build_template(input), tokenizer=tokenizer, max_length=512, 57 | eos_token_id=config.eos_token_id, 58 | do_sample=False, top_p=0.7, temperature=0.95, ) 59 | print('input', input) 60 | print('output', response) -------------------------------------------------------------------------------- /llama2_infer/infer_openbuddy.py: -------------------------------------------------------------------------------- 1 | # coding=utf8 2 | # @Time : 2023/9/2 22:32 3 | # @Author : tk 4 | # @FileName: tiger_infer 5 | import os 6 | import sys 7 | sys.path.append(os.path.join(os.path.dirname(__file__),'..')) 8 | 9 | import torch 10 | from deep_training.data_helper import ModelArguments 11 | from transformers import HfArgumentParser 12 | from data_utils import config_args, NN_DataHelper, get_deepspeed_config 13 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer 14 | from deep_training.zoo.utils.llm_generate import Generate 15 | from deep_training.zoo.model_zoo.chatglm2.llm_model import RotaryNtkScaledArguments,RotaryLinearScaledArguments # aigc-zoo 0.1.20 16 | 17 | deep_config = get_deepspeed_config() 18 | 19 | 20 | sys_prompt = """You are a helpful, respectful and honest INTP-T AI Assistant named Buddy. You are talking to a human User. 21 | Always answer as helpfully and logically as possible, while being safe. Your answers should not include any harmful, political, religious, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature. 22 | If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information. 23 | You like to use emojis. You can speak fluently in many languages, for example: English, Chinese. 24 | You cannot access the internet, but you have vast knowledge, cutoff: 2021-09. 25 | You are trained by OpenBuddy team, (https://openbuddy.ai, https://github.com/OpenBuddy/OpenBuddy), you are based on LLaMA and Falcon transformers model, not related to GPT or OpenAI. 26 | 27 | User: Hi. 28 | Assistant: Hi, I'm Buddy, your AI assistant. How can I help you today?😊 29 | """ 30 | 31 | 32 | 33 | 34 | if __name__ == '__main__': 35 | 36 | 37 | parser = HfArgumentParser((ModelArguments,)) 38 | (model_args,) = parser.parse_dict(config_args, allow_extra_keys=True) 39 | 40 | dataHelper = NN_DataHelper(model_args) 41 | tokenizer, config, _,_= dataHelper.load_tokenizer_and_config() 42 | 43 | enable_ntk = False 44 | rope_args = None 45 | if enable_ntk and config.model_type == 'llama': 46 | rope_args = RotaryNtkScaledArguments(name='rotary_emb',max_position_embeddings=2048, alpha=4) # 扩展 8k 47 | # rope_args = RotaryLinearScaledArguments(name='rotary_emb',max_position_embeddings=2048, scale=4) # 扩展 8k 48 | 49 | 50 | pl_model = MyTransformer(config=config, model_args=model_args, 51 | torch_dtype=torch.float16, 52 | rope_args=rope_args, 53 | device_map="auto",) 54 | model = pl_model.get_llm_model() 55 | model = model.eval() 56 | model.half() 57 | if hasattr(model,'quantize'): 58 | # 支持llama llama2量化 59 | if not model.quantized: 60 | # 按需修改,目前只支持 4/8 bit 量化 , 可以保存量化模型 61 | model.half().quantize(4).cuda() 62 | # 保存量化权重 63 | # model.save_pretrained('llama2-7b-chat-int4',max_shard_size="2GB") 64 | # exit(0) 65 | else: 66 | # 已经量化 67 | model.half().cuda() 68 | else: 69 | model.half().cuda() 70 | 71 | generation_config = { 72 | # "do_sample": True, 73 | "max_new_tokens": 100, 74 | "bos_token_id": 1, 75 | "eos_token_id": 2, 76 | "pad_token_id": 0, 77 | # "repetition_penalty": 1.1, 78 | } 79 | text_list = [ 80 | "Write a poem about yourself.", 81 | "写一个诗歌,关于冬天", 82 | "晚上睡不着应该怎么办", 83 | "从南京到上海的路线", 84 | ] 85 | 86 | for input in text_list: 87 | input_text = sys_prompt + "\n\nUser: {}\nAssistant:".format(input) 88 | input_ids = tokenizer.encode(input_text, return_tensors='pt', truncation=True, max_length=512) 89 | output = model.generate(input_ids=input_ids.to('cuda'), **generation_config) 90 | answer = tokenizer.decode(output[0][len(input_ids[0]):], skip_special_tokens=True) 91 | 92 | print('input', input) 93 | print('output', answer) 94 | 95 | -------------------------------------------------------------------------------- /llama2_infer/infer_tiger.py: -------------------------------------------------------------------------------- 1 | # coding=utf8 2 | # @Time : 2023/9/2 22:32 3 | # @Author : tk 4 | # @FileName: tiger_infer 5 | import os 6 | import sys 7 | sys.path.append(os.path.join(os.path.dirname(__file__),'..')) 8 | 9 | import torch 10 | from deep_training.data_helper import ModelArguments 11 | from transformers import HfArgumentParser 12 | from data_utils import config_args, NN_DataHelper, get_deepspeed_config 13 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer 14 | from deep_training.zoo.utils.llm_generate import Generate 15 | from deep_training.zoo.model_zoo.chatglm2.llm_model import RotaryNtkScaledArguments,RotaryLinearScaledArguments # aigc-zoo 0.1.20 16 | 17 | deep_config = get_deepspeed_config() 18 | 19 | 20 | def infer_tiger(model,tokenizer,max_input_length=512): 21 | tok_ins = "\n\n### Instruction:\n" 22 | tok_res = "\n\n### Response:\n" 23 | prompt_input = tok_ins + "{instruction}" + tok_res 24 | 25 | generation_config = { 26 | "do_sample": True, 27 | "eos_token_id": 2, 28 | "max_length": max_input_length, 29 | "pad_token_id": 60514, 30 | "repetition_penalty": 1.1, 31 | "temperature": 0.3, 32 | "transformers_version": "4.31.0" 33 | } 34 | text_list = ["写一个诗歌,关于冬天", 35 | "晚上睡不着应该怎么办", 36 | "从南京到上海的路线", 37 | ] 38 | 39 | for input in text_list: 40 | sess_text = '' 41 | 42 | query_text = input.strip() 43 | sess_text += tok_ins + query_text 44 | input_text = prompt_input.format_map({'instruction': sess_text.split(tok_ins, 1)[1]}) 45 | inputs = tokenizer(input_text, return_tensors='pt', truncation=True, max_length=max_input_length) 46 | inputs = {k: v.to(model.device) for k, v in inputs.items()} 47 | output = model.generate(**inputs, **generation_config) 48 | output_str = tokenizer.decode(output[0], skip_special_tokens=False, spaces_between_special_tokens=False) 49 | answer = output_str.rsplit(tok_res, 1)[1].strip() 50 | if answer.endswith(tokenizer.eos_token): 51 | answer = answer.rsplit(tokenizer.eos_token, 1)[0].strip() 52 | 53 | print('input', input) 54 | print('output', answer) 55 | 56 | if __name__ == '__main__': 57 | 58 | 59 | parser = HfArgumentParser((ModelArguments,)) 60 | (model_args,) = parser.parse_dict(config_args, allow_extra_keys=True) 61 | 62 | dataHelper = NN_DataHelper(model_args) 63 | tokenizer, config, _,_= dataHelper.load_tokenizer_and_config() 64 | 65 | enable_ntk = False 66 | rope_args = None 67 | if enable_ntk and config.model_type == 'llama': 68 | rope_args = RotaryNtkScaledArguments(name='rotary_emb',max_position_embeddings=2048, alpha=4) # 扩展 8k 69 | # rope_args = RotaryLinearScaledArguments(name='rotary_emb',max_position_embeddings=2048, scale=4) # 扩展 8k 70 | 71 | 72 | pl_model = MyTransformer(config=config, model_args=model_args,torch_dtype=config.torch_dtype,rope_args=rope_args) 73 | model = pl_model.get_llm_model() 74 | model = model.eval() 75 | if hasattr(model,'quantize'): 76 | # 支持llama llama2量化 77 | if not model.quantized: 78 | # 按需修改,目前只支持 4/8 bit 量化 , 可以保存量化模型 79 | model.half().quantize(4).cuda() 80 | # 保存量化权重 81 | # model.save_pretrained('llama2-7b-chat-int4',max_shard_size="2GB") 82 | # exit(0) 83 | else: 84 | # 已经量化 85 | model.half().cuda() 86 | else: 87 | model.half().cuda() 88 | 89 | infer_tiger(model, tokenizer) -------------------------------------------------------------------------------- /module_setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/8/16 16:03 4 | 5 | from deep_training.utils.hf import register_transformer_model, register_transformer_config, \ 6 | register_transformer_tokenizer 7 | from transformers import AutoModelForCausalLM 8 | from deep_training.nlp.models.rellama.modeling_llama import LlamaForCausalLM 9 | from deep_training.zoo.model_zoo.bluelm.llm_model import MyBlueLMForCausalLM,BlueLMTokenizer,BlueLMConfig 10 | from deep_training.zoo.model_zoo.xverse.llm_model import MyXverseForCausalLM,XverseConfig 11 | from deep_training.zoo.model_zoo.internlm.llm_model import MyInternLMForCausalLM,InternLMTokenizer,InternLMConfig 12 | from deep_training.zoo.model_zoo.skywork.llm_model import MySkyworkForCausalLM,SkyworkConfig,SkyworkTokenizer 13 | # from deep_training.zoo.model_zoo.yi.llm_model import MyYiForCausalLM,YiConfig,YiTokenizer 14 | 15 | __all__ = [ 16 | "module_setup" 17 | ] 18 | 19 | def module_setup(): 20 | # 导入模型 21 | #register_transformer_config(XverseConfig) 22 | register_transformer_model(LlamaForCausalLM, AutoModelForCausalLM) 23 | 24 | 25 | register_transformer_config(BlueLMConfig) 26 | register_transformer_model(MyBlueLMForCausalLM, AutoModelForCausalLM) 27 | register_transformer_tokenizer(BlueLMConfig,BlueLMTokenizer,BlueLMTokenizer) 28 | 29 | register_transformer_config(XverseConfig) 30 | register_transformer_model(MyXverseForCausalLM, AutoModelForCausalLM) 31 | 32 | register_transformer_config(InternLMConfig) 33 | register_transformer_model(MyInternLMForCausalLM, AutoModelForCausalLM) 34 | register_transformer_tokenizer(InternLMConfig, InternLMTokenizer, InternLMTokenizer) 35 | 36 | register_transformer_config(SkyworkConfig) 37 | register_transformer_model(MySkyworkForCausalLM, AutoModelForCausalLM) 38 | register_transformer_tokenizer(SkyworkConfig,SkyworkTokenizer,SkyworkTokenizer) 39 | 40 | # register_transformer_config(YiConfig) 41 | # register_transformer_model(MyYiForCausalLM, AutoModelForCausalLM) 42 | # register_transformer_tokenizer(YiConfig, YiTokenizer, YiTokenizer) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | transformers>=4.30 2 | deepspeed 3 | bitsandbytes>=0.39 4 | accelerate>=0.20 5 | cpm-kernels 6 | git+https://github.com/ssbuild/deep_training#egg=deep_training -------------------------------------------------------------------------------- /scripts/train_full.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export trainer_backend=pl 4 | 5 | train_file="../config/train_${trainer_backend}.yaml" 6 | 7 | # 强制覆盖配置文件 8 | export train_file=${train_file} 9 | export enable_deepspeed=false 10 | export enable_ptv2=false 11 | export enable_lora=false 12 | export load_in_bit=0 13 | 14 | # export CUDA_VISIBLE_DEVICES=0,1,2,3 15 | 16 | 17 | usage() { echo "Usage: $0 [-m ]" 1>&2; exit 1; } 18 | 19 | 20 | while getopts m: opt 21 | do 22 | case "${opt}" in 23 | m) mode=${OPTARG};; 24 | *) 25 | usage 26 | ;; 27 | esac 28 | done 29 | 30 | if [ "${mode}" != "dataset" ] && [ "${mode}" != "train" ] ; then 31 | usage 32 | fi 33 | 34 | if [[ "${mode}" == "dataset" ]] ; then 35 | python ../data_utils.py 36 | exit 0 37 | fi 38 | 39 | if [[ "${trainer_backend}" == "pl" ]] ; then 40 | # pl 多卡 修改配置文件 devices 41 | 42 | ### 多机多卡训练 43 | 44 | # 例子 3个机器 每个机器 4个卡 45 | # 修改train.py Trainer num_nodes = 3 46 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=0 python train.py 47 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=1 python train.py 48 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=2 python train.py 49 | 50 | # pl 多卡 修改配置文件 devices 51 | 52 | python ../train.py 53 | elif [[ "${trainer_backend}" == "cl" ]] ; then 54 | # 多机多卡 55 | # colossalai run --nproc_per_node 1 --num_nodes 1 --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 56 | 57 | colossalai run --nproc_per_node 1 --num_nodes 1 ../train.py 58 | else 59 | # 多机多卡 60 | # --nproc_per_node=1 nnodes=1 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 61 | torchrun --nproc_per_node 1 --nnodes 1 ../train.py 62 | fi -------------------------------------------------------------------------------- /scripts/train_lora.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export trainer_backend=pl 4 | 5 | train_file="../config/train_${trainer_backend}.yaml" 6 | 7 | # 强制覆盖配置文件 8 | export train_file=${train_file} 9 | export enable_deepspeed=false 10 | export enable_ptv2=false 11 | export enable_lora=true 12 | export load_in_bit=0 13 | 14 | # export CUDA_VISIBLE_DEVICES=0,1,2,3 15 | 16 | usage() { echo "Usage: $0 [-m ]" 1>&2; exit 1; } 17 | 18 | 19 | while getopts m: opt 20 | do 21 | case "${opt}" in 22 | m) mode=${OPTARG};; 23 | *) 24 | usage 25 | ;; 26 | esac 27 | done 28 | 29 | if [ "${mode}" != "dataset" ] && [ "${mode}" != "train" ] ; then 30 | usage 31 | fi 32 | 33 | if [[ "${mode}" == "dataset" ]] ; then 34 | python ../data_utils.py 35 | exit 0 36 | fi 37 | 38 | if [[ "${trainer_backend}" == "pl" ]] ; then 39 | # pl 多卡 修改配置文件 devices 40 | 41 | ### 多机多卡训练 42 | 43 | # 例子 3个机器 每个机器 4个卡 44 | # 修改train.py Trainer num_nodes = 3 45 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=0 python train.py 46 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=1 python train.py 47 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=2 python train.py 48 | 49 | # pl 多卡 修改配置文件 devices 50 | 51 | python ../train.py 52 | elif [[ "${trainer_backend}" == "cl" ]] ; then 53 | # 多机多卡 54 | # colossalai run --nproc_per_node 1 --num_nodes 1 --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 55 | 56 | colossalai run --nproc_per_node 1 --num_nodes 1 ../train.py 57 | else 58 | # 多机多卡 59 | # --nproc_per_node=1 nnodes=1 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 60 | torchrun --nproc_per_node 1 --nnodes 1 ../train.py 61 | fi -------------------------------------------------------------------------------- /scripts/train_lora_int4.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export trainer_backend=pl 4 | 5 | train_file="../config/train_${trainer_backend}.yaml" 6 | 7 | # 强制覆盖配置文件 8 | export train_file=${train_file} 9 | export enable_deepspeed=false 10 | export enable_ptv2=false 11 | export enable_lora=true 12 | export load_in_bit=4 13 | 14 | # export CUDA_VISIBLE_DEVICES=0,1,2,3 15 | 16 | usage() { echo "Usage: $0 [-m ]" 1>&2; exit 1; } 17 | 18 | 19 | while getopts m: opt 20 | do 21 | case "${opt}" in 22 | m) mode=${OPTARG};; 23 | *) 24 | usage 25 | ;; 26 | esac 27 | done 28 | 29 | if [ "${mode}" != "dataset" ] && [ "${mode}" != "train" ] ; then 30 | usage 31 | fi 32 | 33 | if [[ "${mode}" == "dataset" ]] ; then 34 | python ../data_utils.py 35 | exit 0 36 | fi 37 | 38 | if [[ "${trainer_backend}" == "pl" ]] ; then 39 | # pl 多卡 修改配置文件 devices 40 | 41 | ### 多机多卡训练 42 | 43 | # 例子 3个机器 每个机器 4个卡 44 | # 修改train.py Trainer num_nodes = 3 45 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=0 python train.py 46 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=1 python train.py 47 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=2 python train.py 48 | 49 | # pl 多卡 修改配置文件 devices 50 | 51 | python ../train.py 52 | elif [[ "${trainer_backend}" == "cl" ]] ; then 53 | # 多机多卡 54 | # colossalai run --nproc_per_node 1 --num_nodes 1 --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 55 | 56 | colossalai run --nproc_per_node 1 --num_nodes 1 ../train.py 57 | else 58 | # 多机多卡 59 | # --nproc_per_node=1 nnodes=1 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 60 | torchrun --nproc_per_node 1 --nnodes 1 ../train.py 61 | fi -------------------------------------------------------------------------------- /scripts/train_lora_int8.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export trainer_backend=pl 4 | 5 | train_file="../config/train_${trainer_backend}.yaml" 6 | 7 | # 强制覆盖配置文件 8 | export train_file=${train_file} 9 | export enable_deepspeed=false 10 | export enable_ptv2=false 11 | export enable_lora=true 12 | export load_in_bit=8 13 | 14 | # export CUDA_VISIBLE_DEVICES=0,1,2,3 15 | 16 | usage() { echo "Usage: $0 [-m ]" 1>&2; exit 1; } 17 | 18 | 19 | while getopts m: opt 20 | do 21 | case "${opt}" in 22 | m) mode=${OPTARG};; 23 | *) 24 | usage 25 | ;; 26 | esac 27 | done 28 | 29 | if [ "${mode}" != "dataset" ] && [ "${mode}" != "train" ] ; then 30 | usage 31 | fi 32 | 33 | if [[ "${mode}" == "dataset" ]] ; then 34 | python ../data_utils.py 35 | exit 0 36 | fi 37 | 38 | if [[ "${trainer_backend}" == "pl" ]] ; then 39 | # pl 多卡 修改配置文件 devices 40 | 41 | ### 多机多卡训练 42 | 43 | # 例子 3个机器 每个机器 4个卡 44 | # 修改train.py Trainer num_nodes = 3 45 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=0 python train.py 46 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=1 python train.py 47 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=2 python train.py 48 | 49 | # pl 多卡 修改配置文件 devices 50 | 51 | python ../train.py 52 | elif [[ "${trainer_backend}" == "cl" ]] ; then 53 | # 多机多卡 54 | # colossalai run --nproc_per_node 1 --num_nodes 1 --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 55 | 56 | colossalai run --nproc_per_node 1 --num_nodes 1 ../train.py 57 | else 58 | # 多机多卡 59 | # --nproc_per_node=1 nnodes=1 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 60 | torchrun --nproc_per_node 1 --nnodes 1 ../train.py 61 | fi -------------------------------------------------------------------------------- /scripts/train_ptv2.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export trainer_backend=pl 4 | 5 | train_file="../config/train_${trainer_backend}.yaml" 6 | 7 | # 强制覆盖配置文件 8 | export train_file=${train_file} 9 | export enable_deepspeed=false 10 | export enable_ptv2=true 11 | export enable_lora=false 12 | export load_in_bit=0 13 | 14 | # export CUDA_VISIBLE_DEVICES=0,1,2,3 15 | 16 | usage() { echo "Usage: $0 [-m ]" 1>&2; exit 1; } 17 | 18 | 19 | while getopts m: opt 20 | do 21 | case "${opt}" in 22 | m) mode=${OPTARG};; 23 | *) 24 | usage 25 | ;; 26 | esac 27 | done 28 | 29 | if [ "${mode}" != "dataset" ] && [ "${mode}" != "train" ] ; then 30 | usage 31 | fi 32 | 33 | 34 | if [[ "${mode}" == "dataset" ]] ; then 35 | python ../data_utils.py 36 | exit 0 37 | fi 38 | 39 | if [[ "${trainer_backend}" == "pl" ]] ; then 40 | # pl 多卡 修改配置文件 devices 41 | 42 | ### 多机多卡训练 43 | 44 | # 例子 3个机器 每个机器 4个卡 45 | # 修改train.py Trainer num_nodes = 3 46 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=0 python train.py 47 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=1 python train.py 48 | # MASTER_ADDR=10.0.0.1 MASTER_PORT=6667 WORLD_SIZE=12 NODE_RANK=2 python train.py 49 | 50 | # pl 多卡 修改配置文件 devices 51 | 52 | python ../train.py 53 | elif [[ "${trainer_backend}" == "cl" ]] ; then 54 | # 多机多卡 55 | # colossalai run --nproc_per_node 1 --num_nodes 1 --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 56 | 57 | colossalai run --nproc_per_node 1 --num_nodes 1 ../train.py 58 | else 59 | # 多机多卡 60 | # --nproc_per_node=1 nnodes=1 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT ../train.py 61 | torchrun --nproc_per_node 1 --nnodes 1 ../train.py 62 | fi -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/10/12 10:50 4 | 5 | import os 6 | from config import global_args 7 | 8 | def main(): 9 | trainer_backend = global_args["trainer_backend"] 10 | if trainer_backend == "pl": 11 | from training.train_pl import main as main_execute 12 | elif trainer_backend == "hf": 13 | from training.train_hf import main as main_execute 14 | elif trainer_backend == "cl": 15 | from training.train_cl import main as main_execute 16 | elif trainer_backend == "ac": 17 | from training.train_ac import main as main_execute 18 | else: 19 | raise ValueError(f"{trainer_backend} NotImplemented ") 20 | 21 | main_execute() 22 | 23 | def _mp_fn(index): 24 | # For xla_spawn (TPUs) 25 | main() 26 | 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /training/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/10/12 13:33 4 | -------------------------------------------------------------------------------- /training/train_ac.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/9/25 12:29 4 | import sys 5 | import os 6 | sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))) 7 | 8 | import logging 9 | import math 10 | import datasets 11 | import torch 12 | import transformers 13 | from deep_training.trainer.ac.trainer import TrainerAC 14 | from transformers import ( 15 | HfArgumentParser, 16 | default_data_collator, 17 | set_seed, 18 | ) 19 | from transformers.trainer_utils import get_last_checkpoint 20 | from transformers.utils import check_min_version, send_example_telemetry 21 | from transformers.utils.versions import require_version 22 | from data_utils import NN_DataHelper, config_args, get_deepspeed_config, global_args 23 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer, PetlArguments, LoraConfig, PromptArguments 24 | from deep_training.data_helper import ModelArguments, DataArguments,TrainingArgumentsAC 25 | 26 | assert global_args["trainer_backend"] == "ac" 27 | 28 | # Will error if the minimal version of Transformers is not installed. Remove at your own risks. 29 | check_min_version("4.33.2") 30 | 31 | logger = logging.getLogger(__name__) 32 | 33 | # Setup logging 34 | logging.basicConfig( 35 | format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", 36 | datefmt="%m/%d/%Y %H:%M:%S", 37 | handlers=[logging.StreamHandler(sys.stdout)], 38 | ) 39 | 40 | def main(): 41 | training_args: TrainingArgumentsAC 42 | parser = HfArgumentParser((ModelArguments, TrainingArgumentsAC, DataArguments, PetlArguments, PromptArguments), 43 | conflict_handler='resolve') 44 | model_args, training_args, data_args, lora_args, prompt_args = parser.parse_dict(config_args,allow_extra_keys=True,) 45 | lora_args = lora_args.config 46 | prompt_args = prompt_args.config 47 | 48 | if training_args.should_log: 49 | # The default of training_args.log_level is passive, so we set log level at info here to have that default. 50 | transformers.utils.logging.set_verbosity_info() 51 | 52 | log_level = training_args.get_process_log_level() 53 | logger.setLevel(log_level) 54 | datasets.utils.logging.set_verbosity(log_level) 55 | transformers.utils.logging.set_verbosity(log_level) 56 | transformers.utils.logging.enable_default_handler() 57 | transformers.utils.logging.enable_explicit_format() 58 | 59 | dataHelper = NN_DataHelper(model_args, training_args, data_args) 60 | config_kwargs = {"torch_dtype": torch.float16} 61 | if global_args['config_merge']: 62 | config_kwargs.update(global_args['config_merge']) 63 | 64 | tokenizer, config, _, _ = dataHelper.load_tokenizer_and_config(config_kwargs=config_kwargs) 65 | 66 | # with training_args.main_process_first(desc="make_dataset_all"): 67 | # dataHelper.make_dataset_all() 68 | 69 | is_bf16_supported = torch.cuda.is_bf16_supported() 70 | precision = global_args["precision"] 71 | if precision == "auto": 72 | # 精度 根据实际情况做调整 73 | if is_bf16_supported: 74 | precision = 'bf16' 75 | else: 76 | precision = '16' 77 | 78 | if global_args["quantization_config"] is not None and global_args["quantization_config"].load_in_8bit: 79 | precision = "32" 80 | 81 | 82 | if str(precision) == '16': 83 | training_args.fp16 = True 84 | elif str(precision) == 'bf16': 85 | training_args.bf16 = True 86 | else: 87 | training_args.fp16 = False 88 | training_args.bf16 = False 89 | 90 | deepspeed_config = get_deepspeed_config(precision) 91 | if deepspeed_config: 92 | training_args.deepspeed = deepspeed_config 93 | 94 | # Log on each process the small summary: 95 | logger.warning( 96 | f"Process rank: {training_args.local_rank}, device: {training_args.device}, n_gpu: {training_args.n_gpu}" 97 | + f"distributed training: {training_args.parallel_mode.value == 'distributed'}, 16-bits training: {training_args.fp16}" 98 | ) 99 | logger.info(f"Training/evaluation parameters {training_args}") 100 | 101 | # Detecting last checkpoint. 102 | last_checkpoint = None 103 | if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir: 104 | last_checkpoint = get_last_checkpoint(training_args.output_dir) 105 | if last_checkpoint is None and len(os.listdir(training_args.output_dir)) > 0: 106 | raise ValueError( 107 | f"Output directory ({training_args.output_dir}) already exists and is not empty. " 108 | "Use --overwrite_output_dir to overcome." 109 | ) 110 | elif last_checkpoint is not None and training_args.resume_from_checkpoint is None: 111 | logger.info( 112 | f"Checkpoint detected, resuming training at {last_checkpoint}. To avoid this behavior, change " 113 | "the `--output_dir` or add `--overwrite_output_dir` to train from scratch." 114 | ) 115 | 116 | # Set seed before initializing model. 117 | set_seed(training_args.seed) 118 | 119 | world_size,local_rank,process_index = training_args.world_size,training_args.local_rank,training_args.process_index 120 | 121 | transformer_args = dict(config=config, model_args=model_args, training_args=training_args, lora_args=lora_args, 122 | prompt_args=prompt_args, 123 | quantization_config=global_args["quantization_config"], 124 | device_map={"": local_rank} if world_size > 1 else "auto", 125 | torch_dtype=torch.float16, 126 | trust_remote_code=True, 127 | local_files_only=True, 128 | new_num_tokens=len(tokenizer), # 可能扩充词 129 | ) 130 | 131 | if transformer_args["quantization_config"] is None: 132 | transformer_args.pop("device_map") 133 | 134 | pl_model = MyTransformer(**transformer_args) 135 | 136 | config.save_pretrained(training_args.output_dir) 137 | 138 | # 加载sft权重 139 | # pl_model.load_sft_weight('./best_ckpt/best.pt',is_trainable=True) 140 | 141 | pl_model = pl_model.float() 142 | 143 | train_datasets = None 144 | if training_args.do_train: 145 | train_datasets = dataHelper.load_distributed_random_sampler( 146 | dataHelper.load_dataset_files()["train_files"], 147 | with_load_memory=data_args.data_backend == 'record', 148 | collate_fn=dataHelper.collate_fn, 149 | batch_size=training_args.per_device_train_batch_size, 150 | drop_last=training_args.dataloader_drop_last, # 多卡建议扔掉 151 | num_processes=world_size, process_index=process_index, 152 | num_workers = training_args.dataloader_num_workers, 153 | pin_memory = training_args.dataloader_pin_memory, 154 | ) 155 | 156 | 157 | 158 | # Initialize our Trainer 159 | trainer = TrainerAC( 160 | model=pl_model, 161 | args=training_args, 162 | train_dataset=train_datasets, 163 | tokenizer=tokenizer, 164 | # Data collator will default to DataCollatorWithPadding, so we change it. 165 | data_collator=default_data_collator, 166 | ) 167 | 168 | # Training 169 | if training_args.do_train: 170 | checkpoint = None 171 | if training_args.resume_from_checkpoint is not None: 172 | checkpoint = training_args.resume_from_checkpoint 173 | elif last_checkpoint is not None: 174 | checkpoint = last_checkpoint 175 | trainer.train(resume_from_checkpoint=checkpoint) 176 | 177 | 178 | 179 | 180 | def _mp_fn(index): 181 | # For xla_spawn (TPUs) 182 | main() 183 | 184 | 185 | if __name__ == "__main__": 186 | main() 187 | -------------------------------------------------------------------------------- /training/train_cl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/9/25 12:29 4 | import sys 5 | import os 6 | sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))) 7 | 8 | import logging 9 | import math 10 | from contextlib import nullcontext 11 | import datasets 12 | import torch 13 | import transformers 14 | from deep_training.trainer.cl.trainer import TrainerCL 15 | from transformers import ( 16 | HfArgumentParser, 17 | default_data_collator, 18 | set_seed, 19 | ) 20 | from transformers.trainer_utils import get_last_checkpoint 21 | from transformers.utils import check_min_version, send_example_telemetry 22 | from transformers.utils.versions import require_version 23 | from data_utils import NN_DataHelper, config_args, get_deepspeed_config, global_args 24 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer, PetlArguments, LoraConfig, PromptArguments 25 | from deep_training.data_helper import ModelArguments, DataArguments,TrainingArgumentsCL 26 | 27 | assert global_args["trainer_backend"] == "cl" 28 | 29 | # Will error if the minimal version of Transformers is not installed. Remove at your own risks. 30 | check_min_version("4.33.2") 31 | 32 | 33 | logger = logging.getLogger(__name__) 34 | 35 | # Setup logging 36 | logging.basicConfig( 37 | format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", 38 | datefmt="%m/%d/%Y %H:%M:%S", 39 | handlers=[logging.StreamHandler(sys.stdout)], 40 | ) 41 | 42 | def main(): 43 | world_size, local_rank, process_index = int(os.environ.get("WORLD_SIZE", 1)), int( 44 | os.environ.get("LOCAL_RANK", 0)), int(os.environ.get("RANK", 0)) 45 | 46 | 47 | training_args: TrainingArgumentsCL 48 | parser = HfArgumentParser((ModelArguments, TrainingArgumentsCL, DataArguments, PetlArguments, PromptArguments), 49 | conflict_handler='resolve') 50 | model_args, training_args, data_args, lora_args, prompt_args = parser.parse_dict(config_args,allow_extra_keys=True,) 51 | lora_args = lora_args.config 52 | prompt_args = prompt_args.config 53 | 54 | 55 | 56 | dataHelper = NN_DataHelper(model_args, training_args, data_args) 57 | config_kwargs = {"torch_dtype": torch.float16} 58 | if global_args['config_merge']: 59 | config_kwargs.update(global_args['config_merge']) 60 | 61 | tokenizer, config, _, _ = dataHelper.load_tokenizer_and_config(config_kwargs=config_kwargs) 62 | 63 | # if process_index == 0: 64 | # dataHelper.make_dataset_all() 65 | 66 | is_bf16_supported = torch.cuda.is_bf16_supported() 67 | 68 | precision = global_args["precision"] 69 | if precision == "auto": 70 | # 精度 根据实际情况做调整 71 | if is_bf16_supported: 72 | precision = 'bf16' 73 | else: 74 | precision = '16' 75 | 76 | if global_args["quantization_config"] is not None and global_args["quantization_config"].load_in_8bit: 77 | precision = "32" 78 | 79 | 80 | if str(precision) == '16': 81 | training_args.fp16 = True 82 | elif str(precision) == 'bf16': 83 | training_args.bf16 = True 84 | else: 85 | training_args.fp16 = False 86 | training_args.bf16 = False 87 | 88 | 89 | # Log on each process the small summary: 90 | logger.warning( 91 | f"Process rank: {training_args.local_rank}" 92 | + f"16-bits training: {training_args.fp16}" 93 | ) 94 | logger.info(f"Training/evaluation parameters {training_args}") 95 | 96 | # Detecting last checkpoint. 97 | last_checkpoint = None 98 | if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir: 99 | last_checkpoint = get_last_checkpoint(training_args.output_dir) 100 | if last_checkpoint is None and len(os.listdir(training_args.output_dir)) > 0: 101 | raise ValueError( 102 | f"Output directory ({training_args.output_dir}) already exists and is not empty. " 103 | "Use --overwrite_output_dir to overcome." 104 | ) 105 | elif last_checkpoint is not None and training_args.resume_from_checkpoint is None: 106 | logger.info( 107 | f"Checkpoint detected, resuming training at {last_checkpoint}. To avoid this behavior, change " 108 | "the `--output_dir` or add `--overwrite_output_dir` to train from scratch." 109 | ) 110 | 111 | # Set seed before initializing model. 112 | set_seed(training_args.seed) 113 | 114 | 115 | transformer_args = dict(config=config, model_args=model_args, training_args=training_args, lora_args=lora_args, 116 | prompt_args=prompt_args, 117 | quantization_config=global_args["quantization_config"], 118 | device_map={"": local_rank} if world_size > 1 else "auto", 119 | torch_dtype=torch.float16, 120 | trust_remote_code=True, 121 | local_files_only=True, 122 | new_num_tokens=len(tokenizer), # 可能扩充词 123 | ) 124 | 125 | if transformer_args["quantization_config"] is None: 126 | transformer_args.pop("device_map") 127 | 128 | with nullcontext(): 129 | pl_model = MyTransformer(**transformer_args) 130 | 131 | config.save_pretrained(training_args.output_dir) 132 | 133 | # 加载sft权重 134 | # pl_model.load_sft_weight('./best_ckpt/best.pt',is_trainable=True) 135 | 136 | pl_model = pl_model.float() 137 | 138 | train_datasets = None 139 | if training_args.do_train: 140 | train_datasets = dataHelper.load_distributed_random_sampler( 141 | dataHelper.load_dataset_files()["train_files"], 142 | with_load_memory=data_args.data_backend == 'record', 143 | collate_fn=dataHelper.collate_fn, 144 | batch_size=training_args.per_device_train_batch_size, 145 | drop_last=training_args.dataloader_drop_last, # 多卡建议扔掉 146 | num_processes=world_size, process_index=process_index, 147 | num_workers = training_args.dataloader_num_workers, 148 | pin_memory = training_args.dataloader_pin_memory, 149 | ) 150 | 151 | 152 | 153 | # Initialize our Trainer 154 | trainer = TrainerCL( 155 | model=pl_model, 156 | args=training_args, 157 | train_dataset=train_datasets, 158 | tokenizer=tokenizer, 159 | # Data collator will default to DataCollatorWithPadding, so we change it. 160 | data_collator=default_data_collator, 161 | ) 162 | 163 | # Training 164 | if training_args.do_train: 165 | checkpoint = None 166 | if training_args.resume_from_checkpoint is not None: 167 | checkpoint = training_args.resume_from_checkpoint 168 | elif last_checkpoint is not None: 169 | checkpoint = last_checkpoint 170 | trainer.train(resume_from_checkpoint=checkpoint) 171 | 172 | 173 | 174 | 175 | def _mp_fn(index): 176 | # For xla_spawn (TPUs) 177 | main() 178 | 179 | 180 | if __name__ == "__main__": 181 | main() 182 | -------------------------------------------------------------------------------- /training/train_hf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : ssbuild 3 | # @Time : 2023/9/25 12:29 4 | import sys 5 | import os 6 | sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))) 7 | 8 | import logging 9 | import math 10 | import datasets 11 | import torch 12 | import transformers 13 | from deep_training.trainer.hf.trainer import TrainerHF 14 | from transformers import ( 15 | HfArgumentParser, 16 | default_data_collator, 17 | set_seed, 18 | ) 19 | from transformers.trainer_utils import get_last_checkpoint 20 | from transformers.utils import check_min_version, send_example_telemetry 21 | from transformers.utils.versions import require_version 22 | from data_utils import NN_DataHelper, config_args, get_deepspeed_config, global_args 23 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer, PetlArguments, LoraConfig, PromptArguments 24 | from deep_training.data_helper import ModelArguments, DataArguments,TrainingArgumentsHF 25 | 26 | assert global_args["trainer_backend"] == "hf" 27 | 28 | # Will error if the minimal version of Transformers is not installed. Remove at your own risks. 29 | check_min_version("4.33.2") 30 | 31 | logger = logging.getLogger(__name__) 32 | 33 | # Setup logging 34 | logging.basicConfig( 35 | format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", 36 | datefmt="%m/%d/%Y %H:%M:%S", 37 | handlers=[logging.StreamHandler(sys.stdout)], 38 | ) 39 | 40 | def main(): 41 | training_args: TrainingArgumentsHF 42 | parser = HfArgumentParser((ModelArguments, TrainingArgumentsHF, DataArguments, PetlArguments, PromptArguments), 43 | conflict_handler='resolve') 44 | model_args, training_args, data_args, lora_args, prompt_args = parser.parse_dict(config_args,allow_extra_keys=True,) 45 | lora_args = lora_args.config 46 | prompt_args = prompt_args.config 47 | 48 | if training_args.should_log: 49 | # The default of training_args.log_level is passive, so we set log level at info here to have that default. 50 | transformers.utils.logging.set_verbosity_info() 51 | 52 | log_level = training_args.get_process_log_level() 53 | logger.setLevel(log_level) 54 | datasets.utils.logging.set_verbosity(log_level) 55 | transformers.utils.logging.set_verbosity(log_level) 56 | transformers.utils.logging.enable_default_handler() 57 | transformers.utils.logging.enable_explicit_format() 58 | 59 | dataHelper = NN_DataHelper(model_args, training_args, data_args) 60 | config_kwargs = {"torch_dtype": torch.float16} 61 | if global_args['config_merge']: 62 | config_kwargs.update(global_args['config_merge']) 63 | 64 | tokenizer, config, _, _ = dataHelper.load_tokenizer_and_config(config_kwargs=config_kwargs) 65 | 66 | # with training_args.main_process_first(desc="make_dataset_all"): 67 | # dataHelper.make_dataset_all() 68 | 69 | is_bf16_supported = torch.cuda.is_bf16_supported() 70 | 71 | precision = global_args["precision"] 72 | if precision == "auto": 73 | # 精度 根据实际情况做调整 74 | if is_bf16_supported: 75 | precision = 'bf16' 76 | else: 77 | precision = '16' 78 | 79 | if global_args["quantization_config"] is not None and global_args["quantization_config"].load_in_8bit: 80 | precision = "32" 81 | 82 | 83 | if str(precision) == '16': 84 | training_args.fp16 = True 85 | elif str(precision) == 'bf16': 86 | training_args.bf16 = True 87 | else: 88 | training_args.fp16 = False 89 | training_args.bf16 = False 90 | 91 | deepspeed_config = get_deepspeed_config(precision) 92 | if deepspeed_config: 93 | training_args.deepspeed = deepspeed_config 94 | 95 | # Log on each process the small summary: 96 | logger.warning( 97 | f"Process rank: {training_args.local_rank}, device: {training_args.device}, n_gpu: {training_args.n_gpu}" 98 | + f"distributed training: {training_args.parallel_mode.value == 'distributed'}, 16-bits training: {training_args.fp16}" 99 | ) 100 | logger.info(f"Training/evaluation parameters {training_args}") 101 | 102 | # Detecting last checkpoint. 103 | last_checkpoint = None 104 | if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir: 105 | last_checkpoint = get_last_checkpoint(training_args.output_dir) 106 | if last_checkpoint is None and len(os.listdir(training_args.output_dir)) > 0: 107 | raise ValueError( 108 | f"Output directory ({training_args.output_dir}) already exists and is not empty. " 109 | "Use --overwrite_output_dir to overcome." 110 | ) 111 | elif last_checkpoint is not None and training_args.resume_from_checkpoint is None: 112 | logger.info( 113 | f"Checkpoint detected, resuming training at {last_checkpoint}. To avoid this behavior, change " 114 | "the `--output_dir` or add `--overwrite_output_dir` to train from scratch." 115 | ) 116 | 117 | # Set seed before initializing model. 118 | set_seed(training_args.seed) 119 | 120 | world_size,local_rank,process_index = training_args.world_size,training_args.local_rank,training_args.process_index 121 | 122 | transformer_args = dict(config=config, model_args=model_args, training_args=training_args, lora_args=lora_args, 123 | prompt_args=prompt_args, 124 | quantization_config=global_args["quantization_config"], 125 | device_map={"": local_rank} if world_size > 1 else "auto", 126 | torch_dtype=torch.float16, 127 | trust_remote_code=True, 128 | local_files_only=True, 129 | new_num_tokens=len(tokenizer), # 可能扩充词 130 | ) 131 | 132 | if transformer_args["quantization_config"] is None: 133 | transformer_args.pop("device_map") 134 | 135 | pl_model = MyTransformer(**transformer_args) 136 | 137 | config.save_pretrained(training_args.output_dir) 138 | 139 | # 加载sft权重 140 | # pl_model.load_sft_weight('./best_ckpt/best.pt',is_trainable=True) 141 | 142 | pl_model = pl_model.float() 143 | 144 | train_datasets = None 145 | if training_args.do_train: 146 | train_datasets = dataHelper.load_distributed_random_sampler( 147 | dataHelper.load_dataset_files()["train_files"], 148 | with_load_memory=data_args.data_backend == 'record', 149 | collate_fn=dataHelper.collate_fn, 150 | batch_size=training_args.per_device_train_batch_size, 151 | drop_last=training_args.dataloader_drop_last, # 多卡建议扔掉 152 | num_processes=world_size, process_index=process_index, 153 | num_workers = training_args.dataloader_num_workers, 154 | pin_memory = training_args.dataloader_pin_memory, 155 | ) 156 | 157 | 158 | 159 | # Initialize our Trainer 160 | trainer = TrainerHF( 161 | model=pl_model, 162 | args=training_args, 163 | train_dataset=train_datasets, 164 | tokenizer=tokenizer, 165 | # Data collator will default to DataCollatorWithPadding, so we change it. 166 | data_collator=default_data_collator, 167 | ) 168 | 169 | # Training 170 | if training_args.do_train: 171 | checkpoint = None 172 | if training_args.resume_from_checkpoint is not None: 173 | checkpoint = training_args.resume_from_checkpoint 174 | elif last_checkpoint is not None: 175 | checkpoint = last_checkpoint 176 | train_result = trainer.train(resume_from_checkpoint=checkpoint) 177 | trainer.save_model() # Saves the tokenizer too for easy upload 178 | 179 | metrics = train_result.metrics 180 | metrics["train_samples"] = len(train_datasets) 181 | trainer.log_metrics("train", metrics) 182 | trainer.save_metrics("train", metrics) 183 | trainer.save_state() 184 | 185 | 186 | 187 | 188 | def _mp_fn(index): 189 | # For xla_spawn (TPUs) 190 | main() 191 | 192 | 193 | if __name__ == "__main__": 194 | main() 195 | -------------------------------------------------------------------------------- /training/train_pl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import sys 3 | import os 4 | sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))) 5 | 6 | import logging 7 | import torch 8 | from deep_training.data_helper import ModelArguments, DataArguments, TrainingArguments 9 | from deep_training.trainer.pl.modelcheckpoint import ModelCheckpointEx 10 | from lightning import Trainer 11 | from lightning.pytorch.callbacks import LearningRateMonitor 12 | from lightning.pytorch.strategies import DeepSpeedStrategy 13 | from transformers import HfArgumentParser 14 | from data_utils import NN_DataHelper, config_args, get_deepspeed_config, global_args 15 | from deep_training.zoo.model_zoo.llm.llm_model import MyTransformer, PetlArguments, LoraConfig, PromptArguments 16 | 17 | 18 | assert global_args["trainer_backend"] == "pl" 19 | 20 | def main(): 21 | parser = HfArgumentParser((ModelArguments, TrainingArguments, DataArguments, PetlArguments,PromptArguments)) 22 | model_args, training_args, data_args, lora_args,prompt_args = parser.parse_dict(config_args) 23 | lora_args = lora_args.config 24 | prompt_args = prompt_args.config 25 | 26 | output_weight_dir = './best_ckpt' 27 | 28 | 29 | dataHelper = NN_DataHelper(model_args, training_args, data_args) 30 | config_kwargs = {"torch_dtype": torch.float16} 31 | if global_args['config_merge']: 32 | config_kwargs.update(global_args['config_merge']) 33 | 34 | tokenizer, config, _, _ = dataHelper.load_tokenizer_and_config(config_kwargs=config_kwargs) 35 | 36 | 37 | # dataHelper.make_dataset_all() 38 | 39 | precision = global_args["precision"] 40 | if precision == "auto": 41 | is_bf16_supported = torch.cuda.is_bf16_supported() 42 | # 精度 根据实际情况做调整 43 | if is_bf16_supported: 44 | precision = 'bf16' 45 | else: 46 | precision = '16' 47 | 48 | if global_args["quantization_config"] is not None and global_args["quantization_config"].load_in_8bit: 49 | precision = "32" 50 | 51 | deepspeed_config = get_deepspeed_config(precision) 52 | strategy = 'ddp' if torch.cuda.device_count() > 1 else 'auto' 53 | if deepspeed_config is not None and len(deepspeed_config): 54 | strategy = DeepSpeedStrategy(config=deepspeed_config, ) 55 | checkpoint_callback = ModelCheckpointEx( 56 | # monitor='loss', 57 | dirpath=output_weight_dir, 58 | save_weights_only=True, 59 | save_last=True, 60 | # every_n_train_steps=2000 // training_args.gradient_accumulation_steps, 61 | every_n_epochs=1, 62 | lora_args=lora_args, 63 | prompt_args=prompt_args, 64 | # monitor="loss",mode = "min", save_top_k = 10 按loss存储10个模型 65 | monitor="step", mode="max", 66 | save_top_k=10, # 按步存储最后10个模型 67 | ) 68 | 69 | 70 | trainer = Trainer( 71 | callbacks=[checkpoint_callback, LearningRateMonitor(logging_interval='step')], 72 | max_epochs=training_args.max_epochs, 73 | max_steps=training_args.max_steps, 74 | accelerator="gpu", 75 | devices=data_args.devices, 76 | enable_progress_bar=True, 77 | default_root_dir=data_args.output_dir, 78 | gradient_clip_val=training_args.max_grad_norm, 79 | accumulate_grad_batches=training_args.gradient_accumulation_steps, 80 | num_sanity_val_steps=0, 81 | strategy=strategy, 82 | # lora int8 precision='32' 83 | precision=precision,# 可以自行尝试 "32": "32-true", "16": "16-mixed", "bf16": "bf16-mixed" 84 | ) 85 | 86 | 87 | transformer_args = dict(config=config, model_args=model_args, training_args=training_args, lora_args=lora_args, prompt_args=prompt_args, 88 | quantization_config=global_args["quantization_config"], 89 | device_map={"": trainer.local_rank} if trainer.world_size > 1 else "auto", 90 | torch_dtype=torch.float16, 91 | trust_remote_code=True, 92 | local_files_only=True, 93 | new_num_tokens=len(tokenizer), # 可能扩充词 94 | ) 95 | 96 | if transformer_args["quantization_config"] is None: 97 | transformer_args.pop("device_map") 98 | 99 | pl_model = MyTransformer(**transformer_args) 100 | 101 | config.save_pretrained(output_weight_dir) 102 | 103 | 104 | # 加载sft权重 105 | # pl_model.load_sft_weight('./best_ckpt/best.pt',is_trainable=True) 106 | 107 | pl_model = pl_model.float() 108 | 109 | def dataset_loader_filter_fn(dataset): 110 | print('*' * 30, 'total', len(dataset)) 111 | return dataset 112 | 113 | 114 | train_datasets = dataHelper.load_distributed_random_sampler( 115 | dataHelper.load_dataset_files()["train_files"], 116 | with_load_memory=data_args.data_backend == 'record', 117 | collate_fn=dataHelper.collate_fn, 118 | batch_size=training_args.train_batch_size, 119 | drop_last=training_args.dataloader_drop_last, # 多卡建议扔掉 120 | num_processes=trainer.world_size, process_index=trainer.global_rank, 121 | dataset_loader_filter_fn=dataset_loader_filter_fn, 122 | num_workers=training_args.dataloader_num_workers, 123 | pin_memory=training_args.dataloader_pin_memory, 124 | ) 125 | 126 | if train_datasets is not None: 127 | trainer.fit(pl_model, train_dataloaders=train_datasets) 128 | 129 | 130 | 131 | def _mp_fn(index): 132 | # For xla_spawn (TPUs) 133 | main() 134 | 135 | 136 | if __name__ == "__main__": 137 | main() 138 | --------------------------------------------------------------------------------