华为云平台之大模型上传

最近在使用华为云的模型训练服务平台时,发现一个问题:当算法需要一个预训练模型的时候,怎么去上传呢?在平台上面只找到了一个数据集上传的接口,但这个接口最大上传容量时80M,而算法需要的预训练模型远远大于80M, 那该怎么办呢?既然没办法直接上传,只能考虑分块上传再合并,但是由于这个平台和本地操作还是有一些区别,对于不熟悉的平台的新手来说(比如我),中间可能需要踩很多次坑。为了避免下一次我使用的时时候踩很多坑,所以做个笔记简单记录一下模型上传的整个流程。下面以pytorch的预训练模型resnet50.pth.tar为例子,展示整个操作流程。

1. 本地切分模型

利用以下代码在本地将resnet50的模型以50MB为单位进行切分

def split(orgFile, chunkSize, saveDir):
    '''

    :param orgFile: 原模型存储的位置, 比如 ./checkpoint/resnet50.pth.tar
    :param chunkSize: 文件切分字节数,比如以50M为单位切分原模型,chunkSize 1024*1024*50
    :param saveDir: 切分后的文件储存路径, 比如 ./resnet50
    :return:
    '''
    if not os.path.exists(orgFile):
        print("Cannot find orgFile:{0}".format(orgFile))
        return -1
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)
    partNum = 0
    with open(orgFile, 'rb') as inputFile:

        while True:
            chunk = inputFile.read(chunkSize)
            if not chunk:
                break
            partNum += 1
            fileName = os.path.join(saveDir, 'part%04d' % partNum)
            with open(fileName, 'wb') as f:
                f.write(chunk)

    return partNum
切分后的数据.png

2. 分批上传模型

如下图所示,分批上传分割后的模型,数据类别一定要选择其他。


模型上传.png

上传完毕之后,可以在数据集的目录下看到已经上传好的模型


模型上传成功.png

3. 合并模型

运行下面的代码进行合并

# -*- coding: utf-8 -*-
from __future__ import print_function  # do not delete this line if you want to save your log file.
import softcomai as sai
import numpy
import os
import shutil
import torch


def joinFile():
    # 获取各个文件的路径
    filePaths = []
    for i in range(1,5):
        entityName = "resnet50_{0}".format(i)
        data_reference = sai.data_reference.get_data_reference(dataset="Default", dataset_entity=entityName)
        filePaths.append(data_reference.get_files_paths())  # 注意data_reference.get_files_paths()返回的是一个列表
    
    # 获取平台的sdk返回模型保存路径
    saveDir = sai.context.param(sai.context.MODEL_PATH)   
    
    fileName = 'resnet50.pth.tar'
    savePath = os.path.join(saveDir, fileName)
    outFile = open(savePath, 'wb')
    
    # 合并文件
    for filePath in filePaths:
        inFile = open(filePath[0], 'rb')
        data = inFile.read()
        outFile.write(data)
        inFile.close()
    outFile.close()
    
    return savePath


if __name__ == "__main__":
    
    savePath = joinFile()
   # 测试合并后的文件是否可用
    checkpoint = torch.load(savePath,map_location='cpu')
    print(checkpoint.keys())
    

运行完后,可以在任务目录下找到已经保存好的预训练模型


文件合并成功.png

你可能感兴趣的:(华为云平台之大模型上传)