Todos os produtos
Search
Central de documentação

Platform For AI:Usar o OSS

Última atualização: Aug 28, 2026

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

JindoFuse

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.

  • Você deseja acessar dados do OSS como se fossem um conjunto de dados local, ou seu conjunto de dados é pequeno o suficiente para se beneficiar do cache local do JindoFuse.

  • Seu framework não é PyTorch.

  • Você precisa gravar dados no OSS.

ossfs 2.0

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.

OSS Connector for AI/ML

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:

  • Carregamento por streaming: Elimina a necessidade de pré-baixar dados para o ambiente de treinamento, economizando tempo ocioso da GPU e reduzindo custos.

  • Interface amigável ao desenvolvedor: Alinha-se aos padrões de uso do Dataset do PyTorch. Oferece uma abstração melhor que o OSS SDK e é mais fácil de personalizar e estender.

  • Leituras de alta eficiência: Oferece desempenho de leitura de dados superior ao do OSS SDK para um carregamento de dados mais eficiente.

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.

OSS SDK

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.

Importante

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.limit para ajustar o limite de memória. O código abaixo fornece um exemplo:

    {
      "fs.jindo.fuse.pod.mem.limit": "10Gi"
    }

Usar o Python SDK para modificar parâmetros do JindoFuse para um conjunto de dados

Também é possível usar o Python SDK para modificar parâmetros do JindoFuse.

  1. Cumpra os seguintes pré-requisitos.

    1. Instale o SDK para AI Workspace.

      !pip install alibabacloud-aiworkspace20210204
    2. Configure variáveis de ambiente. Para mais informações, consulte Install the Credentials Tool e Configure environment variables on Linux, macOS, and Windows.

  2. Modifique os parâmetros do JindoFuse.

    Fast read/write

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def change_config():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # Recommended value: twice the number of CPU cores.
        options['fs.oss.download.thread.concurrency'] = 32
        options['fs.oss.upload.thread.concurrency'] = 32
        options['fs.jindo.args'] = '-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    
    change_config()

    Incremental read/write

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def change_config():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # Recommended value: twice the number of CPU cores.
        options['fs.oss.upload.thread.concurrency'] = 32
        options['fs.jindo.args'] = '-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    
    change_config()

    Consistent read/write

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def change_config():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        options['fs.jindo.args'] = '-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    
    change_config()

    Read-only

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def change_config():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # Recommended value: twice the number of CPU cores.
        options['fs.oss.download.thread.concurrency'] = 32
        options['fs.jindo.args'] = '-oro -oattr_timeout=7200 -oentry_timeout=7200 -onegative_timeout=7200 -okernel_cache -ono_symlink'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    
    change_config()

    JindoFuse version

    O código abaixo fornece um exemplo:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def change_version():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # Set the JindoFuse version. Supported versions include 6.4.4, 6.7.0, and 6.6.0. For release notes, see https://aliyun.github.io/alibabacloud-jindodata/releases/.
        options['fs.jindo.fuse.pod.image.tag'] = "6.7.0"
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    change_version()

    Metadata cache

    Ao executar um treinamento distribuído e vários nós tentarem 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. O código abaixo fornece um exemplo:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def turnOffMetaCache():
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
        workspace_client = AIWorkspaceClient(
          config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
          )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
    
        options['fs.jindo.args'] = '-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0'
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    
    turnOffMetaCache()
    

    Upload/download thread count

    Defina os seguintes parâmetros para ajustar a contagem de threads:

    • 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

    O código abaixo fornece um exemplo:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def adjustThreadNum():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
    
        options['fs.oss.upload.thread.concurrency'] = 32
        options['fs.oss.download.thread.concurrency'] = 32
        options['fs.oss.read.readahead.buffer.count'] = 64
     
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
     
     
    adjustThreadNum()
    

    AppendObject writes

    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. O código abaixo fornece um exemplo:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def useAppendObject():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
    
        options['fs.jindo.args'] = '-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0'
        options['fs.oss.append.enable'] = "true"
        options['fs.oss.flush.interval.millisecond'] = "1000"
        options['fs.oss.read.buffer.size'] = "262144"
        options['fs.oss.write.buffer.size'] = "262144"
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    
    useAppendObject()

    OSS-HDFS

    Para informações sobre como habilitar o OSS-HDFS, consulte What is OSS-HDFS service?. O exemplo abaixo mostra como criar um conjunto de dados que usa um endpoint OSS-HDFS:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import CreateDatasetRequest
    
    def createOssHdfsDataset():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        workspace_id = 'YOUR_WORKSPACE_ID'
    
        oss_bucket = 'YOUR_OSS_BUCKET'
        # Use the OSS-HDFS endpoint.
        oss_endpoint = f'{region_id}.oss-dls.aliyuncs.com'
        # The OSS-HDFS path to mount.
        oss_path = '/'
        # The local mount path.
        mount_path = '/mnt/data/'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
    
        response = workspace_client.create_dataset(CreateDatasetRequest(
            workspace_id=workspace_id,
            name="YOUR_DATASET_NAME",
            data_type='COMMON',
            data_source_type='OSS',
            property='DIRECTORY',
            uri=f'oss://{oss_bucket}.{oss_endpoint}{oss_path}',
            accessibility='PRIVATE',
            source_type='USER',
            options=json.dumps({
                'mountPath': mount_path,
                # In distributed training scenarios, we recommend that you add the following parameters.
                '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",
            })
        ))
        print(f'datasetId: {response.body.dataset_id}')
    
    createOssHdfsDataset()
    

    Memory resources

    Defina o parâmetro fs.jindo.fuse.pod.mem.limit para ajustar o limite de memória. O código abaixo fornece um exemplo:

    import json
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
    from alibabacloud_aiworkspace20210204.models import UpdateDatasetRequest
    
    def adjustResource():
        # Use the region where the DLC job runs. For example, use cn-hangzhou for China (Hangzhou).
        region_id = 'cn-hangzhou'
        # An Alibaba Cloud account AccessKey has permissions to call all APIs. We recommend that you use a RAM user for API calls and daily O&M.
        # We strongly recommend that you do not store the AccessKey ID or AccessKey Secret in your code. Otherwise, your AccessKey may be leaked and put all resources in your account at risk.
        # In this example, the Credentials SDK reads the AccessKey from environment variables by default for authentication. You must install the Credentials tool and configure environment variables first.
        cred = CredClient()
        dataset_id = 'YOUR_DATASET_ID'
    
        workspace_client = AIWorkspaceClient(
            config=Config(
                credential=cred,
                region_id=region_id,
                endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
            )
        )
        # 1. Get the dataset content.
        get_dataset_resp = workspace_client.get_dataset(dataset_id)
        options = json.loads(get_dataset_resp.body.options)
        # The memory resource to configure.
        options['fs.jindo.fuse.pod.mem.limit'] = "10Gi"
    
        update_request = UpdateDatasetRequest(
            options=json.dumps(options)
        )
        # 2. Update the options.
        workspace_client.update_dataset(dataset_id, update_request)
        print('new options is: {}'.format(update_request.options))
    
    adjustResource()
    

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_size define 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_size para 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_size maior 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

  1. 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:

      Nota

      Armazenar 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.

      Nota

      Ao 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

  2. 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
        │   └── ...
        └── .manifest

    O 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 OssMapDataset diretamente a partir da URI do OSS fornecida, seguindo o padrão padrão DataLoader do PyTorch.

  • Use este conjunto de dados para criar um DataLoader padrã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:

  1. Instale o OSS Python SDK. Para mais informações, consulte Installation (Python SDK V1).

  2. Configure credenciais de acesso para o OSS Python SDK. Para mais informações, consulte Configure access credentials (Python SDK V1).

  3. 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 DataLoader no 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.

    Nota

    No 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.