云服务器内容精选

  • 本地安装ModelArts SDK步骤 在本地安装ModelArts SDK,具体的配置步骤如下: 步骤一:下载ModelArts SDK 步骤二:配置运行环境 步骤三:安装ModelArts SDK ModelArts SDK支持安装在Windows和Linux操作系统中。 如果在Windows上安装ModelArts SDK时出现报错,可参见FAQ:安装ModelArts SDK报错处理报错。
  • Session鉴权概述 Session模块的主要作用是实现与公有云资源的鉴权,并初始化ModelArts SDK Client、OBS Client。当成功建立Session后,您可以直接调用ModelArts的SDK接口。 ModelArts开发环境Notebook不需要Session鉴权,可以直接使用。示例代码如下: 1 2 from modelarts.session import Session session = Session() 本地PC使用ModelArts SDK时,需要进行Session鉴权。鉴权方式可参考如下认证方式,选择其中一种方式进行认证即可。 用户名密码认证模式: 支持OBS管理、数据管理、训练管理、模型管理、服务管理的鉴权。 用户AK-SK认证模式: 支持OBS管理、数据管理、训练管理、模型管理、服务管理的鉴权。
  • 用户名密码认证模式 本地安装完成ModelArts SDK后,可通过用户名密码认证模式进行Session鉴权。示例代码如下: 使用账号认证 “username”填写您的账号名。 1 2 3 4 5 6 7 from modelarts.session import Session # 认证用的password硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以password保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_PASSWORD。 __PASSWORD = os.environ["HUAWEICLOUD_SDK_PASSWORD"] # 如果进行了加密还需要进行解密操作 session = Session(username='***', password=__PASSWORD, region_name='***', project_id='***') 使用 IAM 用户认证 “account”填写您的账号名,“username”填写您的IAM用户名。 1 2 3 4 5 6 7 from modelarts.session import Session # 认证用的password硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以password保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_PASSWORD。 __PASSWORD = os.environ["HUAWEICLOUD_SDK_PASSWORD"] # 如果进行了加密还需要进行解密操作 session = Session(account='***', username='***', password=__PASSWORD, region_name='***', project_id='***') 账号与用户的概念介绍,请参见IAM基本概念。获取您的账号、用户名等信息,请参见获取用户名、用户ID、项目名称、项目ID。 如果您的华为云账号已经升级为华为账号,则账号认证方式将不可用,请创建一个IAM用户,使用IAM用户认证。
  • 示例代码 示例一:根据数据类型创建图像数据集 from modelarts.session import Session from modelarts.dataset import Dataset session = Session() dataset_name = "dataset-image" # 数据集名称 data_type = "IMAGE" # 数据集类型,图像类型数据集 data_sources = dict() # 数据集数据来源 data_sources["type"] = 0 # 数据来源类型,0表示OBS data_sources["path"] = "/obs-gaia-test/data/image/image-classification/" # 数据在OBS中的路径 work_path = dict() # 数据集输出位置,用于存放输出的标注信息等文件 work_path['type'] = 0 # 数据集工作目录的类型,0表示OBS work_path['path'] = "/obs-gaia-test/data/output/work_path/" # 数据集工作目录在OBS中的路径 create_dataset_resp = Dataset.create_dataset(session, dataset_name=dataset_name, data_type=data_type, data_sources=data_sources, work_path=work_path) 示例二:根据数据类型创建图像数据集(导入标注信息) from modelarts.session import Session from modelarts.dataset import Dataset session = Session() dataset_name = "dataset-image-with-annotations" data_type = "IMAGE" data_sources = dict() data_sources["type"] = 0 data_sources["path"] = "/obs-gaia-test/data/image/image-classification/" annotation_config = dict() # 源数据的标注格式 annotation_config['scene'] = "image_classification" # 数据标注场景为图像分类标注 annotation_config['format_name'] = "ModelArts image classification 1.0" # 标注格式为ModelArts image classification 1.0 data_sources['annotation_config'] = annotation_config work_path = dict() work_path['type'] = 0 work_path['path'] = "/obs-gaia-test/data/output/work_path/" create_dataset_resp = Dataset.create_dataset(session, dataset_name=dataset_name, data_type=data_type, data_sources=data_sources, work_path=work_path) 示例三:根据数据类型创建表格数据集 from modelarts.session import Session from modelarts.dataset import Dataset session = Session() dataset_name = "dataset-table" data_type = "TABLE" data_sources = dict() data_sources["type"] = 0 data_sources["path"] = "/obs-gaia-test/data/table/table0/" data_sources['with_column_header'] = True work_path = dict() work_path['type'] = 0 work_path['path'] = "/obs-gaia-test/data/output/work_path/" # 表格类型的数据集需要指定表格数据的schema信息 schema0 = dict() schema0['schema_id'] = 0 schema0['name'] = "name" schema0['type'] = "STRING" schema1 = dict() schema1['schema_id'] = 1 schema1['name'] = "age" schema1['type'] = "STRING" schema2 = dict() schema2['schema_id'] = 2 schema2['name'] = "label" schema2['type'] = "STRING" schemas = [] schemas.append(schema0) schemas.append(schema1) schemas.append(schema2) create_dataset_resp = Dataset.create_dataset(session, dataset_name=dataset_name, data_type=data_type, data_sources=data_sources, work_path=work_path, schema=schemas) 示例四:根据标注类型创建图像分类数据集 from modelarts.session import Session from modelarts.dataset import Dataset session = Session() dataset_name = "dataset-image-classification" dataset_type = 0 # 数据集的标注类型,0表示图像分类标注类型 data_sources = dict() data_sources["path"] = "/obs-gaia-test/data/image/image-classification/" data_sources["type"] = "0" work_path = dict() work_path['type'] = 0 work_path['path'] = "/obs-gaia-test/data/output/work_path/" create_dataset_resp = Dataset.create_dataset(session, dataset_name=dataset_name, dataset_type=dataset_type, data_sources=data_sources, work_path=work_path) 示例五:根据标注类型创建文本三元组数据集 dataset_name = "dataset-text-triplet" dataset_type = 102 # 数据集标注类型,102表示文本三元组标注类型 data_sources = dict() data_sources['type'] = 0 data_sources['path'] = "/obs-gaia-test/data/text/text-classification/" work_path = dict() work_path['type'] = 0 work_path['path'] = "/obs-gaia-test/data/output/work_path/" # 创建文本三元组标注类型的数据集,需要传入标签参数 label_entity1 = dict() # 标签对象 label_entity1['name'] = "疾病" # 标签名称 label_entity1['type'] = 101 # 标签类型,101表示实体类型标签 label_entity2 = dict() label_entity2['name'] = "疾病别称" label_entity2['type'] = 101 label_relation1 = dict() label_relation1['name'] = "又称为" label_relation1['type'] = 102 # 标签类型,102表示关系类型标签 property = dict() # 关系类型标签需要在标签属性中指定起始实体标签和终止实体标签 property['@modelarts:from_type'] = "疾病" # 起始实体标签 property['@modelarts:to_type'] = "疾病别称" # 终止实体标签 label_relation1['property'] = property labels = [] labels.append(label_entity1) labels.append(label_entity2) labels.append(label_relation1) create_dataset_resp = Dataset.create_dataset(session, dataset_name=dataset_name, dataset_type=dataset_type, data_sources=data_sources, work_path=work_path, labels=labels) 示例六:根据标注类型创建表格数据集 dataset_name = "dataset-table" dataset_type = 400 # 数据集标注类型,400表示表格数据集 data_sources = dict() data_sources['type'] = 0 data_sources['path'] = "/obs-gaia-test/data/table/table0/" data_sources['with_column_header'] = True # 用来指明表格数据中是否包含表头 work_path = dict() work_path['type'] = 0 work_path['path'] = "/obs-gaia-test/data/output/work_path/" # 表格数据集需要传入表格数据的表头参数 schema0 = dict() # 表格的表头 schema0['schema_id'] = 0 # 第一列表头 schema0['name'] = "name" # 表头名称,该列表头为name schema0['type'] = "STRING" # 表头数据类型,表示字符串 schema1 = dict() schema1['schema_id'] = 1 schema1['name'] = "age" schema1['type'] = "STRING" schema2 = dict() schema2['schema_id'] = 2 schema2['name'] = "label" schema2['type'] = "STRING" schemas = [] schemas.append(schema0) schemas.append(schema1) schemas.append(schema2) create_dataset_resp = Dataset.create_dataset(session, dataset_name=dataset_name, dataset_type=dataset_type, data_sources=data_sources, work_path=work_path, schema=schemas)
  • 使用SDK调测单机训练作业 代码中涉及到的OBS路径,请用户替换为自己的实际OBS路径。 代码是以PyTorch为例编写的,不同的AI框架之间,整体流程是完全相同的,仅需修改6和10中的framework_type参数值即可,例如:MindSpore框架,此处framework_type=Ascend-Powered-Engine。 Session初始化。 代码如下:这里只列出最常用的一种方式,更多方式请参考《Session鉴权章节》 from modelarts.session import Session session = Session() 准备训练数据,这里支持三种形式,用户可根据自己的情况选择一种。 import os from modelarts.train_params import InputData base_bucket_path = "obs://modelarts-xxx-a0de02a6/dis-train/cifar10/" base_local_path = "/home/ma-user/work/cifar10/" # 形式1,数据在OBS上,且是一个压缩文件 obs_path = os.path.join(base_bucket_path, "dataset-zip/dataset.zip") data_local = os.path.join(base_local_path, "dataset/") input_data = InputData(obs_path=obs_path, local_path=data_local, is_local_source=False) # 形式2,数据在OBS上,且是一个目录 #obs_path = os.path.join(base_bucket_path, "dataset/") #data_local = os.path.join(base_local_path, "dataset/") #input_data = InputData(obs_path=obs_path, local_path=data_local, is_local_source=False) # 形式3,数据在Notebook中,且是一个目录,一般是使用SFS挂载磁盘的场景 #obs_path = os.path.join(base_bucket_path, "dataset-local/") #data_local = os.path.join(base_local_path, "dataset/") #input_data = InputData(obs_path=obs_path, local_path=data_local, is_local_source=True) 参数解释: is_local_source:可选参数,默认为False,指定训练数据的保存位置。 False:训练数据保存在参数obs_path指定的位置中; True:训练数据保存在notebook中,由local_path指定。 obs_path:obs地址。根据is_local_source值的变化,有不同的含义。 is_local_source=False,此时是必选参数,代表训练数据位置,支持文件夹和压缩文件。 is_local_source=True,此时是可选参数。如果用户填写了该参数,则开始训练时会将Notebook中的训练数据压缩并上传到该位置,不可重复上传。如果第一次上传后,建议将is_local_source修改为False,obs_path指向刚才上传的压缩数据文件位置;如果用户没有填写,则不会进行压缩上传。 local_path:必选参数,Notebook中的路径。用户的训练脚本需要从该目录中读取数据,完成训练任务。根据is_local_source值的变化,有不同的含义。 is_local_source=True,此时代表训练数据位置,仅支持文件夹。 is_local_source=False,训练过程中SDK会帮助用户将数据下载到该位置,如果训练数据是压缩文件,下载完成后会进行解压缩。 准备训练脚本。 from modelarts.train_params import TrainingFiles code_dir = os.path.join(base_local_path, "train/") # 这里提前将训练脚本放在了obs中,实际上训练脚本可以是任何来源,只要能够放到Notebook里边就行 session.obs.download_file(os.path.join(base_bucket_path, "train/test-pytorch.py"), code_dir) training_file = TrainingFiles(code_dir=code_dir, boot_file="test-pytorch.py", obs_path=base_bucket_path + 'train/') 参数解释: code_dir:必选参数,训练脚本所在的目录。在训练任务调测的情况下,必须是notebook中的目录,不能是OBS目录。 boot_file:必选参数,训练启动文件路径,路径格式为基于code_dir目录的相对路径,如实例代码中boot_file的完整路径为/home/ma-user/work/cifar10/train/test-pytorch.py,这里就只需要填写test-pytorch.py。 obs_path:可选参数,一个OBS目录。仅在本地单机调试时不需要该参数,提交远程训练时必选,会将训练脚本压缩并上传到该路径。 准备训练输出,如果用户不需要将训练输出上传到OBS,可以省略这一步。 from modelarts.train_params import OutputData output = OutputData(local_path=os.path.join(base_local_path, "output/"), obs_path=os.path.join(base_bucket_path, 'output/')) local_path:必选参数,一个notebook中的路径,训练脚本需要将输出的模型或其他数据保存在该目录下。 obs_path:必选参数,一个OBS目录。SDK会将local_path中的模型文件自动上传到这里。 查看训练支持的AI框架。 from modelarts.estimatorV2 import Estimator Estimator.get_framework_list(session) 参数session即是第一步初始化的数据。如果用户知道要使用的AI框架,可以略过这一步。 Estimator初始化。 from modelarts.estimatorV2 import Estimator parameters = [] parameters.append({"name": "data_url", "value": data_local}) parameters.append({"name": "output_dir", "value": os.path.join(base_local_path, "output/")}) parameters.append({"name": "epoc_num", "value": 2}) estimator = Estimator(session=session, training_files=training_file, outputs=[output], parameters=parameters, framework_type='PyTorch', train_instance_type='local', train_instance_count=1, script_interpreter="/home/ma-user/anaconda3/envs/PyTorch-1.4/bin/python", log_url=base_bucket_path + 'log/', job_description='This is a image net train job') 参数解释: session:必选参数,1中初始化的参数。 training_files:必选参数,3中初始化的训练文件。 outputs:可选参数,这里传入的是一个list,每个元素都是4中初始化的训练输出。 parameters:可选参数,一个list,每个元素都是一个字典,包含"name"和"value"两个字段,以"--name=value"的形式传递给训练启动文件。value支持字符串,整数,布尔等类型。对于布尔类型,建议用户在训练脚本中使用action='store_true'的形式来解析。 framework_type:必选参数,训练作业使用的AI框架类型,可参考步骤5查询的返回结果。 train_instance_type:必选参数,训练实例类型,这里指定'local'即为在notebook中进行训练。 train_instance_count:必选参数,训练使用的worker个数,单机训练时为1,训练作业只在当前使用的notebook中运行。 script_interpreter:可选参数,指定使用哪个python环境来执行训练任务,如果未指定,会默认使用当前的kernel。 log_url:可选参数,一个OBS地址,训练过程中,SDK会自动将训练的日志上传到该位置。但是如果训练任务运行在Ascend上,则是必选参数。 job_description:可选参数,训练任务的描述。 开始训练。 estimator.fit(inputs=[input_data], job_name="cifar10-dis") 参数解释: inputs:可选参数,一个list,每个元素都是2生成的实例。 job_name:可选参数,训练任务名,便于区分和记忆。 本地单机调试训练任务开始后,SDK会依次帮助用户完成以下流程: 初始化训练作业,如果2指定的训练数据在OBS上,这里会将数据下载到local_path中。 执行训练任务,用户的训练代码需要将训练输出保存在4中指定的local_path中。 将训练任务得到的输出上传到4指定的obs_path中,日志上传到第六步指定的log_url中。 同时,可以在任务名后增加时间后缀,区分不同的任务名称。 from datetime import datetime, timedelta import time base_name = "cifar10-dis" job_name = base_name + '-' + (datetime.now() + timedelta(hours=8)).strftime('%Y%m%d-%H%M%S') estimator.fit(inputs=[input_data], job_name=job_name) 多次调试。 上一步执行过程中,训练脚本的日志会实时打印到控制台,如果用户的代码或者参数有误的话,可以很方便的看到。在Notebook中经过多次调试,得到想要的结果后,可以进行下一步。 查询训练支持的计算节点类型和最大个数。 from modelarts.estimatorV2 import Estimator Estimator.get_spec_list(session=session) 参数session即是1初始化的数据。返回的是一个字典,其中flavors值是一个列表,描述了训练服务支持的所有规格的信息。每个元素中flavor_id是可直接用于远程训练任务的计算规格,max_num是该规格的最大节点数。如果用户知道要使用的计算规格,可以略过这一步。 提交远程训练作业。 from modelarts.estimatorV2 import Estimator parameters = [] parameters.append({"name": "data_url", "value": data_local}) parameters.append({"name": "output_dir", "value": os.path.join(base_local_path, "output/")}) parameters.append({"name": "epoch_num", "value": 2}) estimator = Estimator(session=session, training_files=training_file, outputs=[output], parameters=parameters, framework_type='PyTorch', train_instance_type='modelarts.vm.cpu.8u', train_instance_count=1, script_interpreter="/home/ma-user/anaconda3/envs/PyTorch-1.4/bin/python", log_url=base_bucket_path + 'log/', job_description='This is a image net train job') estimator.fit(inputs=[input_data], job_name="cifar10-dis") 在本地调测完成的基础上,只需要Estimator初始化时将参数train_instance_type修改为训练服务支持的规格即可(即第10步查询出来的flavor_id的值)。执行fit函数后,即可提交远程训练任务。 训练任务提交后,SDK会依次帮助用户完成以下流程: 将训练脚本打包成zip文件,上传到3中指定的obs_path中。 当训练数据保存在Notebook中,则将其打包成zip文件并上传到指定的obs_path中。 向ModelArts训练服务提交 自定义镜像 训练作业,使用的镜像为当前Notebook的镜像,这样保证了远程训练作业和在Notebook中的训练作业使用的运行环境一致。 训练任务得到的输出上传到4指定的obs_path中,日志上传到这一步log_url指定的位置中。 在这一步中需要注意的一个问题: 如果用户在自己的训练脚本中要创建新的目录或文件,请在以下几种目录中创建: /home/ma-user/work; /cache; inputs或者outputs中指定的local_path,如在步骤2中初始化InputData时,填写了local_path="/home/ma-user/work/xx/yy/",则在该目录下也可以创建新目录或文件。 父主题: 训练作业调测
  • 示例代码 在ModelArts notebook平台,Session鉴权无需输入鉴权参数。其它平台的Session鉴权请参见Session鉴权。 方式1:已部署为在线服务predictor的初始化 1 2 3 4 5 from modelarts.session import Session from modelarts.model import Predictor session = Session() predictor_instance = Predictor(session, service_id="your_service_id") 方式2:部署在线服务predictor 部署服务到公共资源池 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from modelarts.session import Session from modelarts.model import Model from modelarts.config.model_config import ServiceConfig, TransformerConfig, Schedule session = Session() model_instance = Model(session, model_id='your_model_id') vpc_id = None # (可选)在线服务实例部署的虚拟私有云ID,默认为空 subnet_network_id = None # (可选)子网的网络ID,默认为空 security_group_id = None # (可选)安全组,默认为空 configs = [ServiceConfig(model_id=model_instance.model_id, weight="100", instance_count=1, specification="modelarts.vm.cpu.2u")] # 参考表3中specification字段 predictor_instance = model_instance.deploy_predictor( service_name="service_predictor_name", infer_type="real-time", vpc_id=vpc_id, subnet_network_id=subnet_network_id, security_group_id=security_group_id, configs=configs, # predictor配置参数, 参考下文configs参数格式说明 schedule = [Schedule(op_type='stop', time_unit='HOURS', duration=1)] # (可选)设置在线服务运行时间 ) 参数“model_id”代表将部署成在线服务的模型。“model_id”可以通过查询模型列表或者ModelArts管理控制台获取。 部署服务到专属资源池 from modelarts.config.model_config import ServiceConfig configs = [ServiceConfig(model_id=model_instance.model_id, weight="100", instance_count=1, specification="modelarts.vm.cpu.2u")] predictor_instance = model_instance.deploy_predictor( service_name="your_service_name", infer_type="real-time", configs=configs, cluster_id="your dedicated pool id" ) configs参数格式说明:SDK提供了ServiceConfig类对其定义,configs为list,list中的元组对象是ServiceConfig。定义代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 configs = [] envs = {"model_name":"mxnet-model-1", "load_epoch":"0"} service_config1 = ServiceConfig( model_id="model_id1", # model_id1和model_id2必须是同一个模型的不同版本对应的model_id weight="70", specification="modelarts.vm.cpu.2u", # 参考表3中specification字段 instance_count=2, envs=envs) # (可选)设置环境变量的值,如:envs = {"model_name":"mxnet-model-1", "load_epoch":"0"} service_config2 = ServiceConfig( model_id='model_id2', weight="30", specification="modelarts.vm.cpu.2u", # 参考表3中specification字段 instance_count=2, envs=envs) # (可选)设置环境变量的值,如:envs = {"model_name":"mxnet-model-1", "load_epoch":"0"} configs.append(service_config1) configs.append(service_config2) 方式3:部署批量服务transformer 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from modelarts.session import Session from modelarts.model import Model from modelarts.config.model_config import TransformerConfig session = Session() model_instance = Model(session, model_id='your_model_id') vpc_id = None # (可选)批量服务实例部署的虚拟私有云ID,默认为空 subnet_network_id = None # (可选)子网的网络ID,默认为空 security_group_id = None # (可选)安全组,默认为空 transformer = model_instance.deploy_transformer( service_name="service_transformer_name", infer_type="batch", vpc_id=vpc_id, subnet_network_id=subnet_network_id, security_group_id=security_group_id, configs=configs # transformer配置参数, 参考下文configs参数格式说明 ) configs参数格式说明:SDK提供了TransformerConfig类对其定义,configs都是list,list中的元组对象是TransformerConfig。定义代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 configs = [] mapping_rule = None # (可选)输入参数与csv数据的映射关系 mapping_type= "file" # file或者csv envs = {"model_name":"mxnet-model-1", "load_epoch":"0"} transformer_config1 = TransformerConfig( model_id="model_id", specification="modelarts.vm.cpu.2u", # 参考表3中specification字段 instance_count=2, src_path="/shp-cn4/sdk-demo/", # 批量任务输入数据的OBS路径,如:"/your_obs_bucket/src_path" dest_path="/shp-cn4/data-out/", # 批量任务输出结果的OBS路径,如:"/your_obs_bucket/dest_path" req_uri="/", mapping_type=mapping_type, mapping_rule=mapping_rule, envs=envs) # (可选)设置环境变量的值,如:envs = {"model_name":"mxnet-model-1", "load_epoch":"0"} configs.append(transformer_config1)
  • Step5 训练Wav2Lip模型 准备预训练模型。下载需要使用的预训练模型。 人脸检测预训练模型,下载链接。 专家唇形同步鉴别器,下载链接 ,此链接是官方提供的预训练模型。训练Wav2Lip模型时需要使用专家唇形同步鉴别器,用户可以用自己的数据训练,也可以直接使用官方提供的预训练模型。 处理初始视频数据集。 将下载好的人脸检测预训练模型修改名字为s3fd.pth,上传到/home/ma-user/Wav2Lip/face_detection/detection/sfd/s3fd.pth目录。 下载LRS2数据集。数据集文件夹结构如下: ├── LRS2_partly | ├── main | │ ├── five-digit numbered video IDs ending with (.mp4) | │ ├── 00001.mp4 | │ ├── 00002.mp4 对数据集进行预处理。具体命令如下。 python preprocess.py --data_root ./LRS2_partly --preprocessed_root lrs2_preprocessed/ data_root参数为原始视频根目录,preprocessed_root参数为处理后生成的数据集目录。 处理后数据目录如下所示。 preprocessed_root (lrs2_preprocessed) ├── main | ├── Folders with five-digit numbered video IDs(00001) | │ ├── *.jpg | │ ├── audio.wav | ├── 00001 | │ ├── *.jpg | │ ├── audio.wav 将LRS2文件列表中的.txt文件(train、val)放入该filelists文件夹中。 图2 filelists文件夹 train.txt和val.txt内容参考如下,为处理后视频数据的目录名字。 图3 train.txt和val.txt内容 训练专家唇形同步鉴别器。 如果使用LRS2数据集,可选择跳过此步骤。如果使用自己的数据集,训练命令参考如下。 python color_syncnet_train.py --data_root ./lrs2_preprocessed/main/ --checkpoint_dir ./savedmodel/syncnet_model/ --checkpoint_path ./checkpoints/lipsync_expert.pth 参数说明: --data_root :处理后的视频数据目录,与train.txt内容拼接后得到单个数据目录,例如:lrs2_preprocessed/main/00001。 --checkpoint_dir :此目录用于保存模型。 -checkpoint_path :(可选)可基于此目录的lipsync_expert模型继续进行训练,如果重新训练则不需要此参数。 默认每10000 step保存一次模型。 训练Wav2Lip模型。 训练Wav2Lip模型时需要使用专家唇形同步鉴别器。可以使用上一步3中的训练结果,也可以直接下载官方提供的预训练权重来使用。 具体训练命令如下。 python wav2lip_train.py --data_root ./lrs2_preprocessed/main/ --checkpoint_dir ./savedmodel --syncnet_checkpoint_path ./checkpoints/lipsync_expert.pth --checkpoint_path ./checkpoints/wav2lip.pth 首次训练会进行模型评估,默认为700 step,请耐心等待,结束之后会进行正式训练。 参数说明: --data_root :处理后的视频数据目录,与train.txt内容拼接后得到单个数据目录,例如:lrs2_preprocessed/main/00001。 --checkpoint_dir :此目录用于保存模型。 --syncnet_checkpoint_path :专家鉴别器的目录。 --checkpoint_path :(可选)可基于此目录的Wav2Lip模型继续进行训练,如果重新训练则不需要此参数。 默认每3000 step保存一次模型。 注: 专家鉴别器的评估损失应降至约 0.25,Wav2Lip评估同步损失应降至约 0.2,以获得良好的结果。 可以在文件设置其他不太常用的超参数hparams.py,常用超参如下: nepochs 训练总步数 checkpoint_interval Wav2Lip模型保存间隔步数 eval_interval Wav2Lip模型评估间隔步数 syncnet_eval_interval 专家鉴别器模型评估间隔步数 syncnet_checkpoint_interval 专家鉴别器模型保存间隔步数
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.907-xxx.zip软件包中的AscendCloud-AIGC-6.3.907-xxx.zip 说明: 包名中的xxx表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一: swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240727152329-0f2c29a 从SWR拉取。
  • Step4 安装依赖和软件包 从github拉取Wav2Lip代码。 cd /home/ma-user git clone https://github.com/Rudrabha/Wav2Lip.git cd /home/ma-user/Wav2Lip git reset --hard f361e9527b917a435928a10 如果出现报错SSL certificate problem: self signed certificate in certificate chain 图1 报错SSL certificate problem 可采取忽略SSL证书验证:使用以下命令来克隆仓库,它将忽略SSL证书验证。 git clone -c http.sslVerify=false https://github.com/Rudrabha/Wav2Lip.git 安装Wav2Lip Ascend软件包。 将获取到的Wav2Lip Ascend软件包AscendCloud-AIGC-*.zip文件上传到容器的/home/ma-user目录下。获取路径:Support网站。 解压AscendCloud-AIGC-*.zip文件,解压后将里面指定文件与对应Wave2Lip文件进行替换。 cd /home/ma-user unzip AscendCloud-AIGC-*.zip -d ./AscendCloud cp AscendCloud/multimodal_algorithm/Wav2Lip/train/f361e9527b917a435928a10/* /home/ma-user/Wav2Lip/ rm -rf AscendCloud* AscendCloud-AIGC-*.zip后面的*表示时间戳,请按照实际替换。 要替换的文件目录结构如下所示: |---Wav2Lip_code/ --- requirements.txt #建议的依赖包版本 注:需要对以下文件进行修改 --- color_syncnet_train.py #训练expert discriminator唇形同步鉴别器 --- wav2lip_train.py #训练 Wav2Lip 模型 --- preprocess.py #对初始视频数据进行推理 在以上三个文件内import末尾增加import如下: import torch_npu from torch_npu.contrib import transfer_to_npu 安装Python依赖包,文件为requirements.txt文件。 pip install -r requirements.txt
  • Step1 准备环境 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • Step3 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 export work_dir="自定义挂载的工作目录" export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称或ID" // 启动一个容器去运行镜像 docker run -itd --net=bridge \ -p 8080:8080 \ --device=/dev/davinci0 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ --shm-size=32g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} \ /bin/bash 参数说明: -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 -p 8080:8080:开启一个端口,可以web访问(如冲突,可自行更换其他端口)。 ${image_name}:容器镜像的名称。 通过容器名称进入容器中。默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it ${container_name} bash
  • Step4 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 docker run -itd --net=host \ --device=/dev/davinci0 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ --shm-size=1024g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。 通过容器名称进入容器中。默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it ${container_name} bash
  • Step5 下载并适配代码 在容器中解压代码包。 unzip AscendCloud-AIGC-6.3.907-*.zip rm -rf AscendCloud-AIGC-6.3.907-* 执行wav2lip推理插件的安装脚本。 cd multimodal_algorithm/Wav2Lip/inference/f361e9527b917a435928a10931fee9ac7be109cd source install.sh 从Github官网下载Wav2lip权重文件和Wav2Lip+GAN权重文件(下载链接),并放在容器的checkpoints目录下。上一步执行完source install.sh命令后,会自动生成checkpoints目录。 图1 下载权重文件 从官网下载模型s3fd-619a316812.pth,并重命名为s3fd.pth,放在容器路径face_detection/detection/sfd下。上一步执行完source install.sh命令后,会自动生成face_detection/detection/sfd目录。
  • Step1 准备环境 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.907-xxx.zip软件包中的AscendCloud-AIGC-6.3.907-xxx.zip 说明: 包名中的xxx表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一: swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240727152329-0f2c29a 从SWR拉取。