Skip to content

Instantly share code, notes, and snippets.

@choiseoungho
Created October 29, 2020 02:07
Show Gist options
  • Save choiseoungho/2392cd2b2ee2e6c4a1b4f99d89bda0e5 to your computer and use it in GitHub Desktop.
Save choiseoungho/2392cd2b2ee2e6c4a1b4f99d89bda0e5 to your computer and use it in GitHub Desktop.
NSML
- GPU 자원의 효율적인 사용을 위해 개발된 MLaaS (Machine Learning as a Service), 클라우드 플랫폼
- AI 연구개발이 가능하도록 돕는 역할을 수행합니다. 단순히 CLI와 Web interface만으로 복잡한 설정 없이 AI 학습을 진행
- NSML 에서는 Session 이라는 개념, 하나의 작업 단위를 Session
- 하나의 session 안에서는 여러 개의 model을 run(진행)
- 모델들은 checkpoint라는 번호로 구분되어 계속 저장
- NSML 을 돌릴 때 Local 에서
Local 환경에서 필요한 것
- Files : 첫 시작점으로 불리는 entry fiel 을 포함한 파일들을 지칭. NSML에 사용하는 명령어들과 머신러닝 모델들을 적는 파일
- Dataset : NSML에서 Session 을 돌릴 때 활용하는 dataset, dataset은 NSML에 이미 push 되어 있음.
User interface 에서 필요한 것
- Command Line Interface (CLI) : NSML 과 명령어로 소통하는 interface
- Web interface : session 들의 진행 사항과 visualization을 확인 가능 (https://ai.nsml.navercorp.com )
https://ai.nsml.navercorp.com/download 다운 파일
Local-nsml 설치,
pip install git+https://github.com/n-CLAIR/nsml-local
Login
nsml login
INFO[2019/07/18 16:05:38.667] connecting to ai-cli.nsml.navercorp.com:18553
GitHub Username: nsml-admin
GitHub Password: ****************
INFO[2019/07/18 16:05:55.570] Welcome to NSML!
경로 설정
export PATH=$PATH:/Users/user/Documents/nsml_client.darwin.amd64.hack
nsml run -d mnist -e main.py
Github baseline code execution
1. Github 의 baseline 레파지토리를 먼저 clone
git clone https://github.com/clovaai/speech_hackathon_2019.git
2. nsml run - d mnist -e main.py
모델 관리하기
- Step 1. 삭제할 모델 조회하기
nsml model ls SESSION_NAME e.g) nsml model ls nsmlteam/mnist/4
각 모델의 사이즈는 맨 오른쪽 Size 열에서 확인 가능
Checkpoint | Last Modified | Elapsed | Summary | Size
- Step 2. 모델 삭제하기 & 확인하기
nsml model rm SESSION_NAME_CHECKPOINT
e.g.) nsml model rm nsmlteam/mnist/4 "*"
session 에 있는 1번부터 35번 model을 전부 bash script로 삭제하기
$ for i in 'seq 1 35'; do nsml model rm nsmlteam/mnist/$i "*" ; done
$ nsml model ls nsmlteam/mnist/35
session 에 있는 1개 삭제하기
$nsml model rm nsmlteam/mnist/4 0
Load a model in a session
NSML 라이브러리를 사용하는 코드 내에서 다른 세션의 모델을 가져올 수 있음
nsml.load 로 다른 세션의 모델을 불러와서 nsml.save로 저장 후, 종료하는 더미 세션을 생성하는 방식
bind_model(model)
if config.pause:
nsml.paused(scope=locals())
bTrainmode = False
if config.mode == 'train':
bTrainmode = True
# the three lines of load/save source codes are positioned at below.
nsml.load(checkpoint='4', session='nsml_team/mnist/48')
nsml.save('saved')
exit()
# If you want to place it to the other line, you should put it below the bind_model() function,
""" Initiate RMSprop optimizer """
opt = keras.optimizers.rmsprop(lr=0.00045, decay=1e-6)
model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
로그 확인
$nsml logs nsml_team/mnist/49
...
model loaded!
model saved!
...
위 두 문구가 나오면 정상적인 문구
확인
$nsml model ls nsml_team/mnist/49
nsml submit 명령어 이용 리더보드에 제출
nsml model ls SESSION_NAME e.g) nsml submit nsml_team/mnist/49 saved
Dataset 관리
CLI 에서 활용
해커톤에서 활용하는 데이터셋은 NSML에 업로드
session을 run할 때 dataset 을 -d 옵션으로 등록
nsml dataset ls 명령어를 사용하면 해커톤에서 사용하는 dataset을 확인
nsml dataset search 명령어는 dataset을 이름으로 검색
show_leaderboard 명령어는 dataset 기준으로 nsml submit 된 모델들의 리더 보드 (순위표)를 보여줌
nsml dataset ls -j
-j : json 형식으로 보여줌
Description : NSML에 등록된 모든 데이터셋의 이름, 크기, 올린 사람을 보여줌
nsml dataset search DATASET_NAME
Description : nsml에 등록된 데이터 셋을 이름으로 찾아줌
nsml dataset board options dataset_name
Description : NSML에 올라간 데이터셋 기준으로 leaderboard를 보여줌
nsml dataset board -j mnist
Session
유저의 코드가 실행되는 하나의 작업 단위를 session 이라고 부름
CLI 에서 session 을 관리하는 명령어들의 사용방법
Prepare a session environment
- Session 을 실행하기 전, 아래와 같은 방법으로 NSML server에서 실행될 code의 실행 환경을 설정
- pip 로 install 이 가능한 경우
setup.py 혹은 requirements.txt 파일에 아래와 같이 python library를 기입
from distutils.core import setup
setup(
name='ladder_networks',
version='1.0',
install_requires=[
'matplotlib',
'tqdm',
'pillow'
]
)
만약 setup.py 와 requirements.txt가 둘다 있으면 setup.py를 먼저 설치하고, requirements.txt를 설치
docker 환경을 기재하지 않으면 nsml/default_ml:latest를 사용함
apt-get 으로 패키지를 설치해야되는 경우
nsml_package.txt 파일을 만들어 필요한 라이브러리를 기재하면 설치됨
NSML ignore
- nsml run으로 session을 실행시킬 때 필요 없는 파일들도 함께 올라가면서 시간이 오래 걸릴 수 있음.
따라서 git 에서 .gitignore와 같은 형식으로 .nsmlignore에 기재하면, 필요 없는 파일이 올라가는 것을 막을 수 있음
Run a session
Usage : nsml run options
Description : 현재 위치의 파일들을 NSML server로 보내 세션을 실행
run을 하면 자동으로 현재 위치의 main.py를 entry 파일로 인식하여 session 을 실행하고, entry 파일이 없으면 에러가 발생. -e 옵션으로 entry 파일을 변경 가능
Example : nsml run -d mnist (-d 옵션을 설정하여 dataset을 꼭 지정해 주셔야 함)
Submit a session
Usage : nsml submit Options SESSION_NAME Checkpoint
session 을 submit하여서 leaderboard에 점수를 제출. 하루에 submit 횟수는 제한이 없음. 다만 submit 을 한 번 했다면 1시간 후에 다시 submit 이 가능.
즉, submit 시간 간격은 1시간이 넘어야 함 (단, -t 옵션을 사용하는 submit은 submit 시간 간격 카운트에 포함되지 않음)
nsml submit nsmlteam/mnist/4 32
nsml submit -t nsmlteam/mnist/4 32
Options : -t 실제로 점수를 제출하기전, 데이터의 포맷 오류나 기타 버그들을 찾기 위해 지원하는 debug 모드 (test 모드)로 session을 제출
test모드로 제출 후 session 이 새로 생기면 logs를 보고 debugging을 할 수 있음
Troubleshooting:
submit 도중에 " Error: Submit/infer session is stopped right after runnig. Please check your code again" 발생하면 nsml.paused()가 호출되기 전에 에러가 발생한 것으로, 크게 두가지로 나눌 수 있음
1. nsml.paused()호출되기 전 test_data 또는 test_label에 접근하는 경우
2. nsml.load() 도중 에러가 난 경우
nsml submit -t SESSION CKPT 를 통해서 디버깅을 가능
실행중인 session 에 REPL로 접근 가능
REPL 콘솔 화면에서 파이썬 구문을 입력하면 바로 결과를 반환하고 다시 입력할 수 있는 도구
Change a session memo
Usage: nsml memo SESSION_NAME MEMO
Description : 현재 session 에 있는 memo/description를 작성. 이미 메모가 있다면 덮어 씀
nsml memo nsmlteam/mnist/4 "First trial"
nsml model rm SESSION_NAME CHECKPOINT
Description: 하나 또는 여러 개의 model 을 삭제합니다. 생성된 CHECKPOINT 번호를 입력
nsml model rm nsmlteam/mnist/4 24
Fork a session
Usage : nsml fork Options SESSION_NAME
session을 fork해서 새로운 세션으로 재생성
fork 가 제대로 동작하려면, 다음의 조건을 만족해야 함.
entry 파일에서 reserved arguments 를 받을 수 있어야 함.
nsml.save 와 nsml.load 가 정상적으로 동작해야 함.
nsml.paused 가 호출되어야 함.
Get a log from session
Usage : nsml logs Options SESSION_NAME
Description : session 에서 만들어진 log를 보여줌
options : -f session 이 종료될 때까지 log를 streaming
Pull sessions
Usage : nsml pull Options SESSION_NAME PATH
Description : nsml run 하였을때 upload 된 session파일들을 local machine으로 가져옴
Example : nsml pull -v nsmlteam/mnist/4 ./
Options : -v 상세한 과정을 표기 , -f 로컬 path 에 folder 가 있으면 지우고 덮어 씀
List models
nsml models ls Options SESSION_NAME
Description : session 에서 생성된 model을 확인
Check a session status
nsml ps Options
Session 들의 목록을 보여줌
nsml ps -n 10
NSML Library 사용 법
NSML Server와의 통신을 위해서 NSML 의 함수들을 사용해야 함.
NSML library 함수들은 main.py 로 만들어진 entry 파일을 포함한 .py 파일에 모듈을 import 한 뒤 사용할 수 있음.
reserved arguments
- NSML에서는 세션을 재생성하는 command 들 (nsml fork, nsml submit)을 사용할때 entry 파일에서 3가지 옵션을 받을 수 있어야 함
-- mode TEXT : 들어온 command 가 nsml submit 일 경우 사용
--pause INTEGER : model을 load할때 1로 설정
-- iteration TEXT : nsml fork 할때 iteration 로 설정, iteration 옵션을 주지 않으면 마지막 wall time의 model을 가져옴
NSML Constants
nsml.IS_ON_NSML
NSML server 에서 code 가 실행되는 상태면 True를 출력
nsml.HAS_DATASET
session 이 dataset 을 가지고 있으면 True를 출력
nsml.DATASET_PATH
nsml run -d DATASET 으로 실행시켰을 때 dataset 의 path를 출력
nsml.DATASET_NAME
nsml run -d DATASET 으로 실행시켰을 때 dataset 의 이름
nsml.report(summary=False, scope=None, **kwargs)
변수의 변화량을 기록하여서 web 에서 scalar, tensorboard, visdom 에 그래프를 그릴 때 사용
summary (bool or None) – 값이 True이면, nsml ps 에 값이 보입
scope – locals() 로 값을 주면, 해당 범위의 값에 nsml exec 으로 접근할 수 있습니다. 또는 python 의 eval 로 세션에 접근할 수 있음
step – scalar 그래프에서 보여줄 x 축 값을 설정
**kwargs (str or None) – 트래킹할 변수를 key=value 형식으로 입력합니다. (ex. loss=loss) (walltime key 값은 내부에서 자동으로 time.time() 으로 설정되므로 만약 walltime=variable 로 값을 넘겨질 경우 time.time() 의 값으로 overwrite됩니다.)
nsml.bind-save
nsml.bind() 에 넘겨지는 save 함수는 model, optimizer 등 python object를 저장하는 함수
nsml.save(checkpoint=None, save_fn=None) 모델을 저장, nsml.bind() 함수에서는 save 함수를 정의
nsml.load
checkpoint (str) – session 의 호출할 checkpoint을 정의합니다.
load_fn (fn) –
모델을 load 하는 방법이 정의된 함수를 인수로 받습니다. load 함수가 호출되는 우선순위는이 함수로 전달된 load_fn
1. nsml.bind() 에 binding 된 load 함수
2. nsml 에서 정의한 default load 함수
3. session (str) – 해당 session name 에서 저장된 model 을 불러옴
nsml.paused
nsml fork, nsml submit 과 같이 nsml command 를 사용해서 세션을 재생성하는 명령어를 실행할 때 사용되는 함수
bind_model은 NSML의 함수는 아니지만 nsml.bind 를 쉽게 사용하기 위한 wrapper 함수
def load(dir_path, **kwargs):
state = torch.load(os.path.join(filename, 'model.pt'))
model.load_state_dict(state['model'])
if 'optimizer' in state and optimizer:
optimizer.load_state_dict(state['optimizer'])
print('Model loaded')
def save(dir_path, **kwargs):
state = {
'model': model.state_dict(),
'optimizer': optimizer.state_dict()
}
torch.save(state, os.path.join(dir_path, 'model.pt'))
def infer(input, top_k=100):
# load data into torch tensor
model.eval()
# from list to tensor
image = torch.stack(preprocess(None, input))
image = Variable(image.cuda())
_, clean_state, _, _ = model(image, None)
_, all_cls = clean_state.size()
prediction = F.softmax(clean_state).topk(min(top_k, all_cls))
# output format
# [[(prob, key), (prob, key)... ], ...]
return list(zip(list(prediction[0].data.cpu().squeeze().tolist()),
list(prediction[1].data.cpu().squeeze().tolist())))
nsml.bind(save=save, load=load, infer=infer) # 'nsml.bind' function must be called at the end.
Web interface 사용법
NSML이 동작하는 내용을 확인
세션들의 목록, 로그, GPU 사용량과 Graph 등을 제공
Appendix
Notification
session의 상태 변화를 email을 통해 알람
Download 링크
https://ai.nsml.navercorp.com/download
Reference
https://n-clair.github.io/ai-docs/_build/html/ko_KR/index.html
https://ai.nsml.navercorp.com/download
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment