Přístup k datům v úloze

PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)

V tomto článku se dozvíte:

  • Jak číst data z úložiště Azure v úloze Azure Machine Learning
  • Jak zapisovat data z úlohy Azure Machine Learning do Služby Azure Storage
  • Rozdíl mezi režimy připojení a stahování .
  • Jak používat identitu uživatele a spravovanou identitu pro přístup k datům.
  • Nastavení připojení disků dostupná v úloze.
  • Optimální nastavení montáže pro běžné scénáře.
  • Přístup k datovým prostředkům V1

Požadavky

Rychlý start

Než prozkoumáte podrobné možnosti, které máte k dispozici při přístupu k datům, nejprve popíšeme relevantní fragmenty kódu pro přístup k datům.

Čtení dat z úložiště Azure v úloze Azure Machine Learning

V tomto příkladu odešlete úlohu Služby Azure Machine Learning, která přistupuje k datům z veřejného účtu úložiště objektů blob. Fragment kódu ale můžete přizpůsobit tak, aby přistupoval k vlastním datům v privátním účtu azure Storage. Aktualizujte cestu, jak je popsáno zde. Azure Machine Learning bezproblémově zajišťuje ověřování v cloudovém úložišti a průchod Microsoft Entra. Když odešlete úlohu, můžete zvolit:

  • Identita uživatele: Předání identity Microsoft Entra pro přístup k datům
  • Spravovaná identita: Použití spravované identity cílového výpočetního objektu pro přístup k datům
  • Žádné: Nezadávejte identitu pro přístup k datům. Použití žádné při použití úložišť dat založených na přihlašovacích údajích (klíč/token SAS) nebo při přístupu k veřejným datům

Návod

Pokud k ověření používáte klíče nebo tokeny SAS, doporučujeme vytvořit úložiště dat služby Azure Machine Learning. Modul runtime se automaticky připojí k úložišti bez vystavení vašich přihlašovacích údajů.

from azure.ai.ml import command, Input, MLClient
from azure.ai.ml.entities import Data, UserIdentityConfiguration, ManagedIdentityConfiguration
from azure.ai.ml.constants import AssetTypes, InputOutputModes
from azure.identity import DefaultAzureCredential

# Set your subscription, resource group and workspace name:
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace = "<AML_WORKSPACE_NAME>"

# connect to the AzureML workspace
ml_client = MLClient(
    DefaultAzureCredential(), subscription_id, resource_group, workspace
)

# ==============================================================
# Set the URI path for the data.
# Supported `path` formats for input include:
# local: `./<path>
# Blob: wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
# ADLS: abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
# Datastore: azureml://datastores/<data_store_name>/paths/<path>
# Data Asset: azureml:<my_data>:<version>
# Supported `path` format for output is:
# Datastore: azureml://datastores/<data_store_name>/paths/<path>
# We set the input path to a file on a public blob container
# ==============================================================
path = "wasbs://data@azuremlexampledata.blob.core.windows.net/titanic.csv"


# ==============================================================
# What type of data does the path point to? Options include:
# data_type = AssetTypes.URI_FILE # a specific file
# data_type = AssetTypes.URI_FOLDER # a folder
# data_type = AssetTypes.MLTABLE # an mltable
# The path we set above is a specific file
# ==============================================================
data_type = AssetTypes.URI_FILE

# ==============================================================
# Set the mode. The popular modes include:
# mode = InputOutputModes.RO_MOUNT # Read-only mount on the compute target
# mode = InputOutputModes.DOWNLOAD # Download the data to the compute target
# ==============================================================
mode = InputOutputModes.RO_MOUNT

# ==============================================================
# You can set the identity you want to use in a job to access the data. Options include:
# identity = UserIdentityConfiguration() # Use the user's identity
# identity = ManagedIdentityConfiguration() # Use the compute target managed identity
# ==============================================================
# This example accesses public data, so we don't need an identity.
# You also set identity to None if you use a credential-based datastore
identity = None

# Set the input for the job:
inputs = {
    "input_data": Input(type=data_type, path=path, mode=mode)
}

# This command job uses the head Linux command to print the first 10 lines of the file
job = command(
    command="head ${{inputs.input_data}}",
    inputs=inputs,
    environment="azureml://registries/azureml/environments/sklearn-1.1/versions/4",
    compute="cpu-cluster",
    identity=identity,
)

# Submit the command
ml_client.jobs.create_or_update(job)

Zápis dat z úlohy Azure Machine Learning do Azure Storage

V tomto příkladu odešlete úlohu Služby Azure Machine Learning, která zapisuje data do výchozího úložiště dat služby Azure Machine Learning. Volitelně můžete nastavit hodnotu name datového aktiva, abyste vytvořili datové aktivum ve výstupu.

from azure.ai.ml import command, Input, Output, MLClient
from azure.ai.ml.constants import AssetTypes, InputOutputModes
from azure.identity import DefaultAzureCredential

# Set your subscription, resource group and workspace name:
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace = "<AML_WORKSPACE_NAME>"

# connect to the AzureML workspace
ml_client = MLClient(
    DefaultAzureCredential(), subscription_id, resource_group, workspace
)

# ==============================================================
# Set the URI path for the data.
# Supported `path` formats for input include:
# local: `./<path>
# Blob: wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
# ADLS: abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
# Datastore: azureml://datastores/<data_store_name>/paths/<path>
# Data Asset: azureml:<my_data>:<version>
# Supported `path` format for output is:
# Datastore: azureml://datastores/<data_store_name>/paths/<path>
# As an example, we set the input path to a file on a public blob container
# As an example, we set the output path to a folder in the default datastore
# ==============================================================
input_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/titanic.csv"
output_path = "azureml://datastores/workspaceblobstore/paths/quickstart-output/titanic.csv"

# ==============================================================
# What type of data are you pointing to?
# AssetTypes.URI_FILE (a specific file)
# AssetTypes.URI_FOLDER (a folder)
# AssetTypes.MLTABLE (a table)
# The path we set above is a specific file
# ==============================================================
data_type = AssetTypes.URI_FILE

# ==============================================================
# Set the input mode. The most commonly-used modes:
# InputOutputModes.RO_MOUNT
# InputOutputModes.DOWNLOAD
# Set the mode to Read Only (RO) to mount the data
# ==============================================================
input_mode = InputOutputModes.RO_MOUNT

# ==============================================================
# Set the output mode. The most commonly-used modes:
# InputOutputModes.RW_MOUNT
# InputOutputModes.UPLOAD
# Set the mode to Read Write (RW) to mount the data
# ==============================================================
output_mode = InputOutputModes.RW_MOUNT

# Set the input and output for the job:
inputs = {
    "input_data": Input(type=data_type, path=input_path, mode=input_mode)
}

outputs = {
    "output_data": Output(type=data_type, 
                          path=output_path, 
                          mode=output_mode,
                          # optional: if you want to create a data asset from the output, 
                          # then uncomment `name` (`name` can be set without setting `version`, and in this way, we will set `version` automatically for you)
                          # name = "<name_of_data_asset>", # use `name` and `version` to create a data asset from the output
                          # version = "<version>",
                  )
}

# This command job copies the data to your default Datastore
job = command(
    command="cp ${{inputs.input_data}} ${{outputs.output_data}}",
    inputs=inputs,
    outputs=outputs,
    environment="azureml://registries/azureml/environments/sklearn-1.1/versions/4",
    compute="cpu-cluster",
)

# Submit the command
ml_client.jobs.create_or_update(job)

Modul runtime dat služby Azure Machine Learning

Když odešlete úlohu, modul runtime dat Azure Machine Learning řídí načítání dat z umístění úložiště do cílového výpočetního objektu. Modul runtime dat Služby Azure Machine Learning je optimalizovaný pro rychlost a efektivitu úloh strojového učení. Mezi klíčové výhody patří:

  • Načítání dat zapsané v jazyce Rust, známém svou vysokou rychlostí a paměťovou efektivitou. U souběžných stahování dat se Rust vyhne problémům s globálním zámkem interpreta Pythonu (GIL).
  • Lehká hmotnost; Rust nemá žádné závislosti na jiných technologiích – například JVM. V důsledku toho se modul runtime rychle nainstaluje a nevyprázdní další prostředky (procesor, paměť) do cílového výpočetního objektu.
  • Víceprocesové (paralelní) načítání dat
  • Předem načte data jako úlohu na pozadí na jednom nebo více procesorech, aby bylo možné při hlubokém učení lépe využít GPU.
  • Bezproblémové řízení ověřování do cloudového úložiště
  • Poskytuje možnosti připojení dat (streamu) nebo stažení všech dat. Další informace najdete v částech Připojit (streamování) a Stáhnout .
  • Bezproblémová integrace s fsspec – jednotné pythonické rozhraní pro místní, vzdálené a vložené systémy souborů a úložiště bajtů.

Návod

Doporučujeme použít modul pro běh dat služby Azure Machine Learning místo vytvoření vlastní funkce pro připojování a stahování dat ve vašem kódu pro trénink (klient). Zjistili jsme omezení propustnosti úložiště, když klientský kód používá Python ke stahování dat z úložiště kvůli problémům s globálním zámkem interpreta (GIL).

Cesty

Při zadávání vstupu nebo výstupu dat do úlohy je nutné zadat path parametr, který odkazuje na umístění dat. Tato tabulka ukazuje různá umístění dat, která Azure Machine Learning podporuje, a obsahuje path příklady parametrů:

Umístění Příklady Vstup Výstup
Cesta ve vašem místním počítači ./home/username/data/my_data Й N
Cesta na veřejném serveru HTTP(S) https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv Й N
Cesta ve službě Azure Storage wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Y, pouze pro ověřování na základě identity N
Cesta k úložišti dat služby Azure Machine Learning azureml://datastores/<data_store_name>/paths/<path> Й Й
Cesta k datovému aktivu azureml:<my_data>:<version> Й N, ale můžete použít name a version k vytvoření datového zdroje na základě výstupu.

Režimy

Když spustíte úlohu s datovými vstupy a výstupy, můžete si vybrat z těchto možností režimu :

  • ro_mount: Připojte úložiště jako pouze pro čtení na lokální výpočetní cíl SSD disku.

  • rw_mount: Připojte umístění úložiště jako čtení a zápis na cílový výpočetní objekt místního disku (SSD).

  • download: Stáhněte data z umístění úložiště do cílového výpočetního objektu místního disku (SSD).

  • upload: Nahrajte data z cílového výpočetního objektu do umístění úložiště.

  • eval_mount / eval_download:Tyto režimy jsou jedinečné pro MLTable. V některých scénářích může tabulka MLTable přinést soubory, které se mohou nacházet v účtu úložiště, který se liší od účtu úložiště, který je hostitelem souboru MLTable. Nebo MLTable může vytvořit podmnožinu dat nebo je zamíchat, která jsou umístěna v prostředku úložiště. Toto zobrazení podmnožina/náhodného prohazování se zobrazí jenom v případech, kdy modul runtime dat Služby Azure Machine Learning vyhodnotí soubor MLTable. Tento diagram například ukazuje, jak se tabulka MLTable používá s eval_mount nebo eval_download k pořizování obrázků ze dvou různých kontejnerů úložiště a anotace uložené v souboru umístěném v jiném účtu úložiště a jak je poté možné připojit nebo stáhnout do systému souborů vzdáleného cílového výpočetního objektu.

    Snímek obrazovky zobrazující vyhodnocení připojovacího bodu

    Složka camera1 , camera2 složka a annotations.csv soubor jsou pak přístupné v systému souborů cílového výpočetního objektu ve struktuře složek:

    /INPUT_DATA
    ├── account-a
    │   ├── container1
    │   │   └── camera1
    │   │       ├── image1.jpg
    │   │       └── image2.jpg
    │   └── container2
    │       └── camera2
    │           ├── image1.jpg
    │           └── image2.jpg
    └── account-b
        └── container1
            └── annotations.csv
    
  • direct: Můžete chtít číst data přímo z identifikátoru URI prostřednictvím jiných rozhraní API, a ne procházet modulem runtime dat služby Azure Machine Learning. Například můžete chtít přistupovat k datům v úložišti s3 (s adresou URL ve stylu virtuálního hostitele nebo ve stylu cesty https) pomocí klienta boto s3. Identifikátor URI vstupu můžete získat jako řetězec s režimem direct . V úlohách Sparku se používá přímý režim, protože metody spark.read_*() vědí, jak zpracovat URI. Pro úlohy mimo Spark je vaší zodpovědností spravovat přístupové přihlašovací údaje. Musíte například explicitně použít Managed Service Identity (MSI) nebo jiný způsob zprostředkování přístupu.

Tato tabulka ukazuje možné režimy pro různé kombinace typu, režimu, vstupu a výstupu:

Typ Vstup a výstup upload download ro_mount rw_mount direct eval_download eval_mount
uri_folder Vstup
uri_file Vstup
mltable Vstup
uri_folder Výstup
uri_file Výstup
mltable Výstup

Stáhnout

V režimu stahování se všechna vstupní data zkopírují na místní disk (SSD) cílového výpočetního objektu. Modul runtime dat služby Azure Machine Learning spustí trénovací skript uživatele, jakmile se zkopírují všechna data. Když se spustí uživatelský skript, načte data z místního disku stejně jako ostatní soubory. Po dokončení úlohy se data odeberou z disku cílového výpočetního objektu.

Výhody Nevýhody
Při spuštění trénování jsou všechna data k dispozici na místním disku (SSD) cílového výpočetního objektu pro trénovací skript. Nevyžaduje se žádná interakce se službou Azure Storage nebo sítí. Datová sada se musí zcela vejít na cílový výpočetní disk.
Po spuštění uživatelského skriptu neexistují žádné závislosti na spolehlivosti úložiště nebo sítě. Stáhnou se celá datová sada (pokud trénování potřebuje náhodně vybrat jenom malou část dat, velká část stahování se pak promarní).
Modul runtime dat Azure Machine Learning dokáže paralelizovat stahování, což výrazně ovlivňuje výkon při práci s mnoha malými soubory, a maximalizovat propustnost sítě a úložiště. Úloha čeká na stažení všech dat na místní disk cílového výpočetního objektu. V případě odeslané úlohy hlubokého učení jsou GPU nečinné, dokud nebudou data připravená.
Vrstva FUSE nepřidává žádné nevyhnutelné režijní náklady (kolečko: volání v uživatelském skriptu v prostoru uživatele → jádro → uživatelský prostor FUSE daemona → jádro → odpověď na uživatelský skript v uživatelském prostoru). Změny úložiště se po dokončení stahování neprojeví na datech.

Kdy použít stahování

  • Data jsou dostatečně malá, aby se vešla na disk cílového výpočetního objektu bez zásahu do jiného trénování.
  • Trénování používá většinu nebo všechny datové sady.
  • Proces trénování čte soubory z datové sady více než jednou.
  • Trénování musí přeskakovat na náhodné pozice velkého souboru.
  • Před zahájením trénování je v pořádku počkat na stažení všech dat.

Dostupná nastavení stahování

Nastavení stahování můžete vyladit pomocí těchto proměnných prostředí ve své úloze:

Název proměnné prostředí Typ Výchozí hodnota Popis
RSLEX_DOWNLOADER_THREADS u64 NUMBER_OF_CPU_CORES * 4 Počet souběžných vláken ke stažení
AZUREML_DATASET_HTTP_RETRY_COUNT u64 7 Počet pokusů o opakování jednotlivých úložišť nebo http požadavku k obnovení z přechodných chyb.

Ve své úloze můžete výše uvedené výchozí hodnoty změnit nastavením proměnných prostředí , například:

Pro stručnost ukazujeme, jak definovat proměnné prostředí v úloze.

from azure.ai.ml import command

env_var = {
"RSLEX_DOWNLOADER_THREADS": 64,
"AZUREML_DATASET_HTTP_RETRY_COUNT": 10
}

job = command(
        environment_variables=env_var
)

Stažení metrik výkonu

Velikost virtuálního počítače cílového výpočetního objektu má vliv na dobu stahování dat. Konkrétně:

  • Počet jader. Čím více jader je k dispozici, tím více souběžnosti a tím rychlejší stahování.
  • Očekávaná šířka pásma sítě. Každý virtuální počítač v Azure má maximální propustnost z síťové karty (NIC).

Poznámka:

U virtuálních počítačů s GPU A100 může Azure Machine Learning runtime nasytit síťový adaptér (síťovou kartu) při stahování dat do cílového výpočetního prostředku (~24 Gbit/s): Teoretická maximální možná propustnost.

Tato tabulka ukazuje výkon stahování, který může modul runtime dat služby Azure Machine Learning zpracovat pro 100GB soubor na virtuálním Standard_D15_v2 počítači (20 jader, propustnost sítě 25 Gbit/s):

Struktura dat Pouze stahování (sekundy) Stažení a výpočet MD5 (sekundy) Dosažená propustnost (Gbit/s)
Soubory, každý o velikosti 10 x 10 GB 55.74 260.97 14.35 Gbit/s
100 souborů po 1 GB 58.09 259.47 13,77 Gbit/s
Soubor 1 x 100 GB 96.13 300.61 8,32 Gbit/s

Vidíme, že větší soubor, rozdělený na menší soubory, může zlepšit výkon stahování z důvodu paralelismu. Doporučujeme, abyste se vyhnuli příliš malým souborům (méně než 4 MB), protože doba potřebná k odeslání požadavků na úložiště se zvyšuje vzhledem k času strávenému stažením datové části. Další informace naleznete v článku Problém s mnoha malými soubory.

Připojení (streamování)

V režimu připojení využívá datová funkce Azure Machine Learning funkci FUSE (systém souborů v uživatelském prostoru) v Linuxu k vytvoření emulovaného systému souborů. Místo stažení všech dat na místní disk (SSD) cílového výpočetního objektu může modul runtime reagovat na akce skriptu uživatele v reálném čase. Například "otevřít soubor", "načíst 2KB blok z pozice X", "vypsat obsah adresáře".

Výhody Nevýhody
Data, která překračují kapacitu místního disku cílového výpočetního prostředku, je možné použít (ne omezená výpočetním hardwarem). Přidaná režie modulu FUSE pro Linux.
Žádné zpoždění na začátku trénování (na rozdíl od režimu stahování). Závislost na chování kódu uživatele (pokud trénovací kód, který postupně čte malé soubory v jednom připojení vlákna, také vyžaduje data z úložiště, nemusí maximalizovat propustnost sítě nebo úložiště).
Další dostupná nastavení pro vyladění scénáře použití Žádná podpora windows.
Z úložiště se čtou jenom data potřebná pro trénování.

Kdy použít mountování

  • Data jsou velká a nevejdou se na cílový výpočetní místní disk.
  • Každý jednotlivý výpočetní uzel v clusteru nemusí číst celou datovou sadu (náhodný soubor nebo řádky ve výběru souboru CSV atd.).
  • Zpoždění čekání na stažení všech dat před zahájením trénování se může stát problémem (nečinný čas GPU).

Dostupná nastavení připojení

Nastavení montování můžete v úloze vyladit pomocí těchto proměnných prostředí:

Název proměnné env Typ Výchozí hodnota Popis
DATASET_MOUNT_ATTRIBUTE_CACHE_TTL u64 Nenastaveno (mezipaměť nikdy nevyprší) Čas, v milisekundách, k zachování výsledků volání getattr v mezipaměti a k zamezení opakovaného získávání těchto informací z úložiště.
DATASET_RESERVED_FREE_DISK_SPACE u64 150 MB Účelem konfigurace systému je zajistit, aby byl výpočetní výkon v pořádku. Bez ohledu na hodnoty ostatních nastavení nepoužívá modul runtime dat služby Azure Machine Learning poslední RESERVED_FREE_DISK_SPACE bajty místa na disku.
DATASET_MOUNT_CACHE_SIZE usize Bez omezení Určuje, kolik místa na disku může připojení použít. Kladná hodnota nastaví absolutní hodnotu v bajtech. Záporná hodnota nastaví, kolik místa na disku necháte volné. Tato tabulka poskytuje další možnosti mezipaměti disku. KB Podporuje MBa GB modifikátory pro usnadnění.
DATASET_MOUNT_FILE_CACHE_PRUNE_THRESHOLD f64 1.0 Připojení svazku spustí prořezávání mezipaměti, když je mezipaměť zaplněna až na AVAILABLE_CACHE_SIZE * DATASET_MOUNT_FILE_CACHE_PRUNE_THRESHOLD. Měla by být mezi 0 a 1. Nastavení této hodnoty na < 1 spustí předčasné vyřazení mezipaměti na pozadí. AVAILABLE_CACHE_SIZE není proměnná prostředí, kterou můžete upravovat ani zobrazovat přímo. V tomto kontextu odkazuje na "počet bajtů, které systém vypočítá jako dostupný pro ukládání do mezipaměti". Tato hodnota závisí na faktorech, jako je velikost disku, velikost místa na disku vyžadované pro stav systému a konfigurace nastavené v proměnných prostředí (například DATASET_RESERVED_FREE_DISK_SPACE a DATASET_MOUNT_CACHE_SIZE).
DATASET_MOUNT_FILE_CACHE_PRUNE_TARGET f64 0,7 Vyřazení mezipaměti se pokusí uvolnit alespoň (1-DATASET_MOUNT_FILE_CACHE_PRUNE_TARGET) místo v mezipaměti.
DATASET_MOUNT_READ_BLOCK_SIZE usize 2 MB Velikost bloku čtení streamu Pokud je soubor dostatečně velký, požádejte o alespoň DATASET_MOUNT_READ_BLOCK_SIZE dat z úložiště a ukládejte do mezipaměti, i když operace fuse požadovaného čtení byla pro menší množství dat.
DATASET_MOUNT_READ_BUFFER_BLOCK_COUNT usize 32 Počet bloků, které se mají předem načíst (čtení bloku k spustí na pozadí přednačítání bloků k+1, ..., k.+DATASET_MOUNT_READ_BUFFER_BLOCK_COUNT)
DATASET_MOUNT_READ_THREADS usize NUMBER_OF_CORES * 4 Počet vláken předběžného načítání na pozadí
DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED Booleova hodnota nepravdivý Povolte ukládání do mezipaměti založené na blokech.
DATASET_MOUNT_MEMORY_CACHE_SIZE usize 128 MB Platí jenom pro ukládání do mezipaměti založené na blokech. Velikost blokové mezipaměti RAM, kterou lze využít. Hodnota 0 zakáže ukládání do mezipaměti zcela.
DATASET_MOUNT_BLOCK_FILE_CACHE_ENABLED Booleova hodnota pravda Platí jenom pro ukládání do mezipaměti založené na blokech. Pokud je hodnota nastavena na true, ukládání do mezipaměti používá místní pevný disk k ukládání bloků do mezipaměti.
DATASET_MOUNT_BLOCK_FILE_CACHE_MAX_QUEUE_SIZE usize 512 MB Platí jenom pro ukládání do mezipaměti založené na blokech. Blokové ukládání do mezipaměti zapisuje blok uložený v mezipaměti na místní disk na pozadí. Toto nastavení určuje, kolik paměti může připojení paměti použít k ukládání bloků čekajících na vyprázdnění do místní mezipaměti disku.
DATASET_MOUNT_BLOCK_FILE_CACHE_WRITE_THREADS usize NUMBER_OF_CORES * 2 Platí jenom pro ukládání do mezipaměti založené na blokech. Počet vláken na pozadí, které blokové ukládání do mezipaměti používá k zápisu stažených bloků na místní disk cílového výpočetního objektu.
DATASET_UNMOUNT_TIMEOUT_SECONDS u64 30 Doba v sekundách pro unmount, aby (řádně) dokončil všechny čekající operace (například volání pro vyprázdnění), než dojde k násilnému ukončení smyčky pro montování zpráv.

Ve své úloze můžete výše uvedené výchozí hodnoty změnit nastavením proměnných prostředí, například:

from azure.ai.ml import command

env_var = {
"DATASET_MOUNT_BLOCK_FILE_CACHE_ENABLED": True
}

job = command(
        environment_variables=env_var
)

Režim otevření na základě bloků

Režim otevření na základě bloků rozdělí jednotlivé soubory na bloky předdefinované velikosti (s výjimkou posledního bloku). Žádost o čtení ze zadané pozice vyžaduje odpovídající blok z úložiště a okamžitě vrátí požadovaná data. Čtení také aktivuje na pozadí předběžné načtení dalšího N bloků pomocí více vláken (těchto vláken optimalizovaných pro sekvenční čtení). Stažené bloky se ukládají do mezipaměti ve dvou vrstvách (RAM a místní disk).

Výhody Nevýhody
Rychlé doručování dat do trénovacího skriptu (méně blokování pro části, které ještě nebyly žádány). Náhodné čtení může plýtvat dopředu přednačtenými bloky.
Více práce se přesměruje na vlákna na pozadí (předběžné načítání nebo ukládání do mezipaměti). Trénování pak může pokračovat. Zvýšená režie při navigaci mezi jednotlivými mezipamětmi ve srovnání s přímým čtením ze souboru uloženého v mezipaměti na místním disku (například v režimu ukládání celé soubory do mezipaměti).
Z úložiště se čtou jenom požadovaná data (plus předběžné načtení).
Pro malá data se používá rychlá mezipaměť založená na paměti RAM.
Kdy použít režim otevření založeného na blokech

Doporučuje se pro většinu scénářů s výjimkou případů, kdy potřebujete rychlé čtení z náhodných umístění souborů. V takových případech použijte režim otevření celé mezipaměti souborů.

Režim otevření celé mezipaměti souborů

Při otevření souboru ve složce připojení (například f = open(path, args)) v režimu celého souboru se proces zablokuje, dokud se celý soubor nestáhne do adresáře vyrovnávací paměti cílového počítače na disku. Všechna následná volání čtení se přesměrovávají do souboru uloženého v mezipaměti, takže není potřeba žádná interakce s úložištěm. Pokud mezipaměť nemá dostatek volného místa pro uložení aktuálního souboru, systém se pokusí uvolnit místo odstraněním nejdéle nepoužitého souboru z mezipaměti. V případech, kdy nelze soubor umístit na disk (s ohledem na nastavení mezipaměti), běhové prostředí dat se přesune do režimu průběžného streamování.

Výhody Nevýhody
Po otevření souboru nejsou žádné závislosti na spolehlivosti úložiště a propustnosti. Otevření volání je zablokováno, dokud se nestáhne celý soubor.
Rychlé náhodné čtení (čtení bloků dat z náhodných míst souboru) Celý soubor se načte z úložiště, i když některé části souboru nemusí být potřeba.
Kdy ji použít

Pokud jsou potřeba náhodné čtení pro relativně velké soubory, které překračují 128 MB.

Využití

Nastavte proměnnou prostředí DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED na false ve vaší úloze:

from azure.ai.ml import command

env_var = {
"DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED": False
}

job = command(
        environment_variables=env_var
)

Připojení: Výpis souborů

Při práci s miliony souborů se vyhněte rekurzivnímu výpisu , například ls -R /mnt/dataset/folder/. Rekurzivní výpis aktivuje mnoho volání pro výpis obsahu adresáře nadřazeného adresáře. Pak vyžaduje samostatné rekurzivní volání pro každý adresář uvnitř všech podřízených úrovní. Azure Storage obvykle umožňuje vrácení pouze 5 000 prvků na jeden požadavek na seznam. V důsledku toho rekurzivní výpis 1M složek obsahujících 10 souborů vyžaduje 1,000,000 / 5000 + 1,000,000 = 1,000,200 požadavky na úložiště. Ve srovnání s 1 000 složkami s 10 000 soubory by pro rekurzivní výpis potřebovalo pouze 1 001 požadavků na úložiště.

Přípojný bod služby Azure Machine Learning provádí výpis pomocí líného načítání. Pokud tedy chcete vypsat mnoho malých souborů, je lepší použít volání iterativní klientské knihovny (například os.scandir() v Pythonu) místo volání klientské knihovny, které vrací úplný seznam (například os.listdir() v Pythonu). Iterativní volání klientské knihovny vrátí generátor, což znamená, že nemusí čekat na načtení celého seznamu. Pak může pokračovat rychleji.

Tato tabulka porovnává čas potřebný pro Python os.scandir() a os.listdir() funkce k vypsání obsahu složky, která obsahuje přibližně 4 miliony souborů v ploché struktuře.

Metrika os.scandir() os.listdir()
Čas na získání první položky (sekundy) 0.67 553.79
Čas získat prvních 50 tisíc položek (sekundy) 9.56 562.73
Čas získání všech položek (sek) 558.35 582.14

Optimální nastavení montáže pro běžné scénáře

Při určitých běžných scénářích představujeme optimální nastavení pro připojení, která je potřeba nastavit ve vaší úloze Azure Machine Learning.

Čtení velkého souboru postupně jednou (zpracování řádků v souboru CSV)

Do sekce konfigurace úlohy Azure Machine Learning zahrňte tato nastavení připojení environment_variables.

Poznámka:

Pokud chcete používat bezserverové výpočetní prostředky, odstraňte compute="cpu-cluster", ho v tomto kódu.

from azure.ai.ml import command

env_var = {
  "DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED": True, # Enable block-based caching
  "DATASET_MOUNT_BLOCK_FILE_CACHE_ENABLED": False, # Disable caching on disk
  "DATASET_MOUNT_MEMORY_CACHE_SIZE": 0, # Disabling in-memory caching

  # Increase the number of blocks used for prefetch. This leads to use of more RAM (2 MB * #value set).
  # Can adjust up and down for fine-tuning, depending on the actual data processing pattern.
  # An optimal setting based on our test ~= the number of prefetching threads (#CPU_CORES * 4 by default)
  "DATASET_MOUNT_READ_BUFFER_BLOCK_COUNT": 80,
}

job = command(
        environment_variables=env_var
)
Čtení velkého souboru jednou z více vláken (zpracování dělených souborů CSV ve více vláknech)

Do sekce konfigurace úlohy Azure Machine Learning zahrňte tato nastavení připojení environment_variables.

from azure.ai.ml import command

env_var = {
  "DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED": True, # Enable block-based caching
  "DATASET_MOUNT_BLOCK_FILE_CACHE_ENABLED": False, # Disable caching on disk
  "DATASET_MOUNT_MEMORY_CACHE_SIZE": 0, # Disabling in-memory caching
}

job = command(
        environment_variables=env_var
)
Čtení milionů malých souborů (obrázků) z více vláken jednou (jedno epochové trénování obrázků)

Do sekce konfigurace úlohy Azure Machine Learning zahrňte tato nastavení připojení environment_variables.

from azure.ai.ml import command

env_var = {
  "DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED": True, # Enable block-based caching
  "DATASET_MOUNT_BLOCK_FILE_CACHE_ENABLED": False, # Disable caching on disk
  "DATASET_MOUNT_MEMORY_CACHE_SIZE": 0, # Disabling in-memory caching
}

job = command(
        environment_variables=env_var
)
Čtení milionů malých souborů (obrázků) z více vláken opakovaně (v průběhu více epoch při trénování na obrázcích)

Do sekce konfigurace úlohy Azure Machine Learning zahrňte tato nastavení připojení environment_variables.

from azure.ai.ml import command

env_var = {
  "DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED": True, # Enable block-based caching
}

job = command(
        environment_variables=env_var
)
Čtení velkého souboru s náhodným hledáním (například obsluha souborové databáze z připojené složky)

Do sekce konfigurace úlohy Azure Machine Learning zahrňte tato nastavení připojení environment_variables.

from azure.ai.ml import command

env_var = {
  "DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED": False, # Disable block-based caching
}

job = command(
        environment_variables=env_var
)

Diagnostika a řešení kritických bodů načítání dat

Při spuštění úlohy Azure Machine Learning s daty určuje mode vstupu způsob, jak se bajty čtou z úložiště a ukládají se do mezipaměti na místním SSD disku cílového výpočetního prostředku. V režimu stahování se všechna data ukládají na disk před spuštěním uživatelského kódu. Maximální rychlost stahování ovlivňuje několik faktorů:

  • Počet paralelních vláken
  • Počet souborů
  • Velikost souboru

V režimu připojení musí uživatelský kód začít otevírat soubory, než se data začnou ukládat do mezipaměti. Různá nastavení připojení vedou k různým chováním při čtení a ukládání do mezipaměti. Různé faktory ovlivňují rychlost načítání dat z úložiště:

  • Umístění dat pro výpočty: Úložiště a cílové umístění výpočetních prostředků by měly být stejné. Pokud se úložiště a cíl výpočetních prostředků nachází v různých oblastech, výkon se sníží, protože data se musí přenášet mezi oblastmi. Další informace o tom, jak zajistit, aby vaše data se nacházela spolu s výpočetními jednotkami, najdete v tématu Colocate data s výpočetními jednotkami.
  • Cílová velikost výpočetních prostředků: Malé výpočetní prostředky mají nižší počet jader (menší paralelismus) a menší očekávanou šířku pásma sítě ve srovnání s většími velikostmi výpočetních prostředků – oba faktory ovlivňují výkon načítání dat.
    • Pokud například používáte malou velikost virtuálního počítače, například Standard_D2_v2 (2 jádra, 1 500 Mb/s síťové karty) a pokusíte se načíst 50 000 MB (50 GB) dat, nejlepší dosažitelná doba načítání dat by byla ~270 sekund (za předpokladu, že saturujete síťovou kartu při propustnosti 187,5 MB/s). Naproti tomu Standard_D5_v2 (16 jader, 12 000 Mb/s) by se stejná data načetla do přibližně 33 sekund (za předpokladu, že síťové rozhraní saturujete při propustnosti 1500 MB/s).
  • Úroveň úložiště: Pro většinu scénářů – včetně velkých jazykových modelů (LLM) – storage úrovně Standard poskytuje nejlepší profil nákladů a výkonu. Pokud ale máte mnoho malých souborů, nabízí Premium Storage lepší profil nákladů a výkonu. Další informace najdete v možnostech služby Azure Storage.
  • Zatížení úložiště: Pokud je účet úložiště pod vysokým zatížením – například mnoho uzlů GPU v clusteru požadujících data – pak riskujete dosažení výstupní kapacity úložiště. Pro více informací si přečtěte zatížení úložiště. Pokud máte mnoho malých souborů, které potřebují přístup paralelně, možná dosáhnete limitů požadavků úložiště. Přečtěte si aktuální informace o limitech pro požadavky na výchozí kapacitu i úložiště v cílech škálování pro účty úložiště úrovně Standard.
  • Vzor přístupu k datům v uživatelském kódu: Při použití režimu připojení se data načítají na základě otevřených a přečtených akcí v kódu. Například při čtení náhodných oddílů velkého souboru může výchozí nastavení předběžného načtení dat připojení vést ke stahování bloků, které se nebudou číst. Možná budete muset vyladit některá nastavení, abyste dosáhli maximální propustnosti. Další informace najdete v tématu Optimální nastavení montáže pro běžné scénáře.

Použití protokolů k diagnostice problémů

Pro přístup k záznamům modulu runtime dat z vaší úlohy:

  1. Na stránce úlohy vyberte Výstupy a protokoly .
  2. Vyberte složku system_logs následovanou data_capability složkou.
  3. Měli byste vidět dva logovací soubory: Snímek obrazovky s logy za běhu dat.

Soubor protokolu data-capability.log zobrazuje základní informace o době strávené při načítání klíčových dat. Například při stahování dat protokoluje modul runtime časy zahájení a dokončení aktivity stahování:

INFO 2023-05-18 17:14:47,790 sdk_logger.py:44 [28] - ActivityStarted, download
INFO 2023-05-18 17:14:50,295 sdk_logger.py:44 [28] - ActivityCompleted: Activity=download, HowEnded=Success, Duration=2504.39 [ms]

Pokud je propustnost stahování zlomkem očekávané šířky pásma sítě pro velikost virtuálního počítače, můžete zkontrolovat soubor protokolu rslex.log.<ČASOVÉ RAZÍTKO>. Tento soubor obsahuje veškeré podrobné protokolování z modulu runtime založeného na Rustu; Například paralelizace:

2023-05-18T14:08:25.388670Z  INFO copy_uri:copy_uri:copy_dataset:write_streams_to_files:collect:reduce:reduce_and_combine:reduce:get_iter: rslex::prefetching: close time.busy=23.2µs time.idle=1.90µs sessionId=012ea46a-341c-4258-8aba-90bde4fdfb51 source=Dataset[Partitions: 1, Sources: 1] file_name_column=None break_on_first_error=true skip_existing_files=false parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 i=0 index=0
2023-05-18T14:08:25.388731Z  INFO copy_uri:copy_uri:copy_dataset:write_streams_to_files:collect:reduce:reduce_and_combine:reduce: rslex::dataset_crossbeam: close time.busy=90.9µs time.idle=9.10µs sessionId=012ea46a-341c-4258-8aba-90bde4fdfb51 source=Dataset[Partitions: 1, Sources: 1] file_name_column=None break_on_first_error=true skip_existing_files=false parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 i=0
2023-05-18T14:08:25.388762Z  INFO copy_uri:copy_uri:copy_dataset:write_streams_to_files:collect:reduce:reduce_and_combine:combine: rslex::dataset_crossbeam: close time.busy=1.22ms time.idle=9.50µs sessionId=012ea46a-341c-4258-8aba-90bde4fdfb51 source=Dataset[Partitions: 1, Sources: 1] file_name_column=None break_on_first_error=true skip_existing_files=false parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4 self=Dataset[Partitions: 1, Sources: 1] parallelization_degree=4

Soubor rslex.log poskytuje podrobnosti o veškerém kopírování souboru bez ohledu na to, jestli jste zvolili režimy připojení nebo stahování. Popisuje také použitá nastavení (proměnné prostředí). Pokud chcete spustit ladění, zkontrolujte, jestli jste nastavili optimální nastavení připojení pro běžné scénáře.

Monitorování úložiště Azure

Na Azure Portal vyberte svůj účet úložiště a poté metriky pro zobrazení metrik úložiště:

Snímek obrazovky zobrazující metriky blob

Pak vykreslíte SuccessE2ELatency s SuccessServerLatency. Pokud metriky zobrazují vysokou hodnotu SuccessE2ELatency a nízkou hodnotu SuccessServerLatency, máte omezená dostupná vlákna nebo máte nedostatek prostředků, jako je procesor, paměť nebo šířka pásma sítě, měli byste:

  • Pomocí zobrazení monitorování v studio Azure Machine Learning zkontrolujte využití procesoru a paměti vaší úlohy. Pokud nemáte procesor a paměť, zvažte zvýšení velikosti cílového výpočetního virtuálního počítače.
  • Zvažte zvýšení RSLEX_DOWNLOADER_THREADS , pokud stahujete a nevyužíváte procesor a paměť. Pokud používáte mount, měli byste zvýšit DATASET_MOUNT_READ_BUFFER_BLOCK_COUNT pro více předběžného načítání a zvýšit DATASET_MOUNT_READ_THREADS pro více vláken čtení.

Pokud metriky zobrazují nízkou hodnotu SuccessE2ELatency a low SuccessServerLatency, ale u klienta dochází k vysoké latenci, máte zpoždění v požadavku na úložiště, které dosáhne služby. Měli byste zkontrolovat:

  • Určuje, jestli je počet vláken používaných pro připojení/stahování (DATASET_MOUNT_READ_THREADS/RSLEX_DOWNLOADER_THREADS) nastavený příliš nízký vzhledem k počtu jader dostupných v cílovém výpočetním objektu. Pokud je nastavení příliš nízké, zvyšte počet vláken.
  • Určuje, jestli je počet opakovaných pokusů o stažení (AZUREML_DATASET_HTTP_RETRY_COUNT) příliš vysoký. Pokud ano, snižte počet opakování.

Monitorování využití disků během úlohy

Z studio Azure Machine Learning můžete během provádění úlohy také monitorovat vstupně-výstupní operace a využití cílového výpočetního disku. Přejděte do své úlohy a vyberte kartu Monitorování . Tato karta poskytuje přehledy o prostředcích vaší úlohy za 30 dnů. Příklad:

Snímek obrazovky znázorňující využití disku během provádění úlohy

Poznámka:

Monitorování úloh podporuje pouze výpočetní prostředky, které spravuje Azure Machine Learning. Úlohy s dobou běhu kratší než 5 minut nebudou mít dostatek dat, aby naplnily toto zobrazení.

Azure Machine Learning Data Runtime nepoužívá poslední RESERVED_FREE_DISK_SPACE bajty místa na disku, aby byl výpočetní výkon v pořádku (výchozí hodnota je 150MB). Pokud je disk plný, kód zapisuje soubory na disk bez deklarování souborů jako výstupu. Zkontrolujte proto kód a ujistěte se, že se data nepíšou chybně na dočasný disk. Pokud musíte zapisovat soubory na dočasný disk a tento prostředek se zaplní, zvažte následující:

  • Zvětšení velikosti virtuálního počítače na virtuální počítač s větším dočasným diskem
  • Nastavení hodnoty TTL u dat uložených v mezipaměti (DATASET_MOUNT_ATTRIBUTE_CACHE_TTL) pro vymazání dat z disku

Kolokace dat s výpočetními prostředky

Upozornění

Pokud jsou úložiště a výpočetní prostředky v různých oblastech, výkon se sníží, protože data se musí přenášet mezi oblastmi. Tím se zvyšují náklady. Ujistěte se, že váš účet úložiště a výpočetní prostředky jsou ve stejné oblasti.

Pokud jsou vaše data a pracovní prostor Služby Azure Machine Learning uložené v různých oblastech, doporučujeme data zkopírovat do účtu úložiště ve stejné oblasti pomocí nástroje azcopy . AzCopy používá rozhraní API typu server-server, aby se data zkopírovala přímo mezi servery úložiště. Tyto operace kopírování nepoužívají šířku pásma sítě vašeho počítače. Propustnost těchto operací můžete zvýšit pomocí AZCOPY_CONCURRENCY_VALUE proměnné prostředí. Další informace najdete v tématu Zvýšení souběžnosti.

Zátěž úložiště

Při vysokém zatížení může dojít k omezení jednoho účtu úložiště, když:

  • Vaše úloha používá mnoho uzlů GPU.
  • Váš účet úložiště má mnoho souběžných uživatelů a aplikací, které při spuštění úlohy přistupují k datům.

Tato část ukazuje výpočty, které určují, jestli se omezování může stát problémem pro vaši úlohu a jak přistupovat ke snížení omezování.

Výpočet limitů šířky pásma

Účet Služby Azure Storage má výchozí limity výstupu 120 Gbit/s. Virtuální počítače Azure mají různé šířky pásma sítě, které mají vliv na teoreticky počet výpočetních uzlů potřebných k dosažení maximální výchozí výstupní kapacity úložiště:

Velikost Karta GPU Virtuální procesory Paměť: GiB Dočasné úložiště (SSD): GiB Počet karet GPU Paměť GPU: GiB Očekávaná šířka pásma sítě (Gbit/s) Výchozí maximum účtu úložiště (Gbit/s)* Počet uzlů, které se mají dostat do výchozí výstupní kapacity
Standard_ND96asr_v4 A100 96 900 6 000 8 40 24 120 5
Standard_ND96amsr_A100_v4 A100 96 1900 6400 8 80 24 120 5
Standard_NC6s_v3 V100 6 112 736 1 16 24 120 5
Standard_NC12s_v3 V100 12 224 1474 2 32 24 120 5
Standard_NC24s_v3 V100 24 448 2948 4 64 24 120 5
Standard_NC24rs_v3 V100 24 448 2948 4 64 24 120 5
Standard_NC4as_T4_v3 T4 4 28 180 1 16 8 120 15
Standard_NC8as_T4_v3 T4 8 56 360 1 16 8 120 15
Standard_NC16as_T4_v3 T4 16 110 360 1 16 8 120 15
Standard_NC64as_T4_v3 T4 64 440 2880 4 64 32 120 3

Modely A100/V100 mají maximální síťovou propustnost na uzel 24 Gbit/s. Pokud každý uzel, který čte data z jednoho účtu, může číst téměř teoreticky maximálně 24 gb/s, dojde k výstupní kapacitě s pěti uzly. Použití šesti nebo více výpočetních uzlů by začalo snižovat propustnost dat napříč všemi uzly.

Důležité

Pokud vaše úloha potřebuje více než šest uzlů A100/V100, nebo se domníváte, že překročíte výchozí výstupní kapacitu úložiště (120Gbit/s), obraťte se na podporu (přes Azure Portal) a požádejte o navýšení limitu výchozího přenosu dat úložiště.

Škálování mezi několika účty úložiště

Můžete překročit maximální výstupní kapacitu úložiště a/nebo můžete narazit na limity přenosové rychlosti požadavků. Pokud k těmto problémům dojde, doporučujeme nejprve kontaktovat podporu, abyste tyto limity pro účet úložiště zvýšili.

Pokud nemůžete zvýšit maximální kapacitu výchozího přenosu dat nebo limit rychlosti požadavků, měli byste zvážit replikaci dat napříč několika účty úložiště. Zkopírujte data do více účtů pomocí služby Azure Data Factory, Průzkumník služby Azure Storage, nebo azcopy, a připojte všechny účty ve vašem tréninkovém úkolu. Stahují se pouze data, ke kterým je přistupováno na připojeném úložišti. Trénovací kód proto může číst RANK z proměnné prostředí a vybrat, ze kterého z více připojených vstupů se má číst. Definice úlohy se předává v seznamu účtů úložiště:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: src
command: >-
  python train.py
  --epochs ${{inputs.epochs}}
  --learning-rate ${{inputs.learning_rate}}
  --data ${{inputs.cifar_storage1}}, ${{inputs.cifar_storage2}}
inputs:
  epochs: 1
  learning_rate: 0.2
  cifar_storage1:
    type: uri_folder
    path: azureml://datastores/storage1/paths/cifar
  cifar_storage2:
    type: uri_folder
    path: azureml://datastores/storage2/paths/cifar
environment: azureml:AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu@latest
compute: azureml:gpu-cluster
distribution:
  type: pytorch
  process_count_per_instance: 1
resources:
  instance_count: 2
display_name: pytorch-cifar-distributed-example
experiment_name: pytorch-cifar-distributed-example
description: Train a basic convolutional neural network (CNN) with PyTorch on the CIFAR-10 dataset, distributed via PyTorch.

Trénovací kód Pythonu pak může použít RANK k získání účtu úložiště specifického pro daný uzel:

import argparse
import os

parser = argparse.ArgumentParser()
parser.add_argument('--data', nargs='+')
args = parser.parse_args()

world_size = int(os.environ["WORLD_SIZE"])
rank = int(os.environ["RANK"])
local_rank = int(os.environ["LOCAL_RANK"])

data_path_for_this_rank = args.data[rank]

Problém s mnoha malými soubory

Čtení souborů z úložiště zahrnuje provádění požadavků na každý soubor. Počet požadavků na soubor se liší v závislosti na velikostech souborů a nastavení softwaru, který zpracovává čtení souboru.

Soubory se čtou v blocích o velikosti 1–4 MB. Soubory menší než blok se čtou jedním požadavkem (GET file.jpg 0–4 MB) a soubory větší než blok mají jeden požadavek na jeden blok (GET file.jpg 0–4 MB, GET file.jpg 4–8 MB). Tato tabulka ukazuje, že soubory menší než blok o velikosti 4 MB mají za následek více požadavků na úložiště v porovnání s většími soubory:

# Soubory Velikost souboru Celková velikost dat Velikost bloku # Požadavky na úložiště
2,000,000 500 kB 1 TB 4 MB 2,000,000
1000 1 GB 1 TB 4 MB 256,000

U malých souborů interval latence většinou zahrnuje zpracování požadavků na úložiště místo přenosů dat. Proto nabízíme tato doporučení ke zvýšení velikosti souboru:

  • Pro nestrukturovaná data (obrázky, videa atd.), archivujte malé soubory společně pomocí formátů zip/tar, abyste je ukládali jako větší soubor, který lze číst v několika blocích. Tyto větší archivované soubory je možné otevřít ve výpočetním prostředku a PyTorch Archive DataPipes může extrahovat menší soubory.
  • U strukturovaných dat (CSV, parquet atd.) zkontrolujte proces ETL a ujistěte se, že slučuje soubory ke zvětšení velikosti. Spark má repartition() a coalesce() metody, které vám pomůžou zvýšit velikost souborů.

Pokud nemůžete zvětšit velikost souborů, prozkoumejte možnosti služby Azure Storage.

Možnosti služby Azure Storage

Azure Storage nabízí dvě úrovně – Standard a Premium:

Storage Scénář
Azure Blob – Standard (HDD) Vaše data jsou strukturovaná ve větších objektech blob – obrázky, video atd.
Azure Blob – Premium (SSD) Vysoké rychlosti transakcí, menší objekty nebo konzistentně nízké požadavky na latenci úložiště

Návod

U "mnoha" malých souborů (velikost KB) doporučujeme použít premium (SSD), protože náklady na úložiště jsou menší než náklady na provoz výpočetních prostředků GPU.

Čtení datových aktiv V1

Tato část vysvětluje, jak v úloze V2 číst datové entity V1 FileDataset a TabularDataset.

Přečtěte si FileDataset

V objektu Inputtype zadejte jako AssetTypes.MLTABLE a mode jako InputOutputModes.EVAL_MOUNT:

Poznámka:

Pokud chcete používat bezserverové výpočetní prostředky, odstraňte compute="cpu-cluster", ho v tomto kódu.

Další informace o objektu MLClient, možnostech inicializace objektů MLClient a o tom, jak se připojit k pracovnímu prostoru, najdete v tématu Připojení k pracovnímu prostoru.

from azure.ai.ml import command
from azure.ai.ml.entities import Data
from azure.ai.ml import Input
from azure.ai.ml.constants import AssetTypes, InputOutputModes
from azure.ai.ml import MLClient

ml_client = MLClient.from_config(credential=DefaultAzureCredential())

filedataset_asset = ml_client.data.get(name="<filedataset_name>", version="<version>")

my_job_inputs = {
    "input_data": Input(
            type=AssetTypes.MLTABLE,
            path=filedataset_asset.id,
            mode=InputOutputModes.EVAL_MOUNT
    )
}

job = command(
    code="./src",  # Local path where the code is stored
    command="ls ${{inputs.input_data}}",
    inputs=my_job_inputs,
    environment="<environment_name>:<version>",
    compute="cpu-cluster",
)

# Submit the command
returned_job = ml_client.jobs.create_or_update(job)
# Get a URL for the job status
returned_job.services["Studio"].endpoint

Přečtěte si TabularDataset

V objektu Inputtype zadejte jako AssetTypes.MLTABLEa mode jako InputOutputModes.DIRECT:

Poznámka:

Pokud chcete používat bezserverové výpočetní prostředky, odstraňte compute="cpu-cluster", ho v tomto kódu.

from azure.ai.ml import command
from azure.ai.ml.entities import Data
from azure.ai.ml import Input
from azure.ai.ml.constants import AssetTypes, InputOutputModes
from azure.ai.ml import MLClient

ml_client = MLClient.from_config(credential=DefaultAzureCredential())

filedataset_asset = ml_client.data.get(name="<tabulardataset_name>", version="<version>")

my_job_inputs = {
    "input_data": Input(
            type=AssetTypes.MLTABLE,
            path=filedataset_asset.id,
            mode=InputOutputModes.DIRECT
    )
}

job = command(
    code="./src",  # Local path where the code is stored
    command="python train.py --inputs ${{inputs.input_data}}",
    inputs=my_job_inputs,
    environment="<environment_name>:<version>",
    compute="cpu-cluster",
)

# Submit the command
returned_job = ml_client.jobs.create_or_update(job)
# Get a URL for the status of the job
returned_job.services["Studio"].endpoint

Cleanup

Pokud jste pro tento kurz vytvořili prostředky Azure, které už nepotřebujete, odeberte je, abyste se vyhnuli účtování nákladů:

  • Pokud už výpočetní cluster nepotřebujete, škálujte výpočetní cluster na nula uzlů nebo ho odstraňte:

    az ml compute update --name cpu-cluster --resource-group <RESOURCE_GROUP> --workspace-name <AML_WORKSPACE_NAME> --min-instances 0
    
  • Odstraňte všechny výstupní datové prostředky nebo kontejnery úložiště, které jste vytvořili během testování.

Další kroky