[AI 서빙 기초] 디버깅 예제 & 서버 관리 기초
개발 과정의 디버깅
- 소프트웨어 개발: 특정 작업 능력이 있는 컴퓨터 프로그램을 만드는 과정
- 디버깅: 오류나 버그를 찾고 수정하는 과정
- 버그
- 소프트웨어 설계, 개발, 작동 과정에서 생기는 오류
- 예상치 못 한 결과를 생성하거나 의도와 다른 방식으로 작동
버그 발생 요인
- 사람의 실수
- 실행 환경
- 의존성
- 복잡성
- 의사소통 착오
디버깅 프로세스
- 문제 발생
- 문제 인식
- 해결책 조사
- 과거에 경험하지 못 한 문제인 경우
- 공식 문서 참조
- 구글링
- GitHub 이슈
- Stack Overflow
ChatGPT → 2023년 04월을 기준으로 이미 수많은 디버깅 대응은 구글링보다 GPT-3.5 혹은 GPT-4.0 기반의 ChatGPT 사용이 훨씬 효율적이라고 생각한다. 문제 상황의 복잡성에 따라 기반 모델을 선정하는 역량을 갖춘다면 원하는 디버깅 해결책을 경험상 90% 이상의 확률(현재 체감상 97% 이상)로 얻을 수 있다. 단, 2021년 이전 학습 데이터로 반영된 내용만 이에 해당한다. 최신 프레임워크에 관한 질문 등에는 제대로 답을 못 할 수도 있다.
원하는 답변을 얻지 못 했다면 그 때 구글이나 스택 오버플로우 같은 사이트로 넘어가는 것이 효율적이라고 생각한다. 어차피 구글링을 하여도 원하는 답변을 100%의 확률로 검색 상단에 서치된 사이트에서 얻을 수 없다면, 훨씬 구체적 질문에 대한 구체적인 답변을 얻을 확률이 높은 ChatGPT를 먼저 사용한 뒤 사실 체크를 뒤에 하는 것이 비용을 크게 절감할 수 있다.
- 과거에 경험했던 문제라면, 기록하여 정리해두는 습관 들이기!
- 과거에 경험하지 못 한 문제인 경우
서버 관리 사례 조사
- AI, ML 프로젝트의 모델은 대부분 서버에서 동작 → 서버 관리를 배울 필요가 있음
서버 관리의 목적
- 서버를 안정적으로 운영하여 장애 발생을 막기 위함
- 서버에서의 작업 원활화
Linux 파일 시스템 구성
- /: 최상단 계층 구조
- /bin: (binary) 단일 사용자나 다중 사용자에게 모두 기본적으로 필요한 유틸리티 프로그램. 예컨대, ls, cp 등의 cli상의 명령어도 이에 포함.
- /sbin: (system binary) 시스템 관리를 위한 유틸리티 프로그램
- /boot: 운영 체제 부팅에 필요한 파일
- /opt: 소프트웨어 패키지 설치 시 사용
- /dev: 하드 드라이브, USB 등 하드웨어 장치를 나타내는 파일 존재
- /etc: 시스템 구성 파일, hostname 설정 등
- /home: 사용자 홈 디렉토리, 사용자 별 개인 파일, 개인 설정
- /lib: (library) 시스템 프로그램, 라이브러리에서 사용하는 파일
- /mnt: (mount ) 외장 하드 드라이브, usb 마운트 할 때 사용
- /usr: 사용자 응용 프로그램
- /var: 로그 파일, 데이터베이스, 임시 파일
사례
- df: 파티션 단위로 용량 확인(-h는 human-readable의 약자)
- du: 폴더, 파일 단위로 용량 확인(-d는 depth의 약자)
네트워크
- IP: 네트워크에 연결된 다른 컴퓨터의 주소
- 도메인을 구매해서 설정
- DNS: 사람이 읽을 수 있는 도메인 이름(예컨대, www.naver.com)을 컴퓨터가 읽을 수 있는 IP 주소(예컨대, 192.0.2.44)로 변환
- Port
- 포트 숫자는 PC에 접속할 수 있는 통로
- 예: localhost:8000, 8000 포트로 접속
- 포트를 개방해야 사용 가능
- 방화벽
- 필수는 아니나, OS에 특정 IP, Port만 접속할 수 있도록 설정
- 보통 이러한 IP, Port를 ACL (Access Control List) 혹은 White List라고 부름
- 네트워크 진단 시 사용하는 명령어
- ping
- 서버 연결 여부, 데이터 전송 빠르기 테스트
- 네트워크상 서버에 작은 패킷 송신 후 서버의 신호 수신에 의해 작동
- ping + IP 주소나 도메인 이름을 입력
- nslookup
- 특정 도메인(www.naver.com)을 찾을 수 있는지 확인 가능
- DNS 서버에의 연결 가능 여부 확인
- 서버에 DNS 서버 설정 여부를 1차적으로 확인할 때 사용
- ping
- 포트 개방 확인(TCP connection)
- 현재 연결 포트 정보 확인: netstat
- 특정 포트 확인 시에 grep 명령어 활용
사례
- 서버에서 주피터 노트북을 실행했으나 웹에서 접속 불가능한 경우
- 해결 방법
- IP 주소 작성 확인: 내부용 IP / 외부용 IP
- 네트워크 연결 확인: ping 정상 작동 여부, netstat 포트 확인
- 주피터 노트북 실행 시 해당 IP로의 실행 여부 확인
- 방화벽 확인: 서버의 포트는 기본적으로 차단이 많이 되어있음(해킹 이슈). 방화벽 설정에서 특정 포트를 개방해야 접근 가능.
- 로그 확인: 주피터 노트북 실행 터미널에서 접근 권한 로그 확인(남지 않았다면 잘못된 곳에 접근 중일 확률이 높음)
- 서버 과부하 여부 확인
- 디스크 용량 체크를 해야 할 수도 - 도커 사용 시, 로그 파일이 자동 생성되어 쌓이곤 함
- FastAPI 사용으로 웹 서버를 구축했다면 여러 이슈 발생 가능성(인프라 영역, DB, 프론트 등) → 디버깅을 통해 하나씩 해결
- 해결 방법
성능 모니터링
- 명령어
- top
- CPU, 메모리, 프로세스 정보 확인 가능
- -b: 순간 정보 확인
- -n: top 실행 주기 설정
- us: 유저 레벨 CPU 사용량
- sy: 시스템 레벨 CPU 사용량
- PID: 프로세스
- %CPU, %MEM: 프로세스 별 사용량
- top 외에도 htop, gotop 등
- glances
- CPU, 메모리, 디스크, GPU, 도커 컨테이너 상태까지 모니터링
- 웹 인터페이스도 띄울 수 있음. API로 상태 확인 가능.
- 파이썬으로 설치: pip install glances[all]
- nvidia-smi
- GPU 코어 별 각 상태, 사용량 확인 가능
- top
정리
- 서버 관리
- GPU 서버 사용 시 간단한 서버 관리 역량 필요
- 대표적으로 셸 커맨드, 파일 시스템, 디스크, 네트워크, 패키지 관리, 성능 모니터링, 도커 등
- CS 기초 지식과 관련된 부분, 서버 관리 시 반복된다면 어떻게 더 잘 할 것인지 고민
참고
- 부스트캠프 - AI 서비스 개발 기초 by 변성윤