배포판 중 주로 다루기 쉬운 Ubuntu 많이 사용
프로그래머라면, 특히 서버 관련 개발자라면 많이 필수
UX는 username@hostname:current_folder 형식
쉘스크립트는 .sh 파일 안에 쉘 커맨드를 추가한 것(bash name.sh로 실행 가능)
쉘 커맨드가 베이스이므로 먼저 익숙해진 다음에 사용 권장
sh : 최초의 셀
bash : Linux 표준 쉘
zsh : Mac 카탈리나 OS 기본 쉘
터미널에 텍스트 출력
echo "hi"
만약 `(백틱) 안에 쉘 커맨드 입력시 그 결과를 출력
echo "pwd"
vim 편집기로 파일 생성
vim 편집기 - Command Mode
e.g., vi vi-test.sh
i를 눌러서 INSERT 모드로 변경 후 echo "hi" 작성
ESC 눌른 뒤 나오는 커맨드 입력
1)wq: 저장후나가기 2)wq! : 1번강제 3) q: 저장안하고나가기
Command mode : 기본 mode이며, 방향키를 통해 커서 이동 및 복사/삭제/붙여넣기 등 가능
Last Line Mode : ESC 누른 후 콜론(:) 누르면 나오는 mode로, 저장/종료/저장후종료 등을 할 수 있고 그 외에도 '/문자'로 문자를 탐색하거나 set nu로 vi 라인 번호를 출력 가능
bash로 쉘 스크립트 실행
bash vi-test.sh
앞에서 작성한 “hi”가 출력
터미널에서 Tab을 누르면 자동완성(지원하지 않는 쉘도 존재)
관리자 혹은 다른 사용자의 권한으로 실행
사용에 주의 필요
파일 또는 폴더 복사
-r : recursive하게 그 안의 파일 역시 모두 복사
-f : 강제 실행
파일 또는 폴더 이동
이름 바꾸기도 가능
mv vi-test.sh vi-test3.sh
특정 파일이나 여러 파일을 합쳐서 출력
저장하고 싶을 경우 > 사용 : cat vi-test2.sh vi-test3.sh > new_test.sh
파일에 추가하고 싶은 경우 >> 사용 : cat vi-test2.sh vi-test3.sh >> new_test.sh
최근 입력한 쉘 커맨드 history 출력
히스토리 결과창에서 !30 : 해당 줄의 커맨드 실행
파일 및 디렉터리 검색
find . -name "File" : 현재 폴더에서 File이란 이름을 가지는 파일 및 디렉토리 검색
환경 변수 설정
echo $"변수명"으로 불러올 수 있음
매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc에 저장하면 됨
(Linux) vi ~/.bashrc 또는 vi ~/.zshrc (자신이 사용하는 쉘에 따라 다름)
별칭 설정
alias ll2=’ls -l’
파일 다운로드
-O : 다른 이름으로 저장
-c : 이어받기
-b : 백그라운드에서 다운
-i : 여러 파일 다운
-p: html 페이지를 알맞게 표시하기위해 필요한 모든 파일을 다운로드
파일의 앞/뒤 n행 출력
head -n 3 vi-test.sh
행 단위 정렬
-r : 내림차순
-n : Numeric Sort
ESC :wq로 저장
중복된 행이 연속으로 있는 경우 중복 제거
sort와 함께 사용
-c : 중복 행의 개수 출력
파일에 주어진 패턴 목록과 매칭되는 라인 검색
grep 옵션 패턴 파일명
i : Insensitively하게, 대소문자 구분 없이 찾기
w : 정확히 그 단어만 찾기
v: 특정 패턴 제외한 결과 출력
E : 정규 표현식 사용
정규 표현식 패턴
^단어 : 단어로 시작하는 것 찾기
단어$ : 단어로 끝나는 것 찾기
. : 하나의 문자 매칭
파일에서 특정 필드 추출
-f : 잘라낼 필드 지정
-d : 필드를 구분하는 구분자. Default는 \t
vi cut_file
프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달
표준 stream이네는 stdin(0, 입력)/stdout(1, 출력)/stderr(2, 디버깅 정보나 에러)가 있음
> : 덮어쓰기(Overwrite) 파일이 없으면 생성하고 저장
>> : 맨 아래에 추가하기(Append)
echo “hi” > vi-test3.sh
echo “hello” >> vi-test3.sh
Pipe : 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
A의 Output을 B의 Input으로 사용(다양한 커맨드를 조합)
현재 폴더에 있는 파일명 중 vi가 들어간 단어를 찾고 싶은 경우 : ls | grep “vi”
최근 입력한 커맨드 중 echo가 들어간 명령어를 찾고 싶은 경우
history | grep “echo”
현재 실행되고 있는 프로세스 출력하기 : Process Status
-e : 모든 프로세스
-f : Full Format으로 자세히 보여줌
Command Line 기반의 Data Transfer 커맨드 : Client URL Request를 테스트할 수 있는 명령어
웹 서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음
curl -X localhost:5000/ {data}
curl 외에 httpie 등도 있음(더 가독성있게 출력)
현재 사용 중인 디스크 용량 확인 : Disk Free
-h : 사람이 읽기 쉬운 형태로 출력
SSH을 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어 : Secure Copy(Remote
file copy program)
-r : 재귀적으로 복사
-P : ssh 포트 지정
-i : SSH 설정을 활용해 실행
local => remote
scp local_path user@ip:remote_directory
remote => local
scp user@ip:remote_directory local_path
remote => remote
scp user@ip:remote_directory user2@ip2:target_remote_directory
터미널 종료 후에도 계속 작업이 유지하도록 실행(백그라운드 실행)
nohup python3 app.py &
nohup으로 실행될 파일은 Permission이 755여야 함
종료는 ps ef | grep app.py 한 후, pid(Process ID) 찾은 후 kill -9 pid 로 프로세스를 Kill
로그는 nohup.out에 저장됨
nohup 외에도 screen이란 도구도 있음
c
파일의 권한을 변경하는 경우 사용 : Change Mode
유닉스에서 파일이나 디렉토리의 시스템 모드를 변경함
Permission
r = Read(읽기), 4
w = Write(쓰기), 2
x = eXecute(실행하기), 1
- = Denied
r-x : 읽거나 실행할 수는 있지만 수정은 불가능
예를 들어, chmod 755 vi-test2.sh 를 실행하면 파일의 Permission이 변경됨

소프트웨어 가상화란 서버 환경까지도 모두 한번에 소프트웨어화 하는 것
Research / Production 환경에서 공통적으로 사용하는 일종의 템플릿
기존의 무거웠던 VM 방식이 아닌 Container 기술을 쉽게 사용할 수 있도록 나온 도구
Docker Image : 컨테이너를 실행할 때 사용할 수 있는 “템플릿”, Read Only
Docker Container : Docker Image를 활용해 실행된 인스턴스, Write 가능
원격 저장소인 Container Registry에 이미지를 업로드하거나 이미지를 다운로드 받아서 실행할 수 있음
동작 확인
이미지 다운
다운받은 이미지 확인
다운받은 이미지 기반으로 Docker Container 만들고 실행
컨테이너 이름, 환경변수 설정, 데몬모드, 포트지정을 옵션으로 줄 수 있음




-v: Volume Mount, host(내 컴퓨터)와 container의 저장소를 공유하며 -v Host_Folder:Container_Folder처럼 사용
실행한 컨테이너 확인
-a로 작동 멈춘 컨테이너도 확인
컨테이너 실행 확인
컨테이너 내부에 들어가 프로세스 실행
멈춘 컨테이너를 삭제
-f로 실행중인 컨테이너도 삭제 가능
폴더 생성 및 가상 환경 세팅과 FastAPI 패키지 설치
pip freeze
설치한 라이브러리 모두 보여줌
pip list --not-required --format=freeze
의존성에 따라 자동으로 설치된 라이브러리는 보이지 않음
pip로 설치한 라이브러리를 모두 requirements.txt에 저장
pip freeze > requirements.txt
Dockerfile이라는 파일을 만들어 작성
여기에는 FROM, COPY, WORKDIR, ENV, RUN, CMD 등이 담김






docker build “Dockerfile이 위치한 경로”
e.g., docker build . -t my-fastapi-app
-t “이미지 이름:태그” 옵션으로 이미지 이름과 태그 지정할 수 있고, 태그는 미 지정시 “latest”로 채워짐
. 는 현재 폴더에 Dockerfile이 있음을 의미(Dockerfile이 관레적으로 사용되므로 따르자)
EXPOSE : 컨테이너 외부에 노출할 포트 지정
ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드
머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스
여러 사람이 하나의 MLflow 서버 위에서 각자 자기 실험을 만들고 공유 가능
각 실행에 사용한 소스 코드, 하이퍼 파라미터, Metric, 부산물 등을 저장
저장소의 모델을 REST API 형태의 서버로 서빙 가능
Docker Image 만들지 않아도 생성 가능
MLflow로 실행한 머신러닝 모델을 Model Registry에 등록 가능
모델을 저장할 때마다 자동 버저닝
git, docker처럼 등록된 모델을 다른 사람들과 쉽게 공유 가능
머신러닝 코드 실행, 로깅을 위한 API, UI
팀의 다른 사용자 등 여러 실행을 비교하기 위한 기록 가능
experiment(실험) : 머신러닝 프로젝트 단위(개/고양이 이미지 분류 실험)
run : 한 번의 학습으로, model과 param, metric 등이 기록됨 (하나의 experiment에 여러 개의 run)
experiment 생성하면 mlruns라는 폴더 생김
experiment 리스트도 확인 가능
localhost:5000으로 MLFlow UI로 접속해 다양한 정보 확인 가능
머신러닝 프로젝트 코드를 패키징하기 위한 표준
소스코드 저장 폴더
의존성 및 어떻게 실행해야 하는지 등 저장
MLflow를 사용한 코드의 프로젝트 메타 정보 저장
run 시 자동으로 metric이나 param 정보 기록
pytorch.NN.Module을 지원하지 않는 등 사용 전 확인 필요
(https://mlflow.org/docs/latest/tracking.html#id2)

팀 내 모든 사람이 하나의 통합된 Tracking server에 실험 기록하고 배포할 때는 Docker Image나 Kubernetes 등으로 진행
Artifact Storage(GCS, S3)와 DB(CloudSQL, Aurora RDS) 역시 하나로 운영하며 Tracking server에 의해 관리됨
mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root $(pwd)/artifacts