아래에서 제안하는 범위 내에서 로깅을 수행해 W&B 페이지를 더 빠르고 응답성이 좋은 상태로 유지하세요.
실험 메트릭을 추적하려면 wandb.Run.log()을(를) 사용하세요.
더 나은 성능을 위해 단일 프로젝트에서 서로 다른 메트릭의 총 개수를 10,000개 이하로 유지하세요.
import wandb
with wandb.init() as run:
run.log(
{
"a": 1, # "a"는 고유한 메트릭입니다
"b": {
"c": "hello", # "b.c"는 고유한 메트릭입니다
"d": [1, 2, 3], # "b.d"는 고유한 메트릭입니다
},
}
)
W&B는 중첩된 값을 자동으로 평탄화합니다. 즉, 사전(dict)을 전달하면 W&B가 키를 점으로 구분된 이름으로 변환합니다. config 값의 경우 이름에 점(.)을 최대 3개까지 사용할 수 있습니다. summary 값의 경우 이름에 점을 최대 4개까지 사용할 수 있습니다.
메트릭 이름은 GraphQL이 부과하는 특정 이름 제약을 따라야 합니다. 자세한 내용은 메트릭 이름 제약 조건을 참조하세요.
워크스페이스 속도가 갑자기 느려졌다면, 최근 run에서 의도치 않게 수천 개의 새로운 메트릭을 로깅했는지 확인하세요. (가장 쉽게 확인하는 방법은 수천 개의 플롯이 있지만 그 위에 표시된 run이 한두 개뿐인 섹션이 있는지 살펴보는 것입니다.) 이런 경우라면 해당 run을 삭제하고, 원하는 메트릭만 로깅되도록 run을 다시 생성하는 것을 고려하세요.
단일 값의 크기는 1 MB 미만으로, 단일 wandb.Run.log() 호출로 전송되는 전체 데이터 크기는 25 MB 미만으로 제한하세요. 이 제한은 wandb.Image, wandb.Audio 등과 같은 wandb.Media 타입에는 적용되지 않습니다.
import wandb
with wandb.init(project="wide-values") as run:
# 권장하지 않음
run.log({"wide_key": range(10000000)})
# 권장하지 않음
with open("large_file.json", "r") as f:
large_data = json.load(f)
run.log(large_data)
값의 범위가 매우 넓으면, 해당 메트릭뿐만 아니라 run의 모든 메트릭에 대한 플롯 로드 시간에도 영향을 줄 수 있습니다.
권장 범위보다 더 넓은 값을 로깅하더라도 데이터는 계속 저장 및 추적됩니다. 다만, 플롯이 로드되는 속도가 느려질 수 있습니다.
로그하려는 메트릭에 알맞은 기록 빈도를 선택하세요. 일반적인 경험칙으로, 범위가 넓은 값일수록 범위가 좁은 값보다 더 낮은 빈도로 기록하세요. W&B에서는 다음을 권장합니다:
- 스칼라: 메트릭당 기록 포인트 <100,000개
- 미디어: 메트릭당 기록 포인트 <50,000개
- 히스토그램: 메트릭당 기록 포인트 <10,000개
import wandb
with wandb.init(project="metric-frequency") as run:
# 권장하지 않음
run.log(
{
"scalar": 1, # 스칼라 100,000개
"media": wandb.Image(...), # 이미지 100,000개
"histogram": wandb.Histogram(...), # 히스토그램 100,000개
}
)
# 권장
run.log(
{
"scalar": 1, # 스칼라 100,000개
},
commit=True,
) # 배치된 단계별 메트릭을 함께 커밋
run.log(
{
"media": wandb.Image(...), # 이미지 50,000개
},
commit=False,
)
run.log(
{
"histogram": wandb.Histogram(...), # 히스토그램 10,000개
},
commit=False,
)
가이드라인을 초과하더라도 W&B는 계속해서 로그된 데이터를 수신하지만, 페이지가 더 느리게 로드될 수 있습니다.
run 구성의 전체 크기를 10 MB 미만으로 제한하세요. 큰 값을 로깅하면 프로젝트 Workspace와 Runs 테이블에서의 작업이 느려질 수 있습니다.
import wandb
# 권장
with wandb.init(
project="config-size",
config={
"lr": 0.1,
"batch_size": 32,
"epochs": 4,
}
) as run:
# 트레이닝 코드를 여기에 작성하세요
pass
# 권장하지 않음
with wandb.init(
project="config-size",
config={
"large_list": list(range(10000000)), # 대용량 리스트
"large_string": "a" * 10000000, # 대용량 문자열
}
) as run:
# 트레이닝 코드를 여기에 작성하세요
pass
# 권장하지 않음
with open("large_config.json", "r") as f:
large_config = json.load(f)
wandb.init(config=large_config)
로드 시간을 줄이려면 단일 프로젝트 내 전체 run 수를 다음 기준 이하로 유지하세요.
- SaaS Cloud: 100,000개
- Dedicated Cloud 또는 Self-Managed: 10,000개
run 수가 이 기준을 넘으면, 특히 run을 그룹화하거나 run 동안 매우 많은 수의 서로 다른 메트릭을 수집하는 경우 프로젝트 Workspace나 Runs 테이블과 관련된 작업이 느려질 수 있습니다. Metric count 섹션도 참고하세요.
팀이 동일한 run 집합(예: 최근 run 집합)에 자주 액세스한다면, 자주 사용하지 않는 run을 한꺼번에 이동하여 새로운 “archive” 프로젝트로 옮기고, 작업 중인 프로젝트에는 더 적은 수의 run만 남겨 두는 방안을 고려하세요.
이 섹션에서는 워크스페이스의 성능을 최적화하기 위한 팁을 제공합니다.
기본적으로 워크스페이스는 automatic 모드이며, 로그된 각 키마다 표준 패널을 생성합니다. 대규모 프로젝트의 워크스페이스에 로그된 키가 많아 각 키에 대한 패널이 많이 포함되어 있으면, 워크스페이스 로드 및 사용 속도가 느려질 수 있습니다. 성능을 개선하려면 다음과 같이 할 수 있습니다.
- 워크스페이스를 기본적으로 패널이 생성되지 않는 manual 모드로 재설정합니다.
- Quick add(빠른 추가)를 사용하여, 시각화가 필요한 로그된 키에 대한 패널만 선택적으로 추가합니다.
사용하지 않는 패널을 하나씩 삭제하는 것은 성능에 거의 영향을 주지 않습니다. 대신 워크스페이스를 재설정한 다음, 필요한 패널만 선택적으로 다시 추가하십시오.
워크스페이스 구성에 대한 자세한 내용은 Panels를 참조하십시오.
워크스페이스에 섹션이 수백 개 있으면 성능이 저하될 수 있습니다. 메트릭을 상위 수준 그룹으로 묶어 섹션을 만들고, 메트릭마다 각각 하나의 섹션을 만드는 안티 패턴은 피하는 것이 좋습니다.
섹션이 너무 많아서 성능이 느려진다면, 접미사(suffix)가 아니라 접두사(prefix) 기준으로 섹션을 생성하도록 워크스페이스 설정을 변경하는 것을 고려해 보십시오. 이렇게 하면 섹션 수를 줄이고 성능을 개선할 수 있습니다.
각 run당 5000개에서 100,000개 사이의 메트릭을 로깅하는 경우, W&B는 수동 Workspace를 사용할 것을 권장합니다. Manual 모드에서는 서로 다른 메트릭 집합을 탐색할 때 원하는 대로 패널을 일괄 추가 및 제거할 수 있습니다. 더 집중된 플롯 집합을 사용하면 Workspace 로딩 속도가 더 빨라집니다. 그래프로 표시되지 않은 메트릭도 그대로 수집 및 저장됩니다.
Workspace를 Manual 모드로 재설정하려면 Workspace의 작업 ... 메뉴를 클릭한 다음 Reset workspace를 클릭합니다. Workspace를 재설정해도 run의 저장된 메트릭에는 영향을 주지 않습니다. Workspace 패널 관리를 참조하세요.
단일 run에 업로드하는 파일 총 개수는 1,000개 이하로 유지하세요. 대량의 파일을 기록해야 할 때는 W&B Artifacts를 사용하세요. 하나의 run에서 파일 수가 1,000개를 초과하면 run 페이지 속도가 느려질 수 있습니다.
리포트는 패널, 텍스트, 미디어를 자유롭게 조합해 구성할 수 있는 문서로, 동료와 인사이트를 쉽게 공유할 수 있게 해 줍니다.
반면, Workspace는 수십 개에서 수천 개에 이르는 메트릭을 수백에서 수십만 개의 run에 걸쳐 고밀도이면서도 높은 성능으로 분석할 수 있게 해 줍니다. Workspace에는 리포트와 비교했을 때 캐싱, 쿼리, 로딩 기능이 최적화되어 있습니다. Workspace는 발표보다는 분석 위주로 사용되는 프로젝트이거나, 한 번에 20개 이상의 플롯을 함께 보여줄 필요가 있을 때 사용하는 것을 권장합니다.
Python 스크립트의 성능이 저하될 수 있는 원인은 다음과 같습니다:
- 데이터 크기가 너무 큰 경우. 데이터가 매우 크면 트레이닝 루프에 1ms를 넘는 오버헤드가 발생할 수 있습니다.
- 네트워크 속도와 W&B 백엔드 구성 방식
wandb.Run.log()를 초당 여러 번 호출하는 경우. 이는 wandb.Run.log()가 호출될 때마다 트레이닝 루프에 작은 지연 시간이 추가되기 때문입니다.
자주 로깅해서 트레이닝 run 속도가 느려지고 있나요? 로깅 전략을 변경해 성능을 개선하는 방법은 이 Colab을 참고하세요.
W&B는 rate limiting 이외에는 별도의 제한을 두지 않습니다. W&B Python SDK는 제한을 초과하는 요청에 대해 자동으로 지수적 “backoff”와 “retry”를 수행합니다. 제한을 초과하면 W&B Python SDK는 명령줄에 “Network failure”를 표시합니다. 무료 계정의 경우, 사용량이 합리적인 한도를 극단적으로 초과하면 W&B에서 연락을 드릴 수 있습니다.
W&B SaaS Cloud API는 시스템 무결성을 유지하고 가용성을 보장하기 위해 요청 제한을 적용합니다. 이 조치는 단일 사용자가 공유 인프라에서 사용 가능한 리소스를 독점하는 것을 방지하여, 서비스가 모든 사용자에게 지속적으로 제공되도록 합니다. 다양한 이유로 더 낮은 요청 제한이 적용될 수 있습니다.
요청 제한에 도달하면 HTTP 429 Rate limit exceeded 오류 응답을 수신하며, 이 응답에는 요청 제한 HTTP 헤더가 포함됩니다.
앞의 표에서는 rate limit HTTP 헤더를 설명합니다:
| Header name | Description |
|---|
| RateLimit-Limit | 시간 윈도우마다 사용 가능한 쿼터 양으로, 0에서 1000 범위로 스케일링된 값입니다 |
| RateLimit-Remaining | 현재 rate limit 윈도우에서 남아 있는 쿼터 양으로, 0에서 1000 범위로 스케일링된 값입니다 |
| RateLimit-Reset | 현재 쿼터가 리셋될 때까지 남은 시간(초 단위)입니다 |
wandb.Run.log() 는 트레이닝 데이터를 W&B에 로깅합니다. 이 API는 온라인 모드 또는 offline syncing을 통해 동작합니다. 두 경우 모두 슬라이딩 시간 창(sliding time window)을 기준으로 레이트 리밋 쿼터를 적용합니다. 여기에는 전체 요청 크기와 요청 빈도에 대한 제한이 포함되며, 요청 빈도는 일정 시간 동안 발생하는 요청 횟수를 의미합니다.
W&B는 W&B 프로젝트별로 레이트 리밋을 적용합니다. 따라서 한 팀에 3개의 프로젝트가 있다면 각 프로젝트마다 고유한 레이트 리밋 쿼터가 있습니다. Paid plans를 사용하는 사용자는 Free 플랜보다 더 높은 레이트 리밋이 적용됩니다.
레이트 리밋에 도달하면 HTTP 429 Rate limit exceeded 오류가 발생하며, 응답에는 rate limit HTTP headers가 포함됩니다.
metrics 로깅 API rate limit을 넘지 않기 위한 권장 사항
rate limit을 초과하면 제한이 리셋될 때까지 run.finish()가 지연될 수 있습니다. 이를 방지하려면 다음 전략을 고려하세요:
- W&B Python SDK 버전 업데이트: 최신 버전의 W&B Python SDK를 사용하고 있는지 확인하세요. W&B Python SDK는 정기적으로 업데이트되며, 요청을 안정적으로 재시도하고 쿼터 사용을 최적화하기 위한 향상된 메커니즘을 포함합니다.
- 메트릭 로깅 빈도 줄이기:
쿼터를 절약하기 위해 메트릭을 로깅하는 빈도를 최소화하세요. 예를 들어, 매 에포크마다 메트릭을 로깅하는 대신, 다섯 에포크마다 메트릭을 로깅하도록 코드를 수정할 수 있습니다:
import wandb
import random
with wandb.init(project="basic-intro") as run:
for epoch in range(10):
# 트레이닝 및 평가 시뮬레이션
accuracy = 1 - 2 ** -epoch - random.random() / epoch
loss = 2 ** -epoch + random.random() / epoch
# 5 에포크마다 메트릭 기록
if epoch % 5 == 0:
run.log({"acc": accuracy, "loss": loss})
- 수동 데이터 동기화: 요청이 rate limit에 걸리면 W&B는 run 데이터를 로컬에 저장합니다.
wandb sync <run-file-path> 명령을 사용해 데이터를 수동으로 동기화할 수 있습니다. 자세한 내용은 wandb sync 참고 문서를 확인하세요.
W&B Models UI와 SDK의 public API는 데이터를 조회하고 수정하기 위해 서버에 GraphQL 요청을 보냅니다. SaaS Cloud에서 발생하는 모든 GraphQL 요청에 대해 W&B는 인증되지 않은 요청에는 IP 주소별로, 인증된 요청에는 사용자별로 레이트 리밋을 적용합니다. 이 제한은 고정된 시간 창 내에서의 요청 속도(초당 요청 수)를 기준으로 하며, 사용하는 요금제에 따라 기본 제한 값이 결정됩니다. 프로젝트 경로(예: Reports, runs, 아티팩트)를 지정하는 관련 SDK 요청의 경우, W&B는 데이터베이스 쿼리 시간으로 측정되는 프로젝트별 레이트 리밋을 적용합니다.
Teams 및 Enterprise 요금제를 사용하는 사용자는 Free 요금제 사용자보다 더 높은 레이트 리밋을 부여받습니다. W&B Models SDK의 public API를 사용하는 동안 레이트 리밋에 도달하면, 표준 출력에 오류를 나타내는 관련 메시지가 표시됩니다.
레이트 리밋에 걸리면 HTTP 429 Rate limit exceeded 오류가 발생하며, 응답에는 레이트 리밋 HTTP 헤더가 포함됩니다.
GraphQL API 요청 제한을 피하기 위한 권장 사항
W&B Models SDK의 public API를 사용해 대량의 데이터를 가져와야 하는 경우, 요청 사이에 최소 1초 이상 대기하는 것을 고려하세요. HTTP 429 Rate limit exceeded 오류를 받거나 응답 헤더에서 RateLimit-Remaining=0을 확인하면, 재시도하기 전에 RateLimit-Reset에 지정된 초만큼 기다리세요.
W&B 앱은 메모리를 많이 사용하는 편이며 Chrome 브라우저에서 가장 안정적으로 동작합니다. 컴퓨터의 메모리 용량에 따라 W&B를 3개 이상의 탭에서 동시에 열어 두면 성능이 저하될 수 있습니다. 예상보다 성능이 느려진다면 다른 탭이나 애플리케이션을 닫는 것을 고려하세요.
W&B는 성능을 매우 중요하게 여기며, 지연 현상에 대한 모든 리포트를 조사합니다. 조사를 더 신속하게 진행하려면, 로딩이 느릴 때 핵심 메트릭과 성능 이벤트를 캡처하는 W&B의 내장 성능 로거를 사용해 보세요. 로딩이 느린 페이지의 URL에 &PERF_LOGGING 매개변수를 추가한 다음, 콘솔 출력 결과를 계정 담당 팀이나 지원팀과 공유하세요.