[AI 서빙 기초] 디버깅 예제 & 서버 관리 기초

개발 과정의 디버깅

  • 소프트웨어 개발: 특정 작업 능력이 있는 컴퓨터 프로그램을 만드는 과정
  • 디버깅: 오류나 버그를 찾고 수정하는 과정
  • 버그
    • 소프트웨어 설계, 개발, 작동 과정에서 생기는 오류
    • 예상치 못 한 결과를 생성하거나 의도와 다른 방식으로 작동

버그 발생 요인

  • 사람의 실수
  • 실행 환경
  • 의존성
  • 복잡성
  • 의사소통 착오

디버깅 프로세스

  1. 문제 발생
  2. 문제 인식
  3. 해결책 조사
    1. 과거에 경험하지 못 한 문제인 경우
      1. 공식 문서 참조
      2. 구글링
      3. GitHub 이슈
      4. Stack Overflow
      5. ChatGPT → 2023년 04월을 기준으로 이미 수많은 디버깅 대응은 구글링보다 GPT-3.5 혹은 GPT-4.0 기반의 ChatGPT 사용이 훨씬 효율적이라고 생각한다. 문제 상황의 복잡성에 따라 기반 모델을 선정하는 역량을 갖춘다면 원하는 디버깅 해결책을 경험상 90% 이상의 확률(현재 체감상 97% 이상)로 얻을 수 있다. 단, 2021년 이전 학습 데이터로 반영된 내용만 이에 해당한다. 최신 프레임워크에 관한 질문 등에는 제대로 답을 못 할 수도 있다.

        원하는 답변을 얻지 못 했다면 그 때 구글이나 스택 오버플로우 같은 사이트로 넘어가는 것이 효율적이라고 생각한다. 어차피 구글링을 하여도 원하는 답변을 100%의 확률로 검색 상단에 서치된 사이트에서 얻을 수 없다면, 훨씬 구체적 질문에 대한 구체적인 답변을 얻을 확률이 높은 ChatGPT를 먼저 사용한 뒤 사실 체크를 뒤에 하는 것이 비용을 크게 절감할 수 있다.

    2. 과거에 경험했던 문제라면, 기록하여 정리해두는 습관 들이기!

서버 관리 사례 조사

  • 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차적으로 확인할 때 사용
  • 포트 개방 확인(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 코어 별 각 상태, 사용량 확인 가능

정리

  • 서버 관리
    • GPU 서버 사용 시 간단한 서버 관리 역량 필요
    • 대표적으로 셸 커맨드, 파일 시스템, 디스크, 네트워크, 패키지 관리, 성능 모니터링, 도커 등
    • CS 기초 지식과 관련된 부분, 서버 관리 시 반복된다면 어떻게 더 잘 할 것인지 고민

참고

  • 부스트캠프 - AI 서비스 개발 기초 by 변성윤

© Copyright 2023 GT.