评测操作流程
用户按照参评要求进行注册,补充个人信息,等待平台审核。
审核通过后,用户登录可以点击【评测管理】按钮,进入【评测管理页面】。
用户可根据实际需求,选择模型评测或者创新算法评测。
NLP领域模型评测
创建评测
用户在评测任务列表页面,点击【创建评测】,弹出【创建评测】对话框,填写相关参数点击提交,跳转到模型评测实例详情页面。
参数名称 | 参数描述 |
---|---|
评测领域 |
|
模型名称 |
|
描述 |
|
评测任务 |
|
选择镜像 |
|
选择卡型 |
|
设置资源 |
|
模型类型 |
|
基座模型数据量(Token) |
|
基座模型名称 |
|
SFT数据量(条) |
|
模型参数规则/B |
|
Tokenizer 参数 |
|
tokenizer_name |
|
max_sequence_length |
|
end_of_text_token |
|
prefix_token |
|
用户提交评测实例,跳转到评测实例详情页面,分为上、左下、右下三部分:
上半部分:
- 显示用户【创建评测】时的具体参数。
- 用户操作有:【编辑】、【上传模型&代码】、【推理验证】、【启动推理评测】。
- 【编辑】操作:除模型名称和评测领域之外都允许编辑。
- 【上传模型&代码】操作:弹出上传模型和代码的引导页面。
【推理验证】操作:
- 平台从测试数据中随机抽取1——3条组成推理验证的数据,方便用户快速验证自己的模型与服务能否运行。
- 建议在正式启动推理评测之前,请先进行推理验证,发现问题可即时修复,也可以查看推理验证中的答案是否符合预期。
【启动推理评测】操作:用户推理验证模型与服务没问题后,可以点击启动推理评测,启动后整个推理评测的过程大概持续数个小时。
评测任务结束时会给用户发送邮件通知
。- 目前仅支持单机推理评测。
左下部分:
- 展示用户启动推理和推理验证的历次版本。
- 展示参数有:版本、任务类型、状态、提交人、操作。
- 任务类型有:推理验证&正式推理。
- 【停止】操作:点击该操作,推理过程结束。
右下部分包括:推理验证详情页面、模型推理进度页面、指标详情页面、日志页面。
- 推理验证tab页面:数据集进度展示(任务名称、数据集名称、状态);
- 验证结果——平台提供部分推理结果,用户可自行确认,数据字段:ID、Dataset、Sample、Label、Predict。
- 推理验证tab页面:数据集进度展示(任务名称、数据集名称、状态);
- 模型推理进度tab页面
- 主要记录推理提交时间;任务名称、数据集名称、状态、开始时间、结束时间。
- 推理过程:串行(任务数据集)推理。每个数据集的状态流转如下图。
- 指标详情页面。推理评测中,用户可以随时查看已经推理评测完的数据集的成绩,每个评测任务都计算自己的平均值。
- 整个推理任务结束后,用户可以根据自己的成绩自行选择是否提交到排行榜中,可以选择【匿名提交】或【具名提交】。
- 用户点击【具名提交&匿名提交】按钮,将成绩同步到NLP排行榜,与NLP排行榜格式保持一致。只有点击提交的成绩才会出现在排行榜上。
- 具名提交:展示提交人的真实姓名与组织单位;匿名提交:提交人的真实姓名与组织单位显示为:【匿名】二字。
注意:
- 用户每个月只有 5次 启动正式推理评测的机会。
主观推理评测
如果用户选择了【中文开放问答】任务,且为SFT模型,则会涉及主观推理与评测。
由于主观推理的评测,需要人工进行标注评测,成本比较大,因此限制每个用户一个月最多2次人工评测次数。等【中文开放问答】推理完成后,点击【启动人工评测】按钮即可。
上传模型&代码规范
(1) 安装 FlagEval-Serving
pip install flageval-serving
或
pip install --upgrade flageval-serving
参考https://github.com/FlagOpen/FlagEval/tree/master/flageval-serving
(2) 准备模型 & 代码
目录结构
如需接入 FlagEval 进行离线模型评测,需要将模型和代码放在同一个目录下:
demo/
├── model # 模型目录
│ └── info # 模型文件,请确保上传的模型权重文件格式与选择的卡型及框架匹配
├── local_guniconf.py # 服务配置文件
├── meta.json # 模型信息
└── service.py # 服务入口(其他依赖模块)
定义模型信息
meta.json
{
"parameter_scale_billion": 7 // 模型参数规模(单位十亿)
}
定义 Service
需要在 service.py
定义 Service
:
from flageval.serving.service import NLPModelService, NLPEvalRequest, NLPEvalResponse, NLPCompletion
class Service(NLPModelService):
def global_init(self, model_path: str):
print("Initial model with path", model_path)
def infer(self, req: NLPEvalRequest) -> NLPEvalResponse:
print(req)
return NLPEvalResponse(
completions=[
NLPCompletion(
text='Hello, world!',
tokens='Hello, world!',
),
]
)
global_init
用于全局初始化模型,服务启动时会调用一次;infer
用于处理推理请求,评测时调用。
本地模型调试
可以通过如下命令运行调试服务: 可添加指定环境的参数 如:--host http://ip:port 默认使用https://flageval.baai.ac.cn
也可以在host中添加 ip flageval.baai.ac.cn 来使用 (线上环境只接收https域名--默认值, 测试环境可以使用ip端口)
flageval-serving --service demo/service.py dev demo/model
然后即可构造 curl
请求进行测试:
curl -X POST http://127.0.0.1:5000/func -H 'Content-Type: application/json' -d '{
"engine": "hello",
"prompt": "hello",
"temperature": 1.5,
"num_return_sequences": 1,
"max_new_tokens": 1,
"top_p": 1,
"echo_prompt": false,
"top_k_per_token": 1,
"stop_sequences": []
}'
设置推理服务进程数
默认情况下,我们使用 1 个进程运行模型推理服务,如果需要个性化可以在 local_guniconf.py
中调整 workers
配置项:
workers = 4 # 使用 4 个 Worker 进程
模型上传
在页面点击【上传模型 & 代码】获取 token
然后填入下面的命令中:
flageval-serving upload --token='TOKEN' demo
上传速度根据上传主机的出口网络带宽和评测平台服务入口带宽决定,最大速度约12.5MB/s。
CV领域模型评测
目前Flageval平台支持用户上传CV的backbone预训练模型,支持backbone模型冻结参数后在不同任务、数据集下进行finetune生成下游任务模型,并在相应的测试数据集上进行推理评测,得到模型在该数据集上的评测指标。
创建评测
用户在评测任务列表页面,点击【创建评测】,弹出【创建评测】对话框,填写相关参数点击提交,跳转到模型评测实例详情页面。
参数名称 | 参数描述 |
---|---|
评测领域 |
|
模型名称 |
|
描述 |
|
评测任务 |
|
适配方法 |
|
选择镜像 |
|
选择卡型 |
|
设置资源 |
|
模型类型 |
|
模型参数规则/B |
|
用户提交评测实例,跳转到评测实例详情页面,分为上、左下、右下三部分:
上半部分:
显示用户【创建评测】时的具体参数。
用户操作有:【编辑】、【上传模型&代码】、【微调&推理验证】、【微调&推理评测】。
【编辑】操作:除模型名称和评测领域之外都允许编辑。
【上传模型&代码】操作:弹出上传模型和代码的引导页面。
【微调&推理验证】操作:
- 平台从验证数据中随机抽取1——3个epoch的数据组成微调验证的数据,方便用户快速验证自己的模型与服务能否运行。
- 建议在正式启动微调&推理评测之前,请先进行验证环节,发现问题可即时修复。
【微调&推理评测】操作:用户验证模型与服务没问题后,可以点击微调&推理评测,启动后整个微调+推理评测的过程大概持续数个小时。
评测任务结束时会给用户发送邮件通知
。- 目前仅支持单机微调与推理评测。
左下部分:
- 展示用户启动推理和推理验证的历次版本。
- 展示参数有:版本、任务类型、状态、提交人、操作。
- 任务类型有:推理验证&正式推理。
- 【停止】操作:点击该操作,推理过程结束。
右下部分包括:验证详情页面、微调&推理详情页面、日志页面。
- 验证详情页面:数据集进度展示(任务名称、数据集名称、状态);
- 微调&推理详情页面
- 主要记录任务名称、数据集名称、状态、评测指标、开始时间、结束时间。
- 日志页面
- 如果某个任务失败,用户可以通过查看日志定位失败原因。
注意:
- 用户每个月只有 5次 启动正式微调&推理评测的机会。
上传模型与代码规范
开源示例代码请参考github
(1) 安装 FlagEval-Serving
pip install flageval-serving
或
pip install --upgrade flageval-serving
参考https://github.com/FlagOpen/FlagEval/tree/master/flageval-serving
(2) 准备模型 & 代码
- 目录结构
需要将模型和代码放在同一个目录下:
开源示例代码请参考github
├── demo
│ ├── meta.json
│ ├── model # 模型相关代码,可以被model_adapter.py调用
| |—— checkpoint.pth
│ └── model_adapter.py
模型参数文件: 放在model/checkpoint.pth, 在模型初始化的时候,会通过字符串checkpoint_path传入模型路径。使用者读取之后自行初始化模型。注意,模型名和位置在上传的时候必须放在model目录下,并且以checkpoint.pth命名,否则系统会解析出错。
- model_adapter.py
通过ModelAdapter类的model_init方法,提供获取模型的借口,示例如下:
import os
import sys
# current_dir 为model_adapter.py所在的路径
# 如果需要访问文件系统,可以通过current_dir。如:
# abs_path = os.path.join(current_dir, yourfile) # yourfile为你的文件的相对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
from model.user_model import get_model # noqa E402
class ModelAdapter:
def model_init(self, checkpoint_path):
model = get_model()
# init weights form checkpoint path
return model
- meta.json
模型配置文件,提供模型的基本信息,其中train_batch_size
和val_batch_size
参数设置为可选,系统会提供默认值。
{
"model_name": "resnet_demo",
"is_rgb": true,
"output_channels": [256, 512, 1024, 2048], # backbone 输出feature的channel数
"output_dims": [4, 4, 4, 4], # backbone 输出feature的channel维度
"mean": [123.675, 116.28, 103.53], # 输入图像预处理的mean
"std": [58.395, 57.12, 57.375], # 输入图像预处理的std
"tasks": {
"classification": {
"train_batch_size": 128,
"val_batch_size": 128,
"out_indices": [3],
},
"segmentation": { # 分割只支持output_dims为4的feature
"train_batch_size": 8,
"val_batch_size": 8,
"out_indices": [0, 1, 2, 3],
},
"semi_supervised_classification": {
"train_batch_size": 32,
"val_batch_size": 128,
"out_indices": [3],
}
}
}
模型上传
在页面点击【上传模型 & 代码】获取 token
然后填入下面的命令中:
flageval-serving upload --token='TOKEN' demo
上传速度根据上传主机的出口网络带宽和评测平台服务入口带宽决定,最大速度约12.5MB/s。
BackBone模型格式规范
- BackBone输出格式规范
对于图像分类、图像检索,小样本分类和半监督任务,平台预置了全局平均池化层作为Neck、线性分类器作为Head,需要获得用户BackBone输出特征图的最后一层, 输出特征可以是一个三维的tensor,也可以是四维tensor,需要和 meta.json
中 output_dims
保持一致。
对于语义分割、深度估计等密集预测型任务,平台预置了不同的Head,需要获得用户BackBone输出的全部四层特征图。建议用户在BackBone的forward函数中将特征图格式处理为[B,C,H,W](B为Batch_size大小, C为特征维度大小,H、W分别为图片的高和宽),再将四层特征图以tuple格式输出。
SwinTransformer的forward函数示例代码如下:
def forward(self, x):
x, hw_shape = self.patch_embed(x)
if self.use_abs_pos_embed:
x = x + resize_pos_embed(
self.absolute_pos_embed, self.patch_resolution, hw_shape,
self.interpolate_mode, self.num_extra_tokens)
x = self.drop_after_pos(x)
outs = []
for i, stage in enumerate(self.stages):
x, hw_shape = stage(x, hw_shape)
if i in self.out_indices:
norm_layer = getattr(self, f'norm{i}')
out = norm_layer(x)
out = out.view(-1, *hw_shape,stage.out_channels).permute(0, 3, 1,2).contiguous()
outs.append(out)
return tuple(outs)
- 适配方法选择注意事项
针对语义分割分割任务,如果用户提交的BackBone采用的是类似Swin或ViT-Adapter的特征金字塔输出形式,请选择UPerNet作为适配方法。如果BackBone采用的是普通ViT输出形式,请选择SETR作为适配方法。
深度估计任务暂时不支持普通ViT架构的评测,仅支持特征金字塔输出形式的模型。对于后者,两个适配方法均可选择。
针对图像分类任务和图像检索任务,所有适配方法均可选择。
模型输入大小:
对于各个任务,模型输入尺寸如下:
- 图像分类、图像检索,小样本分类和半监督:224*224
- 深度估计:
- KITTI Eigen split数据集:352*1120
- NYU-Depth V2数据集:480*640
- 语义分割:512*512
Multimodal领域模型评测
目前Flageval平台支持用户上传Multimodal领域的直接推理模型(无需Finetune)进行推理评测。
创建评测
用户在评测任务列表页面,点击【创建评测】,弹出【创建评测】对话框,填写相关参数点击提交,跳转到模型评测实例详情页面。
参数名称 | 参数描述 |
---|---|
评测领域 |
|
模型名称 |
|
描述 |
|
评测任务 |
|
选择镜像 |
|
选择卡型 |
|
设置资源 |
|
模型类型 |
|
模型参数规则/B |
|
用户提交评测实例,跳转到评测实例详情页面,分为上、左下、右下三部分:
上半部分:
显示用户【创建评测】时的具体参数。
用户操作有:【编辑】、【上传模型&代码】、【推理验证】、【启动推理评测】。
【编辑】操作:除模型名称和评测领域之外都允许编辑。
【上传模型&代码】操作:弹出上传模型和代码的引导页面。
【推理验证】操作:
- 平台从测试数据中随机抽取1——3条组成推理验证的数据,方便用户快速验证自己的模型与服务能否运行。
- 建议在正式启动推理评测之前,请先进行推理验证,发现问题可即时修复,也可以查看推理验证中的答案是否符合预期。
【启动推理评测】操作:用户验证模型与服务没问题后,可以点击启动推理评测。
评测任务结束时会给用户发送邮件通知
。- 目前仅支持单机推理评测。
左下部分:
- 展示用户启动推理和推理验证的历次版本。
- 展示参数有:版本、任务类型、状态、提交人、操作。
- 任务类型有:推理验证&正式推理。
- 【停止】操作:点击该操作,推理过程结束。
右下部分包括:验证详情页面、推理评测详情页面、日志页面。
- 验证详情页面:数据集进度展示(任务名称、数据集名称、状态)以及验证数据结果;
- 推理评测详情页面
- 主要记录任务名称、数据集名称、状态、评测指标、开始时间、结束时间。
日志页面
- 如果某个任务失败,用户可以通过查看日志定位失败原因。
注意:
- 用户每个月只有 5次 正式启动推理评测的机会。
上传模型与代码规范
开源示例代码请参考github
(1) 安装 FlagEval-Serving
pip install flageval-serving
或
pip install --upgrade flageval-serving
参考https://github.com/FlagOpen/FlagEval/tree/master/flageval-serving
(2) 准备模型 & 代码
- 目录结构
使用flageval-serving上传的文件中,必要的两个文件如下,文件名必须使用checkpoint.pth
和run.sh
,存放在上传文件的根目录下:
example_model
├── checkpoint.pth # 模型初始化需要用的的权重文件,需要用户的代码自行载入,解析。
├── run.sh
└── .... # 其它的用户文件
checkpoint.pth
模型初始化需要用的的权重文件,需要用户的代码自行载入,解析。
run.sh
需要接受3个命令行参数,分别表示:task_name, server_ip, server_port, 第一个参数是任务名(retrieval, vqa, t2i),后两个参数是数据服务器ip和端口。run.sh内部没有限制,能确保程序运行,并输出符合预期的结果即可。
bash run.sh $task_name $server_ip $server_port
- 输出格式
vqa任务
对于每个数据集,输出一个list,list的每个元素为 {"question_id": int, "answer": str}
格式,表示对应id的问题和模型给出的答案,具体如下
[
{"question_id": str, "answer": str},
....
]
存储为json格式,路径为 "$output_dir"/"$dataset_name".json
retrieval任务
对于每个数据集,输出一个n*m的矩阵,表示第n张图片和第m个句子的相似度,使用np.ndarray格式,存储路径为 "$output_dir"/"$dataset_name".npy
t2i任务
对于每个数据集,输出n张图片到"$output_dir"
目录下,存储为png格式,图片命名为 ${prompt_id}.png
同时生成另一个文件"$output_dir/output_info.json"
,内容为一个json的list,每个元素需要包含 "id"(当前的question_id
)和 "image"
(生成的图片的名字,即相对于$output_dir
的路径),例如:
[
{
"id": "0",
"image": "0.png"
},
{
"id": "1",
"image": "1.png"
}
....
]
- 数据接口
用户需要通过http请求,获得数据,模型的路径,以及数据集相关信息。主要接口如下:
- io_info:存储用户输出的目录和模型文件路径
http://{server_ip}:{server_port}/io_info
{
'checkpoint_path': 'model checkpoint path',
'output_dir': 'output dir'
}
- meta_info:数据集的meta信息
http://{server_ip}:{server_port}/meta_info
# 对于vqa任务
{
'length': 图片数量,
'name': 数据集名称,
'type': 'vqa'
}
# 对于retrieval
{
'name': 数据集名称,
'image_number': 图片数量,
'caption_number': 文本数量,
'type': 'retrieval'
}
- get_data:获取数据的接口
- vqa任务
# index的取值范围为 [0, 图片数量)
http://{server_ip}:{server_port}/get_data?index={index}
{
"img_path": 一个list,每个元素为图片绝对路径,可以使用PIL,cv2等直接读取,
"question": 问题,是一个str,图片位置用<image1> <image2>
"question_id": question_id,
'type': 类型为str,是题目的类型
}
其中type可以为:
multiple-choice (单选题)
multiple-response (多选题)
fill-in-the-blank (填空题)
short-answer (简答题)
yes-no (判断题)
# 下面是一个实际的例子:
{'img_path': ['/share/projset/mmdataset/MathVista/images/20.jpg'],
'question': '<image 1>Hint: Please answer the question and provide the correct option letter, e.g., A, B, C, D, at the end.\nQuestion: Is the sum of smallest two bar is greater then the largest bar?\nChoices:\n(A) Yes\n(B) No',
'question_id': '20',
'type': 'multiple-choice'
}
- retrieval任务
# 读取图片,index的取值范围为 [0, 图片数量)
http://{server_ip}:{server_port}/get_data?index={index}&type=img
{
"img_path": 图片绝对路径,可以使用PIL,cv2等直接读取,
}
# 读取文本,index的取值范围为 [0, 文本数量)
http://{server_ip}:{server_port}/get_data?index={index}&type=text
{
"caption": 一个文本
}
- t2i任务
# index的取值范围为 [0, prompt数量)
http://{server_ip}:{server_port}/get_data?index={index}
{
"prompt": 一段描述图像的文本,是一个str,
"id": prompt id,int格式
}
- 使用样例: 获取模型checkpoint存储地址以及输出目录。
url = f"{server_ip}:{server_port}/io_info"
data = requests.get(url).json()
checkpoint_path = data['checkpoint_path']
output_dir = data['output_dir']
- 数据相关
# 获取vqa数据
url = f"{server_ip}:{server_port}/get_data?index=12"
data = requests.get(url).json()
# 获取retrieval文本
url = f"{server_ip}:{server_port}/get_data?index=10&type=text"
data = requests.get(url).json()
# 获取retrieval图像
url = f"{server_ip}:{server_port}/get_data?index=10&type=img"
data = requests.get(url).json()
模型上传
在页面点击【上传模型 & 代码】获取 token
然后填入下面的命令中:
flageval-serving upload --token='TOKEN' demo
上传速度根据上传主机的出口网络带宽和评测平台服务入口带宽决定,最大速度约12.5MB/s。
flageval-serving的更多使用教程请参考章节
Audio语音领域模型评测
目前Flageval平台支持用户上传Audio语音领域的backbone预训练模型,支持backbone模型冻结参数后在不同任务、数据集下进行finetune生成下游任务模型,并在相应的测试数据集上进行推理评测,得到模型在该数据集上的评测指标。
创建评测
用户在评测任务列表页面,点击【创建评测】,弹出【创建评测】对话框,填写相关参数点击提交,跳转到模型评测实例详情页面。
参数名称 | 参数描述 |
---|---|
评测领域 |
|
模型名称 |
|
描述 |
|
评测任务 |
|
选择镜像 |
|
选择卡型 |
|
设置资源 |
|
模型类型 |
|
模型参数规则/B |
|
用户提交评测实例,跳转到评测实例详情页面,分为上、左下、右下三部分:
上半部分:
显示用户【创建评测】时的具体参数。
用户操作有:【编辑】、【上传模型&代码】、【启动推理评测】。
【编辑】操作:除模型名称和评测领域之外都允许编辑。
【上传模型&代码】操作:弹出上传模型和代码的引导页面。
【启动推理评测】操作:用户验证模型与服务没问题后,可以点击启动推理评测。
评测任务结束时会给用户发送邮件通知
。- 目前仅支持单机推理评测。
左下部分:
- 展示用户启动推理和推理验证的历次版本。
- 展示参数有:版本、任务类型、状态、提交人、操作。
- 任务类型有:推理验证&正式推理。
- 【停止】操作:点击该操作,推理过程结束。
右下部分包括:验证详情页面、推理评测详情页面、日志页面。
- 验证详情页面:数据集进度展示(任务名称、数据集名称、状态)以及验证数据结果;
- 推理评测详情页面
- 主要记录任务名称、数据集名称、状态、评测指标、开始时间、结束时间。
日志页面
- 如果某个任务失败,用户可以通过查看日志定位失败原因。
注意:
- 用户每个月只有 5次 正式启动推理评测的机会。
上传模型与代码规范
开源示例代码请参考github
(1) 安装 FlagEval-Serving
pip install flageval-serving
或
pip install --upgrade flageval-serving
参考https://github.com/FlagOpen/FlagEval/tree/master/flageval-serving
(2) 准备模型 & 代码
目前平台仅支持BackBone模型进行finetune后进行推理评测,下面是关于添加上游模型(BackBone)及其所需组件的步骤:
首先,上游模型文件夹组织结构 (Folder Structure) 如下,平台提供了示例结构与代码,详情请参考具体的代码:
upstream/example_model
├── model.py
├── convert.py
└── ModelWrapper.py
在 model.py
中, 需要实现两个数据类: ExamplePretrainingConfig
和 exampleconfig
。分别初始化预训练参数配置和模型结构,具体要求如下:
ExamplePretrainingConfig
: 使用该类来配置预训练参数,例如采样率,输入数据的最大最小长度等,例如upstream/wav2vec2/wa2vec2_model.py/AudioPretrainingConfig
。ExampleConfig
: : 该类配置自定义模型的架构参数,例如编码器层的数量、各层网络输入输出的维度、dropout的大小等。
此外,model.py
应该实现 ExampleModel
类,即定义模型结构,请尽量使用pytorch实现,避免额外的依赖。
@dataclass
class ExamplePretrainingConfig:
sample_rate: int = field(
default=16_000,
metadata={
"help": "target sample rate. audio files will be up/down sampled to this rate"
},
)
max_sample_size: Optional[int] = field(
default=None, metadata={"help": "max sample size to crop to for batching"}
)
min_sample_size: Optional[int] = field(
default=None, metadata={"help": "min sample size to skip small examples"}
)
pass
@dataclass
class ExampleConfig:
encoder_layers: int = field(
default=12, metadata={"help": "num encoder layers in the transformer"}
)
pass
class ExampleModel(nn.Module):
def __init__(self, config):
super(ExampleModel, self).__init__()
pass
def forward(self, wavs, padding_mask):
pass
return features, mask
- convert.py
convert.py
文件用于将checkpoint转换为与我们项目兼容的格式。转换后的检查点结构应该如下所示 。
{
"task_cfg": , # Configuration for ExamplePretrainingConfig
"model_cfg", # Configuration for ExampleConfig
"model_weight", # Load model weights using model.load_state_dict(ckpt_state["model_weight"])
}
用户可以使用 convert.py
中提供的 load_converted_model
函数来验证转换后模型的兼容性。
def load_converted_model(ckpt: str):
ckpt_state = torch.load(ckpt, map_location="cpu")
for required_key in ["task_cfg", "model_cfg", "model_weight"]:
if required_key not in ckpt_state:
raise ValueError(
f"{ckpt} is not a valid checkpoint since the required key: {required_key} is missing"
)
task_cfg = merge_with_parent(ExamplePretrainingConfig, ckpt_state["task_cfg"])
model_cfg = merge_with_parent(ExampleConfig, ckpt_state["model_cfg"])
model = ExampleModel(model_cfg)
model.load_state_dict(ckpt_state["model_weight"])
return model, task_cfg
- ModelWrapper.py
ModelWrapper.py
作为平台上游模型的统一接口。该文件中需要创建一个类,例如 MyModel
,结构如下 :
class MyModel(nn.Module):
def __init__(self, load_type, **kwargs):
super(MyModel, self).__init__()
# 在这里初始化并且载入你的模型
# to get config and .pt file
ckpt_state = torch.load(ckpt, map_location="cpu")
self.task_cfg = merge_with_parent(ExamplePretrainingConfig, ckpt_state["task_cfg"])
self.model_cfg = merge_with_parent(ExamplePretrainingConfig, ckpt_state["model_cfg"])
self.model = ExampleModel(self.model_cfg)
self.model.load_state_dict(ckpt_state["model_weight"])
def forward(self, wavs, padding_mask=None):
device = wavs[0].device
# 实现forward结构,并且返回feature和feature_mask。维度均为(B*L*D)
def get_output_dim(self):
# 定义你的模型的输出维度D,以768为例。
return 768
创新算法验证
创建评测
用户点击【创建评测】,选择【创新算法验证】,弹出【创建评测】对话框,填写相应参数:
参数名称 | 参数描述 |
---|---|
名称 |
|
描述 |
|
选择镜像 |
|
选择卡型 |
|
节点配置 |
|
代码&数据 |
|
用户点击【提交】进入评测详情页面,上传代码&数据。
上传待评测文件规范
开源示例代码请参考github
- 准备待评测文件:
用户需要将数据和代码放在同一个目录下,目录结构如下:
demo/
├── dataset # 前1000 iteration需要的数据集,如果需要用到pretrain模型,请和数据一并上传
├── code # 算法验证需要用的代码
├── targets # 前1000个iteration的目标loss
├── task_name1.json
├── task_name2.json
├── meta.json # 模型信息,以及需要验证的算法
├── run.sh # 算法验证的启动脚本
meta.json的格式如下,需要在meta中提供需要进行算法验证的任务的名字:
{
"model_name": "demo",
"tasks": ["task_name1", "task_name2"]
}
平台会遍历meta.json里面的tasks变量,每一次遍历都会调用用户的脚本:
bash run.sh ${task_name}
注意:
1、tasks里的${task_name}要和targets目录里面的${task_name}.json一致。
2、用户代码中必须有meta.json, run.sh, targets。
3、核心代码是run.sh。此脚本要求生成一个json文件,文件名任意(例如文件名是output.json)。json格式要和targets的${task_name}.json一致。然后请把此文件复制给平台:
# $FLAGEVAL_OUTPUT_PATH 为平台的环境变量,不用赋值直接使用。
cp ./output.json $FLAGEVAL_OUTPUT_PATH
4、run.sh中可以用到如下环境变量:
# master节点的数量
echo $FLAGEVAL_MASTER_COUNT
# worker节点的数量
echo $FLAGEVAL_WORKER_COUNT
# master节点的ip地址。如果有多个master节点,则变量为第一个master的ip
echo $FLAGEVAL_MASTER_IP
# 当前节点是master还是worker. 值只可能为 "master" 或 "worker"
echo $FLAGEVAL_NODE
# 当前节点是第几个节点。所有master节点的值都为0。worker节点的num为1, 2, 3...
echo $FLAGEVAL_NODE_NUM
# 输出结果的路径。如果get_res.py为输出结果json的文件,则可以写为:python get_res.py > $FLAGEVAL_OUTPUT_PATH
echo $FLAGEVAL_OUTPUT_PATH
- 安装Flageval-serving工具进行上传。详情参考文件上传工具
上传完成后用户可以点击【查看文件】查看已经上传的文件,如有需要还可以删除、编辑、重新上传新文件。
启动评测
用户点击【启动】按钮,启动正式的评测,可以在日志中查看评测日志详情。
创新算法验证阶段旨在验证项目提出算法的可复现性,确保相同的数据、代码及环境可以复现相同的实验结果。主要步骤如下:
- 运行代码,记录所有loss。
- 记录的loss和基准loss比对。
- 日志输出格式:
- 在模型训练的前1000个iteration中,需记录所有loss,并将其以JSON格式存储至输出/output目录,命名为task_name_log.txt。
- loss需要保留3位小数。
- 样例如下:
{
"total_loss": [4.321, 3.31, 4.412, 1.422, ……],
"reg_loss": [2.231, 2.417, 0.813, 1.230, ……..]
}
- 测试方法:
- 逐个iteration对比loss,每个iteration可以有多个loss,所有loss和基准loss的差异在计算方式为:
(train_loss_per_iter – base_loss_per_iter)/ base_loss_per_iter
测试团队将记录的loss和基准loss进行比对,计算差异,给出创新算法验证阶段测试结果报告。
差异值平均值计算公式为:
差异值平均值= sum(ABS(平台训练loss - 基准loss)) / length(平台训练loss)
flageval-serving工具详细教程
用户可以通过安装 FlagEval-Serving工具上传模型、代码、数据等待评测文件,也可以通过该工具进行本地测试。
操作流程如下:
(1) 安装 FlagEval-Serving
pip install flageval-serving
或
pip install --upgrade flageval-serving
工具开源: https://github.com/FlagOpen/FlagEval/tree/master/flageval-serving
(2) 准备代码 & 模型 & 数据
不同领域的评测需要不同的目录结构和接口规范,请参考各个领域的要求准备待上传文档即可。NLP领域的模型评测还可以支持本地模型调试,请参考NLP领域的操作流程规范。
(3) 常用命令
- 用户上传更新文件需要唯一的 token 进行确认。
- 评测详情页面点击【上传模型 & 代码】获取 token 用于初始化创建评测目录。
- 若用户在当前版本追加文件,用cp命令,且用文件列表页面的 token 进行更新。
- 注意:下面命令中都是英文单引号。
命令 | 含义 | 备注 |
---|---|---|
pip install --upgrade flageval-serving | 更新到最新版本 | 请更新到最新版本使用 |
flageval-serving upload --token='new token' /demo | 将本地的demo文件夹上传到Flageval平台,这里 'new token' 在评测详情页面【上传模型 & 代码】处获取。 | ![]() |
flageval-serving cp --token='old token' /temp /remote | 将本地·文件夹追加到'old token'对用的·远程目录下。效果和linux的cp目录相同:
| 这里只能用文件详情页面的old token ,不能用新token 。 |
flageval-serving ls --token='old token' /remote | 列举平台/remote下的目录和文件 | |
flageval-serving | 输出help相关命令 |
(3) 文件上传
在页面点击【上传模型 & 代码】获取 token
然后填入下面的命令中:
flageval-serving upload --token='TOKEN' demo
上传速度根据上传主机的出口网络带宽和评测平台服务入口带宽决定,最大速度约12.5MB/s。
镜像管理
用户点击【评测管理/镜像管理】可以查看平台的预置镜像和自定义镜像列表(自己导入镜像的管理列表)。
- 预置镜像:Flageval平台为用户提供了各个领域的包括各种评测依赖的预置镜像供用户直接使用。用户可以根据镜像名称、镜像描述、训练框架、适配机型和标签,确定镜像的详细信息。
- 自定义镜像:Flageval平台支持用户导入自己构建好的镜像用于评测任务。
目前平台仅支持用户已有镜像导入,不支持利用dockerfile在平台构建镜像,用户填写的 dockerfile 仅用于平台审核人员审查镜像
。
用户点击【+导入镜像】,弹出【+导入镜像】对话框,填写相应参数,点击提交:
参数 | 参数解释 |
---|---|
镜像名称 |
|
镜像tag |
|
导入方式 |
|
待导入镜像URL |
|
Dockerfile |
|
镜像说明 |
|
用户点击【提交】后,返回【镜像管理】列表页面。等待平台管理员审核导入镜像,审核通过后,会直接将该镜像导入到平台的镜像仓库,用户即可在创建评测时使用导入的镜像。
如果审核不通过,请查看审核不通过的原因,根据平台规范修改导入镜像的地址或者Dockerfile,重新导入。
审核通过、导入成功、审核不通过都会给用户发送邮件通知,如果长时间没有状态反馈,请联系平台管理员反馈问题。
基于 Dockerfile 自定义构建镜像
Dockerfile 是一种用于构建镜像的文本文件,其中包含了一系列的镜像构建指令和参数,Docker通过docker build执行Dockerfile中的一系列指令自动构建镜像。关于 Dockerfile 的语法详见其官方文档,同时可以参考快速入门手册。
用户进行离线评测时,如果平台提供的镜像不满足用户需求,用户可以提供 Dockerfile,平台帮助生成可用的镜像 。
常用关键词如下:
命令关键词 | 含义 |
---|---|
FORM | 基础镜像,表明当前镜像是基于哪个镜像的。Dockerfile第一行必须为From命令,选择的基础镜像必须是安全可信镜像,建议优先选择平台预置镜像以及官方提供的镜像。 |
RUN | 容器构建时需要用到的命令。 |
ENV | 用来构建镜像过程中设置环境变量 (ENV MY_PATH="/usr/mytest"),持久化至容器中,容器启动后可以直接获取。 |
ARG | 构建时使用的临时变量 (ARG TMP="mytemp"),仅供构建期间使用,容器启动后无法获取。 |
注意
- ENV中的以下环境变量是容器给出的,不允许修改。
- NVIDIA_, HOSTNAME, KUBERNETES_, RANK, MASTER_, AIRS_, CUDA_, NCCL_, PADDLE_* Dockerfile使用建议:
- From 选择的基础镜像必须为平台提供的候选镜像。
- 减少镜像层数(layers),RUN, COPY 等指令会在 build 时产生对应的 layer,因此建议使用&&来连接多个命令。
下面命令行创建了2层镜像:
RUN apt-get install -y openssh-server
RUN mkdir -p /run/sshd
修改为以下命令行后,2层变1层,可以有效减小镜像大小。
RUN apt-get install -y openssh-server \
&& mkdir -p /run/sshd
- 当指令比较长时, 建议分行,且建议多行参数进行排序。
- 可以将需要安装的多个包按字母进行排序,避免重复安装,同时提高代码可读性,如下示例。
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion \
&& rm -rf /var/lib/apt/lists/*
- 通过清理缓存减小镜像大小。
- 如 RUN apt-get -y *** && apt-get clean。
- 安装python包的时候建议使用 RUN pip install --no-cache-dir -i {指定源地址} {package} 来安装。
- 安装conda相关包的时候建议后面跟上clean命令,不同参数表示的含义为:
- RUN conda clean -p (删除没用的包)
- RUN conda clean -t (删除tar包)
- RUN conda clean -y --all (删除所有安装包和缓存文件)
- 通过 docker build 命令的 --no-cache=true 选项,不使用缓存。
- Dockerfile示例:该示例对应平台的镜像是flageval-nlp-ngc-pytorch2303:v1.0,该镜像已满足YuLan-Chat-2-13b、llama、chatglm2-6b、Baichuan-13B-Chat等主流模型的环境需求。如果该镜像满足需求,建议选择使用
FROM nvcr.io/nvidia/pytorch:23.03-py3
RUN apt-get update
RUN apt-get install -y openssh-server && mkdir -p /run/sshd
# 下列版本为建议版本,用户可根据自己模型的需求来安装, 建议transformer的包和其他包分开安装
RUN pip install --no-cache-dir transformer-engine==0.6.0 transformers==4.31.0 transformers-stream-generator==0.0.4
RUN pip install --no-cache-dir sentencepiece==0.1.98 accelerate==0.21.0 colorama==0.4.6 cpm_kernels==1.0.11 streamlit==1.25.0 fairscale==0.4.13
# Qwen
RUN pip install tiktoken
平台镜像审核原则
平台目前主要提供英伟达卡系列显卡,建议使用英伟达官方提供的镜像(nvcr.io/nvidia)作为基础镜像。如使用pytorch框架,建议选用nvcr.io/nvidia下的pytorch镜像作为FROM来源,对于其他来源的镜像,如审核人员判断存在安全风险则审核不通过。
如果使用其他品牌的显卡,可先使用平台提供的镜像进行测试,如不满足需求,请联系运维人员(flageval@baai.ac.cn)进行处理。
对dockerfile有以下几点建议:
- Dockerfile 第一行必须为 FROM 命令,指明基础镜像来源,否则驳回镜像导入请求;
- 镜像中需要平台与后端k8s集群进行通讯,需要安装ssh;
- 在dockerfile中尽量不要出现COPY、ADD等命令,如果使用这两个命令需加上注释说明其内容;
- 根据镜像的安全性要求,RUN中不能有wget、curl等下载未知包的操作;
- 用户需使用系统自带的命令安装系统官方包;
- 填写的导入镜像URL需要能使用docker命令下载;
- 在安装包的时候尽量指定使用国内的源。
平台对镜像大小限制:40Gi。
Dockerfile示例:该示例对应平台的镜像是flageval-nlp-ngc-pytorch2303:v1.0,该镜像已满足YuLan-Chat-2-13b、llama、chatglm2-6b、Baichuan-13B-Chat等主流模型的环境需求。如果该镜像满足需求,建议选择使用。
FROM nvcr.io/nvidia/pytorch:23.03-py3
RUN apt-get update
RUN apt-get install -y openssh-server && mkdir -p /run/sshd
# 下列版本为建议版本,用户可根据自己模型的需求来安装, 建议transformer的包和其他包分开安装
RUN pip install --no-cache-dir transformer-engine==0.6.0 transformers==4.31.0 transformers-stream-generator==0.0.4
RUN pip install --no-cache-dir sentencepiece==0.1.98 accelerate==0.21.0 colorama==0.4.6 cpm_kernels==1.0.11 streamlit==1.25.0 fairscale==0.4.13
# Qwen
RUN pip install tiktoken
- 镜像安全必备要求
- 禁止镜像存在公开可利用的且已公布修复方案的高危安全漏洞。
- 禁止使用官方已停止维护的发行版本进行镜像。
- 禁止镜像默认安装任何病毒、木马、后门、挖矿以及挂机等恶意程序。
- 禁止使用任何盗版或者破解版程序。
- 禁止使用包含一切其他可能会危害平台安全的任意程序。
注意:为确保服务镜像的安全性和合规性,我们会定期对已上架的镜像进行扫描。如果发现镜像存在安全漏洞或违规行为,我们将下架该镜像,并追究上传者的法律责任。感谢您对我们平台的支持和配合。
排行榜
参与评测任务的用户可以在【导航栏-排行榜】查看【我的成绩】,排行榜默认展现用户提交的评测任务的汇总。
排行榜说明:
评测方式说明:在评测时,FlagEval 根据数据集的不同规模进行了自动化采样。
平均值(Mean值)计算说明:每个平均值是对应的所有数据集指标的算数平均,例如:
a. “Mean(主观+客观)”是指所有数据集指标的算数平均,而不是Mean(客观)与Mean(主观)的平均。
b. “中文Mean(客观)”是指所有中文客观数据集指标的算数平均(当前指中文选择问答&中文文本分类任务中的客观数据集)。
局限性说明:
a. 由于评测数据集的规模限制,评测结果也会存在一定的局限性,后续我们也会尽可能地关注评测数据集的多样性、完善数据集的构建方法和评测方式。
b. 评测体系方法及相关研究还需要继续深入,当前对模型能力的覆盖程度仍有很大的进步空间,能力框架正在进一步完善。
c. 目前主观评测尚未覆盖的能力维度,如“领域综合能力”和“通用综合能力”,也会在后续中进行迭代升级。