文章目录
-
- 1.评测数据集
-
- [1.1 通用数据集](#1.1 通用数据集)
- 2.模型评测
-
- [2.1 评测框架](#2.1 评测框架)
-
- [2.1.1 候选框架](#2.1.1 候选框架)
- [2.1.2 OpenCompass](#2.1.2 OpenCompass)
-
- [2.1.2.1 简介](#2.1.2.1 简介)
- [2.1.2.2 大模型评测"铁三角"](#2.1.2.2 大模型评测“铁三角”)
- [2.1.2.3 OpenCompass环境构建](#2.1.2.3 OpenCompass环境构建)
- [2.1.3 lm-evaluation-harness](#2.1.3 lm-evaluation-harness)
-
- [2.1.3.1 简介](#2.1.3.1 简介)
- [2.1.3.2 评测示例](#2.1.3.2 评测示例)
- [2.2 模型评测](#2.2 模型评测)
-
- [2.2.1 OpenCompass评测流程](#2.2.1 OpenCompass评测流程)
- [2.2.2 lm-evaluation-harness评测流程](#2.2.2 lm-evaluation-harness评测流程)
- [2.2.3 Qwen2评测结果](#2.2.3 Qwen2评测结果)
- 3.附录
-
- [3.1 MMLU数据集下载脚本](#3.1 MMLU数据集下载脚本)
- [3.2 MultiPL-E数据集下载脚本](#3.2 MultiPL-E数据集下载脚本)
- [3.3 评测问题记录](#3.3 评测问题记录)
1.评测数据集
1.1 通用数据集
数据集名称 | 简介 | 测试集数据量 | 训练集数据量 | 下载地址 |
---|---|---|---|---|
MMLU | MMLU是一个大规模的基准测试,旨在评估模型在零次学习和少次学习设置下获得的知识。它涵盖了STEM、人文科学、社会科学等57个科目,难度从初级到高级专业水平不等。 | 14042 | 99842 | https://huggingface.co/datasets/cais/mmlu |
MMLU-Pro | MMLU-Pro是MMLU的升级版,旨在通过更复杂的问题和更多的选项来更严格地评估大型语言模型。它包含来自各个学科领域的1.2万个复杂问题,每个问题有10个答案选项,且增加了更多以推理为重点的问题。 | 12032 | ------ | https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro |
GPQA | 全称为"Graduate-Level Google-Proof Q&A Benchmark",是一个由纽约大学的研究者提出的具有挑战性的数据集。这个数据集包含448个多项选择题,由生物学、物理学和化学领域的专家编写。GPQA数据集的设计考虑了专家与非专家之间的知识差距,通过让专家编写问题并验证答案的客观性,同时让非专家尝试解决问题,确保了问题的挑战性和广泛性。即便是在该领域已取得或正在攻读博士学位的专家,正确率也只有65%,显示了其难度。 | 448 | ------ | https://huggingface.co/datasets/Idavidrein/gpqa |
TheoremQA | 一个由 STEM 定理驱动的问答数据集,包含 800 个 QA 对,涵盖数学、EE&CS、物理和金融领域的 350 多个定理。它测试了大语言模型在应用定理解决具有挑战性大学级问题方面的局限性。 | 800 | ------ | https://huggingface.co/datasets/TIGER-Lab/TheoremQA |
MT-Bench | 一个多轮对话数据集,用于测试模型的对话和遵循指令的能力,包含80条数据 | 80 | ------ | https://huggingface.co/datasets/philschmid/mt-bench |
Arena-Hard | Arena-Hard 基准测试是根据 Chatbot Arena 中的实时数据构建的,Chatbot Arena 是一个用于LLM评估的众包平台。它包含 500 个具有挑战性的用户查询。该基准测试使用 GPT-4-Turbo 作为评判者,将不同模型的响应与基线模型进行比较。Arena-Hard 基准测试与其他基准测试相比可提供明显更强的可分离性,并且置信区间更严格。它还与 Chatbot Arena 的人类偏好排名具有更高的一致性 (89.1%)。 | 500 | ------ | https://huggingface.co/datasets/pvduy/arena-hard |
IFEval | 该数据集评估大型语言模型的指令跟踪能力。有 500 多个提示和说明,例如"写一篇超过 800 字的文章"、"用双引号引起来"等。 | 541 | ------ | https://huggingface.co/datasets/HuggingFaceH4/ifeval |
HumanEval | 是工作《Evaluating Large Language Models Trained on Code》(https://arxiv.org/abs/2107.03374)中提到的一个代码评测基准。一共包括164条样本 | 164 | ------ | https://huggingface.co/datasets/nus-yam/human-eval |
MBPP | 数据集由 Google 等研究人员开发,包含约1000个众包的 Python 编程问题,设计为可由初级程序员解决,覆盖编程基础和标准库功能等。每个问题包括任务描述、代码解决方案和3个自动化测试用例。MBPP 数据集用于测试大语言模型从自然语言描述中生成 Python 代码的能力。 | 1000 | ------ | https://huggingface.co/datasets/google-research-datasets/mbpp |
MultiPL-E | 是一个多编程语言基准测试,用于评估大型语言模型(LLMs)的代码生成性能。它使用了 OpenAI 的 HumanEval 数据集和 MBPP Python 基准测试,并使用小型编译器将它们转换为其他语言,支持18种编程语言的评估。MultiPL-E 旨在提供一种可扩展和多语言的方法来评估神经代码生成。 | 161 | ------ | https://huggingface.co/datasets/nuprl/MultiPL-E |
EvalPlus | 用于LLM合成代码的严谨性评估。它是LLM4Code的严格评估框架,具有:✨ HumanEval+:比原来的HumanEval多80倍的测试!✨ MBPP+:比原来的MBPP多35倍的测试!✨ 评估框架:我们的包/图像/工具可以在上述基准上轻松、安全地评估LLM | 1312 | ------ | https://huggingface.co/datasets/evalplus/humanevalplus |
LiveCodeBench | LiveCodeBench是一个"实时"更新基准,用于全面评估LLMs的代码相关功能。特别是,它评估 LLMs 的一系列功能,包括代码生成、自我修复、测试输出预测和代码执行。这就是LiveCodeBench的代码生成场景。它还用于使用测试用例反馈来评估自我修复。 | 960 | ------ | https://huggingface.co/datasets/livecodebench/code_generation_lite |
GSM8K | GSM8K是一个高质量的英文小学数学问题测试集,包含 7.5K 训练数据和 1K 测试数据。这些问题通常需要 2-8 步才能解决,有效评估了数学与逻辑能力。 | 1320 | 7470 | https://huggingface.co/datasets/gsm8k |
MATH | MATH是一个由数学竞赛问题组成的评测集,由 AMC 10、AMC 12 和 AIME 等组成,包含 7.5K 训练数据和 5K 测试数据。 | 5000 | 7500 | https://people.eecs.berkeley.edu/~hendrycks/MATH.tar |
C-Eval | C-Eval是一个全面的中文基础模型评测数据集,它包含了 13948 个多项选择题,涵盖了 52 个学科和四个难度级别。 | 13948 | ------ | https://huggingface.co/datasets/ceval/ceval-exam |
AlignBench | AlignBench 的数据集来自于真实的使用场景,经过初步构造、敏感性筛查、参考答案生成和难度筛选等步骤,确保具有真实性和挑战性。数据集分为8个大类,包括知识问答、写作生成、角色扮演等多种类型的问题。 | 683 | ------ | https://github.com/kekewind/AlignBench |
2.模型评测
2.1 评测框架
2.1.1 候选框架
框架名称 | 提出者 | 提出时间 | 框架介绍 | 项目网站 | 代码地址 |
OpenCompass | 上海AI实验室 | 2023-10 | 上海AI实验室推出OpenCompass开放评测体系,提供大模型能力参考_上海人工智能实验室 | OpenCompass司南 - 数据集社区 | https://github.com/open-compass/opencompass |
Auto Arena | 阿里达摩院 | 2024-06 | 大模型到底哪家强?达摩院推出"全自动竞技场Auto Arena"评测框架 | Auto Arena of LLMs | GitHub - DAMO-NLP-SG/Auto-Arena-LLMs |
AlignBench | 智谱AI | 2023-12 | AlignBench:专为「中文 LLM」而生的对齐评测 | LLMBench | GitHub - THUDM/AlignBench: 大模型多维度中文对齐评测基准 (ACL 2024) |
UltraEval | OpenBMB | 2023-11 | UltraEval:开源模型测评框架,集成模型部署、测试数据集、数据指标统计 | UltraEval | https://github.com/OpenBMB/UltraEval |
LM-Evaluation Harness | Eleuther AI | 2020-08 | LLMs之benchmark之lm-evaluation-harness:lm-evaluation-harness(语言模型评估工具)的简介、安装和使用方法、案例应用之详细攻略 | EleutherAI | https://github.com/EleutherAI/lm-evaluation-harness |
2.1.2 OpenCompass
2.1.2.1 简介
上海人工智能实验室研发推出了 OpenCompass 司南开源评测体系。该体系是面向大语言模型、多模态大模型等各类模型的一站式评测平台。OpenCompass 的主要特点包括开源可复现 、全面的能力维度 、丰富的模型支持 、分布式高效评测 、多样化评测范式 以及灵活化拓展。基于高质量、多层次的能力体系和工具链,OpenCompass 创新了多项能力评测方法,并构建了一套高质量的中英文双语评测基准,涵盖语言与理解、常识与逻辑推理、数学计算与应用、多编程语言代码能力、智能体、创作与对话等多个方面,能够实现对大模型真实能力的全面诊断。
2.1.2.2 大模型评测"铁三角"
CompassRank:中立全面的性能榜单
作为OpenCompass2.0中各类榜单的承载平台,CompassRank不受任何商业利益干扰,保持中立性。同时,依托CompassKit工具链体系中的各类评测手段,保证了CompassRank的客观性。CompassRank不仅覆盖多领域、多任务下的模型性能,还将定期更新,提供动态的行业洞察。与此同时,OpenCompass团队将在榜单中提供专业解读,进一步帮助从业者理解技术深意,优化模型选择。
CompassRank 榜单地址: https://rank.opencompass.org.cn/home
CompassHub:高质量评测基准社区
CompassHub是面向大模型能力评测开源开放的基准社区,提供海量的面向不同能力维度和行业场景的评测基准。OpenCompass2.0欢迎评测用户在CompassHub上传各自构建的高质量评测基准,发布相应的性能榜单,汇聚社区力量助力大模型社区整体快速发展。
CompassHub社区地址: https://hub.opencompass.org.cn/home
CompassKit:大模型评测全栈工具链
OpenCompass2.0对广受欢迎的初代评测工具库进行了全面优化,推出大模型评测全栈工具链CompassKit,不仅提供完整的开源可复现评测代码,更提供了丰富的模型支持和高效的分布式评测策略。
CompassKit工具链地址: https://github.com/open-compass
2.1.2.3 OpenCompass环境构建
Step 1. 登录服务器
Step 2. 新建conda环境
bash
conda create -n py310_llm_1_9 --clone py310_chatglm3_1_8
Step 3. 激活conda环境
bash
conda activate py310_llm_1_9
Step 4. 下载OpenCompass代码
bash
git clone https://github.com/open-compass/opencompass.git
Step 5. 安装OpenCompass的依赖
bash
pip install -r requirements.txt
2.1.3 lm-evaluation-harness
2.1.3.1 简介
lm-evaluation-harness支持许多模型种类,包含HuggingFace Hub上托管的模型,OpenAI、Anthropic的API,也支持Llama.cpp或vLLM的接口,因此无论是要评估已开放使用的LLM或个人finetune后的LLM,都可以使用这个工具。
该工具的参数非常多,以下是几个常见的:
-
--model:选用要评估的模型类型,如hf,gguf,vllm,openai等。
-
--model_args:模型的位置和参数,可用huggingface的仓库名称或本地的./xxxx等。这个参数可以接受1个以上,用","分隔即可。
-
--tasks:决定哪些任务要评估,一样可以接受一个以上。列表可以使用lm-eval-tasks list查看。
-
--device:使用的GPU,要一个以上请使用accelerate launcher或参数tensor_parallel_size。
-
--batch_size:auto代表自动选择batch大小。
-
--output_path:结果存储位置。
-
--use_cache:缓存之前运行的结果,可以避免相同情境重复执行。
-
--log_samples:把评估的过程记录下来,包括全部的Prompt和ans。
2.1.3.2 评测示例
HuggingFace Hub
要评估 HuggingFace Hub(例如 GPT-J-6B)上托管的模型,可以使用以下命令(假设使用的是 CUDA 兼容 GPU):
bash
lm_eval --model hf \
--model_args pretrained=EleutherAI/gpt-j-6B \
--tasks hellaswag \
--device cuda:0 \
--batch_size 8
量化模型
bash
CUDA_VISIBLE_DEVICES=0,1,2,3 lm-eval --model hf \
--model_args pretrained=/data2/models/LLM/qwen/Qwen1.5-110B-Chat-GPTQ-Int8,trust_remote_code=True,parallelize=True,autogptq=model.safetensors,gptq_use_triton=True \
--tasks ceval-valid,mmlu,cmmlu,gsm8k \
--output_path qwen1.5_110b_chat_int8_zero.json \
--batch_size 8 \
--num_fewshot 0
vLLM
还支持 vLLM,以便更快地对支持的模型类型进行推理,尤其是在将模型拆分到多个 GPU 上时速度更快。对于单 GPU 或多 GPU(张量并行、数据并行或两者的组合)推理:
bash
lm_eval --model vllm \
--model_args pretrained={model_name},tensor_parallel_size={GPUs_per_model},dtype=auto,gpu_memory_utilization=0.8,data_parallel_size={model_replicas} \
--tasks lambada_openai \
--batch_size auto
模型API和推理服务器
该框架还支持对通过多个商业 API 提供的模型进行评估,还支持本地推理服务器与镜像 OpenAI Completions 和 ChatCompletions API 的服务器结合使用。
bash
lm_eval --model local-chat-completions \
--tasks gsm8k \
--model_args model=facebook/opt-125m,base_url=http://{yourip}:8000/v1
2.2 模型评测
2.2.1 OpenCompass评测流程
Step 1. 登录服务器,激活py310_llm_1_9环境
bash
conda activate py310_llm_1_9
Step 2. 上传OpenCompass的代码
Step 3. 定义API模型
首先需要在 opencompass/models 下新建 customized_model_api.py 文件,然后基于BaseAPIModel自定义一个CustomizedAPIModel。
python
import time
import requests
from concurrent.futures import ThreadPoolExecutor
from typing import Dict, List, Optional, Union
from opencompass.utils.prompt import PromptList
from .base_api import BaseAPIModel
PromptType = Union[PromptList, str]
class CustomizedAPIModel(BaseAPIModel):
def __init__(self,
path: str,
url: str,
query_per_second: int = 1,
max_seq_len: int = 2048,
meta_template: Optional[Dict] = None,
retry: int = 5,
generation_kwargs: Dict = {}):
super().__init__(path=path,
max_seq_len=max_seq_len,
query_per_second=query_per_second,
meta_template=meta_template,
retry=retry,
generation_kwargs=generation_kwargs)
self.model = path
self.url = url
self.headers = {'Content_Type': 'application/json'}
def generate(
self,
inputs: List[PromptType],
max_out_len: int = 512,
) -> List[str]:
"""Generate results given a list of inputs.
Args:
inputs (List[PromptType]): A list of strings or PromptDicts.
The PromptDict should be organized in OpenCompass'
API format.
max_out_len (int): The maximum length of the output.
Returns:
List[str]: A list of generated strings.
"""
with ThreadPoolExecutor() as executor:
results = list(
executor.map(self._generate, inputs,
[max_out_len] * len(inputs)))
self.flush()
return results
def _generate(
self,
input: PromptType,
max_out_len: int = 512,
) -> str:
"""Generate results given an input.
Args:
inputs (PromptType): A string or PromptDict.
The PromptDict should be organized in OpenCompass'
API format.
max_out_len (int): The maximum length of the output.
Returns:
str: The generated string.
"""
assert isinstance(input, (str, PromptList))
if isinstance(input, str):
messages = [{'role': 'user', 'content': input}]
else:
messages = []
msg_buffer, last_role = [], None
for index, item in enumerate(input):
if index == 0 and item['role'] == 'SYSTEM':
role = 'system'
elif item['role'] == 'BOT':
role = 'assistant'
else:
role = 'user'
if role != last_role and last_role is not None:
messages.append({
'content': '\n'.join(msg_buffer),
'role': last_role
})
msg_buffer = []
msg_buffer.append(item['prompt'])
last_role = role
messages.append({
'content': '\n'.join(msg_buffer),
'role': last_role
})
data = {'model': self.model, 'messages': messages}
data.update(self.generation_kwargs)
max_num_retries = 0
while max_num_retries < self.retry:
self.acquire()
try:
raw_response = requests.request('POST',
url=self.url,
headers=self.headers,
json=data)
response = raw_response.json()
except Exception as err:
print('Request Error:{}'.format(err))
time.sleep(3)
continue
self.release()
if response is None:
print('Connection error, reconnect.')
self.logger.error('Connection error, reconnect.')
self.wait()
continue
if raw_response.status_code == 200:
try:
msg = response['choices'][-1]['message']['content']
return msg
except KeyError:
print(response)
self.logger.error(raw_response.content)
time.sleep(1)
continue
self.logger.error(raw_response.content)
max_num_retries += 1
raise RuntimeError("customize qwen api failed.")
CustomizedAPIModel需要两个参数:
-
path:调用的大模型名称。
-
url:请求大模型的url地址。
同时修改opencompass/models/init.py,在文件中增加刚刚新增的CustomizedAPIModel的导出,新增代码如下:
python
from .customized_model_api import CustomizedAPIModel
这样一个自定义的API模型就完成了。
Step 4. 定义API模型的配置文件
在configs/api_examples文目录下新建eval_api_customized.py,文件内容如下:
python
from mmengine.config import read_base
from opencompass.models import CustomizedAPIModel
from opencompass.partitioners import NaivePartitioner
from opencompass.runners.local_api import LocalAPIRunner
from opencompass.tasks import OpenICLInferTask
with read_base():
from ..summarizers.medium import summarizer
from ..datasets.ceval.ceval_gen import ceval_datasets
datasets = [
*ceval_datasets,
]
models = [
dict(
abbr='api-customized',
type=CustomizedAPIModel,
path='Qwen1.5-72B-Chat', # model name
url='http://172.18.65.10:8000/v1/chat/completions', # request api url
generation_kwargs={
'enable_search': False,
},
query_per_second=1,
max_out_len=32768,
max_seq_len=32768,
batch_size=8
),
]
infer = dict(
partitioner=dict(type=NaivePartitioner),
runner=dict(
type=LocalAPIRunner,
max_num_workers=1,
concurrent_users=1,
task=dict(type=OpenICLInferTask)),
)
work_dir = "outputs/api_customized/"
在配置文件中,我们可以设置它的测试集datasets,models的path参数设置相应的大模型名称,url参数设置成大模型调用的url地址,同时还可以通过work_dir来设置测试结果输出的目录。
Step 5. 大模型测评
在项目根目录下执行如下命令:
bash
python run.py configs/api_examples/eval_api_customized.py
2.2.2 lm-evaluation-harness评测流程
Step 1. 激活评测conda环境
bash
conda activate py310_llm_1_9
Step 2. 新增测试集
bash
vim /data2/miniconda/envs/py310_llm_1_9/lib/python3.10/site-packages/lm_eval/api/task.py
python
elif self.DATASET_PATH == 'hails/mmlu_no_train':
self.dataset = datasets.load_from_disk(
f"/data2/datasets/evaluation_datasets/mmlu/{self.DATASET_NAME}"
)
elif self.DATASET_PATH == 'openai/gsm8k':
self.dataset = datasets.load_from_disk(
f"/data2/datasets/evaluation_datasets/gsm8k/{self.DATASET_NAME}"
)
Step 3. 切到评测目录
bash
cd /data2/public/evaluation
Step 4. 执行评测指令
方式一. 本地模型
bash
CUDA_VISIBLE_DEVICES=0,1,2,3 lm-eval --model hf --model_args pretrained=/data2/models/LLM/qwen/Qwen2-72B-Instruct,trust_remote_code=True,parallelize=True --tasks ceval-valid,mmlu,cmmlu,gsm8k --output_path qwen2_72b_instruct_zero.json --batch_size 8 --num_fewshot 0
方式二. API模型
bash
OPENAI_API_KEY=EMPTY lm_eval --model local-chat-completions \
--tasks ceval-valid \
--model_args model=Qwen1.5-72B-Chat,base_url=http://172.18.65.10:8000/v1,echo=True \
--output_path qwen2_72b_instruct_zero.json \
--num_fewshot 0
2.2.3 Qwen2评测结果
Qwen1.5-72B-Chat( lm-evaluation-harness) | Qwen2-72B-Instruct( lm-evaluation-harness) | Qwen2-72B-Instruct(官方) | |
C-Eval | 83.1 | 91.1 | 91.0 |
MMLU | 78.0 | 84.0 | 84.2 |
CMMLU | 83.3 | 91.3 | 90.1 |
GSM8K | 82.3 | 88.7 | 89.5 |
3.附录
3.1 MMLU数据集下载脚本
python
import os
from datasets import load_dataset
# List of all configuration names
config_names = [
'abstract_algebra', 'all', 'anatomy', 'astronomy', 'auxiliary_train', 'business_ethics',
'clinical_knowledge', 'college_biology', 'college_chemistry', 'college_computer_science',
'college_mathematics', 'college_medicine', 'college_physics', 'computer_security',
'conceptual_physics', 'econometrics', 'electrical_engineering', 'elementary_mathematics',
'formal_logic', 'global_facts', 'high_school_biology', 'high_school_chemistry',
'high_school_computer_science', 'high_school_european_history', 'high_school_geography',
'high_school_government_and_politics', 'high_school_macroeconomics', 'high_school_mathematics',
'high_school_microeconomics', 'high_school_physics', 'high_school_psychology',
'high_school_statistics', 'high_school_us_history', 'high_school_world_history', 'human_aging',
'human_sexuality', 'international_law', 'jurisprudence', 'logical_fallacies', 'machine_learning',
'management', 'marketing', 'medical_genetics', 'miscellaneous', 'moral_disputes', 'moral_scenarios',
'nutrition', 'philosophy', 'prehistory', 'professional_accounting', 'professional_law',
'professional_medicine', 'professional_psychology', 'public_relations', 'security_studies',
'sociology', 'us_foreign_policy', 'virology', 'world_religions']
# Loop through each configuration and save the dataset as Parquet
for config in config_names:
print(f"Downloading dataset with config: {config}")
dataset = load_dataset('cais/mmlu', config)
# Create directory if it does not exist
base_dir = f'datasets/mmlu/{config}'
os.makedirs(base_dir, exist_ok=True)
# Save the dataset splits as Parquet files
for split in dataset.keys():
split_dataset = dataset[split]
save_path = os.path.join(base_dir, f'{split}-00000-of-00001.parquet')
split_dataset.to_parquet(save_path)
print(f"Saved {config} - {split} to {save_path}")
3.2 MultiPL-E数据集下载脚本
python
from datasets import load_dataset
# 指定数据集名称
dataset_name = "nuprl/MultiPL-E"
# 配置名称列表
config_names = ['humaneval-clj', 'humaneval-cpp', 'humaneval-cs', 'humaneval-d',
'humaneval-elixir', 'humaneval-go', 'humaneval-hs', 'humaneval-java', 'humaneval-jl',
'humaneval-js', 'humaneval-lua', 'humaneval-ml', 'humaneval-php', 'humaneval-pl',
'humaneval-r', 'humaneval-rb', 'humaneval-rkt', 'humaneval-rs', 'humaneval-scala',
'humaneval-sh', 'humaneval-swift', 'humaneval-ts', 'mbpp-clj', 'mbpp-cpp', 'mbpp-cs',
'mbpp-d', 'mbpp-elixir', 'mbpp-go', 'mbpp-hs', 'mbpp-java', 'mbpp-jl', 'mbpp-js',
'mbpp-lua', 'mbpp-ml', 'mbpp-php', 'mbpp-pl', 'mbpp-r', 'mbpp-rb', 'mbpp-rkt',
'mbpp-rs', 'mbpp-scala', 'mbpp-sh', 'mbpp-swift', 'mbpp-ts']
# 逐个加载并保存数据集
for config_name in config_names:
# 加载数据集
dataset = load_dataset(dataset_name, config_name)
# 输出数据集的基本信息
print(f"Loaded dataset for config: {config_name}")
print(dataset)
# 保存数据集到本地
dataset.save_to_disk(f'datasets/MultiPL-E/{config_name}')
3.3 评测问题记录
1)问题1
解决方案:
bash
vi ~/.bash_profile
在文件中添加如下代码
bash
source ~/.bash_profile
2)问题2
【原因】:model.safetensors.index.json文件缺失
【解决方案】:补齐缺失文件
3)问题3
解决方案: