Produtos do PAI, como Deep Learning Containers (DLC) e Data Science Workshop (DSW), permitem montar uma fonte de dados do Object Storage Service (OSS) em um caminho específico de um contêiner usando ossfs 2.0 ou JindoFuse do Alibaba Cloud E-MapReduce. Você também pode ler dados do OSS com o OSS Connector for AI/ML ou o OSS SDK. Escolha o método de acesso a dados mais adequado ao seu caso de uso.
Contexto
No desenvolvimento de IA, os dados de origem costumam ficar armazenados no OSS e são baixados para um ambiente de treinamento destinado ao desenvolvimento e treinamento de modelos. No entanto, essa prática comum apresenta vários desafios:
Downloads longos de conjuntos de dados podem deixar as GPUs ociosas.
É necessário baixar os dados repetidamente para cada job de treinamento.
A amostragem aleatória de dados exige o download do conjunto de dados inteiro para cada nó de treinamento.
Para resolver esses problemas, considere os seguintes métodos de leitura de dados do OSS:
|
Método de acesso |
Descrição |
Casos de uso |
|
Monta um conjunto de dados do OSS em um caminho especificado no contêiner usando o componente JindoFuse, permitindo leitura e gravação direta de dados. |
|
|
|
ossfs 2.0 é um cliente para acesso montado de alto desempenho ao OSS. Ele se destaca em operações de leitura e gravação sequencial, permitindo aproveitar totalmente a alta largura de banda do OSS. |
O ossfs 2.0 é adequado para cenários que exigem acesso a armazenamento de alto desempenho, como treinamento de IA, inferência, processamento de big data, direção autônoma e outras cargas de trabalho intensivas em computação. Essas cargas envolvem principalmente leituras sequenciais e aleatórias, gravações sequenciais (apenas anexação) e não requerem semântica POSIX completa. |
|
|
O PAI integra o OSS Connector for AI/ML para transmitir arquivos do OSS diretamente no código PyTorch, simplificando e acelerando o acesso aos dados. As principais vantagens incluem:
|
Use este conector para acesso sem montagem visando acelerar a leitura de conjuntos de dados para treinamento PyTorch, especialmente ao ler milhões de arquivos pequenos ou quando for necessário alto throughput. |
|
|
Transmite dados do OSS usando o OSS SDK. Oferece uma solução flexível e eficiente, reduzindo significativamente os tempos de solicitação de dados e melhorando a eficiência do treinamento. |
Utilize o OSS Python SDK ou a OSS Python API para acesso temporário e sem montagem aos dados do OSS, ou quando a lógica da sua aplicação determinar o momento de acessar o OSS. |
Ao usar JindoFuse ou ossfs 2.0 para montar o OSS, especifique uma função RAM para acesso ao OSS e obter um controle de permissões mais granular. Também é possível ativar OSS Mount Requires RAM Role na configuração geral de um workspace. Após ativar esta opção:
Ao criar montagens do OSS em recursos como DSW, DLC e EAS, selecione uma função RAM. A função RAM padrão não é permitida.
Ao criar um conjunto de dados avançado ou lógico que envolva uma montagem do OSS, a função RAM também será imposta com base nesta configuração.
Ao criar uma instância DSW, um job DLC ou um serviço EAS, não será possível selecionar a função padrão do PAI como função RAM.
JindoFuse
O DLC e o DSW permitem usar o componente JindoFuse para montar um conjunto de dados do OSS ou um caminho do OSS em um caminho especificado dentro de um contêiner. Isso possibilita ler e gravar diretamente nos dados armazenados no OSS durante o processo de treinamento.
Métodos de montagem
DLC
Ao criar um job de treinamento distribuído (DLC), monte dados do OSS. Dois tipos de montagem são suportados: Para instruções detalhadas de configuração, consulte Create a training job.
Nas seções Datasets e Directly Mount, clique em Expand Advanced Configuration para visualizar mais opções de montagem e use o alternador Read-Only para controlar o modo de montagem.
|
Tipo de montagem |
Descrição |
|
Datasets |
Selecione um conjunto de dados do tipo OSS e configure o Mount Path. Para conjuntos de dados públicos, apenas o modo somente leitura é suportado. |
|
Directly Mount |
Monte diretamente um caminho de bucket do OSS. Se você utilizar uma cota de recursos de computação inteligente Lingjun com cache local habilitado, ative a chave Use Cache para habilitar o cache. |
DSW
Ao criar uma instância DSW, monte dados do OSS. Dois tipos de montagem são suportados: Para instruções detalhadas de configuração, consulte Create a DSW instance.
Ambos os tipos de montagem oferecem a opção Expand Advanced Configuration. Os tipos de armazenamento suportados pela Storage Path Mounting incluem OSS, NAS de uso geral, NAS extremo, CPFS e CPFS de computação inteligente.
|
Tipo de montagem |
Descrição |
|
Dataset Mounting |
Selecione um conjunto de dados do tipo OSS e configure o Mount Path. Ao usar um conjunto de dados público, apenas o modo somente leitura é suportado. |
|
Storage Path Mounting |
Monte diretamente um caminho de armazenamento de bucket do OSS. |
Limitações da configuração padrão
Se você deixar os parâmetros de Advanced Configurations vazios, a configuração padrão será aplicada. A configuração padrão possui as seguintes limitações:
-
Para acelerar a leitura de arquivos do OSS, metadados (listas de diretórios e arquivos) são armazenados em cache quando o OSS é montado.
Em um treinamento distribuído, se vários nós tentarem criar o mesmo diretório, o cache de metadados pode fazer com que cada nó tente a criação. Apenas um nó terá sucesso, e os outros relatarão um erro.
Por padrão, a API MultiPart do OSS é usada para criar arquivos. O objeto torna-se visível no OSS somente após a conclusão das operações de gravação.
Operações simultâneas de leitura e gravação no mesmo arquivo não são suportadas.
Operações de gravação aleatória em arquivos não são suportadas.
Configurações comuns do JindoFuse
Personalize os parâmetros do JindoFuse na configuração avançada conforme o seu caso de uso.
Este tópico fornece sugestões de configuração do JindoFuse para alguns cenários comuns. Essas configurações podem não oferecer desempenho ideal para todas as cargas de trabalho. Para opções de configuração mais flexíveis, consulte JindoFuse User Guide .
-
Quick Read/write: Garante leituras e gravações rápidas. No entanto, inconsistência de dados pode ocorrer durante leituras ou gravações simultâneas. Monte dados de treinamento e modelos no caminho de montagem deste modo. Recomendamos não usar o caminho de montagem deste modo como diretório de trabalho.
{ "fs.oss.download.thread.concurrency": "Twice the number of CPU cores", "fs.oss.upload.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" } -
Incremental Read/Write: Garante consistência de dados durante gravação incremental. Se os dados originais forem sobrescritos, pode ocorrer inconsistência de dados. A velocidade de leitura é ligeiramente menor. Use este modo para salvar os arquivos de pesos do modelo para dados de treinamento.
{ "fs.oss.upload.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" } -
Consistent Read/write: Garante consistência de dados durante leituras ou gravações simultâneas e é adequado para cenários que exigem alta consistência de dados e não requerem leituras rápidas. Use este modo para salvar o código dos seus projetos.
{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" } -
Read-only: Permite apenas leituras. Use este modo para montar conjuntos de dados públicos.
{ "fs.oss.download.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oro -oattr_timeout=7200 -oentry_timeout=7200 -onegative_timeout=7200 -okernel_cache -ono_symlink" }
Outras operações comuns de configuração incluem:
-
Selecionar uma versão diferente do JindoFuse:
{ "fs.jindo.fuse.pod.image.tag": "6.7.0" } -
Desativar o cache de metadados: Ao executar um treinamento distribuído onde vários nós tentam gravar no mesmo diretório simultaneamente, o cache pode causar falhas nas operações de gravação em alguns nós. Para resolver esse problema, adicione o argumento
-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0à linha de comando do JindoFuse.{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0" } -
Ajustar a contagem de threads de upload/download: Ajuste a contagem de threads usando os seguintes parâmetros.
{ "fs.oss.upload.thread.concurrency": "32", "fs.oss.download.thread.concurrency": "32", "fs.oss.read.readahead.buffer.count": "64", "fs.oss.read.readahead.buffer.size": "4194304" } -
Usar AppendObject para gravações: Todos os arquivos criados localmente na montagem são criados como objetos no OSS chamando a API
AppendObject. O tamanho de um objeto criado usando AppendObject não pode exceder 5 GB. Para mais limites de uso, consulte AppendObject. Abaixo está um exemplo de configuração:{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0", "fs.oss.append.enable": "true", "fs.oss.flush.interval.millisecond": "1000", "fs.oss.read.readahead.buffer.size": "4194304", "fs.oss.write.buffer.size": "262144" } -
Montar OSS-HDFS: Para informações sobre como habilitar o OSS-HDFS, consulte What is OSS-HDFS service?. Em cenários de treinamento distribuído, recomendamos adicionar os seguintes parâmetros:
{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -ono_symlink -ono_xattr -ono_flock -odirect_io", "fs.oss.flush.interval.millisecond": "10000", "fs.oss.randomwrite.sync.interval.millisecond": "10000" } -
Configurar recursos de memória: Defina o parâmetro
fs.jindo.fuse.pod.mem.limitpara ajustar o limite de memória. O código abaixo fornece um exemplo:{ "fs.jindo.fuse.pod.mem.limit": "10Gi" }
ossfs 2.0
Para montar uma fonte de dados do OSS usando ossfs, defina {"mountType":"ossfs"} em Advanced Configuration.
Métodos de montagem
Montar OSS no DLC
Ao criar um job DLC, monte dados do OSS. O DLC suporta os dois tipos de montagem a seguir. Para detalhes de configuração, consulte Create a training job.
|
Tipo de montagem |
Descrição |
|
Datasets |
Selecione um conjunto de dados OSS e configure o Mount Path. Conjuntos de dados públicos suportam apenas o modo somente leitura. |
|
Directly Mount |
Monte diretamente um caminho de armazenamento de bucket do OSS. Se estiver usando uma cota de recursos Lingjun com cache local habilitado, ative Use Cache. |
Montar OSS no DSW
Ao criar uma instância DSW, monte dados do OSS. O DSW suporta os dois tipos de montagem a seguir. Para detalhes de configuração, consulte Create a DSW instance.
|
Tipo de montagem |
Descrição |
|
Dataset Mounting |
Selecione um conjunto de dados OSS e configure o Mount Path. Conjuntos de dados públicos suportam apenas o modo somente leitura. |
|
Storage Path Mounting |
Monte diretamente um caminho de armazenamento de bucket do OSS. |
Configurações comuns do ossfs
Em Advanced Configuration, defina parâmetros avançados usando fs.ossfs.args. Separe múltiplos parâmetros com vírgula (,). Para mais informações sobre esses parâmetros avançados, consulte ossfs 2.0. Os exemplos a seguir mostram vários casos de uso comuns:
-
Fonte de dados estática durante o job: Para arquivos que não são modificados durante o job, configure um tempo limite de cache longo para reduzir solicitações de metadados. Um caso de uso típico é ler um lote de arquivos existentes e gerar um novo conjunto de arquivos após o processamento.
{ "mountType":"ossfs", "fs.ossfs.args": "-oattr_timeout=7200" } -
Leitura/gravação rápida: Use um tempo limite de cache de metadados mais curto para equilibrar a eficiência do cache e a atualização dos dados.
{ "mountType":"ossfs", "fs.ossfs.args": "-oattr_timeout=3, -onegative_timeout=0" } -
Leitura/gravação consistente para jobs distribuídos: Por padrão, o ossfs atualiza os dados do arquivo com base no cache de metadados. Use a seguinte configuração para garantir uma visualização consistente em vários nós.
{ "mountType":"ossfs", "fs.ossfs.args": "-onegative_timeout=0, -oclose_to_open" } -
Out-of-memory (OOM) devido a muitos arquivos abertos no DLC ou DSW: Alta concorrência de jobs no DLC e DSW pode abrir muitos arquivos simultaneamente, causando potencialmente problemas de Out-of-memory (OOM). A configuração a seguir pode ajudar a reduzir a pressão sobre a memória.
{ "mountType":"ossfs", "fs.ossfs.args": "-oreaddirplus=false, -oinode_cache_eviction_threshold=300000" } -
Falha ao gravar arquivos grandes:
-oupload_buffer_sizedefine o tamanho do buffer (em bytes) para uploads multipart. Este parâmetro determina o tamanho máximo gravável do arquivo, calculado como upload_buffer_size * 10000.Por padrão, o ossfs 2.0 usa um tamanho de parte de 8 MiB, o que limita o tamanho máximo gravável do arquivo a 78,125 GiB. Ao gravar um arquivo que excede esse limite, a operação falha. Para aumentar o tamanho máximo de arquivo suportado, configure a opção
-oupload_buffer_sizepara aumentar o tamanho da parte. Por exemplo, definir o tamanho da parte para 32 MiB (33.554.432 bytes) suporta um tamanho máximo de arquivo de 312,5 GiB. Observe que um-upload_buffer_sizemaior consome mais memória. Controle o uso de memória configurando-total_mem_limit. Para mais informações, consulte Mount options.{ "mountType":"ossfs", "fs.ossfs.args": "-oupload_buffer_size=33554432" }
OSS Connector for AI/ML
O OSS Connector for AI/ML é uma biblioteca cliente da equipe do Alibaba Cloud OSS para cargas de trabalho de IA e machine learning. Ela simplifica o carregamento de dados para treinamento PyTorch em larga escala, reduz o tempo e a complexidade da transferência de dados e acelera o treinamento de modelos eliminando gargalos de carregamento de dados. Para agilizar o acesso a dados, a plataforma PAI integrou o OSS Connector for AI/ML, permitindo transmitir dados diretamente do OSS dentro do seu código PyTorch para um carregamento eficiente.
Limitações
Imagens oficiais: O OSS Connector for AI/ML está disponível apenas em jobs DLC e instâncias DSW que usam uma imagem oficial do PyTorch 2.0 ou posterior.
-
Imagens personalizadas: Apenas PyTorch 2.0 ou posterior é suportado. Para imagens personalizadas que usam uma versão suportada, instale o OSS Connector for AI/ML executando o seguinte comando:
pip install -i http://yum.tbsite.net/aliyun-pypi/simple/ --extra-index-url http://yum.tbsite.net/pypi/simple/ --trusted-host=yum.tbsite.net osstorchconnector Versão do Python: Apenas Python 3.8–3.12 é suportado.
Pré-requisitos
-
Configure um arquivo de credenciais.
Configure as credenciais de uma das seguintes maneiras:
Configure acesso sem senha ao OSS para seu job DLC. Para mais informações, consulte Configure a DLC RAM role. Com este método, o job DLC obtém uma credencial temporária do STS para acessar com segurança o OSS e outros recursos cloud, eliminando a necessidade de informações explícitas de autenticação e reduzindo o risco de vazamento de chaves de acesso.
-
Configure um arquivo de credenciais no seu projeto de código para gerenciar informações de autenticação. O código abaixo fornece um exemplo de configuração:
NotaArmazenar informações de chave de acesso em texto simples representa um risco de segurança. Recomendamos usar uma função RAM para configurar automaticamente as credenciais dentro de uma instância DLC. Para mais informações, consulte Configure a DLC RAM role.
Ao usar o OSS Connector for AI/ML, especifique o caminho para o arquivo de credenciais para recuperar automaticamente as informações de autenticação para assinar solicitações de dados do OSS.
{ "AccessKeyId": "<Access-key-id>", "AccessKeySecret": "<Access-key-secret>", "SecurityToken": "<Security-Token>", "Expiration": "2024-08-20T00:00:00Z" }A tabela a seguir descreve os campos.
Parâmetro
Obrigatório
Descrição
Exemplo
AccessKeyId
Sim
O ID da chave de acesso e o segredo da chave de acesso de uma conta Alibaba Cloud ou usuário RAM.
NotaAo usar uma credencial temporária do STS para acessar o OSS, defina esses parâmetros como o ID da chave de acesso temporária e o segredo da chave de acesso temporária.
NTS****
AccessKeySecret
Sim
7NR2****
SecurityToken
Não
O token de segurança do STS. Este parâmetro é necessário apenas quando você usa uma credencial temporária do STS para acessar o OSS.
STS.6MC2****
Expiration
Não
O tempo de expiração da credencial. Se este campo estiver vazio, a credencial não expira. O OSS Connector for AI/ML relê o arquivo de credenciais quando a credencial expira.
2024-08-20T00:00:00Z
-
Configure um arquivo
config.json. O código abaixo fornece um exemplo de configuração:Este arquivo é usado para gerenciar configurações no seu projeto, como níveis de concorrência, parâmetros de pré-busca e locais de arquivos de log. Ao usar o OSS Connector for AI/ML, especifique o caminho para este arquivo
config.json. O conector então aplica automaticamente suas configurações definidas e grava logs relacionados a solicitações de dados do OSS no arquivo de log especificado.{ "logLevel": 1, "logPath": "/var/log/oss-connector/connector.log", "auditPath": "/var/log/oss-connector/audit.log", "datasetConfig": { "prefetchConcurrency": 24, "prefetchWorker": 2 }, "checkpointConfig": { "prefetchConcurrency": 24, "prefetchWorker": 4, "uploadConcurrency": 64 } }A tabela a seguir descreve os campos.
Parâmetro
Obrigatório
Descrição
Exemplo
logLevel
Sim
O nível de log. O valor padrão é 1 (INFO). Valores válidos:
-
0: DEBUG
-
1: INFO
-
2: WARN
-
3: ERROR
1
logPath
Sim
O caminho do log para o conector. O caminho padrão é
/var/log/oss-connector/connector.log./var/log/oss-connector/connector.log
auditPath
Sim
O log de auditoria para registros de I/O do Connector registra solicitações de leitura e gravação com latência superior a 100 milissegundos. O caminho padrão é
/var/log/oss-connector/audit.log./var/log/oss-connector/audit.log
DatasetConfig
prefetchConcurrency
Sim
O número de tarefas concorrentes para pré-busca de dados do OSS ao usar um conjunto de dados. O valor padrão é 24.
24
prefetchWorker
Sim
O número de vCPUs disponíveis para pré-busca de dados do OSS ao usar um conjunto de dados. O valor padrão é 2.
2
checkpointConfig
prefetchConcurrency
Sim
O número de tarefas concorrentes para pré-busca de dados do OSS durante uma leitura de checkpoint. O valor padrão é 24.
24
prefetchWorker
Sim
O número de vCPUs disponíveis para pré-busca de dados do OSS durante uma leitura de checkpoint. O valor padrão é 4.
4
uploadConcurrency
Sim
O número de tarefas concorrentes para upload de dados durante uma gravação de checkpoint. O valor padrão é 64.
64
-
Uso
O OSS Connector for AI/ML fornece duas interfaces de acesso a conjuntos de dados, OssMapDataset e OssIterableDataset, que estendem as interfaces Dataset e IterableDataset do PyTorch, respectivamente. O OssIterableDataset é otimizado com pré-busca para maior eficiência de treinamento. A ordem de leitura de dados do OssMapDataset é determinada pelo DataLoader e suporta operações de embaralhamento. Escolha uma interface de acesso a conjunto de dados com base nas seguintes recomendações:
Se você tiver memória limitada, um conjunto de dados grande e precisar apenas de leituras sequenciais com baixo paralelismo, use
OssIterableDataset.Caso tenha memória suficiente, um conjunto de dados menor e precise de acesso aleatório e processamento paralelo, utilize
OssMapDataset.
O OSS Connector for AI/ML também fornece a interface OssCheckpoint para carregar e salvar modelos. Atualmente, o recurso OssCheckpoint está disponível apenas em ambientes de recursos de computação de uso geral.
As seções a seguir descrevem como usar essas três interfaces.
OssMapDataset
Três métodos de acesso a conjuntos de dados são suportados:
-
Acessar uma pasta pelo prefixo de caminho do OSS
Especifique apenas o nome da pasta sem precisar configurar um arquivo de índice, o que simplifica a manutenção e a escalabilidade. Use este método se sua pasta do OSS estiver estruturada da seguinte forma:
dataset_folder/ ├── class1/ │ ├── image1.JPEG │ └── ... ├── class2/ │ ├── image2.JPEG │ └── ...Ao usar este método, especifique um prefixo de caminho do OSS e defina um método personalizado para analisar o fluxo de arquivos. O exemplo abaixo mostra como analisar e transformar arquivos de imagem:
def read_and_transform(data): normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) transform = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), normalize, ]) try: img = accimage.Image((data.read())) val = transform(img) label = data.label # File name except Exception as e: print("read failed", e) return None, 0 return val, label dataset = OssMapDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
Acessar arquivos de um arquivo de manifesto
Este método permite acessar dados de vários buckets do OSS, proporcionando gerenciamento de dados mais flexível. Use este método se sua pasta do OSS estiver estruturada da seguinte forma e você tiver um arquivo de manifesto que mapeia nomes de arquivos para rótulos.
dataset_folder/ ├── class1/ │ ├── image1.JPEG │ └── ... ├── class2/ │ ├── image2.JPEG │ └── ... └── .manifestO arquivo de manifesto tem o seguinte formato:
{'data': {'source': 'oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class1/image1.JPEG'}} {'data': {'source': ''}}Ao usar este método, defina um método personalizado para analisar o arquivo de manifesto. O código abaixo fornece um exemplo:
def transform_oss_path(input_path): pattern = r'oss://(.*?)\.(.*?)/(.*)' match = re.match(pattern, input_path) if match: return f'oss://{match.group(1)}/{match.group(3)}' else: return input_path def manifest_parser(reader: io.IOBase) -> Iterable[Tuple[str, str, int]]: lines = reader.read().decode("utf-8").strip().split("\n") data_list = [] for i, line in enumerate(lines): data = json.loads(line) yield transform_oss_path(data["data"]["source"]), "" dataset = OssMapDataset.from_manifest_file("{manifest_file_path}", manifest_parser, "", endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path) -
Acessar arquivos de uma lista de URIs do OSS
Acesse arquivos do OSS especificando suas URIs do OSS sem precisar configurar um arquivo de índice. O código abaixo fornece um exemplo:
uris =["oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class1/image1.JPEG", "oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class2/image2.JPEG"] dataset = OssMapDataset.from_objects(uris, endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path)
OssIterableDataset
O OssIterableDataset suporta os mesmos três métodos de acesso a conjuntos de dados que o OssMapDataset. Os exemplos a seguir mostram como usar esses três métodos:
-
Acessar uma pasta pelo prefixo de caminho do OSS
dataset = OssIterableDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
Acessar arquivos de um arquivo de manifesto
dataset = OssIterableDataset.from_manifest_file("{manifest_file_path}", manifest_parser, "", endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path) -
Acessar arquivos de uma lista de URIs do OSS
dataset = OssIterableDataset.from_objects(uris, endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path)
OssCheckpoint
Atualmente, o recurso OssCheckpoint está disponível apenas em ambientes de recursos de computação de uso geral. Use a interface OssCheckpoint para acessar e salvar arquivos de modelo no OSS. O código abaixo mostra como usar a interface:
checkpoint = OssCheckpoint(endpoint="{oss_endpoint}", cred_path=cred_path, config_path=config_path)
checkpoint_read_uri = "{checkpoint_path}"
checkpoint_write_uri = "{checkpoint_path}"
with checkpoint.reader(checkpoint_read_uri) as reader:
state_dict = torch.load(reader)
model.load_state_dict(state_dict)
with checkpoint.writer(checkpoint_write_uri) as writer:
torch.save(model.state_dict(), writer)
Exemplo de código
O código abaixo fornece um exemplo completo de como usar o OSS Connector for AI/ML para acessar dados do OSS:
from osstorchconnector import OssMapDataset, OssCheckpoint
import torchvision.transforms as transforms
import accimage
import torchvision.models as models
import torch
# The default credential path after you configure a RAM role for a DLC job or DSW instance.
cred_path = "/mnt/.alibabacloud/credentials"
config_path = "config.json"
checkpoint = OssCheckpoint(endpoint="{oss_endpoint}", cred_path=cred_path, config_path=config_path)
model = models.__dict__["resnet18"]()
epochs = 100 # Specify the number of epochs.
checkpoint_read_uri = "{checkpoint_path}"
checkpoint_write_uri = "{checkpoint_path}"
with checkpoint.reader(checkpoint_read_uri) as reader:
state_dict = torch.load(reader)
model.load_state_dict(state_dict)
def read_and_transform(data):
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
normalize,
])
try:
img = accimage.Image((data.read()))
value = transform(img)
except Exception as e:
print("read failed", e)
return None, 0
return value, 0
dataset = OssMapDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path)
data_loader = torch.utils.data.DataLoader(
dataset, batch_size="{batch_size}",num_workers="{num_workers"}, pin_memory=True)
for epoch in range(args.epochs):
for step, (images, target) in enumerate(data_loader):
# batch processing
# model training
# save model
with checkpoint.writer(checkpoint_write_uri) as writer:
torch.save(model.state_dict(), writer)
Pontos-chave neste exemplo:
Construa um conjunto de dados com
OssMapDatasetdiretamente a partir da URI do OSS fornecida, seguindo o padrão padrãoDataLoaderdo PyTorch.Use este conjunto de dados para criar um
DataLoaderpadrão do PyTorch e execute um loop de treinamento normal para processar cada lote, treinar o modelo e salvar checkpoints.Isso permite o carregamento sob demanda, eliminando a necessidade de montar o conjunto de dados no ambiente do contêiner ou baixá-lo para o armazenamento local antecipadamente.
OSS SDK
OSS Python SDK
Use o OSS Python SDK para ler e gravar dados no OSS:
Instale o OSS Python SDK. Para mais informações, consulte Installation (Python SDK V1).
Configure credenciais de acesso para o OSS Python SDK. Para mais informações, consulte Configure access credentials (Python SDK V1).
-
Leia e grave dados no OSS.
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # Configure access credentials using the RAM user access key from environment variables. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) bucket = oss2.Bucket(auth, '<Endpoint>', '<your_bucket_name>') # Read a complete file. result = bucket.get_object('<your_file_path/your_file>') print(result.read()) # Read data by range. result = bucket.get_object('<your_file_path/your_file>', byte_range=(0, 99)) # Write data to OSS. bucket.put_object('<your_file_path/your_file>', '<your_object_content>') # Append data to an appendable file. result = bucket.append_object('<your_file_path/your_file>', 0, '<your_object_content>') result = bucket.append_object('<your_file_path/your_file>', result.next_position, '<your_object_content>')Modifique os seguintes parâmetros conforme necessário:
Parâmetro
Descrição
<Endpoint>
O endpoint para a região do seu bucket. Por exemplo, para a região China (Hangzhou), defina o endpoint como https://oss-cn-hangzhou.aliyuncs.com. Para mais informações sobre como obter um endpoint, consulte Regions and endpoints.
<your_bucket_name>
O nome do seu bucket.
<your_file_path/your_file>
O caminho do arquivo a ser lido ou gravado. Especifique o caminho completo do objeto, mas exclua o nome do bucket. Por exemplo,
testfolder/exampleobject.txt.<your_object_content>
O conteúdo a ser gravado ou anexado. Substitua conforme necessário.
OSS Python API
Use a OSS Python API para armazenar convenientemente dados de treinamento e modelos no OSS. Antes de começar, certifique-se de ter instalado o OSS Python SDK e configurado suas credenciais de acesso. Para mais informações, consulte Installation (Python SDK V1) e Configure access credentials (Python SDK V1).
-
Carregar dados de treinamento
Armazene seus dados em um bucket do OSS, com os caminhos dos dados e rótulos correspondentes em um arquivo de índice no mesmo bucket. Criando um Dataset personalizado, use a API
DataLoaderno PyTorch para ler dados em paralelo em vários processos. O código abaixo é um exemplo.import io import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider import PIL import torch class OSSDataset(torch.utils.data.dataset.Dataset): def __init__(self, endpoint, bucket, auth, index_file): self._bucket = oss2.Bucket(auth, endpoint, bucket) self._indices = self._bucket.get_object(index_file).read().split(',') def __len__(self): return len(self._indices) def __getitem__(self, index): img_path, label = self._indices(index).strip().split(':') img_str = self._bucket.get_object(img_path) img_buf = io.BytesIO() img_buf.write(img_str.read()) img_buf.seek(0) img = Image.open(img_buf).convert('RGB') img_buf.close() return img, label # Obtain access credentials from environment variables. Before you run this code sample, # make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) dataset = OSSDataset(endpoint, bucket, auth, index_file) data_loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, num_workers=num_loaders, pin_memory=True)Esta tabela descreve os parâmetros principais.
Parâmetro
Descrição
endpoint
O endpoint para a região do seu bucket. Por exemplo, para a região China (Hangzhou), defina o endpoint como https://oss-cn-hangzhou.aliyuncs.com. Para mais informações sobre como obter um endpoint, consulte Regions and endpoints.
bucket
O nome do seu bucket.
index_file
O caminho do arquivo de índice.
NotaNo exemplo, o arquivo de índice usa uma vírgula (,) para separar cada amostra e dois pontos (:) para separar o caminho da amostra do rótulo.
-
Salvar ou carregar modelos
Use a OSS Python API para salvar ou carregar modelos PyTorch. Para mais informações sobre como salvar e carregar modelos no PyTorch, consulte PyTorch. O código abaixo fornece exemplos:
-
Salvar um modelo
from io import BytesIO import torch import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # bucket_name bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO() torch.save(model.state_dict(), buffer) bucket.put_object("<your_model_path>", buffer.getvalue())Onde:
endpoint é o endpoint para a região do seu bucket. Por exemplo, para a região China (Hangzhou), defina o endpoint como https://oss-cn-hangzhou.aliyuncs.com.
<your_bucket_name> é o nome do bucket do OSS, sem o prefixo oss://.
<your_model_path> é o caminho do modelo. Substitua conforme necessário.
-
Carregar um modelo
from io import BytesIO import torch import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO(bucket.get_object("<your_model_path>").read()) model.load_state_dict(torch.load(buffer))Onde:
endpoint é o endpoint para a região do seu bucket. Por exemplo, para a região China (Hangzhou), defina o endpoint como https://oss-cn-hangzhou.aliyuncs.com.
<your_bucket_name> é o nome do bucket do OSS, sem o prefixo oss://.
<your_model_path> é o caminho do modelo. Substitua conforme necessário.
-