今天的这个代码几乎没有任何解释,结合之前GPT生成文本摘要的代码。
大概记录一下
import numpy as np # 导入NumPy库
def process_dataset(dataset, tokenizer, max_seq_len=512, batch_size=4, shuffle=False):
# 判断当前设备是否为Ascend,如果是ascen的话就硬件加速
is_ascend = mindspore.get_context('device_target') == 'Ascend'
# 定义一个内部函数用于文本分词
def tokenize(text):
# 如果是在Ascend上运行,则在分词时添加padding到最大长度,入门提到过ascend有硬件加速,所以可以最大
if is_ascend:
tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)
else:
# 在非Ascend设备上,只进行截断,不强制添加padding到最大长度,节省时间
tokenized = tokenizer(text, truncation=True, max_length=max_seq_len)
return tokenized['input_ids'], tokenized['attention_mask']
# 如果需要打乱数据集,使得每次读取的数据都具有随机性
if shuffle:
dataset = dataset.shuffle(buffer_size=len(dataset))
dataset = dataset.map(operations=[tokenize], input_columns="text", output_columns=['input_ids', 'attention_mask'])
# 映射数据集,将'label'列的数据类型转换为mindspore.int32
dataset = dataset.map(operations=transforms.TypeCast(mindspore.int32), input_columns="label", output_columns="labels")
# 根据是否是Ascend设备,选择不同的batch大小
if is_ascend:
dataset = dataset.batch(batch_size)
else:
dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id),
'attention_mask': (None, 0)})
# 返回处理后的数据集
return dataset