메인 콘텐츠로 건너뛰기
하이퍼파라미터 컨트롤러는 기본적으로 Weights & Biases에서 클라우드 서비스 형태로 호스팅됩니다. W&B 에이전트는 컨트롤러와 통신하여 트레이닝에 사용할 다음 파라미터 세트를 결정합니다. 컨트롤러는 또한 조기 중지 알고리즘을 실행하여 어떤 run을 중지할 수 있는지 결정하는 역할도 담당합니다. 로컬 컨트롤러 기능을 사용하면 사용자가 로컬에서 검색 및 중지 알고리즘을 실행할 수 있습니다. 로컬 컨트롤러를 사용하면 사용자가 코드를 검사하고 계측하여 문제를 디버깅하고, 클라우드 서비스에 통합할 수 있는 새로운 기능을 개발할 수 있습니다.
이 기능은 Sweeps 도구에서 새로운 알고리즘을 더 빠르게 개발하고 디버깅할 수 있도록 지원하기 위한 것입니다. 실제 하이퍼파라미터 최적화 작업을 위한 용도로는 의도되지 않았습니다.
시작하기 전에 W&B SDK(wandb)를 설치해야 합니다. 다음 코드 스니펫을 명령줄에 입력하세요:
pip install wandb sweeps 
다음 예제에서는 이미 Python 스크립트 또는 Jupyter Notebook에서 설정 파일과 트레이닝 루프를 정의해 두었다고 가정합니다. 설정 파일 정의 방법에 대한 자세한 내용은 스윕 설정 정의를 참조하세요.

명령줄에서 로컬 컨트롤러 실행하기

W&B에서 클라우드 서비스로 호스팅하는 하이퍼파라미터 컨트롤러를 사용할 때와 비슷한 방식으로 스윕을 초기화합니다. W&B 스윕 작업에 로컬 컨트롤러를 사용하도록 지정하려면 컨트롤러 플래그(controller)를 설정합니다:
wandb sweep --controller config.yaml
또는 스윕을 초기화하는 작업과 로컬 컨트롤러를 사용하도록 지정하는 작업을 두 단계로 나눌 수 있습니다. 이 단계를 분리하려면 먼저 스윕의 YAML 설정 파일에 다음 키-값 쌍을 추가하세요:
controller:
  type: local
다음으로, 스윕을 초기화합니다:
wandb sweep config.yaml
wandb sweep는 스윕 ID를 생성합니다. 스윕을 초기화한 후에는 wandb controller로 컨트롤러를 시작합니다:
wandb controller {user}/{entity}/{sweep_id}
로컬 컨트롤러를 사용하도록 지정했다면, 하나 이상의 Sweep 에이전트를 시작하여 스윕을 실행합니다. 평소와 같이 W&B Sweep을 시작하면 됩니다. 자세한 내용은 Start sweep agents 문서를 참고하세요.
wandb sweep sweep_ID

W&B Python SDK로 로컬 컨트롤러 실행하기

다음 코드 스니펫은 W&B Python SDK에서 로컬 컨트롤러를 지정하고 사용하는 방법을 보여줍니다. Python SDK에서 컨트롤러를 사용하는 가장 간단한 방법은 스윕 ID를 wandb.controller 메서드에 전달하는 것입니다. 그런 다음 반환된 객체의 run 메서드를 호출하여 스윕 작업을 시작합니다:
sweep = wandb.controller(sweep_id)
sweep.run()
컨트롤러 루프에 대한 제어를 더 세밀하게 하고 싶다면:
import wandb

sweep = wandb.controller(sweep_id)
while not sweep.done():
    sweep.print_status()
    sweep.step()
    time.sleep(5)
제공되는 파라미터를 더욱 세밀하게 제어하려면:
import wandb

sweep = wandb.controller(sweep_id)
while not sweep.done():
    params = sweep.search()
    sweep.schedule(params)
    sweep.print_status()
스윕을 완전히 코드로만 지정하고 싶다면 다음과 같이 할 수 있습니다:
import wandb

sweep = wandb.controller()
sweep.configure_search("grid")
sweep.configure_program("train-dummy.py")
sweep.configure_controller(type="local")
sweep.configure_parameter("param1", value=3)
sweep.create()
sweep.run()