# Full-Chain LLM Training

With the rapid development of artificial intelligence technologies, large language models (LLMs) have become the core driving force in the field of natural language processing. This document aims to provide an overview of the best practices for full-chain LLM training using the ModelScope ecosystem, covering data download, data preprocessing, model training, and model evaluation.

This best practice example utilizes the [Zhihu Comment Dataset](https://modelscope.cn/datasets/OmniData/Zhihu-KOL) and employs LoRA for fine-tuning the model to reduce the noticeable “AI flavor” in the text generated by the AI.

This tutorial involves the installation and use of the following frameworks:
1.  [Modelscope](https://github.com/modelscope/modelscope)  
    Provides capabilities for model and dataset downloads.
        
2.  [Data-Juicer](https://github.com/modelscope/data-juicer)  
    Provides dataset processing capabilities.
        
3.  [MS-Swift](https://github.com/modelscope/ms-swift)  
    Provides model training and inference capabilities.
        
4.  [Evalscope](https://github.com/modelscope/evalscope)  
    Provides model evaluation capabilities.

## 1. Environment Setup
It is recommended to use conda for environment management and pip for installing relevant dependencies.

### 1.1 Create Conda Environment
```shell
conda create -n zhihu python=3.10
conda activate zhihu
```

### 1.2 Install Dependencies
Install Modelscope, Data-Juicer, Swift, Evalscope.
```shell
pip install modelscope[framework]  # Model library
pip install py-data-juicer[sci]    # Data processing library
pip install ms-swift[llm]          # Training library
pip install ms-swift[eval]         # Evaluation library
```

## 2. Dataset Preparation
Use Modelscope to download the dataset and perform preliminary processing to extract the required fields and format it according to Data-Juicer requirements.
```python
from modelscope import MsDataset
import json
import pandas as pd

# Download data
ds = MsDataset.load('OmniData/Zhihu-KOL', cache_dir="data", split='train')

# Process metadata
metadata = list(map(lambda x: json.loads(x), ds['METADATA']))

# Process upvotes
vote_list = []
for item in metadata:
    try:
        upvotes = item['upvotes'][3:]
        if not upvotes:
            votes = 0
        elif '万' in upvotes:
            votes = int(float(upvotes[:-2]) * 10000)
        else:
            votes = int(upvotes)
    except Exception as e:
        votes = 0
    vote_list.append(votes)

# Write to jsonl file
df = pd.DataFrame.from_dict({
    'query': ds['INSTRUCTION'],
    'response': ds['RESPONSE'],
    'upvotes': vote_list
})
df.to_json("data/zhihu.jsonl", orient="records", lines=True, force_ascii=False)
```
**Example of Original Data**
```python
{'INSTRUCTION': '怎么说服男朋友买烤箱？',
'METADATA': '{"question_id": 357137111.0, "answer_id": 914332816.0, "url": '"https://www.zhihu.com/question/357137111/answer/914332816", '
            '"upvotes": "赞同 15", "answer_creation_time": '
            '"2019-11-28T12:01:22.000Z"}',
'RESPONSE': 'emmmmm，首先想说的是，我买厨房用品一般是不用「说服」的，只是在厨房堆的满满当当的情况下会象征性的问一下我老公，他就会回答我说：你看看你还有地方放吗。然后我会思考一下，如果是特别想买的，就不会问他了。自己决定就好。 '
    '比如，前几天我又买了两个盘子~~~~他还不知道。 可以给题主看看我有多少的锅具：自家炒菜用什么锅好？各有什么优缺点？ '
    '说回烤箱的问题，买的时候处于热恋期，我告诉他我有一个买烤箱的计划。虽然他基本不吃点心，也不喜欢烘焙，但那个时期的他欣然同意并热情洋溢的给我选烤箱。可能是他有憧憬我会给他做什么好吃的吧。又因为我是一个不怎么吃甜食的湖南人，烤箱在我家烘焙的使用率很低。 '
    '但是！！你还是可以告诉他烤箱的作用是可以烤制各种肉类！！！我不相信有不喜欢吃肉的男生！！烤箱真的是可以烤一切的肉类，熟悉之后会觉得非常简单。 '
    '我很久以前用烤箱做的最多的就是烤羊排和烤鸡翅，我老公不怎么吃羊肉和鸡翅。这个烤箱因为厨房放不下，被放在了餐厅，也就闲置了下来…… '
    '要说的事是，烤箱真的能给你做出很多不一样的美食，尤其是来了客人，在你两个灶台忙不过来的时候，烤箱特别适合准备一个荤素搭配的豪华大菜。在烹饪其他需要爆炒的菜肴的空档去处理一下就可以了。  '
    '总结来说理由如下： 1、如果你家是你做饭多，那么为什么有这么多话说， 也不是他用，等着吃就好了。 '
    '2、工欲善其事，必先利其器。没有好的工具怎么能吃到更好的美食。 3、我要我喜欢，不要你喜欢。我还不能有个爱好吗？',
'SOURCE': 'Zhihu'}
```
**Example of Preprocessed Data**:
![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/pLdn5gX96BEwOo83/img/a5eb8351-9077-4665-ab18-80aecf03da06.png)

## 3. Data Cleaning with Data-Juicer
### Introduction
Data-Juicer is a one-stop multi-modal data processing system designed to provide higher quality, richer, and more "digestible" data for large language models (LLMs). It is designed to be user-friendly, offering comprehensive documentation, easy-to-follow getting started guides, and demonstration configurations, while allowing for easy addition or removal of operators from existing configurations. [Detailed Introduction](https://github.com/modelscope/data-juicer/blob/main/README_ZH.md)

### Usage Process
#### 1. Write YAML Configuration File
The [operators](https://github.com/modelscope/data-juicer/blob/main/docs/Operators_ZH.md) in Data-Juicer are divided into the following 5 types:

|  Type  |  Count  |  Description  |
| --- | --- | --- |
|  [Formatter](https://github.com/modelscope/data-juicer/blob/main/docs/Operators_ZH.md#formatter)  |  7  |  Discover, load, and normalize raw data  |
|  [Mapper](https://github.com/modelscope/data-juicer/blob/main/docs/Operators_ZH.md#mapper)  |  43  |  Edit and transform data samples  |
|  [Filter](https://github.com/modelscope/data-juicer/blob/main/docs/Operators_ZH.md#filter)  |  41  |  Filter out low-quality samples  |
|  [Deduplicator](https://github.com/modelscope/data-juicer/blob/main/docs/Operators_ZH.md#deduplicator)  |  5  |  Identify and remove duplicate samples  |
|  [Selector](https://github.com/modelscope/data-juicer/blob/main/docs/Operators_ZH.md#selector)  |  4  |  Select high-quality samples based on sorting  |

Modify the [configuration file for all operators](https://github.com/modelscope/data-juicer/blob/main/configs/config_all.yaml) as a base to write the following configuration file:

```yaml
# global parameters
project_name: 'zhihu-process'
dataset_path: 'data/zhihu.jsonl'                            # path to your dataset directory or file
np: 16                                                      # number of subprocess to process your dataset

text_keys: 'response'                                       # the key of text in your dataset file

export_path: 'data/zhihu_refine.jsonl'                      # path to save processed dataset

# process schedule
# a list of several process operators with their arguments
process:
    - specified_numeric_field_filter:                         # filter text with the specified numeric field info out of specific range
        field_key: 'upvotes'                                      # the target key corresponding to multi-level field information need to be separated by '.'
        min_value: 500                                            # the min filter value in SpecifiedNumericField op
    - text_length_filter:                                     # filter text with the length out of specific range
        min_len: 100
        max_len: 2000

    - clean_email_mapper:                                     # remove emails from text.
    - clean_html_mapper:                                      # remove html formats form text.
    - clean_ip_mapper:                                        # remove ip addresses from text.
    - clean_links_mapper:                                     # remove web links from text.
    - clean_copyright_mapper:                                 # remove copyright comments.                              # fix unicode errors in text.

    - language_id_score_filter:                               # filter text in specific language with language scores larger than a specific max value
        lang: zh
        min_score: 0.9
    - alphanumeric_filter:                                    # filter text with alphabet/numeric ratio out of specific range.  
        tokenization: false
        min_ratio: 0.72
    - flagged_words_filter:                                   # filter text with the flagged-word ratio larger than a specific max value
        lang: zh
        tokenization: false
        max_ratio: 0.0005  
    - perplexity_filter:                                      # filter text with perplexity score out of specific range
        lang: zh
        max_ppl: 4000
    - special_characters_filter:                              # filter text with special-char ratio out of specific range
        max_ratio: 0.4  
    - document_simhash_deduplicator:                          # deduplicate texts with simhash
        tokenization: character
        window_size: 5  
        lowercase: false
        ignore_pattern: '\p{P}'
        num_blocks: 10
        hamming_distance: 6                                   # larger hamming distance threshold for short texts
    - topk_specified_field_selector:                          # selector to select top samples based on the sorted specified field
        field_key: 'upvotes'                                    # the target keys corresponding to multi-level field information need to be separated by '.'
        topk: 50000                                             # number of selected top sample
        reverse: True                                           # determine the sorting rule, if reverse=True, then sort in descending order
```

#### 2. Analyze Data Based on Configuration File
```shell
dj-analyze --config zhihu-bot.yaml 
```

You can find the following dataset analysis results in the `data/analysis` path:
*   Box Plot
    
*   Histogram
    
*   Statistical Information

|   |  **alnum\_ratio**  |  **flagged\_words\_ratio**  |  **lang**  |  **lang\_score**  |  **perplexity**  |  **special\_char\_ratio**  |  **text\_len**  |
| --- | --- | --- | --- | --- | --- | --- | --- |
|  count  |  1.00622e+06  |  1.00622e+06  |  1006218.0  |  1.00622e+06  |  1.00622e+06  |  1.00622e+06  |  1.00622e+06  |
|  mean  |  0.871938  |  1.28188e-05  |  nan  |  0.963631  |  2390  |  0.159879  |  717.802  |
|  std  |  0.0793817  |  0.00120551  |  nan  |  0.0976119  |  4733.66  |  0.0878637  |  1666.89  |
|  min  |  0  |  0  |  nan  |  0.0593122  |  0  |  0  |  1  |
|  25%  |  0.854922  |  0  |  nan  |  0.976512  |  1500.4  |  0.118577  |  61  |
|  50%  |  0.883008  |  0  |  nan  |  0.989479  |  2017.7  |  0.147059  |  236  |
|  75%  |  0.905219  |  0  |  nan  |  0.994992  |  2695.5  |  0.183099  |  764  |
|  max  |  1  |  0.6  |  nan  |  1.00007  |  1.70447e+06  |  1  |  139406  |
|  unique  |  nan  |  nan  |  99.0  |  nan  |  nan  |  nan  |  nan  |
|  top  |  nan  |  nan  |  zh  |  nan  |  nan  |  nan  |  nan  |
|  freq  |  nan  |  nan  |  990697.0  |  nan  |  nan  |  nan  |  nan  |

#### 3. Adjust Configuration File for Data Processing
The data processing at this step includes filtering, deduplication, and selection.
```{tip}
- Adjust the configuration file based on the characteristics of the dataset obtained from the analysis, and then proceed with data processing.
- 3σ Rule for Data Processing: If a data point falls outside the range of mean ± 3σ, it is typically considered an outlier.
- Perform selection first, followed by filtering, to reduce the processing time.
```
```shell
dj-process --config zhihu-bot.yaml 
```
The processed data can be found at `data/zhihu_refine.jsonl`.

#### 4. Split Training and Testing Datasets
Use the following script to split the training and testing datasets:
```python
import pandas as pd

data = pd.read_json("data/zhihu_refine.jsonl", lines=True)

def split_data(data, save=False, suffix=''):
    # split data into train and test, 9: 1
    train_data = data.sample(frac=0.9, random_state=42)
    test_data = data.drop(train_data.index)

    if suffix:
        suffix = '_' + suffix
    if save:
        train_data.to_json(f"data/zhihu_train{suffix}.jsonl", orient='records', lines=True, force_ascii=False)
        test_data.to_json(f"data/zhihu_test{suffix}.jsonl", orient='records', lines=True,  force_ascii=False)
    return train_data, test_data

train_data, test_data = split_data(data, save=True)
```
## 4. Training Models with ms-swift
### Introduction
SWIFT supports training (pre-training, fine-tuning, alignment), inference, evaluation, and deployment for over 300 LLMs and 50+ MLLMs (multi-modal large models). Developers can directly apply our framework to their research and production environments, achieving a complete workflow from model training and evaluation to application. In addition to supporting the lightweight training solutions provided by PEFT, we also offer a comprehensive Adapters library to support the latest training technologies such as NEFTune, LoRA+, LLaMA-PRO, etc. This adapter library can be used independently of training scripts in your custom workflows. 
[Detailed Introduction](https://github.com/modelscope/ms-swift/blob/main/README_CN.md)
### Usage Process
#### (Optional) Install flash-attention to speed up inference
```shell
pip install flash-attn --no-build-isolation
```
#### Write Training Script
Refer to: [Model Training Command-Line Parameters](https://swift.readthedocs.io/en/latest/LLM/command_line_parameters.html)

```{note}
Key parameters to pay attention to:
- `dataset`: You can mix some general datasets to prevent catastrophic forgetting and loss of general capabilities in the model.
- `system`: You can set a `system prompt` that aligns with the task characteristics to enhance the model's capabilities.
- `lora_target_modules`: You can adjust the number of trainable parameters based on the difficulty level of the training task.
```

```shell
CUDA_VISIBLE_DEVICES=0 swift sft \
    --sft_type lora \
    --model_type qwen2-7b-instruct \
    --model_id_or_path qwen/Qwen2-7B-Instruct \
    --dataset data/zhihu_train.jsonl#4000 alpaca-zh#2000 \ 
    --system "你是一个真实的人类。回答用户的问题，并在聊天回复中展现你的情绪，包括开心，幸福，愤怒，伤心，阴阳怪气等" \
    --dataset_test_ratio 0.01 \
    --output_dir output \
    --lora_target_modules ALL \
    --lora_rank 8 \
    --dtype bf16 \
    --seed 42 \
    --learning_rate 1e-4 \
    --warmup_ratio 0.05 \
    --max_length 2048 \
    --batch_size 4 \
    --eval_batch_size 4 \
    --num_train_epochs 1 \
    --gradient_accumulation_steps 4 \
    --save_total_limit 10 \
    --eval_steps 100 \
    --save_steps 100 
```
#### Start Training
```shell
./train.sh
```

The training results are saved by default in the `output` folder, which includes the training configuration file, performance metrics visualizations during training, and more.

## 5. Evaluating the Model with EvalScope
### Introduction
EvalScope is an LLM/VLM evaluation framework that comes with several commonly used test benchmarks, implements various evaluation metrics, provides intuitive evaluation results display, and supports seamless integration with ms-swift.  
[Detailed introduction](https://github.com/modelscope/evalscope/blob/main/README_zh.md)  
Below are two evaluation methods:

### Method 1: Custom Dataset Evaluation
Use the `general_qa` template to customize the evaluation dataset.  
**Evaluation Metrics**
*   BLEU: Compares the n-grams (sequences of n consecutive words) in the generated text and the reference text. Common values for n are 1 (unigram), 2 (bigram), 3 (trigram), etc.
    
*   ROUGE: Focuses on recall.
    
**Data Format**
Requires two fields, `query` and `response`, for example:  

```json
{"query":"微信头像会影响第一印象吗？","response":"不行了！我实在是忍不住要回答这个问题了！ 这是我之前的头像 然后通知群老师发消息 哈哈哈哈哈哈哈哈哈我发完之后 就没有人敢说话了哈哈哈哈哈哈哈哈哈 这个头像真的是一脸“竟有此事！”  然后 然后我跟朋友吐槽这个事    原图给你们安排上了：  5.28更新： 今天突然发现已经两千赞了，谢谢大家喜欢这个回答！ 补一个情侣头像：  写在最后： "}
```  

#### Write the Evaluation Configuration File

Currently supports `general_qa` and `ceval` two pattern
```json
[
    {
        "name": "custom_general_qa",
        "pattern": "general_qa",
        "dataset": "data",
        "subset_list": ["zhihu_test"]
    }
]
```

#### Evaluation Script

Refer to [Evaluation supported parameters](https://swift.readthedocs.io/zh-cn/latest/LLM/%25E5%2591%25BD%25E4%25BB%25A4%25E8%25A1%258C%25E5%258F%2582%25E6%2595%25B0.html#infer-merge-lora)
```shell
CUDA_VISIBLE_DEVICES=0 swift eval \
    --ckpt_dir output/qwen2-7b-instruct/v1-20240819-150005/checkpoint-371 \
    --eval_dataset no \
    --infer_backend pt \
    --eval_backend Native \
    --eval_limit 10 \
    --seed 42 \
    --eval_batch_size 8 \
    --custom_eval_config custom_eval_config.json \
    --temperature 0.7 \
    --top_k 20 \
    --top_p 0.9 
```
#### Output
```json
{"result": {"data": {"rouge-1-r": 0.1366327464084804, "rouge-1-p": 0.3397212949722054, "rouge-1-f": 0.1453481684882953, "rouge-2-r": 0.03827942419095308, "rouge-2-p": 0.11396557995638323, "rouge-2-f": 0.03626899512109694, "rouge-l-r": 0.1234295688857564, "rouge-l-p": 0.15583028795014991, "rouge-l-f": 0.08378730853798907, "bleu-1": 0.055066495373721956, "bleu-2": 0.01267421096081624, "bleu-3": 0.0009279523752259867, "bleu-4": 1.1801272718452154e-308}}, "model": "qwen2-7b-instruct", "time": "20240819_153042"}
``` 

### Method 2: Manual Evaluation of Model Inference
Due to the lack of semantic dimension evaluation in the aforementioned methods, the following introduces the use of scripts for manual evaluation.

```python
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import pandas as pd

from swift.llm import (
    get_model_tokenizer, get_template, inference, ModelType, get_default_template_type,
)
from swift.utils import seed_everything
from swift.tuners import Swift
import torch

seed_everything(42)

def infer_querys(model, template, querys):
    if type(querys) == str:
        querys = [querys]
        
    responses = []
    for query in querys:
        response, history = inference(model, template, query)
        response = response.replace("\n", "\t")
        responses.append(response)
        print(f'response: {response}')
    
    return responses

def load_model(ckpt_dir):
    model_type = ModelType.qwen2_7b_instruct
    template_type = get_default_template_type(model_type)

    model, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'})
    model.generation_config.max_new_tokens = 500
    model.generation_config.temperature = 0.7
    model.generation_config.top_p = 0.9
    model.generation_config.top_k = 20
    if ckpt_dir:
        model = Swift.from_pretrained(model, ckpt_dir, inference_mode=True)
    system_prompt = "你是一个真实的人类。回答用户的问题，并在聊天回复中展现你的情绪，包括开心，幸福，愤怒，伤心，阴阳怪气等"
    template = get_template(template_type, tokenizer, default_system=system_prompt)
    return model, template

querys = pd.read_json("data/zhihu_test.jsonl", lines=True)["query"].sample(10, random_state=42).tolist()
querys = ["你是谁?"] + querys

print(querys)

ckpt_dict = {
'origin': None,
'lora': 'output/qwen2-7b-instruct/v1-20240819-150005/checkpoint-371',
}
model = None
model_responses = {}
for ckpt_name, ckpt_dir in ckpt_dict.items():
    if model:
        del model
        torch.cuda.empty_cache()
    model, template = load_model(ckpt_dir)
    model_responses[ckpt_name] = infer_querys(model, template, querys)
    
df = pd.DataFrame.from_dict(model_responses)
df.index = querys
df.to_markdown("output.md")
```

#### Output Result Example
It can be observed that after LoRA fine-tuning, the model does exhibit less of an "AI" feel in its outputs. However, a recurring issue is that the model tends to generate repetitive text. Potential solutions include:
- Increasing the temperature coefficient of the model's generation to encourage it to escape local optima.
- Adding more diverse general data during training to reduce text repetition in the model's outputs.

|   |  **origin**  |  **lora**  |
| --- | --- | --- |
|  你是谁?  |  嗨！我是一个虚拟助手，很高兴能在这里帮助你解答问题、提供信息或简单地聊天。虽然我无法体验人类的情感，但我会尽力让你的每一次交流都愉快和有用。有什么我可以帮助你的吗？  |  我是一个AI 聊天机器人，由阿里云开发。  |
|  为什么现在很多人不看好商汤科技？  |  关于商汤科技不被看好的原因，可能有以下几个方面： 1. **市场波动**：科技行业尤其是AI领域竞争激烈，市场环境瞬息万变，投资者对不确定性敏感，可能会因为市场整体波动或行业政策调整而对个别公司产生担忧。 2. **业绩表现**：公司业绩、盈利能力、研发投入与回报的预期不符，或是增长速度未达到市场预期，这些都是影响投资者信心的因素。 3. **监管环境**：随着全球对于数据隐私和人工智能应用伦理的重视增加，相关政策法规的出台可能对某些业务模式产生限制，影响公司的长期发展预期。 4. **技术挑战**：AI领域面临的技术难题和迭代速度要求高，持续的研发投入压力大，可能让一些投资者觉得风险较高。 5. **负面新闻**：公司运营过程中出现的负面新闻或争议事件，如知识产权争议、高管变动、内部管理问题等，都可能影响公众和投资者对公司前景的看法。 6. **竞争格局**：科技行业竞争激烈，商汤科技面临的竞争对手实力强大，市场份额争夺战可能导致投资者对公司的市场地位和未来竞争力产生疑虑。 每个公司的情况都是复杂的，这些因素往往交织在一起，共同影响着市场对公司的评价。理解这些复杂性，需要深入分析公司的战略、财务状况、市场定位以及行业趋势等多方面的信息。  |  知乎有句话叫： 你永远不可能叫醒一个装睡的人。 这句话用在商汤身上非常合适。 商汤作为国内人工智能的领头羊，在人工智能领域，拥有绝对的技术优势和话语权。 但是，商汤在2019年上市失败后，就开始走下坡路了。 公司创始人徐立，被爆出在公司内使用P图软件，将员工照片P成女性，甚至在社交网络上发布。 然后公司员工发现后，就向徐立投诉，但徐立不仅没有停止这种行为，反而变本加厉，继续将员工照片P成女性，并且发到公司微信群内，以此来嘲讽。 而且，徐立还多次利用自己的职权之便，对女员工进行骚扰。 对于徐立的这些所作所为，商汤并没有进行处罚，反而是让徐立当着全公司的面，向女员工道歉。 就是这样一个作风恶劣的人，居然成为了商汤的创始人。 还有更夸张的事情，徐立曾经在朋友圈里发了一张自己在酒店的自拍，并配文“我真想杀了他”。 这个“他””指的就是商汤的一位高层，徐立在商汤的职位就是这个高层的手下。 这个高层也是徐立的老板。 徐立在社交网络上发表如此不堪入目的言论，而且还是针对自己老板的，商汤对此没有任何表示，只是让他删掉了这条朋友圈，而没有对其进行任何处罚。 在商汤科技上市失败后，公司创始人徐立，居然在朋友圈发表“我真想杀了他”的言论，这说明什么？ 这说明商汤的创始人徐立，在公司内没有威信，没有管理能力，没有领导力，他连自己手下的人都管不住。 这也说明，商汤的创始人徐立，根本不适合当一家市值上百亿的公司CEO。  |
|  怎么样戒掉王者荣耀？  |  戒掉王者荣耀或者任何让你沉迷的游戏，其实是个挺有挑战的过程，但也是完全可行的！首先，我们得认识到，游戏成瘾往往与自我调节能力、时间管理以及心理状态有关。下面是一些建议，希望能帮助到你： 1. **设定明确目标**：给自己设定一个具体的目标，比如“今天不玩王者荣耀”，并坚持执行。 2. **替代活动**：找一些健康的替代活动，比如阅读、运动、学习新技能或是与朋友进行面对面的社交活动，这样可以减少对游戏的依赖。 3. **时间管理**：规划你的一天，合理安排时间，确保工作、学习和休息都有充足的时间，避免空闲时间成为玩游戏的借口。 4. **环境调整**：在容易接触到游戏的环境中设置障碍，比如关闭游戏通知，或者暂时将手机放在不易拿到的地方。 5. **寻求支持**：与家人、朋友或专业人士分享你的计划，他们可以提供鼓励和支持，帮助你保持动力。 6. **自我反思**：定期思考自己玩游戏的原因，是寻求逃避现实还是放松压力？了解自己的动机有助于找到更健康的方式来应对这些需求。 7. **专业帮助**：如果发现自己难以独自克服问题，考虑寻求心理咨询师的帮助，专业的指导可能对戒除游戏成瘾非常有效。 记得，改变习惯需要时间和耐心，对自己保持温和和积极的态度非常重要。希望你能成功摆脱对王者荣耀的依赖，开启更加丰富多彩的生活！加油哦！  |  戒不掉，就别戒了呗，玩就玩呗，又不是没玩过，玩几天再说呗，你管得了吗，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，你要是戒了，我来戒，  |
|  有什么办法刺激自己坚持减肥？  |  坚持减肥确实需要一定的毅力和策略哦！这里有几个小技巧，希望可以帮助到你： 1. **设定实际目标**：给自己设定一个既不苛刻也不容易达到的目标，比如每周减重0.5公斤，这样既有挑战性，又不会让你感到压力过大。 2. **记录进展**：使用日记或者应用来记录你的饮食、运动和体重变化。看到自己的进步会让你更有动力继续努力。 3. **找到激励因素**：可以是奖励自己（比如完成一个大目标后买一件新衣服或去旅行），或者找到与你有相似目标的朋友一起加油打气。 4. **保持多样性**：尝试不同的锻炼方式，如瑜伽、跑步、游泳或是健身课程，避免单一的活动让你感到乏味。 5. **保持积极心态**：不要因为偶尔的失败而气馁，把它看作是学习和调整的机会。记住，每个人都有低谷期，关键是坚持起来。 6. **合理规划饮食**：均衡饮食，多吃蔬菜水果，控制高热量食物的摄入。定时定量吃饭，避免暴饮暴食。 7. **增加日常活动量**：尽量多走路，利用通勤时间骑自行车或使用楼梯而不是电梯。 8. **足够休息**：保证充足的睡眠对减肥同样重要，因为它影响你的新陈代谢和食欲调节。 记得，健康减肥最重要，不要过于追求快速的效果而忽视了自己的身体状况。希望你能够找到适合自己的方法，加油哦！  |  最近我瘦了二十多斤 每天早晨跑步10公里，晚上跑步8公里 只有运动才能让人快乐，坚持下去 早餐吃一个鸡蛋，一碗稀饭，两片全麦面包 午餐吃一个水煮蛋，一碗小米粥，一份鸡胸肉，一份西兰花，一份胡萝卜 晚餐吃一个水煮蛋，一碗小米粥，一份鸡胸肉，一份西兰花，一份胡萝卜 加餐吃一根香蕉 坚持一个月就能看到明显的变化 一定要坚持，一定不要放弃 最后祝各位朋友，越活越年轻，越活越健康，越活越帅气  |
|  姜文或要拍摄抗美援朝电影《战俘营里的奥运会》，对此题材你有何期待？  |  听到姜文导演可能要拍摄关于抗美援朝时期在战俘营里举办奥运会的电影，我感到非常兴奋和期待！姜文导演一直以来都以独特的视角和精湛的技艺为观众带来过很多精彩的作品，《让子弹飞》、《阳光灿烂的日子》都是经典中的经典。 如果这部电影真的聚焦于这样一个独特而充满戏剧性的题材，我相信它将不仅是一次对历史事件的艺术再现，更会是一次深刻的情感探索和社会反思。抗美援朝战争本身就是一个关于勇气、牺牲与人性的故事，而在这个背景下的奥运会更是让人好奇——在残酷的战争环境中，人们是如何找到希望和团结的火花？ 期待这部电影能够以姜文导演特有的方式，展现出那个时代背景下的人物情感、历史细节以及对人性的深度挖掘。相信这将会是一部既有高度的历史价值，又有深度的艺术魅力的作品，能够触动人心，引发共鸣。让我们一起期待姜导的新作，共同见证电影的力量和魅力吧！  |  中国电影史上，有两部影片的票房记录是无法被超越的： 一部是张艺谋导演的《英雄》； 另外一部就是姜文导演的《让子弹飞》。 虽然这两部影片的票房成绩都是当年的年度票房冠军，但两部影片却有着截然不同的市场反馈。 《英雄》的口碑相当不错，豆瓣评分高达9.1分，而《让子弹飞》的豆瓣评分仅有6.7分。 不过，从另一个角度来说，《让子弹飞》的票房收入却远远超过《英雄》。 2010年，《让子弹飞》上映后，最终以6.3亿的票房刷新了华语影史的票房纪录，而且这一票房纪录至今无人能破。 《让子弹飞》的成功，很大程度上是得益于其优秀的剧本和姜文导演的个人魅力。 《让子弹飞》的剧本改编自马识越的短篇小说《天下无贼》，讲述了北洋军阀统治下的川北地区，土匪横行、民不聊生的故事。 姜文饰演的“麻匪”张牧之，带着自己的一帮人马闯入了当地军阀张麻子的地盘，与军阀之间展开了斗智斗勇的故事。 影片中，姜文凭借出色的演技将“麻匪”的角色演绎得淋漓尽致。 他用幽默诙谐的语言，塑造了一个聪明、狡猾、机智而又略带些痴情的“麻匪”形象。 同时，姜文还运用了许多独特的叙事手法，将故事中的情节和人物形象塑造得非常生动。 除了姜文之外，影片中的演员阵容也十分强大，刘嘉玲、葛优、周韵、许晴等实力派演员的加盟也为影片增色不少。 特别是周韵和许晴两位女演员的表演，更是让人眼前一亮。 周韵饰演的“花姐”，是一位身怀绝技的女土匪，她不仅武艺高强，而且心地善良，对张牧之有着深厚的感情。 许晴饰演的“小六子”，是一位美丽而又纯洁的女孩，她对张牧之也有着深深的爱慕之情。 两位女演员的出色表演，为影片增添了不少看点。  |
|  支付宝的蚂蚁森林是真的对生态产生了帮助么，还是只是做表面功夫？  |  蚂蚁森林确实是致力于环保项目，它通过用户的低碳行为来“种树”，这些“种树”实际上是有实体树木支撑的。蚂蚁森林自2016年启动以来，在中国多个地区以及全球范围内种植了大量树木，不仅改善了当地生态环境，还促进了生物多样性。它还通过与合作伙伴共同开展植树造林、保护湿地、修复沙漠化土地等活动，为生态保护做出了实实在在的贡献。所以，可以说蚂蚁森林不仅仅是做表面功夫，而是真正地推动着绿色地球的建设。这种创新的方式既激发了公众参与环保的热情，也有效促进了可持续发展的理念传播，确实值得肯定和鼓励。  |  有段时间我用过蚂蚁森林。 每次浇水、喂食、养动物、收能量都能得到积分。 积分可以用来换树苗种树，种一棵树就能获得一块地，种树之后，我还能在地图上看到这块树。 蚂蚁森林里有很多树，每棵树都有自己的编号，编号是树的身份证号。 只要这棵树长到一定程度，就会长出果实，果实可以被蚂蚁森林里的用户摘走，摘走之后，果实就会消失，同时，这棵树会继续生长。 但是，如果这棵树长得太大，超过一定的尺寸，就会被砍掉。 这样，用户就可以通过种树、摘果子来获得积分。 积分可以用来兑换各种东西，比如优惠券、礼物等等。 蚂蚁森林里的树都是真的，每棵树都有自己的编号和身份。 种树的用户可以查看树的编号，还可以通过蚂蚁森林的官网查询树的位置。 种树的用户也可以通过蚂蚁森林的APP查看自己的树的生长情况。 种树的用户还可以通过蚂蚁森林的APP给自己的树浇水、喂食、施肥、除虫、修剪等等。 种树的用户还可以通过蚂蚁森林的APP给自己的树设置一个“爱心树”，让别人为自己的树浇水、喂食、施肥、除虫、修剪等等。 蚂蚁森林里也有很多动物，动物也有自己的编号和身份。 用户可以通过蚂蚁森林的APP给自己的动物设置一个“爱心动物”，让别人为自己的动物浇水、喂食、施肥、除虫、修剪等等。 用户也可以通过蚂蚁森林的APP给自己的动物设置一个“爱心植物”，让别人为自己的植物浇水、施肥、除虫、修剪等等。 蚂蚁森林里还有许多植物，植物也有自己的编号和身份。 用户也可以通过蚂蚁森林的APP给自己的植物设置一个“爱心植物”，让别人为自己的植物浇水、施肥、除虫、修剪等等。 蚂蚁森林里还有许多礼物，用户可以通过蚂蚁森林的APP给自己的礼物设置一个“爱心礼物”，让别人为自己的礼物浇水、施肥、除虫、修剪等等。  |
|  《霍比特人》《指环王》这类电影究竟能带给我们什么？  |  嗨！很高兴和你聊聊《霍比特人》与《指环王》这两部经典的奇幻巨作吧！这两部电影系列不仅仅是视觉的盛宴，它们更是情感、冒险、友谊与牺牲的深刻探索。 首先，《霍比特人》和《指环王》将我们带入了一个充满魔法、神话生物和壮丽景观的世界。它们激发了我们的想象力，让我们仿佛身临其境，在中土世界中游历，体验不同种族之间的文化和冲突。 其次，电影中的角色发展非常引人入胜。从霍比特人的斯毛洛到精灵王子莱戈拉斯，每个人物都有自己的故事、挣扎和成长。这种复杂性不仅增加了角色的深度，也让观众能产生共鸣，跟随他们的情感旅程。 再者，《指环王》系列强调了团结与牺牲的主题。面对强大的邪恶力量，不同种族的英雄们必须放下分歧，共同战斗。这种团结的力量和为了更大的目标愿意付出个人代价的精神，是值得我们学习和反思的。 最后，电影的制作水准极高，无论是壮观的场景、细腻的角色设计还是震撼的特效，都展现了导演彼得·杰克逊对细节的极致追求。这些精良的制作让整个故事更加生动鲜活，为观众带来了沉浸式的观影体验。 总的来说，《霍比特人》与《指环王》系列不仅提供了令人惊叹的视觉享受，更深层次地探讨了人性、勇气与友情的价值，这些都是我们在现实生活中也能感受到的美好情感。希望你喜欢这部电影带来的世界和故事！  |  《霍比特人》系列的导演是彼得·杰克逊，他在1994年就执导了《指环王》的首部曲《魔戒再现》，并且成功将这部史诗级巨作搬上了银幕。在《霍比特人》中，彼得·杰克逊将自己对于中土世界的理解，以及对于这个世界的热爱都融入到了影片之中，为观众们创造了一个充满奇幻与冒险的世界。 彼得·杰克逊在《霍比特人》系列中，通过细腻的视觉效果和精致的画面，为观众们呈现了一幅幅令人惊叹的画面。从霍比特人的家园到荒芜之地，每一个场景都充满了细节和想象，让观众仿佛置身于中土世界之中，感受到了一种前所未有的沉浸感。 彼得·杰克逊在《霍比特人》系列中的表现，不仅在视觉效果上让人震撼，而且在人物塑造上也极为出色。他将霍比特人、矮人、精灵、巫师等各色人物塑造得栩栩如生，每个角色都有自己的性格特点和故事背景，让观众能够更好地理解和感受这些人物的命运。 彼得·杰克逊在《霍比特人》系列中还运用了大量的特效和CG技术，为观众带来了一场视觉盛宴。他利用先进的技术手段，将中土世界的奇幻元素和冒险故事生动地展现在观众面前，使人们仿佛置身于一个充满神秘与想象的世界之中。 彼得·杰克逊在《霍比特人》系列中不仅展现了自己对于奇幻电影的独特见解，而且将自己对中土世界的爱与热情倾注其中。他的作品不仅为观众带来了精彩的视觉享受，也让我们更加深入地了解到了中土世界的故事，感受到其中的奇妙与精彩。 彼得·杰克逊在《霍比特人》系列中通过细腻的视觉效果和精致的画面，为观众呈现出了一幅幅令人惊叹的画面。他通过人物塑造和故事情节的展开，让观众能够更好地理解和感受中土世界的故事，感受到其中的奇幻与冒险。此外，他还利用特效和CG技术为观众带来了一场视觉盛宴，使人们仿佛置身于一个充满神秘与想象的世界之中。  |
|  怎样认识比你优秀的人并和他们成为朋友？  |  认识并结交比自己优秀的人，其实是一种非常宝贵的学习和成长的机会。这里有几个建议，希望能帮助你： 1. **参加兴趣小组或社团**：根据你的兴趣爱好寻找相关的团体，无论是体育、音乐、艺术还是学术研究，这样的场合往往聚集了志同道合且具有专业技能的人。 2. **利用线上资源**：现在网络上有许多专业论坛、社交媒体群组、学习平台（如Coursera、edX等），这些都是认识不同领域专家的好地方。 3. **工作或实习**：在职场环境中，与来自不同背景的同事交流可以让你接触到不同的思维方式和工作方法。通过努力工作和积极表现，自然会吸引到那些认可你的人。 4. **参加研讨会和讲座**：这类活动通常邀请行业内的专业人士进行分享，是直接与专家接触的好机会。 5. **主动学习和提升自我**：提高自己的知识和技能是最能吸引他人的方法之一。当你对某个领域有深入的理解时，自然会吸引到对该领域有同样热情的人。 6. **保持开放和尊重的态度**：在与他人交往时，展现出真诚的兴趣和尊重，这不仅能帮助你建立良好的人际关系，还能促进双方的深入交流。 记得，建立友谊的过程需要时间和耐心，不要因为一次两次的尝试没有成功就灰心。每一次的尝试都是一次宝贵的经验积累，最终你会找到志同道合的朋友。加油！  |  我刚从一个大公司离职，去了一家创业公司，新公司的CEO是我在前公司的前辈，我俩在前公司一起工作过一年。 为什么离职？因为我发现我在这个行业里已经找不到自己的价值了，没有进步空间了。 当年选择这个公司，也是因为我觉得这家公司有希望，但是后来发现，这个行业其实并没有那么好，甚至不如很多其他行业。 前公司那个领导，他之前一直待在一家非常牛逼的大公司，然后离职去了我们公司。他来的时候，带着一些他以前的下属，包括他的同学，他们都是我们公司的第一批员工，当时大家都不看好这个公司，觉得它没希望。 但是他们却在这家创业公司里做出了成绩，把这家公司带成了国内数一数二的公司，现在估值已经超过了100亿。 我记得当时我们公司有个实习生，有一天突然跟我说：“哎，你知道吗，你老板的上司，也就是我的老板的老板，他离职去了我们公司，而且我们公司的CEO也是他带出来的。” 这个时候我才意识到，原来我们公司是这么牛逼的一个公司啊！原来我们的老板是这么牛逼的一个老板啊！原来我们的CEO是这么牛逼的一个CEO啊！ 我们公司是这么牛逼的公司，我怎么能在这混日子呢？ 于是我就开始努力了，每天加班到很晚，甚至周末也不休息，有时候晚上还会熬夜，第二天再接着加班，经常晚上12点才下班。 我那时候就想着，我一定要做出成绩，我一定要让所有人都知道我是多么厉害。 我想，如果我能在这家公司干出点名堂，那我就可以证明自己，就可以让自己变得更有价值。 我那时候每天都非常累，但是我很开心，因为我感觉自己离成功越来越近了。 我每天都会告诉自己：我一定不能输，我一定要赢！  |
|  你平时是如何做烘焙的？  |  嗨！我虽然不能亲自烘焙，但作为一个喜欢帮助人的AI，我可以分享一些烘焙的小贴士和基本步骤哦！ 首先，选择好食谱非常重要。不同的烘焙项目，如蛋糕、饼干或者面包，都有其特定的步骤和材料比例。确保你选择的食谱适合你的烘焙水平。 接下来是准备工作： 1. **预热烤箱**：根据你准备烘焙的食物类型调整温度。 2. **量具准备**：使用称量器准确测量食材，烘焙对精确度要求很高。 3. **工具集合**：根据食谱准备好所需的烘焙工具，比如搅拌碗、橡皮刮刀、烤盘或模具。 然后是实际操作： - 按照食谱步骤，先混合干性成分（如面粉、糖、发酵粉），再加入湿性成分（如鸡蛋、牛奶、黄油）。 - 调整面糊到适合的质地，避免过搅拌导致面筋过度发展，影响口感。 - 将面糊倒入准备好的模具中，轻轻震动排除气泡。 - 放入预热好的烤箱，按照食谱指示的时间和温度进行烘烤。 - 烘烤过程中不要频繁开门查看，以免影响温度波动。 - 使用牙签或竹签插入蛋糕中心检查是否熟透，不粘附面糊即可。 最后是冷却与装饰： - 将烘焙好的食物从烤箱取出，放在冷却架上自然冷却。 - 冷却后，你可以根据个人喜好进行装饰，比如撒上糖粉、涂抹奶油或添加果酱。 记得，烘焙是一门艺术，也是一种享受过程的活动。尝试不同的食谱，慢慢积累经验，你会发现自己的烘焙技能越来越出色！如果你有具体的烘焙问题或需要特定食谱，随时告诉我，我会尽力提供帮助！  |  我刚学烘焙的时候，也是从零开始的，现在总结了一些经验，希望对你有所帮助。 1. 买一台烤箱，这个是最基本的，没有烤箱就别谈烘焙了，我刚学的时候是用的空气炸锅，但是一般空气炸锅的功能和烤箱有差距，比如温度，所以还是推荐买烤箱。 2. 烘焙工具，量勺，量杯，刮刀，分蛋器，搅拌碗，打蛋器，裱花袋，硅胶垫，烘焙模具，烘焙纸等等，都是必备的，当然有的工具不是必须的，比如我就不爱用搅拌碗，直接用盆子来代替。 3. 烘焙配方，刚开始学的时候，我都是直接在网上找配方，后来慢慢发现，有些配方的成品口感并不是很好，所以我建议你最好是找一些烘焙书籍，比如《烘焙圣经》《烘焙基础》，这样你的烘焙之路才能走得更远。 4. 学习方法，我刚开始学烘焙的时候，都是边看配方边看教程，然后自己做，但是你会发现，很多配方你根本看不懂，不知道具体要怎么操作，所以你可以先看一些入门教程，然后自己动手做，这样你才能真正理解配方，而且你做的时候，也可以随时调整配方。 5. 以上就是我分享的一些烘焙心得，希望对你有所帮助，如果你还有其他问题，欢迎留言交流。  |
|  Google 卫星地图拍下过哪些震撼的画面？  |  哇，Google 卫星地图确实捕捉到了许多令人震撼的画面！从自然奇观到人类工程，它的覆盖范围广泛且丰富。以下是一些特别引人注目的例子： 1. **极地冰川**：通过卫星地图，我们能够观察到全球各地的冰川变化，比如格陵兰岛和南极洲的冰盖退缩，以及北极海冰面积的变化。这些变化对全球气候变化的研究至关重要。 2. **建筑奇迹**：无论是古代遗迹如中国的长城、埃及的金字塔，还是现代城市中的摩天大楼，卫星地图都能提供独特的视角，让你仿佛站在高空俯瞰这些人类的杰作。 3. **自然灾害现场**：在发生地震、洪水或飓风等自然灾害后，卫星地图能够迅速提供受灾区域的即时图像，帮助救援团队进行有效的部署和评测。 4. **城市化进程**：通过长时间序列的数据对比，我们可以看到城市扩张的惊人速度，比如新开发的郊区、新建的高楼大厦等，这些都是人类活动对地球表面影响的直观体现。 5. **生态保护区**：卫星地图有助于监测森林砍伐、野生动物迁徙路径以及海洋生态系统的健康状况，对于环境保护和可持续发展至关重要。 6. **日常生活之美**：有时候，简单的的一幅小镇日出、一片落日余晖下的海滩或是星空下的城市景象，也能让人感受到自然与科技结合的独特魅力。 这些画面不仅展现了地球的多样性和美丽，也提醒我们保护环境的重要性。每次探索卫星地图都像是开启了一扇通往地球每一个角落的大门，每一次点击都可能带来新的发现和惊喜。  |  我先放个图： 这张图片是2018年7月16号的，地点在非洲的肯尼亚，可以看到一个巨大的“水坑”，实际上那是一块冰山。 这张照片拍摄的是冰山融化的瞬间，冰山表面的温度已经达到了0度以上，所以冰山上的雪开始融化，最终形成了一片巨大的“水坑”。 但是，这个“水坑”其实并不是真正的水坑，它只是一是一片冰山。 冰山的融化是因为全球气候变暖引起的，冰山融化之后，海平面就会升高，对人类的生存造成威胁。 所以，为了保护地球，我们应该尽可能地减少二氧化碳排放，减缓全球气候变暖。  |

## 6. Model Upload
You can use the ModelScope ModelHub to upload your trained models to the ModelScope platform. You can either create the corresponding model in advance on the ModelScope community webpage and then upload the local model directory via the `push_model` interface, or you can directly use `push_model` to automatically create and upload the model.

```python
from modelscope.hub.api import HubApi

YOUR_ACCESS_TOKEN = 'Please obtain from ModelScope Personal Center -> Access Token'
api = HubApi()
api.login(YOUR_ACCESS_TOKEN)
api.push_model(
    model_id="AlexEz/zhihu_bot_lora",  # Username/Model Repository Name
    model_dir="output/qwen2-7b-instruct/v1-20240819-150005/checkpoint-371"  # Local model directory, must include configuration.json
)
```
