”开头 将自动安装数据集,然后将其解压缩到指定的数据目录文件中为您节省一些不必要的工作DATA_DIR = "DATA_DIR" WORK_DIR = "WORK_DIR" os.environ['DATA_DIR'] = DATA_DIR os.makedirs(WORK_DIR, exist_ok=True) os.makedirs(DATA_DIR, exist_ok=True) ! wget <a href="https://dl.fbaipublicfiles.com/glue/data/SST-2.zip" target="_self">https://dl.fbaipublicfiles.com/glue/data/SST-2.zip </a>! unzip -o SST-2.zip -d {DATA_DIR}5.过滤和清理数据由于 Nemo 数据集有自己独特的格式,因此应插入或修改任何使用的数据集以适应这种所需的格式在我们的数据集中,我们需要删除额外的标题行这是使用 sed 1d 命令完成的,该命令从指定数据集中删除第一列请注意,我们从训练和验证数据集中删除了标题行,只是因为测试数据集没有这个问题! sed 1d {DATA_DIR}/SST-2/train.tsv > {DATA_DIR}/SST-2/train_nemo_format.tsv ! sed 1d {DATA_DIR}/SST-2/dev.tsv > {DATA_DIR}/SST-2/dev_nemo_format.tsv ! ls -l {DATA_DIR}/SST-2 To print the first 5 lines of each data set: print('Contents (first 5 lines) of train.tsv:') ! head -n 5 {DATA_DIR}/SST-2/train_nemo_format.tsv print('\nContents (first 5 lines) of test.tsv:') ! head -n 5 {DATA_DIR}/SST-2/test.tsv6.下载配置文件NVIDIA Nemo 模型使用配置系统工作,其中保存和使用包含运行模型所需的所有必要数据的配置文件本教程中编写的大部分代码都会更新并向该文件添加新数据首先,NVIDIA 为您提供了一个可以立即使用的基本 YAML 配置文件当然,从模型到模型都需要一些修改和调整配置文件将下载到指定目录# download the model's configuration file MODEL_CONFIG = "text_classification_config.yaml" CONFIG_DIR = WORK_DIR + '/configs/' os.makedirs(CONFIG_DIR, exist_ok=True) if not os.path.exists(CONFIG_DIR + MODEL_CONFIG): print('Downloading config file...') wget.download(f'<a href="https://raw.githubusercontent.com/NVIDIA/NeMo/{BRANCH}/examples/nlp/text_classification/conf/">https://raw.githubusercontent.com/NVIDIA/NeMo/{BRANCH}/examples/nlp/text_classification/conf/</a>' + MODEL_CONFIG, CONFIG_DIR) print('Config file downloaded!') else: print ('config file already exists') config_path = f'{WORK_DIR}/configs/{MODEL_CONFIG}' print(config_path) config = OmegaConf.load(config_path)7. 配置给定模型中的类数dataset.num_classes 数字表示我们数据集中使用的不同变量值在这一步中,我们选择我们的值等于 2,因为我们的标签列可以有 0(负)或 1(正)值例如,如果还有一个中性值,那么我们应该有 num.classes=3config.model.dataset.num_classes=28. 将训练和验证文件路径传递给配置文件下载和修改(删除标题行)我们的数据集文件后,我们会将它们给定的路径传递到我们的配置文件中这有点类似于更知名的 pd.read_csv(“file path”) 函数config.model.train_ds.file_path = os.path.join(DATA_DIR, 'SST-2/train_nemo_format.tsv') config.model.validation_ds.file_path = os.path.join(DATA_DIR, 'SST-2/dev_nemo_format.tsv') # Name of the .nemo file where trained model will be saved. config.save_to = 'trained-model.nemo' config.export_to = 'trained-model.onnx'9. 在配置文件中配置 Trainer String检查是否提供了 GPU,如果有,我们将使用它config.trainer.accelerator = 'gpu' if torch.cuda.is_available() else 'cpu' config.trainer.devices = 1使用 Colab 时禁用分布式训练以防止错误config.trainer.strategy = None设置最大步数以减少训练时间当达到 max_epochs 时,训练停止config.trainer.max_epochs = 1使用配置的 trainer 部分实例化 PT Trainer 对象trainer = pl.Trainer(config.trainer)10. 处理记录和保存检查点Nemo 为其用户提供了自动处理日志记录和保存检查点任务的能力由于一个trainer对象的experiment manager不能设置两次我们在这里重复训练器创建代码,以防止在多次执行此单元格时出错trainer = pl.Trainer(config.trainer)exp_dir 指定存储检查点和日志的路径;它的默认值为“./nemo_experiments”exp_dir 提供了当前实验的路径以便于访问exp_dir = exp_manager(trainer, config.exp_manager)11. 指定 BERT-Like 模型并创建它在指定 BERT-base-uncased 模型名称后,我们会将配置和训练器参数传递给我们的最终模型BERT代表来自 Transformers 的双向编码器表示,它是由 Google 开发的用于自然语言处理预训练的基于转换器的机器学习技术将配置中的“model.language_model.pretrained_model_name”参数设置为bert-base-uncased模型config.model.language_model.pretrained_model_name = "bert-base-uncased"创建实际模型model = nemo_nlp.models.TextClassificationModel(cfg=config.model, trainer=trainer)12. 运行模型使用 trainer.fit() 函数,模型的实际训练开始trainer.fit(model) model.save_to(config.save_to)13. 模型评估从训练中提取最佳检查点的路径;您可以将其更新到任何检查点checkpoint_path = trainer.checkpoint_callback.best_model_path创建评估模型并加载检查点eval_model = nemo_nlp.models.TextClassificationModel.load_from_checkpoint(checkpoint_path=checkpoint_path)创建用于评估的数据加载器配置;这里使用了validation_ds 中提供的相同数据文件eval_config = OmegaConf.create({'file_path': config.model.validation_ds.file_path, 'batch_size': 64, 'shuffle': False, 'num_samples': -1}) eval_model.setup_test_data(test_data_config=eval_config)创建了一个新的训练器来展示如何从已经训练的模型中评估一个检查点然后我们将创建培训师配置的副本并对其进行更新以用于最终评估eval_trainer_cfg = config.trainer.copy() eval_trainer_cfg.accelerator = 'gpu' if torch.cuda.is_available() else 'cpu' # it is safer to perform evaluation on single GPU as PT is buggy with the last batch on multi-GPUs eval_trainer_cfg.strategy = None # 'ddp' is buggy with test process in the current PT, it looks like it has been fixed in the latest master eval_trainer = pl.Trainer(eval_trainer_cfg) eval_trainer.test(model=eval_model, verbose=False) # test_dataloaders=eval_dataloader,提取检查点的路径checkpoint_path = trainer.checkpoint_callback.best_model_path创建评估模型并加载检查点infer_model = nemo_nlp.models.TextClassificationModel.load_from_checkpoint(checkpoint_path=checkpoint_path)将模型移动到所需的设备进行推理如果可用,我们将模型移动到“cuda”,否则将使用“cpu”if torch.cuda.is_available(): infer_model.to("cuda") else: infer_model.to("cpu")定义推理查询列表queries = ['by the end of no such thing the audience , like beatrice , has a watchful affection for the monster .', 'director rob marshall went out gunning to make a great one .', 'uneasy mishmash of styles and genres .'] # max_seq_length=512 is the maximum length BERT supports. results = infer_model.classifytext(queries=queries, batch_size=3, max_seq_length=512) print('The prediction results of some sample queries with the trained model:') for query, result in zip(queries, results): print(f'Query : {query}') print(f'Predicted label: {result}')以下是模型的预测结果:The prediction results of some sample queries with the trained model: Query : by the end of no such thing the audience , like beatrice , has a watchful affection for the monster . Predicted label: 1 Query : director rob marshall went out gunning to make a great one . Predicted label: 1 Query: uneasy mishmash of styles and genres . Predicted label: 0 For our 3 examples, the model predicted the results correctly, where 1 means that the sentiment of the sentence was positive and 0 means that it was negative.使用 NVIDIA NeMo在本教程中,我们解释了 NVIDIA NeMo 是什么以及它的主要重点是增强机器学习领域我们还解释了它的一些模块,例如自动语音识别、自然语言处理和文本到语音, 它们是文本分类中较小的子字段最后,我们使用 NVIDIA NeMo 构建了一个能够预测给定文本的情感含义的自然语言处理模型随着对话式人工智能的兴起,NVIDIA 的 NeMo 等机器学习工具包变得越来越可靠通过允许其用户轻松训练他们的模型,它可能值得一试
(图片来源网络,侵删)
0 评论