ML 파이프라인 단계로/단계 간에 데이터 이동(Python)

적용 대상:Python SDK azureml v1

이 문서에서는 Azure Machine Learning 파이프라인의 단계 간 데이터를 가져오고, 변환하고, 이동하는 코드를 제공합니다. Azure Machine Learning에서 데이터의 작동 방식에 대한 개요는 Azure Storage 서비스에서 데이터 액세스를 참조하세요. Azure Machine Learning 파이프라인의 이점과 구조는 Azure Machine Learning 파이프라인이란?을 참조하세요.

이 문서는 다음을 수행하는 방법을 보여줍니다.

  • 기존 데이터에 대한 Dataset 개체 사용
  • 단계 내의 데이터 액세스
  • Dataset 데이터를 학습 및 유효성 검사 하위 집합과 같은 하위 집합으로 분할
  • 다음 파이프라인 단계로 데이터를 전송하는 OutputFileDatasetConfig 개체 만들기
  • 파이프라인 단계에 대한 입력으로 OutputFileDatasetConfig 개체 사용
  • 유지하려는 OutputFileDatasetConfig에서 새 Dataset 개체 만들기

필수 조건

다음 작업을 수행해야 합니다.

기존 데이터에 대한 Dataset 개체 사용

파이프라인으로 데이터를 수집하는 기본 방법은 Dataset 개체를 사용하는 것입니다. Dataset 개체는 작업 영역 전체에서 사용할 수 있는 영구적 데이터를 나타냅니다.

Dataset 개체를 만들고 등록하는 방법에는 여러 가지가 있습니다. 테이블 형식 데이터 세트는 하나 이상의 파일에서 사용할 수 있는 구분된 데이터에 대한 것입니다. 파일 데이터 세트는 이미지와 같은 이진 데이터 또는 구문을 분석할 데이터에 대한 것입니다. Dataset 개체를 만드는 가장 간단한 프로그래밍 방식은 작업 영역 스토리지 또는 퍼블릭 URL에서 기존 BLOB을 사용하는 것입니다.

datastore = Datastore.get(workspace, 'training_data')
iris_dataset = Dataset.Tabular.from_delimited_files(DataPath(datastore, 'iris.csv'))

datastore_path = [
    DataPath(datastore, 'animals/dog/1.jpg'),
    DataPath(datastore, 'animals/dog/2.jpg'),
    DataPath(datastore, 'animals/cat/*.jpg')
]
cats_dogs_dataset = Dataset.File.from_files(path=datastore_path)

다른 옵션을 사용하여 데이터 세트를 만들거나 다른 소스에서 데이터 세트를 만들고 이를 Azure Machine Learning UI에서 등록 및 검토하고, 데이터 크기가 컴퓨팅 용량과 상호 작용하는 방식을 이해하고, 버전을 관리하는 것에 대한 더 많은 옵션은 Azure Machine Learning 데이터 세트 만들기를 참조하세요.

스크립트에 데이터 세트 전달

데이터 세트의 경로를 스크립트로 전달하려면 Dataset 개체의 as_named_input() 메서드를 사용합니다. 결과 DatasetConsumptionConfig 개체를 인수로 스크립트에 전달하거나 파이프라인 스크립트에 대한 inputs 인수를 사용함으로써 Run.get_context().input_datasets[]를 사용하여 데이터 세트를 검색할 수 있습니다.

명명된 입력을 만든 후에는 해당 액세스 모드(FileDataset에만 해당)(as_mount() 또는 as_download())를 선택할 수 있습니다. 스크립트가 데이터 세트의 모든 파일을 처리하고 컴퓨팅 리소스의 디스크가 데이터 세트에 충분한 크기일 경우 다운로드 액세스 모드를 선택하는 것이 좋습니다. 다운로드 액세스 모드는 런타임 시 데이터 스트리밍의 오버헤드를 방지합니다. 스크립트가 데이터 세트의 하위 집합에 액세스하거나 크기가 너무 커서 컴퓨팅에 사용할 수 없는 경우에는 탑재 액세스 모드를 사용합니다. 자세한 내용은 탑재 대 다운로드를 참조하세요.

파이프라인 단계에 데이터 세트를 전달하려면:

  1. TabularDataset.as_named_input() 또는 FileDataset.as_named_input()(끝에 ‘s’ 없음)을 사용하여 DatasetConsumptionConfig 개체 만들기
  2. FileDataset에만 해당:. as_mount() 또는 as_download()를 사용하여 액세스 모드를 설정합니다. TabularDataset는 설정된 액세스 모드를 지원하지 않습니다.
  3. arguments 또는 inputs 인수를 사용하여 파이프라인 단계로 데이터 세트 전달

다음 코드 조각은 iris_dataset(TabularDataset)를 사용하여 PythonScriptStep 생성자 내에서 이러한 단계를 결합하는 일반적인 패턴을 보여 줍니다.


train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[iris_dataset.as_named_input('iris')]
)

참고 항목

이러한 모든 인수(즉, "train_data", "train.py", cluster, iris_dataset)에 대한 값을 고유한 데이터로 바꿔야 합니다. 위의 코드 조각은 호출 형식만 보여 주며 Microsoft 샘플의 일부가 아닙니다.

random_split()take_sample()과 같은 메서드를 사용하여 여러 입력을 만들거나 파이프라인 단계로 전달되는 데이터양을 줄일 수도 있습니다.

seed = 42 # PRNG seed
smaller_dataset = iris_dataset.take_sample(0.1, seed=seed) # 10%
train, test = smaller_dataset.random_split(percentage=0.8, seed=seed)

train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[train.as_named_input('train'), test.as_named_input('test')]
)

스크립트 내에서 데이터 세트에 액세스

파이프라인 단계 스크립트의 명명된 입력은 Run 개체 내에서 사전으로 사용할 수 있습니다. Run.get_context()를 사용하여 활성 Run 개체를 검색한 다음 input_datasets를 사용하여 명명된 입력의 사전을 검색합니다. inputs 인수가 아닌 arguments 인수를 사용하여 DatasetConsumptionConfig 개체를 전달한 경우 ArgParser 코드를 사용하여 데이터에 액세스합니다. 다음 코드 조각에서는 두 가지 방법을 모두 보여 줍니다.

파이프라인 정의 스크립트

# Code for demonstration only: It would be very confusing to split datasets between `arguments` and `inputs`
train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    # datasets passed as arguments
    arguments=['--training-folder', train.as_named_input('train').as_download()],
    # datasets passed as inputs
    inputs=[test.as_named_input('test').as_download()]
)

PythonScriptStep에서 참조된 train.py 스크립트

# In pipeline script
parser = argparse.ArgumentParser()
# Retreive the dataset passed as an argument
parser.add_argument('--training-folder', type=str, dest='train_folder', help='training data folder mounting point')
args = parser.parse_args()
training_data_folder = args.train_folder
# Retrieve the dataset passed as an input
testing_data_folder = Run.get_context().input_datasets['test']

전달된 값은 데이터 세트 파일의 경로입니다.

등록된 Dataset에 직접 액세스할 수도 있습니다. 등록된 데이터 세트는 영구적이며 작업 영역에서 공유되므로 직접 검색할 수 있습니다.

run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')

참고 항목

이전 코드 조각은 호출의 형식을 나타내며 Microsoft 샘플의 일부가 아닙니다. 다양한 인수를 사용자 고유의 프로젝트 값으로 바꿔야 합니다.

중간 데이터에 OutputFileDatasetConfig 사용

Dataset 개체가 영구 데이터만 나타내지만 파이프라인 단계 영구 출력 데이터에서 임시 데이터 출력에 OutputFileDatasetConfig 개체를 사용할 수 있습니다. OutputFileDatasetConfig에서는 Blob Storage, fileshare, adlsgen1 또는 adlsgen2에 데이터 쓰기를 지원합니다. 탑재 모드와 업로드 모드를 모두 지원합니다. 탑재 모드에서 탑재된 디렉터리에 기록된 파일은 파일을 닫을 때 영구적으로 저장됩니다. 업로드 모드에서 출력 디렉터리에 기록된 파일은 작업 종료 시 업로드됩니다. 작업이 실패하거나 취소되면 출력 디렉터리가 업로드되지 않습니다.

OutputFileDatasetConfig 개체의 기본 동작은 작업 영역의 기본 데이터 저장소에 쓰는 것입니다. arguments 매개 변수를 사용하여 OutputFileDatasetConfig 개체를 PythonScriptStep에 전달합니다.

from azureml.data import OutputFileDatasetConfig
dataprep_output = OutputFileDatasetConfig()
input_dataset = Dataset.get_by_name(workspace, 'raw_data')

dataprep_step = PythonScriptStep(
    name="prep_data",
    script_name="dataprep.py",
    compute_target=cluster,
    arguments=[input_dataset.as_named_input('raw_data').as_mount(), dataprep_output]
    )

참고 항목

OutputFileDatasetConfig에 대한 동시 쓰기가 실패하게 됩니다. 단일 OutputFileDatasetConfig를 동시에 사용하지 않아야 합니다. 분산 학습을 사용하는 경우와 같이 다중 처리 상황에서는 단일 OutputFileDatasetConfig를 공유하지 않도록 합니다.

학습 단계의 출력으로 OutputFileDatasetConfig 사용

파이프라인의 PythonScriptStep 내에서 프로그램의 인수를 사용하여 사용 가능한 출력 경로를 검색할 수 있습니다. 이 단계가 첫 번째이고 출력 데이터를 초기화하는 경우 지정된 경로에 디렉터리를 만들어야 합니다. 그런 다음 OutputFileDatasetConfig에 포함할 파일을 쓸 수 있습니다.

parser = argparse.ArgumentParser()
parser.add_argument('--output_path', dest='output_path', required=True)
args = parser.parse_args()

# Make directory for file
os.makedirs(os.path.dirname(args.output_path), exist_ok=True)
with open(args.output_path, 'w') as f:
    f.write("Step 1's output")

OutputFileDatasetConfig를 초기 단계가 아닌 단계에 대한 입력으로 읽기

초기 파이프라인 단계에서 일부 데이터를 OutputFileDatasetConfig 경로에 쓰고 초기 단계의 출력이 되면 이후 단계에 대한 입력으로 사용할 수 있습니다.

다음 코드에서:

  • step1_output_data는 PythonScriptStep, step1의 출력이 업로드 액세스 모드에서 ADLS Gen 2 데이터스토어 my_adlsgen2에 기록되었음을 나타냅니다. ADLS Gen 2 데이터 저장소에 데이터를 다시 쓰기 위해 역할 권한 설정을 하는 방법에 관해 자세히 알아보세요.

  • step1이 완료되고 출력이 step1_output_data에 표시된 대상에 기록되면 2단계에서 step1_output_data를 입력으로 사용할 수 있습니다.

# get adls gen 2 datastore already registered with the workspace
datastore = workspace.datastores['my_adlsgen2']
step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()

step1 = PythonScriptStep(
    name="generate_data",
    script_name="step1.py",
    runconfig = aml_run_config,
    arguments = ["--output_path", step1_output_data]
)

step2 = PythonScriptStep(
    name="read_pipeline_data",
    script_name="step2.py",
    compute_target=compute,
    runconfig = aml_run_config,
    arguments = ["--pd", step1_output_data.as_input()]

)

pipeline = Pipeline(workspace=ws, steps=[step1, step2])

Python 스크립트 step2.py에서 데이터를 읽는 것은 앞선 스크립트 내 데이터 세트 액세스에 설명된 것과 동일합니다. 데이터에 액세스하려면 ArgumentParser를 사용하여 스크립트에 --pd 인수를 추가합니다.

다시 사용할 OutputFileDatasetConfig 개체 등록

OutputFileDatasetConfig를 실험 기간보다 오래 사용할 수 있도록 하려면 이 개체를 작업 영역에 등록하여 실험 전반에 공유하고 다시 사용하면 됩니다.

step1_output_ds = step1_output_data.register_on_complete(
    name='processed_data', 
    description = 'files from step1'
)

더 이상 필요하지 않은 OutputFileDatasetConfig 콘텐츠 삭제

Azure는 OutputFileDatasetConfig로 작성된 중간 데이터를 자동으로 삭제하지 않습니다. 대량의 불필요한 데이터에 대한 스토리지 요금을 방지하려면 다음 중 하나를 선택해야 합니다.

주의

데이터의 마지막 변경 날짜로부터 30일이 지난 후에만 중간 데이터를 삭제합니다. 데이터를 더 일찍 삭제하면 파이프라인이 재사용을 위해 30일 기간 내에 중간 데이터가 존재한다고 가정하기 때문에 파이프라인 실행이 실패할 수 있습니다.

  • 파이프라인 작업 종료 시 중간 데이터가 더 이상 필요하지 않을 때 프로그래밍 방식으로 삭제합니다.
  • 중간 데이터에 대한 단기 스토리지 정책과 함께 Blob Storage를 사용합니다(Azure Blob Storage 액세스 계층을 자동화하여 비용 최적화 참조). 이 정책은 작업 영역의 기본이 아닌 데이터 저장소에만 설정할 수 있습니다. 중간 데이터를 기본값이 아닌 다른 데이터 저장소로 내보내려면 OutputFileDatasetConfig를 사용합니다.
    # Get adls gen 2 datastore already registered with the workspace
    datastore = workspace.datastores['my_adlsgen2']
    step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()
    
  • 더 이상 필요하지 않은 데이터 정기적으로 검토 및 삭제합니다.

자세한 내용은 Azure Machine Learning 비용 플랜 및 관리를 참조하세요.

다음 단계