Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 模块内部管控调用迁移到 V2 #853

Open
wants to merge 35 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
be3d0d8
更新 Redis 依赖未安装的 Warning 信息
Dobiichi-Origami Oct 29, 2024
5326d24
初步迁移 Dataset 到 V2
Dobiichi-Origami Oct 31, 2024
34dfb20
Merge branch 'main' into dataset_calling_v2_update
Dobiichi-Origami Nov 4, 2024
aeab72a
修改单测以适配新的 V2 Dataset
Dobiichi-Origami Nov 4, 2024
6c3a42e
Evaluation 迁移 V2
Dobiichi-Origami Nov 5, 2024
1388dfe
Merge branch 'main' into dataset_calling_v2_update
Dobiichi-Origami Nov 12, 2024
eeafede
修改文档,迁移模型发布功能到 v2
Dobiichi-Origami Nov 13, 2024
79d7fa6
模型发布功能 Bugfix
Dobiichi-Origami Nov 13, 2024
e697c8b
修复由于接口文档与实际返回不对导致的 Bug
Dobiichi-Origami Nov 14, 2024
88152b4
修复单测问题
Dobiichi-Origami Nov 15, 2024
f595b74
修改函数入参
Dobiichi-Origami Nov 18, 2024
c6aaec9
修复了 create_from_bos_file 的 bug
Dobiichi-Origami Nov 25, 2024
c3a12f8
本地数据集兼容具有字段缺失的情况
Dobiichi-Origami Nov 27, 2024
24929cc
从 QianfanDataSource 中删除 ak, sk 字段,支持 SFT 数据集清洗
Dobiichi-Origami Nov 29, 2024
d757050
支持 PromptImageResponse 类型数据集
Dobiichi-Origami Dec 2, 2024
3388226
修复单测错误
Dobiichi-Origami Dec 3, 2024
4b2c477
Merge branch 'main' into dataset_calling_v2_update
Dobiichi-Origami Dec 3, 2024
e454abf
模型服务部署参数更新
Dobiichi-Origami Dec 3, 2024
0e16daa
FakePyarrow 添加 Schema
Dobiichi-Origami Dec 3, 2024
2409ce2
创建服务 reservation 参数错误
Dobiichi-Origami Dec 3, 2024
f699e5e
正则表达式匹配 bos 路径时不强制要求尾随左下划线
Dobiichi-Origami Dec 3, 2024
ce6ac05
模型压缩任务参数 config 更名为 comp_config
Dobiichi-Origami Dec 3, 2024
09a896a
在未安装 pyarrow 且需要直接上传数据集的时候统一上传前后的文件拓展名
Dobiichi-Origami Dec 3, 2024
45ceb70
刷新文档参数
Dobiichi-Origami Dec 4, 2024
4a3105f
管控接口调用在检查到接口返回失败时打印日志
Dobiichi-Origami Dec 4, 2024
1e355f0
修改 _get_transmission_bos_info 以确保返回的 bos 路径以 / 开头
Dobiichi-Origami Dec 4, 2024
c170435
更新 cookbook 中的传参
Dobiichi-Origami Dec 5, 2024
eddc2d4
支持手动设置覆盖千帆数据集上传时的文件格式
Dobiichi-Origami Dec 5, 2024
35691ca
save 到千帆数据源时支持传入备用 ak sk
Dobiichi-Origami Dec 9, 2024
f3b4ec0
bug 修复,支持在传入 dataset_version_id 时指定文件格式
Dobiichi-Origami Dec 10, 2024
84945cb
使用 _extract_all_with_utf8 来替换 zipfile 对象的 extractall 方法以解决 cp437 默认编码的问题
Dobiichi-Origami Dec 10, 2024
5ae29fc
移除从分享链接上传 Bos 的方式,修改 text 类型数据集的打包方式
Dobiichi-Origami Dec 12, 2024
a0c074d
移除 csv.DictReader 构造函数中的 kwargs
Dobiichi-Origami Dec 12, 2024
07d7577
更新文档
Dobiichi-Origami Dec 18, 2024
5d66312
当不能使用 cp437 解码时回退到 utf8
Dobiichi-Origami Dec 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ print(resp["result"])
```python
from qianfan.dataset import Dataset

ds = Dataset.load(qianfan_dataset_id="your_dataset_id")
ds = Dataset.load(qianfan_dataset_version_id="your_dataset_id")
```

且千帆 Python SDK 集成了一系列本地的数据处理功能,允许用户在本地对来自多个数据源的数据进行增删改查等操作,详见[Dataset 框架](./docs/dataset.md)。
Expand All @@ -192,34 +192,38 @@ from qianfan.dataset import Dataset
# 从本地文件导入
ds = Dataset.load(data_file="path/to/dataset_file.json")


def filter_func(row: Dict[str, Any]) -> bool:
return "answer" in row.keys()
return "answer" in row.keys()


def map_func(row: Dict[str, Any]) -> Dict[str, Any]:
return {
"prompt": row["question"],
"response": row["answer"],
}
return {
"prompt": row["question"],
"response": row["answer"],
}


# 链式调用处理数据
ds.filter(filter_func).map(map_func).pack()

# 上传到千帆
# 数据集只有上传到千帆后才可以用于训练
# 请确保你的数据集格式符合要求
ds.save(qianfan_dataset_id="your_dataset_id")
ds.save(qianfan_dataset_version_id="your_dataset_id")
```

#### Trainer

千帆 Python SDK 以Pipeline为基础串联整个模型训练的流程,同时允许用户更好的把控训练流程状态 [Trainer 框架](./docs/trainer.md)。
以下是一个快速实现ERNIE-Speed-8K fine-tuning的例子:

```python
from qianfan.dataset import Dataset
from qianfan.trainer import Finetune

# 加载千帆平台上的数据集
ds: Dataset = Dataset.load(qianfan_dataset_id="ds-xxx")
ds: Dataset = Dataset.load(qianfan_dataset_version_id="ds-xxx")

# 新建trainer LLMFinetune,最少传入train_type和dataset
# 注意fine-tune任务需要指定的数据集类型要求为有标注的非排序对话数据集。
Expand All @@ -242,7 +246,7 @@ trainer.run()
from qianfan.model import Model
from qianfan.dataset import Dataset

ds = Dataset.load(qianfan_dataset_id="ds-xx")
ds = Dataset.load(qianfan_dataset_version_id="ds-xx")
m = Model(version_id="amv-xx")

m.batch_inference(dataset=ds)
Expand Down
2 changes: 1 addition & 1 deletion docs/batch_inference.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ Dataset 还支持使用平台上预置的模型或者用户训练完成的模型

```python
# 加载千帆平台上的数据集
qianfan_ds = Dataset.load(qianfan_dataset_id=cloud_dataset_id)
qianfan_ds = Dataset.load(qianfan_dataset_version_id=cloud_dataset_id)

result = qianfan_ds.test_using_llm(model_version_id="amv-qb8ijukaish3")
print(result[0])
Expand Down
2 changes: 1 addition & 1 deletion docs/data.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 数据集
# 数据集 V1

目前支持的数据集管理操作有:
- [创建数据集](#创建数据集)
Expand Down
82 changes: 45 additions & 37 deletions docs/dataset.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ from qianfan.dataset import Dataset
ds = Dataset.load(data_file="path/to/dataset_file.jsonl")

# 从千帆导入
ds = Dataset.load(qianfan_dataset_id="your_dataset_id")
ds = Dataset.load(qianfan_dataset_version_id="your_dataset_version_id")
```

### 处理数据集
Expand Down Expand Up @@ -107,7 +107,7 @@ print(ds.filter(filter_func).map(map_func).list())
new_ds = ds.save(data_file="path/to/local_file.csv")

# 导出到千帆平台
new_ds = ds.save(qianfan_dataset_id="your_dataset_id")
new_ds = ds.save(qianfan_dataset_version_id="your_dataset_version_id")

# 或者导出到它导入的地方
new_ds = ds.save()
Expand Down Expand Up @@ -269,7 +269,7 @@ new_ds = ds.save(data_file="file.json", batch_size=100)
```python
from qianfan.dataset import Dataset

ds_qianfan = Dataset.load(qianfan_dataset_id="your_dataset_id")
ds_qianfan = Dataset.load(qianfan_dataset_version_id="your_dataset_version_id")
print(ds_qianfan.list())
```

Expand All @@ -280,7 +280,7 @@ print(ds_qianfan.list())
```python
from qianfan.dataset import Dataset

ds_local = Dataset.load(qianfan_dataset_id="your_dataset_id").save(data_file="your_file_path")
ds_local = Dataset.load(qianfan_dataset_version_id="your_dataset_version_id").save(data_file="your_file_path")
print(ds_local.list())
```

Expand All @@ -292,48 +292,58 @@ print(ds_local.list())

主要的参数包括:
+ name: 千帆平台数据集名称
+ template_type: 千帆平台数据集模板类型
+ dataset_format: 千帆平台数据集类型
+ storage_type: 千帆平台数据集存储类型

```python
from qianfan.resources.console.consts import V2 as V2Consts

ds_qianfan.save(
qianfan_dataset_create_args={
"name": "example_name",
"template_type": DataTemplateType.NonSortedConversation,
"storage_type": DataStorageType.PrivateBos,
"storage_id": "your_bucket_name",
"storage_path": "/your_desired_dataset_path/",
"dataset_format": V2Consts.DatasetFormat.PromptResponse,
"storage_type": V2Consts.StorageType.Bos,
"storage_path": "bos://bucket/dir/"
},
)
```

> 以 `sup` 开头的参数为辅助上传数据集时用到的 Bos 信息。当且仅当目标的千帆数据集使用公共存储(公共 BOS,对应 `DataStorageType.PublicBos`)数据时需要填写,详情见下
> 以 `sup` 开头的参数为辅助上传数据集时用到的 Bos 信息。当且仅当目标的千帆数据集使用公共存储(公共 BOS,对应 `V2Consts.StorageType.SysStorage`)数据时需要填写,详情见下

+ 另一种导出方式是增量导出到已经存在的数据集当中:填写 `save` 函数的 `qianfan_dataset_id` 参数(和 `load` 方法一致)。如果是导出到原本导入的数据集,则可以忽略 `qianfan_dataset_id` 参数。
+ 另一种导出方式是导出到事先创建好的数据集当中:填写 `save` 函数的 `qianfan_dataset_version_id` 参数(和 `load` 方法一致)。如果是导出到原本创建为对象的数据集,则可以忽略 `qianfan_dataset_version_id` 参数。

```python
ds_qianfan.save(qianfan_dataset_id="your_dataset_id")
# 如果是导出到原本导入的数据集,可以忽略该参数
ds_qianfan.save(qianfan_dataset_version_id="your_dataset_version_id")
# 如果是导出到原本创建为对象数据集,可以忽略该参数
ds_qianfan.save()
```

​ 这种导出方式目前暂不支持导出到新数据集版本进行覆盖导出。若用户有覆盖导出的需求,请使用方式一。
+ 还有一种导出方式是直接导出到数据集的新版本中,这个要求用户使用 `QianfanDataSource` 来创建新的数据集版本。有关 `QianfanDataSource` 的介绍见下

```python
from qianfan.dataset.data_source import QianfanDataSource

target_data_source = QianfanDataSource.get_existed_dataset(version_id="your_version_id")
new_data_source = target_data_source.create_new_version()

ds_qianfan.save(qianfan_dataset_version_id=new_data_source.id)
```

#### 千帆数据源

和从文件系统导入一致,千帆 Python SDK 也同样内置了千帆数据源,用作数据集 `load` 或者 `save` 操作的入参。目前 SDK 支持用户在本地全新创建一个千帆数据源,代表在千帆平台上创建一个新的数据集组,默认包含一个数据集;或者在本地创建一个千帆数据源以代表平台上已经存在的数据集。

```python
from qianfan.dataset import DataTemplateType
from qianfan.dataset.data_source import QianfanDataSource
from qianfan.resources.console.consts import V2 as V2Consts

# 创建一个映射到已存在的数据集的千帆数据源
data_source = QianfanDataSource.get_existed_dataset("your_dataset_id")
data_source = QianfanDataSource.get_existed_dataset("your_dataset_version_id")

# 创建一个全新的数据源,同时在平台创建一个新的数据集组
data_source = QianfanDataSource.create_bare_dataset(
"data_group_name",
DataTemplateType.NonSortedConversation
V2Consts.DatasetFormat.PromptResponse,
)
```

Expand All @@ -343,11 +353,11 @@ data_source = QianfanDataSource.create_bare_dataset(
#### 导出格式

为了能够将数据集导出到千帆平台,被导出的数据集应该符合一定的格式要求。我们在下面列出了对应数据集类型的单条数据集格式:
+ Prompt+Response: `[{"prompt": "", "response": [[""]]}]`
+ Prompt+多Response排序: `[{"prompt": "", "response": [["", "", ...]]}]`
+ 纯文本: `""`
+ Prompt集: `{"prompt": ""}`
+ Prompt集+图片: `{"annotation": "", "image_path": "path/to/image_file"}`
+ PromptResponse: `[{"prompt": "", "response": [[""]]}]`
+ PromptSortedResponses: `[{"prompt": "", "response": [["", "", ...]]}]`
+ Text: `""`
+ Prompt: `{"prompt": ""}`
+ PromptImage: `{"annotation": "", "image_path": "path/to/image_file"}`

### 从 HuggingFace 数据集导入

Expand Down Expand Up @@ -412,7 +422,7 @@ ds_pyarrow_table = Dataset.create_from_pyarrow_table(Table.from_pandas(...))
除此之外,当用户以 jsonl \ txt 格式导入类数组形式文件,或者导入的是千帆平台的数据集时,SDK 支持传入 `organize_data_as_group` 参数,来指定将数据集组织成 SDK 内部的二维表格形式。这种格式包含了分组信息。并且可以通过 `pack()` 与 `unpack()` 函数进行格式之间的互相转换。

```python
ds = Dataset.load(qianfan_dataset_id="your_dataset_id", organize_data_as_group=True)
ds = Dataset.load(qianfan_dataset_version_id="your_dataset_id", organize_data_as_group=True)
```

设置 `organize_data_as_group=True` 或使用 `unpack()` 函数得到的千帆平台的数据集格式如下所示
Expand Down Expand Up @@ -548,7 +558,7 @@ print(ds[["column_name1", "column_name3"]])
```python
from qianfan.dataset import Dataset

ds_qianfan = Dataset.load(qianfan_dataset_id="your_dataset_id")
ds_qianfan = Dataset.load(qianfan_dataset_version_id="your_dataset_id")

# 单独检视某一实体
print(ds_qianfan[0])
Expand Down Expand Up @@ -605,19 +615,19 @@ ds = ds \
```python
from qianfan.dataset import Dataset
from qianfan.dataset.qianfan_data_operators import (
RemoveInvisibleCharacter,
FilterCheckNumberWords,
DeduplicationSimhash,
ReplaceEmails,
RemoveInvisibleCharacter,
FilterCheckNumberWords,
DeduplicationSimhash,
ReplaceEmails,
)

ds_qianfan = Dataset.load(qianfan_dataset_id="your_dataset_id")
ds_qianfan = Dataset.load(qianfan_dataset_version_id="your_dataset_id")

ds_qianfan.online_data_process([
RemoveInvisibleCharacter(),
FilterCheckNumberWords(number_words_max_cutoff=1024),
DeduplicationSimhash(distance=5),
ReplaceEmails()
RemoveInvisibleCharacter(),
FilterCheckNumberWords(number_words_max_cutoff=1024),
DeduplicationSimhash(distance=5),
ReplaceEmails()
])
```

Expand All @@ -632,13 +642,11 @@ from qianfan.dataset.schema import QianfanNonSortedConversation
schema = QianfanNonSortedConversation()

# 在 load 时使用
ds_qianfan = Dataset.load(qianfan_dataset_id="your_dataset_id", schema=schema)
ds_qianfan = Dataset.load(qianfan_dataset_version_id="your_dataset_id", schema=schema)

# 在 save 时使用
# 如果在 load 时就已经传入了 schema ,
# 则默认使用 load 的 schema 进行校验
# 额外传入则会覆盖原有的 schema,
# 使用新的 schema 进行校验
# 则使用 load 的 schema 进行校验
ds_qianfan.save(schema=schema)

# 单独使用
Expand Down
31 changes: 14 additions & 17 deletions docs/evaluation.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,35 +23,32 @@
from qianfan.dataset import Dataset
from qianfan.evaluation import EvaluationManager
from qianfan.evaluation.evaluator import QianfanRuleEvaluator, QianfanRefereeEvaluator
from qianfan.evaluation.consts import QianfanRefereeEvaluatorDefaultMetrics, QianfanRefereeEvaluatorDefaultSteps, QianfanRefereeEvaluatorDefaultMaxScore
from qianfan.evaluation.consts import QianfanRefereeEvaluatorDefaultMetrics, QianfanRefereeEvaluatorDefaultSteps,
QianfanRefereeEvaluatorDefaultMaxScore
from qianfan.model import Model

your_qianfan_dataset_id = "your_dataset_id"
ds = Dataset.load(qianfan_dataset_id=your_qianfan_dataset_id)
your_qianfan_dataset_version_id = "your_dataset_id"
ds = Dataset.load(qianfan_dataset_version_id=your_qianfan_dataset_version_id)

user_app_id = 123

qianfan_evaluators = [
QianfanRuleEvaluator(using_accuracy=True, using_similarity=True),
QianfanRefereeEvaluator(
app_id=user_app_id,
prompt_metrics=QianfanRefereeEvaluatorDefaultMetrics,
prompt_steps=QianfanRefereeEvaluatorDefaultSteps,
prompt_max_score=QianfanRefereeEvaluatorDefaultMaxScore,
),
QianfanRuleEvaluator(using_accuracy=True, using_similarity=True),
QianfanRefereeEvaluator(
prompt_metrics=QianfanRefereeEvaluatorDefaultMetrics,
prompt_steps=QianfanRefereeEvaluatorDefaultSteps,
prompt_max_score=QianfanRefereeEvaluatorDefaultMaxScore,
),
]

em = EvaluationManager(qianfan_evaluators=qianfan_evaluators)
result = em.eval([Model(version_id="amv-qb8ijukaish3")], ds)
```

在评估完成后,`eval` 函数会返回一个 `EvaluationResult` 对象,其中 `metrics` 成员包含了整体的评估结果,`result_dataset` 成员包含了以 `Dataset` 形式展示的、详细的评估结果,包括大模型的输出和各项指标数据,用户可以自由处理,如数据分析或保存。
在评估完成后,`eval` 函数会返回一个 `EvaluationResult` 对象,其中 `metrics` 成员包含了整体的评估结果

```python
print(result.metrics)

result_dataset = result.result_dataset
result_dataset.save(data_file="your/path")
```

### 千帆评估器
Expand Down Expand Up @@ -116,8 +113,8 @@ result = em.eval([your_service], ds)
与在线评估一致,对 `Model` 进行离线评估需要数据集已经被上传到千帆平台成为云端数据集

```python
your_qianfan_dataset_id = "your_dataset_id"
ds = Dataset.load(qianfan_dataset_id=your_qianfan_dataset_id)
your_qianfan_dataset_version_id = "your_dataset_id"
ds = Dataset.load(qianfan_dataset_version_id=your_qianfan_dataset_version_id)

em = EvaluationManager(local_evaluators=local_evaluators)
result = em.eval([Model(version_id="amv-qb8ijukaish3")], ds)
Expand All @@ -137,7 +134,7 @@ result = em.eval([Model(version_id="amv-qb8ijukaish3")], ds)

### 获取评估结果

和在线评估一样,完成离线评估后,评估得到的数据集会被保存在返回的 `EvaluationResult` 对象的 `result_dataset` 成员中。
完成离线评估后,评估得到的数据集会被保存在返回的 `EvaluationResult` 对象的 `result_dataset` 成员中。

```python
result_ds = result.result_dataset
Expand Down
4 changes: 2 additions & 2 deletions docs/model.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ m = trainer.output["model"]
from qianfan.model import Model
from qianfan.dataset import Dataset

ds = Dataset.load(qianfan_dataset_id="ds-xx")
ds = Dataset.load(qianfan_dataset_version_id="ds-xx")
m = Model(version_id="amv-xx")

m.batch_inference(dataset=ds)
Expand All @@ -47,7 +47,7 @@ from qianfan.model import Model
from qianfan.evaluation.evaluator import QianfanRuleEvaluator
from qianfan.evaluation import EvaluationManager

ds = Dataset.load(qianfan_dataset_id="ds-xxx")
ds = Dataset.load(qianfan_dataset_version_id="ds-xxx")
m = Model(version_id="amv-xx")

# 千帆平台规则评估器:
Expand Down
Loading
Loading