240911 TIL #490 AI Tech #28 AI 엔지니어링 / 리눅스 / 쉘 커맨드

김춘복·2024년 9월 11일
0

TIL : Today I Learned

목록 보기
491/571

Today I Learned

오늘은 AI 기초 내용, SW엔지니어링과 AI 엔지니어링, 그리고 쉘에 대해 배웠다.


오답노트

anaconda

  • conda에서 원하는 python버전으로 가상환경이 생성안되면 아래의 코드를 사용한다.
conda create -n 환경이름 python=3.12 -c conda-forge
  • conda 코드
conda env list # 현재 존재하는 가상환경 출력
conda install 패키지명=버전 # 라이브러리 설치
conda install -c conda-forge 패키지명=버전 # conda에서 안되면 이걸로
conda activate 환경이름 # 가상환경 활성화
conda create -n 환경이름 python=3.12 -c conda-forge # 원하는 파이썬 버전으로 새 환경 생성 conda로만 안되면 conda-forge사용
conda env remove -n 환경이름 # 가상환경 삭제
conda list # 현재 환경에서 설치된 패키지 확인
conda update 패키지명 # 패키지 최신 업데이트. 패키지명 대신 --all을쓰면 다 업데이트
conda update conda # conda 업데이트

강의 복습

SW 엔지니어링

고품질의 소프트웨어를 체계적이고 효율적으로 개발하고 유지보수하기 위한 공학적 접근 방식

  • SW 개발 lifecycle
    계획 - 요구조건 분석 - 설계 - 구현 - 테스트 - 유지보수 반복

  • 좋은 소프트웨어 설계?
    모듈성 : sw를 독립적인 기능 단위로 나누는 것. 재사용성과 유지보수 용이
    응집도 : 모듈 내 구성요소가 얼마나 기능적으로 밀접하게 관련되어있나. 객체 지향적 사고방식. 높을수록 가독성과 신뢰성이 좋다.
    결합도 : 모듈 간 상호의존성. 낮을수록 복잡성 감소하고 유연성이 증가해 좋다.

  • 테스트과정과 문서화도 중요!

AI 엔지니어링

SW 서비스에서 AI 모델이 동작할 수 있도록 개발하는 것
SW 엔지니어링의 일부분이다.

  • AI는 전체 SW에서 일부분에 불과하다.

  • 데이터, 모델(ML, DL등), 코드(API개발), 인프라(서버,GPU)

  • 이미지, 텍스트 분류, 번역, 추천시스템, 이미지 생성, LLM 등.


Linux

  • 무료 오픈소스 OS라서 서버에서 주로 사용

  • 버전이 많아서 원하는 버전에 맞게 custom해서 사용가능
    Ubuntu, debian, redhat, centOS 등의 버전이 있다.

유저가 문자를 입력해 컴퓨터에 명령할 수 있는 프로그램

  • 터미널(콘솔) : 쉘을 실행하기 위해서 문자를 입력받아 컴퓨터에 전달하고 결과를 출력

  • 서버, docker, crontab 등을 사용할때 쉘을 많이 사용한다.

  • jupyter notebook에선 !를 붙이면 쉘 커맨드 사용 가능


기본 쉘 커맨드

  • mkdir 폴더명 : Make Directory. 폴더 생성

  • ls : List Segment. 뒤에 아무것도 안붙이면 현재 폴더 기준으로 파일 출력
    ls -a : 전체 파일 출력
    ls -l : 퍼미션, 소유자, 만든날짜, 용량까지 출력
    ls -h : 용량을 사람이 읽기 쉽게 gb,mb 단위로 출력
    ls *.txt : 특정 패턴의 파일 출력

  • pwd : print working directory. 현재 폴더 경로를 절대경로로 보여줌

  • cd 폴더명: change directory. 폴더 이동
    cd만 쓰면 홈 디렉토리로 가고, cd ..을 쓰면 상위 디렉토리, cd -는 이전 디렉토리로 간다.

  • echo : 터미널에 텍스트 출력. `쉘커맨드` 처럼 백틱으로 감싸면 커맨드의 결과값 출력

  • cp 1 2: copy. 파일 or 폴더 복사. 1을 2에 복사. -f를 쓰면 강제로 적용

  • bash 파일명.sh: .sh 파일(쉘스크립트 파일) 실행

  • sudo 명령어 : 관리자 권한으로 실행하고싶을 때 커맨드 앞에 붙임

  • mv : 파일, 폴더 이동하기

  • clear : 터미널 창 깨끗하게

  • history : 최근에 입력한 쉘 커맨드 history 출력. !숫자 입력하면 그 열의 커맨드 재활용

  • vi 편집기 모드
    i: 삽입모드
    esc : 명령모드
    :wq : 저장후 종료 :q만쓰면 그냥 종료

  • export: 환경변수 설정. 띄어쓰기하면안됨. 터미널 꺼지면 사라짐
    export password="asdf1234" 한 뒤 echo $password 하면 asdf1234출력.

  • alias : 별칭 목록. alias ll2='ls -l' 하고 설정하면 ll2만 쳐도 뒤에꺼 실행

mkdir teset123 
ls
pwd
cd datafolder
cd ..
cp source_file destination_file 
clear
  • tree -L 숫자 : 디렉토리를 트리구조로 숫자레벨까지 보여준다.
    (sudo) apt-get install tree 를 하면 설치된다.

  • head -n 숫자 파일명 : 파일 앞의 숫자줄만큼 볼 수 있다. tail을 쓰면 뒤에서부터


cat

파일 내용을 출력하거나 연결(concat)해 출력 할 때 사용한다.

  • cat 파일명 : 파일 내용을 터미널에 출력
  • cat 파일1 파일2 : 여러 파일 내용을 한번에 연결해서 출력
  • cat 파일1 파일2 > 새파일명 : 파일 12를 합쳐 새 파일에 저장
  • cat 파일1 >> 기존파일 : 기존 파일 끝에 파일1 내용을 추가
  • cat > 새파일명 : 엔터 치고 텍스트 입력 후 ctrl+D를 입력하면 새파일에 텍스트 작성
  • cat 파일명 | sort : 파일 내용을 정렬함. 기본은 오름차순 뒤에 -r을 붙이면 내림차순
  • cat 파일명 | uniq : 중복 제거. sort | uniq로 같이 쓴다.

텍스트 처리

  • grep 옵션 패턴 파일명 : 패턴과 매칭되는 라인 검색
    옵션에서 -i는 대소문자구분없이, -w는 정확히 그 단어, -E는 정규식

  • cut : 파일에서 특정 필드를 추출. -d는 구분자, -f는 자를 필드 지정
    cut -d , -f 2,5

  • awk '패턴 { 액션 }' 파일 : 파일의 패턴에 맞는 행에대해 action을 수행하는 코드

awk '$3 > 100 { print $1, $3 }' filename
# 3번째 열의 값이 100보다 큰 행에 대해 첫번째와 세번째 열을 출력
awk -F ":" '{ print $1, $3 }' /etc/passwd
# 구분자 : 로 나눠진 파일에서 첫번째와 세번째 열을 출력

표준 스트림

유닉스에서 사용되는 프로세스와 OS간의 입출력 통로

  1. 표준 입력 stdin
    0으로 표현되는 입력. 키보드를 통해 유저가 입력한다. 파이프 | 나 파일 리다이렉션 < 을 통해 입력 데이터를 받을 수도 있다.

  2. 표준 출력 stdout
    1로 표현되는 출력. 터미널에 출력되는 값. 리다이렉션 >을 통해 파일로 출력 가능

echo "Hello, world!" > output.txt  # output.txt 파일로 표준 출력을 리다이렉트
  1. 표준 에러 stderr
    2로 표현되는 출력. 디버깅정보나 에러가 출력된다. 표준출력과는 별도로 처리된다. 리다이렉션 2>를 통해 파일로 출력 가능
  • 리다이렉션 >, >>
    >만쓰면 덮어쓰기(없으면 생성후저장), >>를 쓰면 맨 아래 추가
python test.py > log_file 2>&1 &
# 표준에러(2)를 표준출력(1)으로 리다이렉트해서 에러도 log_file에 같이 저장되게.
# 마지막 &는 백그라운드에서 실행
  • 파이프 |
    프로그램의 표준 출력을 다른 프로그램의 입력으로 사용할 때
ls | grep "log" # 현재 디렉토리에서 "log"가 포함된 파일 이름을 찾을 때
cat data.txt | sort # data.txt 파일을 정렬할 때

서버에서 자주 쓰는 커맨드

  • ps : Process Status. 현재 실행중인 프로세스(PID) 출력

  • curl : Client URL. 웹서버 구현 시 Request(요청)를 테스트하는 명령어

  • df -h : Disk Free. 현재 사용중인 디스크 용량 확인

  • ssh 옵션 user@hostname : 암호화 원격 서버 접속 프로토콜.
    user는 사용자명, hostname은 서버의 ip주소나 도메인 이름
    옵션 -p는 포트 지정, -i는 ssh키파일 사용, -L은 터널링(포트포워딩), -q는 배너메세지 무시

ssh john@192.168.1.100 # john으로 해당 ip서버에 접속
ssh -p 2222 john@192.168.1.100 # 기본적으로 22번포트 사용하지만 -p로 다른 포트 지정 가능
ssh -i ~/.ssh/id_rsa john@192.168.1.100 # 키파일 경로를 지정해 그 키파일로 접속
ssh john@192.168.1.100 'ls -l /home/john' # 접속하지않고 특정 명령만 실행 후 종료
ssh -o ServerAliveInterval=60 user@hostname # SSH 접속 유지. 60초마다 재연결
ssh -L 8080:localhost:80 john@192.168.1.100 # 로컬의 8080포트를 원격의 80번 포트에 연결
  • SSH 설정 파일(~/.ssh/config) 아래와 같이 저장 후 ssh myserver를 하면 쉽게 사용 가능
# ~/.ssh/config 예시
Host myserver
    HostName 192.168.1.100
    User john
    Port 2222
    IdentityFile ~/.ssh/id_rsa
  • scp 옵션 원본경로 대상경로 : ssh 기반으로 원격<->로컬간 파일 전송 명령어
    원격에서 원격으로 전송도 가능하다.
scp myfile.txt john@192.168.1.100:/home/john/ #로컬의 myfile을 원격서버로 복사
scp -r /my/local/folder john@192.168.1.100:/home/john/ #로컬 폴더를 원격 서버로 복사
scp john@192.168.1.100:/home/john/myfile.txt /local/directory/
# 원격의 파일을 로컬 경로로 복사
  • nohup python3 app.py & : 백그라운드에서 터미널 종료 후에도 계속 작업 실행
    permission이 755여야 nohup으로 실행 가능. 로그는 nohup.out에 저장된다.
    ps ef | grep app.py 후 pid 찾아서 kill -9 pid값으로 nohup 종료.

  • chmod 옵션 모드 대상파일 : change mode. 파일이나 디렉토리의 권한 변경
    읽기(r)는 4, 쓰기(w)는 2, 실행(x)는 1. 다 되면 7, 읽쓰면 6, 읽실은 5 등..
    숫자는 사용자 / 그룹 / 기타사용자 순이다.
    옵션 -R은 재귀적으로 하위 폴더나 파일에도 적용, -v는 권한 변경된 항목 출력

chmod 755 file.txt  # 사용자: 읽기, 쓰기, 실행 / 그룹: 읽기, 실행 / 다른 사용자: 읽기, 실행
chmod 644 file.txt  # 사용자: 읽기, 쓰기 / 그룹: 읽기 / 다른 사용자: 읽기
chmod 700 script.sh # 사용자: 읽기, 쓰기, 실행 / 그룹: 권한 없음 / 다른 사용자: 권한 없음

쉘 스크립트

쉘 커맨드를 모아 파일로 저장한 스크립트. 여러 명령어를 자동화하기 위해 작성된다.

  • .sh파일을 생성해 그 안에 쉘 커맨드를 추가한다. if while case문 사용가능
    bash 파일명.sh로 실행 가능하다.

  • 첫줄 Shebang은 어떤 쉘에서 실행될 지 지정한다.
    #!/bin/bash은 Bash쉘에서 실행하도록, #!/bin/sh는 기본 쉘에서 실행하도록 한다.

  • $1, $2 를 사용해 첫번째, 두번째 변수를 사용할 수 있고, $@를 쓰면 모든 변수에 접근한다.


피어세션

  • 오늘 피어세션은 프로젝트 구조에 대해서 토론했다.

회고

  • 우선 추석 전에 마무리하기위해 아침 일찍부터 늦은시간까지 강의를 수강중이다. 소화가 다 되는지는 모르겠지만 추석에도 복습하고 프로젝트를 위해 부지런히 움직여야할 것 같다.
profile
Backend Dev / Data Engineer

0개의 댓글