이 섹션의 다중 페이지 출력 화면임. 여기를 클릭하여 프린트.

이 페이지의 일반 화면으로 돌아가기.

Integrations

W&B 인테그레이션을 사용하면 기존 프로젝트 내에서 실험 추적 및 데이터 버전 관리를 빠르고 쉽게 설정할 수 있습니다. PyTorch와 같은 ML 프레임워크, Hugging Face와 같은 ML 라이브러리 또는 Amazon SageMaker와 같은 클라우드 서비스에 대한 인테그레이션을 확인하세요.

관련 자료

  • Examples: 각 인테그레이션에 대한 노트북 및 스크립트 예제를 사용하여 코드를 사용해 보세요.
  • Video Tutorials: YouTube 동영상 튜토리얼로 W&B 사용법을 배우세요.

1 - Add wandb to any library

모든 라이브러리에 wandb 추가하기

이 가이드는 강력한 Experiment Tracking, GPU 및 시스템 모니터링, 모델 체크포인팅 등을 사용자 라이브러리에서 활용할 수 있도록 W&B를 Python 라이브러리에 통합하는 모범 사례를 제공합니다.

다음은 작업 중인 코드베이스가 단일 Python 트레이닝 스크립트 또는 Jupyter 노트북보다 복잡할 때 유용한 팁과 모범 사례입니다. 다루는 주제는 다음과 같습니다.

  • 설정 요구 사항
  • 사용자 로그인
  • wandb Run 시작하기
  • Run 설정 정의하기
  • W&B에 로깅하기
  • 분산 트레이닝
  • 모델 체크포인팅 등
  • 하이퍼파라미터 튜닝
  • 고급 인테그레이션

설정 요구 사항

시작하기 전에 라이브러리의 종속성에 W&B가 필요한지 여부를 결정하세요.

설치 시 W&B 필요

W&B Python 라이브러리(wandb)를 종속성 파일에 추가합니다(예: requirements.txt 파일):

torch==1.8.0
...
wandb==0.13.*

설치 시 W&B를 선택 사항으로 만들기

W&B SDK(wandb)를 선택 사항으로 만드는 방법에는 두 가지가 있습니다.

A. 사용자가 수동으로 설치하지 않고 wandb 기능을 사용하려고 할 때 오류를 발생시키고 적절한 오류 메시지를 표시합니다.

try:
    import wandb
except ImportError:
    raise ImportError(
        "You are trying to use wandb which is not currently installed."
        "Please install it using pip install wandb"
    )

B. Python 패키지를 빌드하는 경우 pyproject.toml 파일에 wandb를 선택적 종속성으로 추가합니다.

[project]
name = "my_awesome_lib"
version = "0.1.0"
dependencies = [
    "torch",
    "sklearn"
]

[project.optional-dependencies]
dev = [
    "wandb"
]

사용자 로그인

API 키 만들기

API 키는 클라이언트 또는 머신을 W&B에 인증합니다. 사용자 프로필에서 API 키를 생성할 수 있습니다.

  1. 오른쪽 상단 모서리에 있는 사용자 프로필 아이콘을 클릭합니다.
  2. 사용자 설정을 선택한 다음 API 키 섹션으로 스크롤합니다.
  3. 표시를 클릭합니다. 표시된 API 키를 복사합니다. API 키를 숨기려면 페이지를 새로 고침합니다.

wandb 라이브러리 설치 및 로그인

로컬에서 wandb 라이브러리를 설치하고 로그인하려면:

  1. API 키로 WANDB_API_KEY 환경 변수를 설정합니다.

    export WANDB_API_KEY=<your_api_key>
    
  2. wandb 라이브러리를 설치하고 로그인합니다.

    pip install wandb
    
    wandb login
    
pip install wandb
import wandb
wandb.login()
!pip install wandb

import wandb
wandb.login()

사용자가 위에 언급된 단계를 따르지 않고 처음으로 wandb를 사용하는 경우 스크립트에서 wandb.init을 호출할 때 자동으로 로그인하라는 메시지가 표시됩니다.

Run 시작하기

W&B Run은 W&B에서 로깅하는 계산 단위입니다. 일반적으로 트레이닝 실험당 단일 W&B Run을 연결합니다.

코드 내에서 W&B를 초기화하고 Run을 시작합니다.

run = wandb.init()

선택적으로, 코드에서 wandb_project와 같은 파라미터와 함께 프로젝트 이름을 제공하거나 사용자 이름 또는 팀 이름(예: 엔터티 파라미터에 대한 wandb_entity)과 함께 프로젝트 이름을 제공하도록 할 수 있습니다.

run = wandb.init(project=wandb_project, entity=wandb_entity)

Run을 완료하려면 run.finish()를 호출해야 합니다. 이것이 통합 디자인에 적합한 경우 Run을 컨텍스트 관리자로 사용합니다.

# 이 블록이 종료되면 run.finish()를 자동으로 호출합니다.
# 예외로 인해 종료되면 run.finish(exit_code=1)을 사용하여 Run을 실패로 표시합니다.
with wandb.init() as run:
    ...

wandb.init을 언제 호출해야 할까요?

라이브러리는 가능한 한 빨리 W&B Run을 만들어야 합니다. 오류 메시지를 포함하여 콘솔의 모든 출력이 W&B Run의 일부로 로깅되기 때문입니다. 이렇게 하면 디버깅이 더 쉬워집니다.

wandb를 선택적 종속성으로 사용하기

사용자가 라이브러리를 사용할 때 wandb를 선택 사항으로 만들려면 다음 중 하나를 수행할 수 있습니다.

  • 다음과 같은 wandb 플래그를 정의합니다.
trainer = my_trainer(..., use_wandb=True)
python train.py ... --use-wandb
  • 또는 wandb.init에서 wandbdisabled로 설정합니다.
wandb.init(mode="disabled")
export WANDB_MODE=disabled

또는

wandb disabled
  • 또는 wandb를 오프라인으로 설정합니다. 이렇게 하면 여전히 wandb가 실행되지만 인터넷을 통해 W&B에 다시 통신하려고 시도하지 않습니다.
export WANDB_MODE=offline

또는

os.environ['WANDB_MODE'] = 'offline'
wandb offline

Run 설정 정의하기

wandb Run 설정으로 W&B Run을 만들 때 모델, 데이터셋 등에 대한 메타데이터를 제공할 수 있습니다. 이 정보를 사용하여 다양한 Experiments를 비교하고 주요 차이점을 빠르게 이해할 수 있습니다.

W&B Runs table

로깅할 수 있는 일반적인 구성 파라미터는 다음과 같습니다.

  • 모델 이름, 버전, 아키텍처 파라미터 등
  • 데이터셋 이름, 버전, 트레이닝/검증 예제 수 등
  • 학습률, 배치 크기, 옵티마이저 등과 같은 트레이닝 파라미터

다음 코드 조각은 구성을 로깅하는 방법을 보여줍니다.

config = {"batch_size": 32, ...}
wandb.init(..., config=config)

Run 설정 업데이트하기

run.config.update를 사용하여 구성을 업데이트합니다. 구성 사전이 정의된 후에 파라미터를 가져올 때 구성 사전을 업데이트하는 것이 유용합니다. 예를 들어 모델이 인스턴스화된 후에 모델의 파라미터를 추가할 수 있습니다.

run.config.update({"model_parameters": 3500})

구성 파일을 정의하는 방법에 대한 자세한 내용은 실험 구성을 참조하세요.

W&B에 로깅하기

메트릭 로깅

키 값이 메트릭 이름인 사전을 만듭니다. 이 사전 오브젝트를 run.log에 전달합니다.

for epoch in range(NUM_EPOCHS):
    for input, ground_truth in data:
        prediction = model(input)
        loss = loss_fn(prediction, ground_truth)
        metrics = { "loss": loss }
        run.log(metrics)

메트릭이 많은 경우 메트릭 이름에 train/...val/...와 같은 접두사를 사용하여 UI에서 자동으로 그룹화할 수 있습니다. 이렇게 하면 트레이닝 및 검증 메트릭 또는 분리하려는 다른 메트릭 유형에 대해 W&B Workspace에 별도의 섹션이 생성됩니다.

metrics = {
    "train/loss": 0.4,
    "train/learning_rate": 0.4,
    "val/loss": 0.5,
    "val/accuracy": 0.7
}
run.log(metrics)
A W&B Workspace with 2 separate sections

run.log에 대해 자세히 알아보세요.

x축 정렬 오류 방지

동일한 트레이닝 단계에 대해 run.log를 여러 번 호출하는 경우 wandb SDK는 run.log를 호출할 때마다 내부 단계 카운터를 증가시킵니다. 이 카운터는 트레이닝 루프의 트레이닝 단계와 정렬되지 않을 수 있습니다.

이러한 상황을 피하려면 wandb.init을 호출한 직후에 run.define_metric을 사용하여 x축 단계를 명시적으로 한 번 정의하세요.

with wandb.init(...) as run:
    run.define_metric("*", step_metric="global_step")

글로브 패턴 *는 모든 메트릭이 차트에서 global_step을 x축으로 사용함을 의미합니다. 특정 메트릭만 global_step에 대해 로깅하려면 대신 지정할 수 있습니다.

run.define_metric("train/loss", step_metric="global_step")

이제 run.log를 호출할 때마다 메트릭, step 메트릭 및 global_step을 로깅합니다.

for step, (input, ground_truth) in enumerate(data):
    ...
    run.log({"global_step": step, "train/loss": 0.1})
    run.log({"global_step": step, "eval/loss": 0.2})

예를 들어 검증 루프 중에 “global_step"을 사용할 수 없는 경우 독립 단계 변수에 액세스할 수 없는 경우 “global_step"에 대해 이전에 로깅된 값이 wandb에서 자동으로 사용됩니다. 이 경우 메트릭에 필요한 경우 정의되도록 메트릭에 대한 초기 값을 로깅해야 합니다.

이미지, 테이블, 오디오 등 로깅

메트릭 외에도 플롯, 히스토그램, 테이블, 텍스트, 이미지, 비디오, 오디오, 3D 등과 같은 미디어를 로깅할 수 있습니다.

데이터 로깅 시 고려해야 할 사항은 다음과 같습니다.

  • 메트릭을 얼마나 자주 로깅해야 할까요? 선택 사항이어야 할까요?
  • 시각화하는 데 어떤 유형의 데이터가 도움이 될 수 있을까요?
    • 이미지의 경우 시간 경과에 따른 진화를 확인하기 위해 샘플 예측, 분할 마스크 등을 로깅할 수 있습니다.
    • 텍스트의 경우 나중에 탐색할 수 있도록 샘플 예측 테이블을 로깅할 수 있습니다.

미디어, 오브젝트, 플롯 등을 로깅하는 방법에 대해 자세히 알아보세요.

분산 트레이닝

분산 환경을 지원하는 프레임워크의 경우 다음 워크플로우 중 하나를 적용할 수 있습니다.

  • “메인” 프로세스를 감지하고 거기에서만 wandb를 사용합니다. 다른 프로세스에서 오는 필요한 데이터는 먼저 메인 프로세스로 라우팅되어야 합니다. (이 워크플로우가 권장됩니다).
  • 모든 프로세스에서 wandb를 호출하고 모두 동일한 고유 group 이름을 지정하여 자동으로 그룹화합니다.

자세한 내용은 분산 트레이닝 실험 로깅을 참조하세요.

모델 체크포인트 등 로깅

프레임워크에서 모델 또는 데이터셋을 사용하거나 생성하는 경우 전체 추적성을 위해 로깅하고 wandb가 W&B Artifacts를 통해 전체 파이프라인을 자동으로 모니터링하도록 할 수 있습니다.

Stored Datasets and Model Checkpoints in W&B

Artifacts를 사용할 때 사용자가 다음을 정의하도록 하는 것이 유용하지만 필수는 아닙니다.

  • 모델 체크포인트 또는 데이터셋을 로깅하는 기능(선택 사항으로 만들려는 경우).
  • 입력으로 사용되는 아티팩트의 경로/참조(있는 경우). 예를 들어 user/project/artifact입니다.
  • Artifacts 로깅 빈도.

모델 체크포인트 로깅

모델 체크포인트를 W&B에 로깅할 수 있습니다. 고유한 wandb Run ID를 활용하여 출력 모델 체크포인트 이름을 지정하여 Runs 간에 차별화하는 것이 유용합니다. 유용한 메타데이터를 추가할 수도 있습니다. 또한 아래와 같이 각 모델에 에일리어스를 추가할 수도 있습니다.

metadata = {"eval/accuracy": 0.8, "train/steps": 800}

artifact = wandb.Artifact(
                name=f"model-{run.id}",
                metadata=metadata,
                type="model"
                )
artifact.add_dir("output_model") # 모델 가중치가 저장되는 로컬 디렉토리

aliases = ["best", "epoch_10"]
run.log_artifact(artifact, aliases=aliases)

사용자 지정 에일리어스를 만드는 방법에 대한 자세한 내용은 사용자 지정 에일리어스 만들기를 참조하세요.

출력 Artifacts를 임의의 빈도(예: 모든 에포크, 500단계마다 등)로 로깅할 수 있으며 자동으로 버전이 지정됩니다.

사전 학습된 모델 또는 데이터셋 로깅 및 추적

사전 학습된 모델 또는 데이터셋과 같이 트레이닝에 입력으로 사용되는 아티팩트를 로깅할 수 있습니다. 다음 코드 조각은 Artifact를 로깅하고 위의 그래프에 표시된 대로 진행 중인 Run에 입력으로 추가하는 방법을 보여줍니다.

artifact_input_data = wandb.Artifact(name="flowers", type="dataset")
artifact_input_data.add_file("flowers.npy")
run.use_artifact(artifact_input_data)

아티팩트 다운로드

Artifact(데이터셋, 모델 등)를 다시 사용하면 wandb가 로컬에 복사본을 다운로드합니다(그리고 캐시합니다).

artifact = run.use_artifact("user/project/artifact:latest")
local_path = artifact.download("./tmp")

Artifacts는 W&B의 Artifacts 섹션에서 찾을 수 있으며 자동으로 생성된 에일리어스(latest, v2, v3) 또는 로깅할 때 수동으로 생성된 에일리어스(best_accuracy 등)로 참조할 수 있습니다.

분산 환경 또는 간단한 추론과 같이(wandb.init을 통해) wandb Run을 만들지 않고 Artifact를 다운로드하려면 대신 wandb API로 아티팩트를 참조할 수 있습니다.

artifact = wandb.Api().artifact("user/project/artifact:latest")
local_path = artifact.download()

자세한 내용은 Artifacts 다운로드 및 사용을 참조하세요.

하이퍼파라미터 튜닝

라이브러리에서 W&B 하이퍼파라미터 튜닝을 활용하려면 W&B Sweeps를 라이브러리에 추가할 수도 있습니다.

고급 인테그레이션

다음 인테그레이션에서 고급 W&B 인테그레이션이 어떻게 보이는지 확인할 수도 있습니다. 대부분의 인테그레이션은 이만큼 복잡하지 않습니다.

2 - Azure OpenAI Fine-Tuning

W&B를 사용하여 Azure OpenAI 모델을 파인튜닝하는 방법.

도입

W&B를 사용하여 Microsoft Azure에서 GPT-3.5 또는 GPT-4 모델을 미세 조정하면 메트릭을 자동으로 캡처하고 W&B의 실험 추적 및 평가 툴을 통해 체계적인 평가를 용이하게 하여 모델 성능을 추적, 분석 및 개선할 수 있습니다.

전제 조건

  • 공식 Azure 설명서에 따라 Azure OpenAI 서비스를 설정합니다.
  • API 키로 W&B 계정을 구성합니다.

워크플로우 개요

1. 미세 조정 설정

  • Azure OpenAI 요구 사항에 따라 트레이닝 데이터를 준비합니다.
  • Azure OpenAI에서 미세 조정 작업을 구성합니다.
  • W&B는 미세 조정 프로세스를 자동으로 추적하여 메트릭 및 하이퍼파라미터를 기록합니다.

2. 실험 추적

미세 조정하는 동안 W&B는 다음을 캡처합니다.

  • 트레이닝 및 유효성 검사 메트릭
  • 모델 하이퍼파라미터
  • 리소스 활용률
  • 트레이닝 Artifacts

3. 모델 평가

미세 조정한 후 W&B Weave를 사용하여 다음을 수행합니다.

  • 참조 데이터셋에 대한 모델 출력을 평가합니다.
  • 다양한 미세 조정 Runs에서 성능을 비교합니다.
  • 특정 테스트 케이스에서 모델 행동을 분석합니다.
  • 모델 선택을 위해 데이터 기반 결정을 내립니다.

실제 예제

추가 자료

3 - Catalyst

Catalyst, Pytorch 프레임워크에 W&B를 통합하는 방법

Catalyst는 재현성, 빠른 실험, 코드베이스 재사용에 중점을 둔 딥러닝 R&D를 위한 PyTorch 프레임워크이므로 새로운 것을 만들 수 있습니다.

Catalyst에는 파라미터, 메트릭, 이미지 및 기타 Artifacts 로깅을 위한 W&B 인테그레이션이 포함되어 있습니다.

Python 및 Hydra를 사용한 예제가 포함된 인테그레이션 관련 문서를 확인하세요.

인터랙티브 예제

Catalyst 및 W&B 인테그레이션이 작동하는 것을 보려면 예제 colab을 실행하세요.

4 - Cohere fine-tuning

W&B를 사용하여 Cohere 모델을 파인튜닝하는 방법.

Weights & Biases를 사용하면 Cohere 모델의 미세 조정 메트릭 및 설정을 기록하여 모델의 성능을 분석하고 이해하며 동료와 결과를 공유할 수 있습니다.

Cohere 가이드에는 미세 조정 run을 시작하는 방법에 대한 전체 예제가 있으며, Cohere API 문서는 여기에서 찾을 수 있습니다.

Cohere 미세 조정 결과 기록

Cohere 미세 조정 로깅을 W&B workspace에 추가하려면 다음을 수행하십시오.

  1. W&B API 키, W&B entityproject 이름으로 WandbConfig를 생성합니다. W&B API 키는 https://wandb.ai/authorize 에서 찾을 수 있습니다.

  2. 모델 이름, 데이터셋 및 하이퍼파라미터와 함께 이 설정을 FinetunedModel 오브젝트에 전달하여 미세 조정 run을 시작합니다.

    from cohere.finetuning import WandbConfig, FinetunedModel
    
    # W&B 세부 정보로 config를 생성합니다.
    wandb_ft_config = WandbConfig(
        api_key="<wandb_api_key>",
        entity="my-entity", # 제공된 API 키와 연결된 유효한 entity여야 합니다.
        project="cohere-ft",
    )
    
    ...  # 데이터셋 및 하이퍼파라미터를 설정합니다.
    
    # cohere에서 미세 조정 run을 시작합니다.
    cmd_r_finetune = co.finetuning.create_finetuned_model(
      request=FinetunedModel(
        name="command-r-ft",
        settings=Settings(
          base_model=...
          dataset_id=...
          hyperparameters=...
          wandb=wandb_ft_config  # 여기에 W&B config를 전달합니다.
        ),
      ),
    )
    
  3. 모델의 미세 조정 트레이닝 및 유효성 검사 메트릭과 하이퍼파라미터를 생성한 W&B project에서 확인합니다.

Runs 구성

W&B runs는 자동으로 구성되며 job 유형, base model, 학습 속도 및 기타 하이퍼파라미터와 같은 모든 configuration 파라미터를 기준으로 필터링/정렬할 수 있습니다.

또한 runs의 이름을 바꾸거나, 노트를 추가하거나, 태그를 생성하여 그룹화할 수 있습니다.

참고 자료

5 - Databricks

W&B를 Databricks와 통합하는 방법.

W&B는 Databricks 환경에서 W&B Jupyter 노트북 경험을 사용자 정의하여 Databricks와 통합됩니다.

Databricks 설정

  1. 클러스터에 wandb 설치

    클러스터 설정으로 이동하여 클러스터를 선택하고 Libraries를 클릭합니다. Install New를 클릭하고 PyPI를 선택한 다음 wandb 패키지를 추가합니다.

  2. 인증 설정

    W&B 계정을 인증하려면 노트북이 쿼리할 수 있는 Databricks secret을 추가하면 됩니다.

    # databricks cli 설치
    pip install databricks-cli
    
    # databricks UI에서 토큰 생성
    databricks configure --token
    
    # 다음 두 코맨드 중 하나를 사용하여 스코프를 생성합니다 (databricks에서 보안 기능 활성화 여부에 따라 다름).
    # 보안 추가 기능 사용
    databricks secrets create-scope --scope wandb
    # 보안 추가 기능 미사용
    databricks secrets create-scope --scope wandb --initial-manage-principal users
    
    # 다음 위치에서 api_key를 추가합니다: https://app.wandb.ai/authorize
    databricks secrets put --scope wandb --key api_key
    

예시

간단한 예시

import os
import wandb

api_key = dbutils.secrets.get("wandb", "api_key")
wandb.login(key=api_key)

wandb.init()
wandb.log({"foo": 1})

Sweeps

wandb.sweep() 또는 wandb.agent()를 사용하려는 노트북에 필요한 설정(임시):

import os

# 다음은 향후에는 필요하지 않습니다.
os.environ["WANDB_ENTITY"] = "my-entity"
os.environ["WANDB_PROJECT"] = "my-project-that-exists"

6 - DeepChecks

DeepChecks와 W&B를 통합하는 방법.

DeepChecks는 최소한의 노력으로 데이터의 무결성 검증, 분포 검사, 데이터 분할 검증, 모델 평가, 여러 모델 간 비교 등 기계 학습 모델과 데이터를 검증하는 데 도움을 줍니다.

DeepChecks 및 wandb 통합에 대해 자세히 알아보기 ->

시작하기

DeepChecks를 Weights & Biases 와 함께 사용하려면 먼저 Weights & Biases 계정을 여기에서 가입해야 합니다. DeepChecks의 Weights & Biases 인테그레이션을 사용하면 다음과 같이 빠르게 시작할 수 있습니다.

import wandb

wandb.login()

# deepchecks에서 검사 가져오기
from deepchecks.checks import ModelErrorAnalysis

# 검사 실행
result = ModelErrorAnalysis()

# 해당 결과를 wandb로 푸시
result.to_wandb()

전체 DeepChecks 테스트 스위트를 Weights & Biases 에 로그할 수도 있습니다.

import wandb

wandb.login()

# deepchecks에서 full_suite 테스트 가져오기
from deepchecks.suites import full_suite

# DeepChecks 테스트 스위트 생성 및 실행
suite_result = full_suite().run(...)

# thes 결과를 wandb로 푸시
# 여기에서 필요한 wandb.init 구성 및 인수를 전달할 수 있습니다.
suite_result.to_wandb(project="my-suite-project", config={"suite-name": "full-suite"})

예시

``이 Report는 DeepChecks와 Weights & Biases를 사용하는 강력한 기능을 보여줍니다.

이 Weights & Biases 인테그레이션에 대한 질문이나 문제가 있으십니까? DeepChecks github repository에 이슈를 열어주시면 확인 후 답변드리겠습니다 :)

7 - DeepChem

DeepChem 라이브러리 와 W&B 를 통합하는 방법.

DeepChem 라이브러리는 약물 발견, 재료 과학, 화학 및 생물학에서 딥러닝 사용을 대중화하는 오픈 소스 툴을 제공합니다. 이 W&B 인테그레이션은 DeepChem을 사용하여 모델을 트레이닝하는 동안 간단하고 사용하기 쉬운 experiment 추적 및 모델 체크포인팅을 추가합니다.

3줄의 코드로 DeepChem 로깅하기

logger = WandbLogger()
model = TorchModel(, wandb_logger=logger)
model.fit()

Report 및 Google Colab

W&B와 DeepChem 사용: 분자 그래프 컨볼루션 네트워크 아티클에서 W&B DeepChem 인테그레이션을 사용하여 생성된 차트 예제를 살펴보세요.

작동하는 코드로 바로 들어가려면 이 Google Colab을 확인하세요.

Experiments 추적

KerasModel 또는 TorchModel 유형의 DeepChem 모델에 대해 W&B를 설정합니다.

가입하고 API 키 만들기

API 키는 W&B에 대한 컴퓨터를 인증합니다. 사용자 프로필에서 API 키를 생성할 수 있습니다.

  1. 오른쪽 상단 모서리에 있는 사용자 프로필 아이콘을 클릭합니다.
  2. User Settings를 선택한 다음 API Keys 섹션으로 스크롤합니다.
  3. Reveal을 클릭합니다. 표시된 API 키를 복사합니다. API 키를 숨기려면 페이지를 새로 고칩니다.

wandb 라이브러리를 설치하고 로그인하기

wandb 라이브러리를 로컬에 설치하고 로그인하려면 다음을 수행합니다.

  1. WANDB_API_KEY 환경 변수를 API 키로 설정합니다.

    export WANDB_API_KEY=<your_api_key>
    
  2. wandb 라이브러리를 설치하고 로그인합니다.

    pip install wandb
    
    wandb login
    
pip install wandb
import wandb
wandb.login()
!pip install wandb

import wandb
wandb.login()

W&B에 트레이닝 및 평가 데이터 기록하기

트레이닝 손실 및 평가 메트릭은 W&B에 자동으로 기록될 수 있습니다. DeepChem ValidationCallback을 사용하여 선택적 평가를 활성화할 수 있습니다. WandbLogger는 ValidationCallback 콜백을 감지하고 생성된 메트릭을 기록합니다.

from deepchem.models import TorchModel, ValidationCallback

vc = ValidationCallback()  # optional
model = TorchModel(, wandb_logger=logger)
model.fit(, callbacks=[vc])
logger.finish()
from deepchem.models import KerasModel, ValidationCallback

vc = ValidationCallback()  # optional
model = KerasModel(, wandb_logger=logger)
model.fit(, callbacks=[vc])
logger.finish()

8 - Docker

W&B를 Docker와 통합하는 방법.

Docker 인테그레이션

W&B는 코드 가 실행된 Docker 이미지에 대한 포인터를 저장하여 이전의 실험 을 정확한 환경 으로 복원할 수 있도록 합니다. wandb 라이브러리 는 이 상태 를 유지하기 위해 WANDB_DOCKER 환경 변수 를 찾습니다. 이 상태 를 자동으로 설정하는 몇 가지 도우미를 제공합니다.

로컬 개발

wandb docker 는 docker 컨테이너 를 시작하고, wandb 환경 변수 를 전달하고, 코드 를 마운트하고, wandb가 설치되었는지 확인하는 코맨드 입니다. 기본적으로 이 코맨드 는 TensorFlow, PyTorch, Keras 및 Jupyter가 설치된 docker 이미지 를 사용합니다. 동일한 코맨드 를 사용하여 자신의 docker 이미지 를 시작할 수 있습니다: wandb docker my/image:latest. 이 코맨드 는 현재 디렉토리 를 컨테이너 의 “/app” 디렉토리 에 마운트합니다. “–dir” 플래그 를 사용하여 이를 변경할 수 있습니다.

프로덕션

wandb docker-run 코맨드 는 프로덕션 워크로드 를 위해 제공됩니다. nvidia-docker 를 대체할 수 있도록 만들어졌습니다. 이는 docker run 코맨드 에 대한 간단한 래퍼 로, 자격 증명 과 WANDB_DOCKER 환경 변수 를 호출에 추가합니다. “–runtime” 플래그 를 전달하지 않고 시스템에서 nvidia-docker 를 사용할 수 있는 경우 런타임 이 nvidia로 설정됩니다.

Kubernetes

Kubernetes에서 트레이닝 워크로드 를 실행하고 k8s API가 Pod에 노출된 경우 (기본적으로 해당됨) wandb는 docker 이미지 의 다이제스트에 대해 API를 쿼리하고 WANDB_DOCKER 환경 변수 를 자동으로 설정합니다.

복원

WANDB_DOCKER 환경 변수 로 Run이 계측된 경우, wandb restore username/project:run_id 를 호출하면 코드 를 복원하는 새 분기를 체크아웃한 다음, 트레이닝 에 사용된 정확한 docker 이미지 를 원래 코맨드 로 미리 채워 시작합니다.

9 - Farama Gymnasium

Farama Gymnasium과 W&B를 통합하는 방법.

Farama Gymnasium을 사용하는 경우 gymnasium.wrappers.Monitor에서 생성된 환경의 비디오가 자동으로 기록됩니다. wandb.init에 대한 monitor_gym 키워드 인수를 True로 설정하기만 하면 됩니다.

Gymnasium 인테그레이션은 매우 간단합니다. gymnasium에서 기록된 비디오 파일의 이름을 확인하고, 그에 따라 이름을 지정하거나 일치하는 항목을 찾지 못하면 "videos"로 대체합니다. 더 많은 제어를 원한다면 언제든지 수동으로 비디오를 기록할 수 있습니다.

CleanRL 라이브러리와 함께 Gymnasium을 사용하는 방법에 대한 자세한 내용은 이 report를 확인하세요.

10 - fastai

fastai를 사용하여 모델을 트레이닝하는 경우, W&B는 WandbCallback을 사용하여 쉽게 통합할 수 있습니다. 예제가 포함된 대화형 문서에서 자세한 내용을 살펴보세요 →

가입 및 API 키 생성

API 키는 사용자의 머신을 W&B에 인증합니다. 사용자 프로필에서 API 키를 생성할 수 있습니다.

  1. 오른쪽 상단 모서리에 있는 사용자 프로필 아이콘을 클릭합니다.
  2. User Settings를 선택한 다음 API Keys 섹션으로 스크롤합니다.
  3. Reveal을 클릭합니다. 표시된 API 키를 복사합니다. API 키를 숨기려면 페이지를 새로 고칩니다.

wandb 라이브러리 설치 및 로그인

로컬에서 wandb 라이브러리를 설치하고 로그인하려면 다음을 수행합니다.

  1. WANDB_API_KEY 환경 변수를 API 키로 설정합니다.

    export WANDB_API_KEY=<your_api_key>
    
  2. wandb 라이브러리를 설치하고 로그인합니다.

    pip install wandb
    
    wandb login
    
pip install wandb
import wandb
wandb.login()
!pip install wandb

import wandb
wandb.login()

WandbCallbacklearner 또는 fit 메서드에 추가

import wandb
from fastai.callback.wandb import *

# wandb run 로깅 시작
wandb.init(project="my_project")

# 하나의 트레이닝 단계에서만 로깅하려면
learn.fit(..., cbs=WandbCallback())

# 모든 트레이닝 단계에서 지속적으로 로깅하려면
learn = learner(..., cbs=WandbCallback())

WandbCallback 인수

WandbCallback은 다음 인수를 허용합니다.

Args Description
log 모델의 다음 항목을 기록할지 여부: gradients , parameters, all 또는 None (기본값). 손실 및 메트릭은 항상 기록됩니다.
log_preds 예측 샘플을 기록할지 여부 (기본값은 True).
log_preds_every_epoch 에포크마다 예측을 기록할지 또는 마지막에 기록할지 여부 (기본값은 False)
log_model 모델을 기록할지 여부 (기본값은 False). 이 옵션은 SaveModelCallback도 필요합니다.
model_name 저장할 file 이름으로, SaveModelCallback을 재정의합니다.
log_dataset
  • False (기본값)
  • True는 learn.dls.path에서 참조하는 폴더를 기록합니다.
  • 기록할 폴더를 참조하기 위해 경로를 명시적으로 정의할 수 있습니다.

참고: 하위 폴더 “models"는 항상 무시됩니다.

dataset_name 기록된 데이터셋의 이름 (기본값은 folder name).
valid_dl 예측 샘플에 사용되는 항목을 포함하는 DataLoaders (기본값은 learn.dls.valid의 임의 항목).
n_preds 기록된 예측 수 (기본값은 36).
seed 임의 샘플을 정의하는 데 사용됩니다.

커스텀 워크플로우의 경우 데이터셋과 모델을 수동으로 기록할 수 있습니다.

  • log_dataset(path, name=None, metadata={})
  • log_model(path, name=None, metadata={})

참고: 모든 하위 폴더 “models"는 무시됩니다.

분산 트레이닝

fastai는 컨텍스트 관리자 distrib_ctx를 사용하여 분산 트레이닝을 지원합니다. W&B는 이를 자동으로 지원하며 Multi-GPU Experiments를 즉시 추적할 수 있습니다.

이 최소 예제를 검토하세요.

import wandb
from fastai.vision.all import *
from fastai.distributed import *
from fastai.callback.wandb import WandbCallback

wandb.require(experiment="service")
path = rank0_first(lambda: untar_data(URLs.PETS) / "images")

def train():
    dls = ImageDataLoaders.from_name_func(
        path,
        get_image_files(path),
        valid_pct=0.2,
        label_func=lambda x: x[0].isupper(),
        item_tfms=Resize(224),
    )
    wandb.init("fastai_ddp", entity="capecape")
    cb = WandbCallback()
    learn = vision_learner(dls, resnet34, metrics=error_rate, cbs=cb).to_fp16()
    with learn.distrib_ctx(sync_bn=False):
        learn.fit(1)

if __name__ == "__main__":
    train()

그런 다음 터미널에서 다음을 실행합니다.

$ torchrun --nproc_per_node 2 train.py

이 경우 머신에 2개의 GPU가 있습니다.

이제 노트북 내에서 직접 분산 트레이닝을 실행할 수 있습니다.

import wandb
from fastai.vision.all import *

from accelerate import notebook_launcher
from fastai.distributed import *
from fastai.callback.wandb import WandbCallback

wandb.require(experiment="service")
path = untar_data(URLs.PETS) / "images"

def train():
    dls = ImageDataLoaders.from_name_func(
        path,
        get_image_files(path),
        valid_pct=0.2,
        label_func=lambda x: x[0].isupper(),
        item_tfms=Resize(224),
    )
    wandb.init("fastai_ddp", entity="capecape")
    cb = WandbCallback()
    learn = vision_learner(dls, resnet34, metrics=error_rate, cbs=cb).to_fp16()
    with learn.distrib_ctx(in_notebook=True, sync_bn=False):
        learn.fit(1)

notebook_launcher(train, num_processes=2)

메인 프로세스에서만 로그

위의 예에서 wandb는 프로세스당 하나의 run을 시작합니다. 트레이닝이 끝나면 두 개의 run이 생성됩니다. 이는 혼란스러울 수 있으며 메인 프로세스에서만 로그할 수 있습니다. 이렇게 하려면 어떤 프로세스에 있는지 수동으로 감지하고 다른 모든 프로세스에서 run 생성을 피해야 합니다 (wandb.init 호출).

import wandb
from fastai.vision.all import *
from fastai.distributed import *
from fastai.callback.wandb import WandbCallback

wandb.require(experiment="service")
path = rank0_first(lambda: untar_data(URLs.PETS) / "images")

def train():
    cb = []
    dls = ImageDataLoaders.from_name_func(
        path,
        get_image_files(path),
        valid_pct=0.2,
        label_func=lambda x: x[0].isupper(),
        item_tfms=Resize(224),
    )
    if rank_distrib() == 0:
        run = wandb.init("fastai_ddp", entity="capecape")
        cb = WandbCallback()
    learn = vision_learner(dls, resnet34, metrics=error_rate, cbs=cb).to_fp16()
    with learn.distrib_ctx(sync_bn=False):
        learn.fit(1)

if __name__ == "__main__":
    train()

터미널에서 다음을 호출합니다.

$ torchrun --nproc_per_node 2 train.py
import wandb
from fastai.vision.all import *

from accelerate import notebook_launcher
from fastai.distributed import *
from fastai.callback.wandb import WandbCallback

wandb.require(experiment="service")
path = untar_data(URLs.PETS) / "images"

def train():
    cb = []
    dls = ImageDataLoaders.from_name_func(
        path,
        get_image_files(path),
        valid_pct=0.2,
        label_func=lambda x: x[0].isupper(),
        item_tfms=Resize(224),
    )
    if rank_distrib() == 0:
        run = wandb.init("fastai_ddp", entity="capecape")
        cb = WandbCallback()
    learn = vision_learner(dls, resnet34, metrics=error_rate, cbs=cb).to_fp16()
    with learn.distrib_ctx(in_notebook=True, sync_bn=False):
        learn.fit(1)

notebook_launcher(train, num_processes=2)

Examples

10.1 - fastai v1

fastai v1을 사용하는 스크립트의 경우, 모델 토폴로지, 손실, 메트릭, 가중치, 그레이디언트, 샘플 예측 및 최적 트레이닝된 모델을 자동으로 기록할 수 있는 콜백이 있습니다.

import wandb
from wandb.fastai import WandbCallback

wandb.init()

learn = cnn_learner(data, model, callback_fns=WandbCallback)
learn.fit(epochs)

요청된 기록 데이터는 콜백 생성자를 통해 구성할 수 있습니다.

from functools import partial

learn = cnn_learner(
    data, model, callback_fns=partial(WandbCallback, input_type="images")
)

트레이닝을 시작할 때만 WandbCallback을 사용하는 것도 가능합니다. 이 경우 인스턴스화해야 합니다.

learn.fit(epochs, callbacks=WandbCallback(learn))

사용자 지정 파라미터를 해당 단계에서 제공할 수도 있습니다.

learn.fit(epochs, callbacks=WandbCallback(learn, input_type="images"))

예제 코드

이 통합이 어떻게 작동하는지 보여주는 몇 가지 예제를 만들었습니다.

Fastai v1

옵션

WandbCallback() 클래스는 다음과 같은 여러 옵션을 지원합니다.

키워드 인수 기본값 설명
learn N/A 연결할 fast.ai 학습기입니다.
save_model True 각 단계에서 향상되면 모델을 저장합니다. 트레이닝이 끝나면 최적 모델도 로드합니다.
mode auto min, max 또는 auto: 단계 간에 monitor에 지정된 트레이닝 메트릭을 비교하는 방법입니다.
monitor None 최적 모델을 저장하기 위한 성능을 측정하는 데 사용되는 트레이닝 메트릭입니다. None은 유효성 검사 손실을 기본값으로 합니다.
log gradients gradients, parameters, all 또는 None. 손실 및 메트릭은 항상 기록됩니다.
input_type None images 또는 None. 샘플 예측을 표시하는 데 사용됩니다.
validation_data None input_type이 설정된 경우 샘플 예측에 사용되는 데이터입니다.
predictions 36 input_type이 설정되고 validation_dataNone인 경우 수행할 예측 횟수입니다.
seed 12345 input_type이 설정되고 validation_dataNone인 경우 샘플 예측을 위해 난수 생성기를 초기화합니다.

11 - Hugging Face Transformers

Hugging Face Transformers 라이브러리를 사용하면 최첨단 NLP 모델(예: BERT)과 혼합 정밀도 및 그레이디언트 체크포인트와 같은 트레이닝 기술을 쉽게 사용할 수 있습니다. W&B 통합은 사용 편의성을 유지하면서도 대화형 중앙 집중식 대시보드에 풍부하고 유연한 실험 추적 및 모델 버전 관리를 추가합니다.

몇 줄의 코드로 차세대 로깅 구현

os.environ["WANDB_PROJECT"] = "<my-amazing-project>"  # W&B 프로젝트 이름 지정
os.environ["WANDB_LOG_MODEL"] = "checkpoint"  # 모든 모델 체크포인트 로깅

from transformers import TrainingArguments, Trainer

args = TrainingArguments(..., report_to="wandb")  # W&B 로깅 켜기
trainer = Trainer(..., args=args)
W&B 대화형 대시보드에서 실험 결과 탐색

시작하기: Experiments 추적

가입하고 API 키 만들기

API 키는 사용자의 컴퓨터가 W&B에 인증되도록 합니다. 사용자 프로필에서 API 키를 생성할 수 있습니다.

  1. 오른쪽 상단 모서리에 있는 사용자 프로필 아이콘을 클릭합니다.
  2. User Settings를 선택한 다음 API Keys 섹션으로 스크롤합니다.
  3. Reveal을 클릭합니다. 표시된 API 키를 복사합니다. API 키를 숨기려면 페이지를 새로 고칩니다.

wandb 라이브러리 설치 및 로그인

wandb 라이브러리를 로컬에 설치하고 로그인하는 방법:

  1. WANDB_API_KEY 환경 변수를 API 키로 설정합니다.

    export WANDB_API_KEY=<your_api_key>
    
  2. wandb 라이브러리를 설치하고 로그인합니다.

    pip install wandb
    
    wandb login
    
pip install wandb
import wandb
wandb.login()
!pip install wandb

import wandb
wandb.login()

W&B를 처음 사용하는 경우 퀵스타트를 확인하는 것이 좋습니다.

프로젝트 이름 지정

W&B Project는 관련 Runs에서 기록된 모든 차트, 데이터 및 Models가 저장되는 곳입니다. 프로젝트 이름을 지정하면 작업을 구성하고 단일 프로젝트에 대한 모든 정보를 한 곳에 보관하는 데 도움이 됩니다.

Run을 프로젝트에 추가하려면 WANDB_PROJECT 환경 변수를 프로젝트 이름으로 설정하기만 하면 됩니다. WandbCallback은 이 프로젝트 이름 환경 변수를 가져와 Run을 설정할 때 사용합니다.

WANDB_PROJECT=amazon_sentiment_analysis
import os
os.environ["WANDB_PROJECT"]="amazon_sentiment_analysis"
%env WANDB_PROJECT=amazon_sentiment_analysis

프로젝트 이름이 지정되지 않은 경우 프로젝트 이름은 기본적으로 huggingface로 설정됩니다.

트레이닝 Runs를 W&B에 로깅

Trainer 트레이닝 인수를 정의할 때 코드 내부 또는 커맨드라인에서 가장 중요한 단계는 W&B를 사용하여 로깅을 활성화하기 위해 report_to"wandb"로 설정하는 것입니다.

TrainingArgumentslogging_steps 인수는 트레이닝 중에 트레이닝 메트릭이 W&B로 푸시되는 빈도를 제어합니다. run_name 인수를 사용하여 W&B에서 트레이닝 Run의 이름을 지정할 수도 있습니다.

이제 모델이 트레이닝하는 동안 손실, 평가 메트릭, 모델 토폴로지 및 그레이디언트를 W&B에 로깅합니다.

python run_glue.py \     # Python 스크립트 실행
  --report_to wandb \    # W&B에 로깅 활성화
  --run_name bert-base-high-lr \   # W&B Run 이름(선택 사항)
  # 기타 커맨드라인 인수
from transformers import TrainingArguments, Trainer

args = TrainingArguments(
    # 기타 인수 및 kwargs
    report_to="wandb",  # W&B에 로깅 활성화
    run_name="bert-base-high-lr",  # W&B Run 이름(선택 사항)
    logging_steps=1,  # W&B에 로깅 빈도
)

trainer = Trainer(
    # 기타 인수 및 kwargs
    args=args,  # 트레이닝 인수
)

trainer.train()  # 트레이닝을 시작하고 W&B에 로깅

모델 체크포인트 설정

Artifacts를 사용하면 최대 100GB의 Models 및 Datasets를 무료로 저장한 다음 Weights & Biases Registry를 사용할 수 있습니다. Registry를 사용하면 Models를 등록하여 탐색하고 평가하고, 스테이징을 준비하거나 프로덕션 환경에 배포할 수 있습니다.

Hugging Face 모델 체크포인트를 Artifacts에 로깅하려면 WANDB_LOG_MODEL 환경 변수를 다음 _중 하나_로 설정합니다.

  • checkpoint: TrainingArguments에서 args.save_steps마다 체크포인트를 업로드합니다.
  • end: load_best_model_at_end도 설정된 경우 트레이닝이 끝나면 모델을 업로드합니다.
  • false: 모델을 업로드하지 않습니다.
WANDB_LOG_MODEL="checkpoint"
import os

os.environ["WANDB_LOG_MODEL"] = "checkpoint"
%env WANDB_LOG_MODEL="checkpoint"

이제부터 초기화하는 모든 Transformers Trainer는 Models를 W&B Project에 업로드합니다. 로깅하는 모델 체크포인트는 Artifacts UI를 통해 볼 수 있으며 전체 모델 계보가 포함됩니다(UI에서 예제 모델 체크포인트를 보려면 여기 참조).

W&B Registry

체크포인트를 Artifacts에 로깅한 후에는 **Registry**를 사용하여 최고의 모델 체크포인트를 등록하고 팀 전체에서 중앙 집중화할 수 있습니다. Registry를 사용하면 작업별로 최고의 Models를 구성하고, Models의 라이프사이클을 관리하고, 전체 ML 라이프사이클을 추적 및 감사하고, 다운스트림 작업을 자동화할 수 있습니다.

모델 Artifact를 연결하려면 Registry를 참조하세요.

트레이닝 중 평가 결과 시각화

트레이닝 또는 평가 중 모델 출력을 시각화하는 것은 모델 트레이닝 방식을 실제로 이해하는 데 종종 필수적입니다.

Transformers Trainer의 콜백 시스템을 사용하면 모델의 텍스트 생성 출력 또는 기타 예측과 같은 추가적인 유용한 데이터를 W&B Tables에 로깅할 수 있습니다.

아래의 **사용자 지정 로깅 섹션**에서 트레이닝 중 평가 출력을 로깅하여 다음과 같은 W&B Table에 로깅하는 방법에 대한 전체 가이드를 참조하세요.

평가 출력이 있는 W&B Table을 보여줍니다.

W&B Run 종료(노트북 전용)

트레이닝이 Python 스크립트에 캡슐화된 경우 스크립트가 완료되면 W&B Run이 종료됩니다.

Jupyter 또는 Google Colab 노트북을 사용하는 경우 wandb.finish()를 호출하여 트레이닝이 완료되었음을 알려야 합니다.

trainer.train()  # 트레이닝을 시작하고 W&B에 로깅

# 트레이닝 후 분석, 테스트, 기타 로깅된 코드

wandb.finish()

결과 시각화

트레이닝 결과를 로깅했으면 W&B Dashboard에서 결과를 동적으로 탐색할 수 있습니다. 유연하고 대화형 시각화를 통해 한 번에 수십 개의 Runs를 비교하고, 흥미로운 발견을 확대하고, 복잡한 데이터에서 통찰력을 얻는 것이 쉽습니다.

고급 기능 및 FAQ

최고의 모델을 저장하는 방법은 무엇인가요?

TrainingArgumentsload_best_model_at_end=TrueTrainer에 전달하면 W&B는 가장 성능이 좋은 모델 체크포인트를 Artifacts에 저장합니다.

모델 체크포인트를 Artifacts로 저장하는 경우 Registry로 승격할 수 있습니다. Registry에서 다음을 수행할 수 있습니다.

  • ML 작업별로 최고의 모델 버전을 구성합니다.
  • Models를 중앙 집중화하고 팀과 공유합니다.
  • 프로덕션을 위해 Models를 스테이징하거나 추가 평가를 위해 북마크합니다.
  • 다운스트림 CI/CD 프로세스를 트리거합니다.

저장된 모델을 로드하는 방법은 무엇인가요?

WANDB_LOG_MODEL을 사용하여 모델을 W&B Artifacts에 저장한 경우 추가 트레이닝을 위해 또는 추론을 실행하기 위해 모델 가중치를 다운로드할 수 있습니다. 이전과 동일한 Hugging Face 아키텍처에 다시 로드하기만 하면 됩니다.

# 새 Run 만들기
with wandb.init(project="amazon_sentiment_analysis") as run:
    # Artifact 이름 및 버전 전달
    my_model_name = "model-bert-base-high-lr:latest"
    my_model_artifact = run.use_artifact(my_model_name)

    # 모델 가중치를 폴더에 다운로드하고 경로 반환
    model_dir = my_model_artifact.download()

    # 동일한 모델 클래스를 사용하여 해당 폴더에서 Hugging Face 모델 로드
    model = AutoModelForSequenceClassification.from_pretrained(
        model_dir, num_labels=num_labels
    )

    # 추가 트레이닝 또는 추론 실행

체크포인트에서 트레이닝을 재개하는 방법은 무엇인가요?

WANDB_LOG_MODEL='checkpoint'를 설정한 경우 model_dirTrainingArgumentsmodel_name_or_path 인수로 사용하고 resume_from_checkpoint=TrueTrainer에 전달하여 트레이닝을 재개할 수도 있습니다.

last_run_id = "xxxxxxxx"  # wandb Workspace에서 run_id 가져오기

# run_id에서 W&B Run 재개
with wandb.init(
    project=os.environ["WANDB_PROJECT"],
    id=last_run_id,
    resume="must",
) as run:
    # Artifact를 Run에 연결
    my_checkpoint_name = f"checkpoint-{last_run_id}:latest"
    my_checkpoint_artifact = run.use_artifact(my_model_name)

    # 체크포인트를 폴더에 다운로드하고 경로 반환
    checkpoint_dir = my_checkpoint_artifact.download()

    # 모델 및 Trainer 다시 초기화
    model = AutoModelForSequenceClassification.from_pretrained(
        "<model_name>", num_labels=num_labels
    )
    # 멋진 트레이닝 인수
    training_args = TrainingArguments()

    trainer = Trainer(model=model, args=training_args)

    # 체크포인트 디렉터리를 사용하여 체크포인트에서 트레이닝을 재개해야 합니다.
    trainer.train(resume_from_checkpoint=checkpoint_dir)

트레이닝 중에 평가 샘플을 로깅하고 보는 방법

Transformers Trainer를 통해 W&B에 로깅하는 것은 Transformers 라이브러리의 WandbCallback에서 처리합니다. Hugging Face 로깅을 사용자 지정해야 하는 경우 WandbCallback을 서브클래싱하고 Trainer 클래스의 추가적인 메서드를 활용하는 추가적인 기능을 추가하여 이 콜백을 수정할 수 있습니다.

아래는 이 새로운 콜백을 HF Trainer에 추가하는 일반적인 패턴이며, 아래에는 평가 출력을 W&B Table에 로깅하는 코드 완성 예제가 있습니다.

# Trainer를 정상적으로 인스턴스화
trainer = Trainer()

# Trainer 오브젝트를 전달하여 새로운 로깅 콜백 인스턴스화
evals_callback = WandbEvalsCallback(trainer, tokenizer, ...)

# Trainer에 콜백 추가
trainer.add_callback(evals_callback)

# Trainer 트레이닝을 정상적으로 시작
trainer.train()

트레이닝 중 평가 샘플 보기

다음 섹션에서는 모델 예측을 실행하고 트레이닝 중에 평가 샘플을 W&B Table에 로깅하도록 WandbCallback을 사용자 지정하는 방법을 보여줍니다. Trainer 콜백의 on_evaluate 메서드를 사용하여 모든 eval_steps에서 수행합니다.

여기서는 토크나이저를 사용하여 모델 출력에서 예측 및 레이블을 디코딩하는 decode_predictions 함수를 작성했습니다.

그런 다음 예측 및 레이블에서 pandas DataFrame을 만들고 DataFrame에 epoch 열을 추가합니다.

마지막으로 DataFrame에서 wandb.Table을 만들고 wandb에 로깅합니다. 또한 예측을 freq 에포크마다 로깅하여 로깅 빈도를 제어할 수 있습니다.

참고: 일반적인 WandbCallback과 달리 이 사용자 지정 콜백은 Trainer를 인스턴스화한 후에 Trainer에 추가해야 하며 Trainer 초기화 중에는 추가하면 안 됩니다. Trainer 인스턴스는 초기화 중에 콜백에 전달되기 때문입니다.

from transformers.integrations import WandbCallback
import pandas as pd


def decode_predictions(tokenizer, predictions):
    labels = tokenizer.batch_decode(predictions.label_ids)
    logits = predictions.predictions.argmax(axis=-1)
    prediction_text = tokenizer.batch_decode(logits)
    return {"labels": labels, "predictions": prediction_text}


class WandbPredictionProgressCallback(WandbCallback):
    """트레이닝 중에 모델 예측을 로깅하는 사용자 지정 WandbCallback입니다.

    이 콜백은 트레이닝 중 각 로깅 단계에서 모델 예측과 레이블을 wandb.Table에 로깅합니다.
    트레이닝이 진행됨에 따라 모델 예측을 시각화할 수 있습니다.

    특성:
        trainer (Trainer): Hugging Face Trainer 인스턴스입니다.
        tokenizer (AutoTokenizer): 모델과 연결된 토크나이저입니다.
        sample_dataset (Dataset): 예측 생성을 위한 유효성 검사 데이터셋의 서브셋입니다.
        num_samples (int, optional): 예측 생성을 위해 유효성 검사 데이터셋에서 선택할 샘플 수입니다. 기본값은 100입니다.
        freq (int, optional): 로깅 빈도입니다. 기본값은 2입니다.
    """

    def __init__(self, trainer, tokenizer, val_dataset, num_samples=100, freq=2):
        """WandbPredictionProgressCallback 인스턴스를 초기화합니다.

        인수:
            trainer (Trainer): Hugging Face Trainer 인스턴스입니다.
            tokenizer (AutoTokenizer): 모델과 연결된 토크나이저입니다.
            val_dataset (Dataset): 유효성 검사 데이터셋입니다.
            num_samples (int, optional): 예측 생성을 위해 유효성 검사 데이터셋에서 선택할 샘플 수입니다.
              기본값은 100입니다.
            freq (int, optional): 로깅 빈도입니다. 기본값은 2입니다.
        """
        super().__init__()
        self.trainer = trainer
        self.tokenizer = tokenizer
        self.sample_dataset = val_dataset.select(range(num_samples))
        self.freq = freq

    def on_evaluate(self, args, state, control, **kwargs):
        super().on_evaluate(args, state, control, **kwargs)
        # `freq` 에포크마다 예측을 로깅하여 로깅 빈도 제어
        if state.epoch % self.freq == 0:
            # 예측 생성
            predictions = self.trainer.predict(self.sample_dataset)
            # 예측 및 레이블 디코딩
            predictions = decode_predictions(self.tokenizer, predictions)
            # wandb.Table에 예측 추가
            predictions_df = pd.DataFrame(predictions)
            predictions_df["epoch"] = state.epoch
            records_table = self._wandb.Table(dataframe=predictions_df)
            # 테이블을 wandb에 로깅
            self._wandb.log({"sample_predictions": records_table})


# 먼저 Trainer 인스턴스화
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=lm_datasets["train"],
    eval_dataset=lm_datasets["validation"],
)

# WandbPredictionProgressCallback 인스턴스화
progress_callback = WandbPredictionProgressCallback(
    trainer=trainer,
    tokenizer=tokenizer,
    val_dataset=lm_dataset["validation"],
    num_samples=10,
    freq=2,
)

# Trainer에 콜백 추가
trainer.add_callback(progress_callback)

자세한 예제는 이 colab을 참조하세요.

어떤 추가 W&B 설정이 제공되나요?

환경 변수를 설정하여 Trainer로 로깅되는 항목을 추가로 구성할 수 있습니다. W&B 환경 변수의 전체 목록은 여기에서 찾을 수 있습니다.

환경 변수 사용법
WANDB_PROJECT 프로젝트 이름 지정(기본값: huggingface)
WANDB_LOG_MODEL

모델 체크포인트를 W&B Artifact로 로깅(기본값: false)

  • false(기본값): 모델 체크포인트 없음
  • checkpoint: 체크포인트는 모든 args.save_steps마다 업로드됩니다(Trainer의 TrainingArguments에서 설정).
  • end: 최종 모델 체크포인트는 트레이닝이 끝나면 업로드됩니다.
WANDB_WATCH

모델 그레이디언트, 파라미터 또는 둘 다를 로깅할지 여부 설정

  • false(기본값): 그레이디언트 또는 파라미터 로깅 없음
  • gradients: 그레이디언트의 히스토그램 로깅
  • all: 그레이디언트 및 파라미터의 히스토그램 로깅
WANDB_DISABLED true로 설정하여 로깅을 완전히 끕니다(기본값: false)
WANDB_SILENT true로 설정하여 wandb에서 인쇄된 출력을 표시하지 않습니다(기본값: false)
WANDB_WATCH=all
WANDB_SILENT=true
%env WANDB_WATCH=all
%env WANDB_SILENT=true

wandb.init를 사용자 지정하는 방법은 무엇인가요?

Trainer가 사용하는 WandbCallbackTrainer가 초기화될 때 내부적으로 wandb.init를 호출합니다. 또는 Trainer를 초기화하기 전에 wandb.init를 호출하여 Run을 수동으로 설정할 수 있습니다. 이렇게 하면 W&B Run 구성을 완전히 제어할 수 있습니다.

init에 전달할 수 있는 예는 아래와 같습니다. wandb.init를 사용하는 방법에 대한 자세한 내용은 참조 설명서를 확인하세요.

wandb.init(
    project="amazon_sentiment_analysis",
    name="bert-base-high-lr",
    tags=["baseline", "high-lr"],
    group="bert",
)

추가 자료

다음은 Transformer 및 W&B 관련 기사 6가지입니다.

Hugging Face Transformers의 하이퍼파라미터 최적화
  • Hugging Face Transformers의 하이퍼파라미터 최적화를 위한 세 가지 전략(그리드 검색, 베이지안 최적화 및 모집단 기반 트레이닝)을 비교합니다.
  • Hugging Face Transformers의 표준 uncased BERT 모델을 사용하고 SuperGLUE 벤치마크에서 RTE 데이터셋을 파인튜닝하려고 합니다.
  • 결과는 모집단 기반 트레이닝이 Hugging Face Transformer 모델의 하이퍼파라미터 최적화에 가장 효과적인 접근 방식임을 보여줍니다.

전체 리포트는 여기에서 읽어보세요.

Hugging Tweets: 트윗 생성을 위한 모델 트레이닝
  • 이 기사에서 작성자는 5분 안에 모든 사람의 트윗에서 사전 트레이닝된 GPT2 HuggingFace Transformer 모델을 파인튜닝하는 방법을 보여줍니다.
  • 이 모델은 다음 파이프라인을 사용합니다. 트윗 다운로드, 데이터셋 최적화, 초기 실험, 사용자 간 손실 비교, 모델 파인튜닝.

전체 리포트는 여기에서 읽어보세요.

Hugging Face BERT 및 WB를 사용한 문장 분류
  • 이 기사에서는 자연어 처리의 최근 혁신의 힘을 활용하여 문장 분류기를 구축하고 NLP에 대한 전이 학습 애플리케이션에 중점을 둡니다.
  • 우리는 단일 문장 분류를 위해 CoLA(Corpus of Linguistic Acceptability) 데이터셋을 사용합니다. 이 데이터셋은 문법적으로 올바르거나 올바르지 않은 것으로 레이블이 지정된 일련의 문장으로, 2018년 5월에 처음 게시되었습니다.
  • Google의 BERT를 사용하여 다양한 NLP 작업에서 최소한의 노력으로 고성능 모델을 만듭니다.

전체 리포트는 여기에서 읽어보세요.

Hugging Face 모델 성능 추적에 대한 단계별 가이드
  • W&B와 Hugging Face Transformers를 사용하여 BERT보다 40% 작지만 BERT 정확도의 97%를 유지하는 Transformer인 DistilBERT를 GLUE 벤치마크에서 트레이닝합니다.
  • GLUE 벤치마크는 NLP 모델 트레이닝을 위한 9개의 데이터셋 및 작업 모음입니다.

전체 리포트는 여기에서 읽어보세요.

HuggingFace의 조기 중단 예제
  • 조기 중단 정규화를 사용하여 Hugging Face Transformer를 파인튜닝하는 것은 PyTorch 또는 TensorFlow에서 기본적으로 수행할 수 있습니다.
  • TensorFlow에서 EarlyStopping 콜백을 사용하는 것은 tf.keras.callbacks.EarlyStopping 콜백을 사용하는 것과 간단합니다.
  • PyTorch에는 즉시 사용 가능한 조기 중단 메서드는 없지만 GitHub Gist에서 작업 조기 중단 훅을 사용할 수 있습니다.

전체 리포트는 여기에서 읽어보세요.

사용자 지정 데이터셋에서 Hugging Face Transformers를 파인튜닝하는 방법

사용자 지정 IMDB 데이터셋에서 감정 분석(이진 분류)을 위해 DistilBERT Transformer를 파인튜닝합니다.

전체 리포트는 여기에서 읽어보세요.

도움을 받거나 기능 요청

Hugging Face W&B 통합에 대한 문제, 질문 또는 기능 요청이 있는 경우 Hugging Face 포럼의 이 스레드에 게시하거나 Hugging Face Transformers GitHub 리포에 문제를 여유롭게 게시하세요.

12 - Hugging Face Diffusers

Hugging Face Diffusers는 이미지, 오디오, 심지어 분자의 3D 구조를 생성하기 위한 최첨단 사전학습된 diffusion model을 위한 라이브러리입니다. Weights & Biases 인테그레이션은 사용 편의성을 유지하면서도 대화형 중앙 집중식 대시보드에 풍부하고 유연한 실험 추적, 미디어 시각화, 파이프라인 아키텍처 및 설정 관리를 추가합니다.

단 두 줄로 차원이 다른 로깅을 경험하세요

단 2줄의 코드를 추가하는 것만으로도 실험과 관련된 모든 프롬프트, 부정적 프롬프트, 생성된 미디어 및 설정을 기록할 수 있습니다. 다음은 로깅을 시작하기 위한 2줄의 코드입니다.

# import the autolog function
from wandb.integration.diffusers import autolog

# call the autolog before calling the pipeline
autolog(init=dict(project="diffusers_logging"))
An example of how the results of your experiment are logged
실험 결과가 기록되는 방식의 예시입니다.

시작하기

  1. diffusers, transformers, acceleratewandb를 설치합니다.

    • 커맨드라인:

      pip install --upgrade diffusers transformers accelerate wandb
      
    • 노트북:

      !pip install --upgrade diffusers transformers accelerate wandb
      
  2. autolog를 사용하여 Weights & Biases run을 초기화하고 지원되는 모든 파이프라인 호출에서 입력 및 출력을 자동으로 추적합니다.

    wandb.init()에 필요한 파라미터의 dictionary를 받는 init 파라미터로 autolog() 함수를 호출할 수 있습니다.

    autolog()를 호출하면 Weights & Biases run이 초기화되고 지원되는 모든 파이프라인 호출에서 입력과 출력을 자동으로 추적합니다.

    • 각 파이프라인 호출은 워크스페이스의 자체 테이블로 추적되며, 파이프라인 호출과 관련된 설정은 해당 run의 설정에서 워크플로우 목록에 추가됩니다.
    • 프롬프트, 부정적 프롬프트 및 생성된 미디어는 wandb.Table에 기록됩니다.
    • 시드 및 파이프라인 아키텍처를 포함하여 실험과 관련된 다른 모든 설정은 run의 설정 섹션에 저장됩니다.
    • 각 파이프라인 호출에 대해 생성된 미디어도 run의 미디어 패널에 기록됩니다.

예시

Autologging

다음은 autolog의 간단한 엔드투엔드 예시입니다.

import torch
from diffusers import DiffusionPipeline

# import the autolog function
from wandb.integration.diffusers import autolog

# call the autolog before calling the pipeline
autolog(init=dict(project="diffusers_logging"))

# Initialize the diffusion pipeline
pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-1", torch_dtype=torch.float16
).to("cuda")

# Define the prompts, negative prompts, and seed.
prompt = ["a photograph of an astronaut riding a horse", "a photograph of a dragon"]
negative_prompt = ["ugly, deformed", "ugly, deformed"]
generator = torch.Generator(device="cpu").manual_seed(10)

# call the pipeline to generate the images
images = pipeline(
    prompt,
    negative_prompt=negative_prompt,
    num_images_per_prompt=2,
    generator=generator,
)
import torch
from diffusers import DiffusionPipeline

import wandb

# import the autolog function
from wandb.integration.diffusers import autolog

# call the autolog before calling the pipeline
autolog(init=dict(project="diffusers_logging"))

# Initialize the diffusion pipeline
pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-1", torch_dtype=torch.float16
).to("cuda")

# Define the prompts, negative prompts, and seed.
prompt = ["a photograph of an astronaut riding a horse", "a photograph of a dragon"]
negative_prompt = ["ugly, deformed", "ugly, deformed"]
generator = torch.Generator(device="cpu").manual_seed(10)

# call the pipeline to generate the images
images = pipeline(
    prompt,
    negative_prompt=negative_prompt,
    num_images_per_prompt=2,
    generator=generator,
)

# Finish the experiment
wandb.finish()
  • 단일 실험의 결과:

    An example of how the results of your experiment are logged
  • 여러 실험의 결과:

    An example of how the results of your experiment are logged
  • 실험의 설정:

    An example of how the autolog logs the configs of your experiment

다중 파이프라인 워크플로우 추적

이 섹션에서는 StableDiffusionXLPipeline에서 생성된 잠재 변수가 해당 리파이너에 의해 개선되는 일반적인 Stable Diffusion XL + Refiner 워크플로우에서 autolog를 시연합니다.

import torch
from diffusers import StableDiffusionXLImg2ImgPipeline, StableDiffusionXLPipeline
from wandb.integration.diffusers import autolog

# initialize the SDXL base pipeline
base_pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
base_pipeline.enable_model_cpu_offload()

# initialize the SDXL refiner pipeline
refiner_pipeline = StableDiffusionXLImg2ImgPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=base_pipeline.text_encoder_2,
    vae=base_pipeline.vae,
    torch_dtype=torch.float16,
    use_safetensors=True,
    variant="fp16",
)
refiner_pipeline.enable_model_cpu_offload()

prompt = "a photo of an astronaut riding a horse on mars"
negative_prompt = "static, frame, painting, illustration, sd character, low quality, low resolution, greyscale, monochrome, nose, cropped, lowres, jpeg artifacts, deformed iris, deformed pupils, bad eyes, semi-realistic worst quality, bad lips, deformed mouth, deformed face, deformed fingers, deformed toes standing still, posing"

# Make the experiment reproducible by controlling randomness.
# The seed would be automatically logged to WandB.
seed = 42
generator_base = torch.Generator(device="cuda").manual_seed(seed)
generator_refiner = torch.Generator(device="cuda").manual_seed(seed)

# Call WandB Autolog for Diffusers. This would automatically log
# the prompts, generated images, pipeline architecture and all
# associated experiment configs to Weights & Biases, thus making your
# image generation experiments easy to reproduce, share and analyze.
autolog(init=dict(project="sdxl"))

# Call the base pipeline to generate the latents
image = base_pipeline(
    prompt=prompt,
    negative_prompt=negative_prompt,
    output_type="latent",
    generator=generator_base,
).images[0]

# Call the refiner pipeline to generate the refined image
image = refiner_pipeline(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=image[None, :],
    generator=generator_refiner,
).images[0]
import torch
from diffusers import StableDiffusionXLImg2ImgPipeline, StableDiffusionXLPipeline

import wandb
from wandb.integration.diffusers import autolog

# initialize the SDXL base pipeline
base_pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
base_pipeline.enable_model_cpu_offload()

# initialize the SDXL refiner pipeline
refiner_pipeline = StableDiffusionXLImg2ImgPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=base_pipeline.text_encoder_2,
    vae=base_pipeline.vae,
    torch_dtype=torch.float16,
    use_safetensors=True,
    variant="fp16",
)
refiner_pipeline.enable_model_cpu_offload()

prompt = "a photo of an astronaut riding a horse on mars"
negative_prompt = "static, frame, painting, illustration, sd character, low quality, low resolution, greyscale, monochrome, nose, cropped, lowres, jpeg artifacts, deformed iris, deformed pupils, bad eyes, semi-realistic worst quality, bad lips, deformed mouth, deformed face, deformed fingers, deformed toes standing still, posing"

# Make the experiment reproducible by controlling randomness.
# The seed would be automatically logged to WandB.
seed = 42
generator_base = torch.Generator(device="cuda").manual_seed(seed)
generator_refiner = torch.Generator(device="cuda").manual_seed(seed)

# Call WandB Autolog for Diffusers. This would automatically log
# the prompts, generated images, pipeline architecture and all
# associated experiment configs to Weights & Biases, thus making your
# image generation experiments easy to reproduce, share and analyze.
autolog(init=dict(project="sdxl"))

# Call the base pipeline to generate the latents
image = base_pipeline(
    prompt=prompt,
    negative_prompt=negative_prompt,
    output_type="latent",
    generator=generator_base,
).images[0]

# Call the refiner pipeline to generate the refined image
image = refiner_pipeline(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=image[None, :],
    generator=generator_refiner,
).images[0]

# Finish the experiment
wandb.finish()
  • Stable Diffisuion XL + Refiner 실험의 예: An example of how the autolog tracks an Stable Diffusion XL + Refiner experiment

추가 자료