※ 일본의 한 포스팅을 번역한 글입니다. 오역 및 직역, 의역이 있을 수 있으며, 틀린 내용은 지적해주시면 감사하겠습니다.
이번 포스팅에서는 코드 에디터인 VSCode에서 머신러닝 개발을 할 때 폭발적으로 속도를 올려주는 셋팅에 대해서 얘기하고자한다. 심층학습 모델의 만들 때 리모트 환경의 GPU를 탑재한 서버에서 작업을 하는 경우가 매우 많아. VSCode는 이러한 리모트 환경에서의 코드 편집 및 디버그를 간단히 할 수 있는 구조들이 꽤 많이 존재한다.
이 포스팅에서는 심층학습 모델의 구현에서 빈번히 사용되는 Python을 대상으로, 아래의 관점을 바탕으로 작성 속도를 올려주는 설정과 기능에 대해 소개한다.
- Python의 개발 환경의 구축
- 리모트 환경의 GPU 서버에 접속하기 위한 설정
- 심층학습 모델의 구현/디버그를 간단히 할 수 있는 기능
- 추천하는 단축키/확장기능/커스터마이즈
그리고 이번 포스팅의 목차이다.
- VSCode의 설치
- 코멘드 팔레트에 의한 명령어 실행
- settings.json에 의한 VSCode의 설정
- Python의 개발 환경 구축
- 확장 기능의 설치
- settings.json의 설정 예
- Python 환경 지정
- 리모트 GPU서버에 접속하기 위한 설정 방법
- 확장 기능의 설치
- 리모트 서버에 VSCode로 접속하기
- 리모트 서버에 확장 기능을 설치하기
- 심층 학습 모델의 구현/디버그를 간단히 할 수 있는 기능
- VSCode의 강력한 디버그 기능
- Python 스크립트의 디버그
- AllenNLP 모델의 디버그
- VSCode의 강력한 디버그 기능
- 여담
- 추천하는 단축키/확장 기능/ 커스터마이즈
- 추천하는 단축키
- 추천하는 확장 기능
- 추천하는 커스터마이즈
- 추천하는 단축키/확장 기능/ 커스터마이즈
VSCode의 설치
VSCode 공식 사이트에 들어가서 설치하자. MacOS의 경우 brew가 설치되어 있다면, 아래의 커멘드로 설치하는 것도 가능하다.
$ brew cask install visual-studio-code
커맨드 팔레트에 의한 커멘드의 실행
이후에는 간단하기 때문에 VSCode 커맨드 팔레트(Windows: alt + shif + p , MacOS : cmd + shift + p)에서 커맨드를 실행한다. 커맨드 팔레트나 단축키에 익숙해지면 키보드에서 손을 떼지않고 편집이 가능해진다. 텍스트 편집의 효율화를 위해 익숙해지는 것을 추천한다.
settings.json을 통한 VSCode의 설정
VScode는 GUI를 통하 설정 혹은 settings.json을 통해서도 설정이 가능하다. 커맨드 팔레트에서 > Preferences : Open Settings(JSON) 으로 설정 파일을 열 수 있다. 아래에서 개인적으로 추천하는 설정을 이 settings.json형식으로 소개할 것이다.
Python의 개발 환경의 구축
VSCode에 의한 Python 개발 환경은 Python의 확장 기능을 설치하는 것으로 다른 설정이 불필요하고 풍부한 보완이나 리팩터링 기능을 사용할 수 있다.
확장 기능의 설치
Python의 개발 환경을 위한 확장 기능을 설치한다. 커맨드 팔레트에서 >View: Show Extensions 을 선택하여 검색창에 Python을 입력하면 아래의 확장 기능을 발견할 수 있으므로 설치해두자.
settings.json의 설정 예
아래는 Python 확장기능에 따른 settings.json의 설정예이다.
{
"python.formatting.provider": "black",
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--ignore=E501,W503"
],
"python.sortImports.args": [
"-m 3"
],
"python.jediEnabled": false
}
- black : Fromatter
- black에 의해 소스 코드의 자동 포맷을 이용한다. 커스터마이스 불필요하며 규칙에 따라 포맷을 정리해준다.
- flake8 : Linter
- flake8를 통해 문법을 체크할 때 사용한다.
- black과 병용할 때는 E501(하나의 행이 너무 길면 에러)와 W503(이항연산자의 전에 개행하면 경고)를 무시하는 설정을 추가한다.
- pylint는 flake8와 동일하게 문법 체크시에 넓게 사용되지만, 이번에 소개할 설정의 예에서는 flake8을 사용할 것이므로 off로 한다.
- isort : import 문의 정렬
- isort에 의한 import문의 자동 정렬 기능을 이용한다.
- import문을 개행할때의 스타일을 -m 3와 같이 지정한다. 이 이외의 스타일은 이 사이트를 참고하길 바란다.
- jedi : 코드 보완
- jedi는 지금까지 Python의 코드 보완에 주로 사용되어 왔지만, Microsoft가 만든 코드 보완으로 충분하므로 이번에 소개할 설정의 예에서는 off로 한다.
이러한 패키지는 대상 Python환경에 설치하지 않은 경우는 인스톨을 권하는 팝업이 표시되므로 이 팝업을 통해 설치하는 것도 가능하다.
Python 환경의 지정
pyenv 등을 이용한 가상의 Python환경이 존재하는 경우, 커맨드 팔레트에서 > Python: Select Interpreter을 선택해, Python 환경으로 바꾸는 것도 가능하다. 대상의 가상 환경을 선택하여 변경해주길 바란다.
리모트 GPU 서버에 접속하기 위한 설정 방법
VSCode에서는 Remote development의 확장 기능을 설치하는 것으로 로컬에서 텍스트 편집하는 것과 거의 동일한 편집이 가능하다.
확장 기능의 설치
리모트 환경의 서버 상의 텍스트를 편집하기 위해서는 확장 기능을 설치한다. 커맨드 팔레트에서 > View : Show Extensions 를 선택하여 검색창에 remote를 입력하면 아래의 확장 기능을 발견 할 수 있다. 이 확장 기능을 설치하자.
리모트 서버에 VSCode로 접속하기
커맨드 팔레트에서 > Remote-SSH: Open configuration File를 선택하면, ssh의 설정 파일을 열 수 있다. 여기에 접속처가 될 서버의 정보를 아래와 같이 기재한다.
Host <임의의 이름>
Hostname <서버의 IP주소>
User <로그인하고 싶은 서버상의 유저명>
IdentityFile <ssh키의 장소>
서버에 접속하기 위해서는 커맨드 팔레트에서 > Remote-SSH: Connect to Host 를 선택하면, <임의의 이름>으로 설정한 유저명을 선택지에서 확인할 수 있으므로 선택하다. 그러면 새로운 윈도우가 열려, 서버에 접속된 상태의 VSCode 화면이 표시된다.
리모트 서버에 확장 기능을 설치하기
지금까지 여러 가지의 확장 기능을 설치해왔다. VSCode에서는 리모트 서버에도 동일한 확장기능을 설치할 필요가 있으므로 주의하자. 설치할 예정인 Python 확장 기능 등은 아래와 같이 settings.json에 기재하면 자동적으로 설치된다.
{
"remote.containers.defaultExtensions": [
"ms-python.python",
"christian-kohler.path-intellisense"
]
}
심층 학습 모델의 구현/디버그를 간단히 할 수 있는 기능
심층 학습 모델을 구혈할 때에 가장 시간이 걸리는 것이 "모델의 입출력 부분"과 "모델 내의 tensor 변형을 맞추는 부분"이라고 생각된다. 이러한 부분을 에디터로 어떠한 처리를 하고 싶지만, 사실상 그렇게 간단한 문제가 아니다. VSCode의 디버그 기능은 이러한 미묘한 수정이 필요한 부분에서 힘을 발휘한다.
VSCode의 강력한 디버그 기능
VSCode에서는 Python의 확장 기능을 설치하는 것으로 다음의 것들이 가능해진다.
- tensor의 값이나 형태가 자동적으로 표시된다.
- 마우스 커서를 변수 위에 올리면 tensor의 값이나 형태, 가중치나 디바이스 타입까지 확인할 수 있다.
이와 같이, 심층 학습 모델의 디버그에 필수불가결인 정보를 간단히 확인할 수 있다. 일반적인 디버그를 떠올리면 pdb이라는 디버그 툴을 사용하거나 print문 이용하는 방법이 있는데, 마우스 오버만으로 tensor의 값이나 형태를 확인할 수 있으므로 수고가 덜어진다.
Python 스크립트의 디버그
VSCode에서의 디버그 흐름은 디버그의 설정을 기재한 launch.json을 작성한다. launch.json의 설정 예는 아래의 사이트에 각 프로그램 언어의 예를 참고하면 된다.
구체적인 디버그 내용은 생략하도록 하겠다. 공식 사이트 페이지에서 더욱 상세히 설명되어있기 때문에 사이트를 참고하길 바란다.
AllenNLP 모델의 디버그
심층 학습에 의한 잔연어 처리 모델을 구현할 때 AllenNLP를 이용하는 방법이 많을 것으로 생각된다. VSCode의 디버그 기능을 이용하여 AllenNLP로 구현한 모델을 디버그하는 방법은 아래의 사이트가 도움이 된다.
디버그 시에 호출할 스크립트를 기재한다. 그 다음 launch.json에 동일한 방법으로 디버그의 설정을 작성할 뿐이다.
여담
여기서부터는 내(원글의 저자)가 추천하는 VSCode의 각 종 설정에 대해 이야기하고자 한다.
추천하는 단축키/확장 기능/커스터마이즈
추천 단축키
텍스트 편집을 효율적으로 할 수 있는 단축키로 내가 많이 사용하는 것을 열거하고자 한다. 아래는 MacOS를 상정한 단축키로 Windows의 경우는 cmd를 alt로 바꿔 읽으면 된다.
- 커맨드 팔레트를 열기
- cmd + shitf + p
- 사이드바를 열고 닫기
- cmd + b
- 파일 익스플로러를 열기
- 파일 목록을 보고 싶을 때 사용한다.
- cmd + shift + e
- 멀티 커서
- 여러 개의 커서를 표시해 변수 등을 편집할 때 사용한다.
- 모두 변경할 때
- 선택지 중 구문을 모두 선택하기
- cmd + shift + l
- 특정 구문만 대상으로 변경할 때
- cmd + d
- 모두 변경할 때
- 여러 개의 커서를 표시해 변수 등을 편집할 때 사용한다.
추천 확장 기능
- Path Intellisense - Visual Studio Marketplace
- 파일 패스를 보완해주는 확장기능이다. 경로의 오탈자등 미묘한 실수를 제어할 수 있다.
- Statusbar error - Visual Studio Marketplace
- 에러가 발생하고 있는 곳에 커서를 올려두면 그 내용을 상태바에 표시하거나, 팝업해주는 확장 기능이다.
- 기본적으로는 마우스를 오버하지 않으면 이러한 내용을 볼 수 없다. 키보드에서 손을 떨어트려 마우스를 움직여 마우스 조작하는 것은 번거로우므로, 이 기능을 넣어두면 키보드에서 손을 떼지 않고 커서를 움직이는 것만으로 내용을 확인할 수 있다.
- vscode-icons - Visual Studio Marketplace
- 파일 목록에 표시된 파일이나 디렉토리의 아이콘을 바꿔주는 확장 기능이다. 보기 쉬워진다.
- Code Spell Checker - Visual Studio Marketplace
- 파일 내의 영어 스펠링을 체크해 주는 확장기능이다. 부끄러운 오타를 제어해준다.
- 머신러닝이나 심층 학습에 사용되는 ReLU나 LSTM이라는 단어에 체크가 들어가버리기 때문에, 커맨드 파레트에서 Add Word to User Directory로 예외 단어를 등록해두는 것을 추천한다.
- 파일 내의 영어 스펠링을 체크해 주는 확장기능이다. 부끄러운 오타를 제어해준다.
- Bracket Part Colorizer 2 - Visual Studio Marketplace
- 괄호를 알기 쉽게 색을 붙여주는 확장기능이다. 특히 Common Lisp나 Emacs Lips의 확장을 쓸 때 좋다.
- YAML - Visual Studio Marketplace
- VSCode에서 YAML을 쓸 때 편리한 확장기능이다. 보완이나 문법 체크 등의 기능이 있다.
- Whitespace+ - Visual Studio Marketplace
- 혼합 된 스페이스를 보기 쉽게 가시화해주는 확장 기능입니다.
추천 커스터마이즈
이 섹션에서는 지금까지 등록한 추천 설정의 모든 것을 표시하였다. 이 설정을 반영은 커맨드 파레트에서 > Preferences : Open Settings (JSON) 에서 settings.json을 열어서 복사/붙여넣기하여 반영하면 된다.
{
"editor.cursorStyle": "block",
"editor.formatOnSave": true,
"editor.minimap.enabled": false,
"editor.formatOnType": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"files.watcherExclude": {
"**/.git/objects/**": true,
"**/.git/subtree-cache/**": true,
"**/node_modules/**": true,
"**/dataset/**/*.{png,zip,jpg,npz}": true,
},
"remote.containers.defaultExtensions": [
"christian-kohler.path-intellisense",
"davidhouchin.whitespace-plus",
"JoeBerria.statusbarerror",
"ms-python.python",
"streetsidesoftware.code-spell-checker"
],
"python.formatting.provider": "black",
"python.linting.flake8Enabled": true,
"python.linting.pylintEnabled": false,
"python.jediEnabled": false,
"python.linting.flake8Args": [
"--ignore=E501,W503"
],
"python.sortImports.args": [
"-m 3"
],
"statusbarerror.wholeLine.show": true,
"window.zoomLevel": 0,
"window.title": "${folderPath}${separator}${activeEditorShort}${separator}${rootName}",
"workbench.colorTheme": "Solarized Dark+",
"workbench.startupEditor": "newUntitledFile",
"workbench.colorCustomizations": {
"editorCursor.foreground": "#FFFF00"
},
"cSpell.userWords": [
"conv",
"cuda",
"cudnn",
"lstm",
"ndarray",
"numpy",
"relu",
"sklearn",
"tqdm",
],
}
아래는 지금까지 소개하지 않았던 설정에 대한 설명이다.
- "editor.formatOnSave" : true
- 파일을 저장할 때에 포맷터를 실행한다. 특히 Python의 포맷인 black에 의해, 항상 코드 규약에 따라 정리된 코드를 유지할 수 있다.
- "editor.codeActionsOnSave"
- "source.organizeImports": true
- 파일을 저장할 때 import문을 정리한다. 특히 Python의 isort에 따라 import 문이 항상 정리된 형태로 유지된다.
- "source.organizeImports": true
- "editor.minimap.enabled" : false
- 미니맵의 표시를 off로 한다.
- "files.watcherExclude"
- 변경을 감시를 배제할 패턴을 정의한다. 심층 학습에서는 많은 파일을 다루므로 특히 .jpg나 .png이라는 이미지 파일이나 .csv 나 .csv파일로 만들 텍스트 파일을 미리 배제해두는 것을 추천한다.
- 디렉토리 구조에 맞춰 적당히 변경하는 것을 추천한다.
- "cSpell.userWords"
- 스펠링 체크시에 배제할 단어를 정의한다.
참고자료
'IT > AI\ML' 카테고리의 다른 글
[python/Tensorflow] Tensorflow에서 GPU 제한 혹은 무효화하기 (0) | 2022.05.30 |
---|---|
Annotation과 Annotation의 툴 비교 (0) | 2022.05.13 |
[python] AI엔지니어가 주의해야할 python 코드 작성 포인트 (0) | 2022.04.13 |
Concept drift와 Data drift란? (0) | 2022.04.12 |
segmentation의 종류 (semantic segmentation, instance segmentation, panoptic segmentation의 차이) (0) | 2022.03.31 |