- 인쇄
- PDF
노드 종료 유예 대비하기
- 인쇄
- PDF
VPC 환경에서 이용 가능합니다.
CLOVA NSML은 현재 Closed Beta로 일부 파트너사에게만 제공되어 있으며, 일반 사용자 대상 오픈 시기는 미정입니다.
Node(노드)는 언제든지 중지될 수 있으며, 노드가 중지될 때 10분간 종료 유예 기간(graceful termination period)을 가질 수 있습니다. 종료 유예 기간에 학습 상태를 보존하는 조치를 취할 수 있으며, 다음과 같은 상황에 노드 종료 유예 기간을 가집니다.
- 사용자가 유예 시간을 갖도록 설정(Graceful Termination 옵션)한 후 Run(실험)을 중지했거나 노드를 중지 중지
- 노드가 사용할 수 있는 프로젝트의 크레딧이 모두 소진
- 선점 가능(preemtible)한 노드로 설정되어 자원 부족으로 종료
노드가 종료될 때는 다음과 같은 과정을 거칩니다.
- CLOVA NSML은 사용자에게 Slack으로 대상 Run(실험)이 중단됨을 알립니다.
- 실행 중인 프로세스에 종료 시그널(SIGTERM)이 전송됩니다. 노드의 상태는 종료 중인 상태(Finalizing)로 바뀝니다.
- 10분 정도 종료 유예 시간을 가집니다.
- 실험을 강제 종료(SIGKILL)합니다.
SIGTERM 시그널은 사용자 정의 명령을 사용했을 때만 수신할 수 있습니다. 사용자 정의 명령을 사용하지 않은 노드는 종료 유예 기간 없이 바로 노드 상태가 종료된 상태(Succeeded)로 바뀝니다.
SIGTERM 시그널이 전달되는 대상 프로세스는 사용자 프로세스와 같은 프로세스 그룹 ID(pgid)를 갖는 프로세스입니다.
위 과정 중 종료 시그널(SIGTERM)을 프로세스가 받을 때 동작하는 핸들러를 코드에 등록하면 필요한 작업을 수행할 수 있습니다. 다음은 Python 표준 라이브러리로 SIGTERM 시그널에 대한 핸들러를 등록한 예입니다.
def sigterm_handler(s: signal.Signals, f: types.FrameType) -> None:
raise KeyboardInterrupt
signal.signal(signal.SIGTERM, sigterm_handler)
try:
train(model, optimizer) # 학습 등의 메인 프로세스
except KeyboardInterrupt:
# 종료 유예 기간 중에 할 것: 현재 model, optimizer 상태 저장 등
torch.save(model, 'model.pt')
torch.save(optimizer, optimizer.pt')
학습 데이터나 모델이 크면 필요한 데이터를 저장하기에 유예 기간이 짧을 수도 있습니다. 그뿐만 아니라 시간이 충분하더라도 데이터를 저장할 때 오류가 발생할 수도 있습니다. 이를 위해 학습 상태를 주기적으로 저장할 수도 있습니다. 다만, 데이터를 저장할 때 GPU 활용률이 떨어질 수 있기 때문에 비용과 자원 활용을 고려하여 적정 저장 주기를 탐색할 필요가 있습니다. 다음은 10 회의 에포크(epoch) 주기로 데이터를 저장하는 예입니다.
for epoch in range(epochs):
train(model, optimizer)
if (epoch+1) % 10 == 0:
torch.save(model, 'model.pt')
torch.save(optimizer, 'optimizer.pt')