Colab에서 실행해 보기Hugging Face Transformers 라이브러리는 BERT와 같은 최신 NLP 모델과 mixed precision, gradient checkpointing 같은 학습 기법을 손쉽게 사용할 수 있게 해줍니다. W&B 통합을 사용하면 이러한 사용 편의성을 그대로 유지하면서, 상호작용형 중앙 집중식 대시보드에서 풍부하고 유연한 실험 추적과 모델 버전 관리를 수행할 수 있습니다.
W&B 프로젝트는 관련 실행에서 로깅된 모든 차트, 데이터, 모델이 저장되는 곳입니다. 프로젝트에 이름을 지정하면 작업을 체계적으로 정리하고, 단일 프로젝트에 대한 모든 정보를 한곳에 모을 수 있습니다.실행을 특정 프로젝트에 추가하려면 WANDB_PROJECT 환경 변수를 프로젝트 이름으로 설정하면 됩니다. WandbCallback은 이 프로젝트 이름 환경 변수를 감지하고, 실행을 설정할 때 해당 이름을 사용합니다.
코드 내부에서든 커맨드 라인에서든 Trainer의 학습 인자를 정의할 때 가장 중요한 단계는 W&B로 로깅을 활성화하기 위해 report_to를 "wandb"로 설정하는 것입니다.TrainingArguments의 logging_steps 인자는 학습 중에 학습 지표를 W&B로 얼마나 자주 전송할지 제어합니다. 또한 run_name 인자를 사용해 W&B에서 학습 실행에 이름을 지정할 수 있습니다.이것으로 설정은 완료되었습니다. 이제 모델은 학습하는 동안 손실, 평가 지표, 모델 토폴로지, 그래디언트를 W&B에 로깅합니다.
명령줄
Python
python run_glue.py \ # Python 스크립트를 실행합니다 --report_to wandb \ # W&B로 로깅을 활성화합니다 --run_name bert-base-high-lr \ # W&B 실행 이름 (선택 사항) # 여기에 다른 명령줄 인자를 추가합니다
from transformers import TrainingArguments, Trainerargs = TrainingArguments( # 여기에 다른 args 및 kwargs를 추가합니다 report_to="wandb", # W&B로 로깅을 활성화합니다 run_name="bert-base-high-lr", # W&B 실행 이름 (선택 사항) logging_steps=1, # W&B에 얼마나 자주 로깅할지 설정합니다)trainer = Trainer( # 여기에 다른 args 및 kwargs를 추가합니다 args=args, # 학습 인자)trainer.train() # 학습을 시작하고 W&B에 로깅합니다
TensorFlow를 사용하나요? PyTorch Trainer를 TensorFlow TFTrainer로 바꾸기만 하면 됩니다.
아티팩트를 사용하면 최대 100GB까지 모델과 데이터셋을 무료로 저장할 수 있고, 이어서 W&B Registry를 활용할 수 있습니다. Registry를 사용하면 모델을 등록해 탐색 및 평가하고, 스테이징 환경에 준비하거나 프로덕션 환경에 배포할 수 있습니다.Hugging Face 모델 체크포인트를 아티팩트에 로깅하려면 WANDB_LOG_MODEL 환경 변수를 다음 값 중 하나로 설정합니다:
지금부터 초기화하는 모든 Transformers Trainer는 모델을 해당 W&B 프로젝트에 업로드합니다. 로깅한 모델 체크포인트는 아티팩트 UI에서 확인할 수 있으며, 전체 모델 계보(lineage)를 포함합니다(UI에서 예시 모델 체크포인트를 보려면 여기를 참조하세요).
기본적으로, WANDB_LOG_MODEL이 end로 설정된 경우 모델은 model-{run_id}로, checkpoint로 설정된 경우 checkpoint-{run_id}로 W&B 아티팩트에 저장됩니다.
그러나 TrainingArguments에 run_name을 전달하면, 모델은 model-{run_name} 또는 checkpoint-{run_name}으로 저장됩니다.
체크포인트를 아티팩트로 로깅한 후에는 Registry를 사용하여 최적의 모델 체크포인트를 등록하고 팀 전체가 중앙에서 관리할 수 있습니다. Registry를 사용하면 작업별로 최적의 모델을 구성하고, 모델 라이프사이클을 관리하며, 전체 ML 라이프사이클을 추적 및 감사하고, 다운스트림 작업을 자동화할 수 있습니다.모델 아티팩트를 연결하려면 Registry를 참조하십시오.
모델을 학습하거나 평가하는 동안 출력 결과를 시각화하는 것은 모델이 어떻게 학습되고 있는지 정확히 이해하는 데 필수적인 경우가 많습니다.Transformers Trainer의 콜백 시스템을 사용하면, 모델의 텍스트 생성 결과나 기타 예측값 등과 같은 추가적인 유용한 데이터를 W&B Tables에 로깅할 수 있습니다.아래의 Custom logging 섹션을 참고하여, 학습 중 평가 출력을 아래와 같은 W&B Table에 로깅하는 전체 과정을 확인하세요:
Trainer에 load_best_model_at_end=True로 설정된 TrainingArguments를 전달하면, W&B에서 가장 성능이 좋은 모델 체크포인트를 아티팩트로 저장합니다.모델 체크포인트를 아티팩트로 저장하면, 이를 Registry로 승격할 수 있습니다. Registry에서는 다음을 수행할 수 있습니다:
WANDB_LOG_MODEL을 사용해 모델을 W&B 아티팩트에 저장했다면, 추가 학습이나 추론 실행을 위해 모델 가중치를 다운로드할 수 있습니다. 이전에 사용했던 것과 동일한 Hugging Face 모델 아키텍처에 이 가중치를 다시 로드하면 됩니다.
# 새 실행 생성with wandb.init(project="amazon_sentiment_analysis") as run: # 아티팩트의 이름과 버전 전달 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 ) # 추가 학습 수행 또는 추론 실행
Transformers Trainer를 통해 W&B로 로깅하는 작업은 Transformers 라이브러리의 WandbCallback에 의해 처리됩니다. Hugging Face 로깅을 사용자 지정해야 하는 경우, WandbCallback을 상속(subclassing)하여 Trainer 클래스의 추가 메서드를 활용하는 기능을 더해 이 콜백을 수정할 수 있습니다.아래는 이 새로운 콜백을 Hugging Face Trainer에 추가하는 일반적인 패턴이며, 그 아래에는 평가 결과를 W&B Table에 로깅하는 완전한 코드 예제가 있습니다.
# 평소와 같이 Trainer를 인스턴스화합니다trainer = Trainer()# 새 로깅 콜백을 인스턴스화하고 Trainer 객체를 전달합니다evals_callback = WandbEvalsCallback(trainer, tokenizer, ...)# Trainer에 콜백을 추가합니다trainer.add_callback(evals_callback)# 평소와 같이 Trainer 학습을 시작합니다trainer.train()
다음 섹션에서는 WandbCallback을 커스터마이즈하여 모델 예측을 수행하고, 학습 중에 평가 샘플을 W&B Table에 로깅하는 방법을 보여줍니다. 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 WandbCallbackimport pandas as pddef 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에 기록합니다. 학습이 진행됨에 따라 모델 예측을 시각화할 수 있습니다. Attributes: 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 인스턴스를 초기화합니다. Args: 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)
Trainer가 사용하는 WandbCallback은 Trainer가 초기화될 때 내부적으로 wandb.init을 호출합니다. 대신 Trainer가 초기화되기 전에 wandb.init을 호출해 실행을 직접 설정할 수도 있습니다. 이렇게 하면 W&B 실행 구성을 온전히 제어할 수 있습니다.init에 전달할 수 있는 예시는 아래와 같습니다. wandb.init()에 대한 자세한 내용은 wandb.init() 참고 문서를 참조하세요.