Backend 30

[GitHub Actions] Self-Hosted Runner를 활용한 CI 파이프라인 구축

지난 프로젝트에서 CI 파이프라인을 구축한 방법 지난 Open Domain Question Answering 프로젝트를 진행하면서 CI 파이프라인을 구축하기 위해 GitHub에서 제공하는 서버(GitHub-hosted runner)에서 GitHub Actions를 사용했다. 그러나, GitHub-hosted runner는 하드웨어적인 한계나 서버 인프라를 직접 관리할 수 없다는 한계가 있었기 때문에, 새로운 프로젝트에서는 self-hosted runner를 활용하기로 결정했다. GitHub-hosted runner의 한계점 GPU를 활용할 수 없다. GitHub-hosted runner에서 GPU를 활용하기 위해서는 Team 또는 Enterprise plan에 가입해야 하는 것으로 알고 있다. 따라서 사..

Backend/기타 2023.07.05

[Python 에러 분석] 직접 구현한 모듈을 import할 때 ModuleNotFoundError가 발생하는 이유

모델 추론 코드를 테스트하기 위한 코드를 작성하던 도중 만난 ModuleNotFoundError를 해결하면서 이해한 python이 모듈을 import하는 방식에 대한 내용을 공유해보려고 한다. 문제 상황 에러가 발생한 디렉토리 구조는 아래와 같았다. /Users/sangwon/Documents/GitHub/mlops_practice ├── tests │ └── test_inference.py └── webapp ├── dataset │ ├── datasets.py │ ├── preprocess.py │ └── tokenize.py ├── inference.py ... inference.py는 datasets.py를 import하고 있고, inference.py를 단독적으로 실행할 때는 문제 없이 실행되는..

GitHub Actions를 활용한 CI 구축

Open Domain Question Answering 프로젝트를 진행하면서 코드를 수정하여 merge할 때마다 해당 코드에 문제가 없는지 테스트를 진행해야 할 필요성을 느꼈다. train과 inference가 평균적으로 1시간 가까이 걸리기 때문에 코드의 문제가 뒤늦게 발견되는 경우 시간 낭비가 심했다. 따라서 코드가 master branch에 merge될 때마다 테스트가 자동으로 수행될 수 있도록 CI 환경을 구축하기로 결정했다. 요구사항 CI 환경을 구축하면서 내가 정의한 요구사항은 다음과 같다. 1. 사전에 코드의 문제를 파악하기 위해 다양한 가능성을 고려한 테스트를 진행한다. 테스트를 위한 파이썬의 내장 모듈인 unittest가 존재하지만, unittest는 테스트 작성을 위해 반드시 클래스를 ..

Backend/기타 2023.06.17

[pytest] 테스트 코드에서 명령행 인자 전달하는 방법 (feat. argparse)

아래와 같이 argparse 모듈을 통해 명령행 인자를 입력받는 함수 main()이 있다. # main.py import argparse def main(): parser = argparse.ArgumentParser() parser.add_argument("--name", default="sangwon") args = parser.parse_args() return args.name if __name__ == "__main__": print(main()) main.py는 아래과 같이 실행할 수 있다. >> python main.py --name YoonSangWon YoonSangWon 그렇다면 테스트 코드에서 main 함수에 명령행 인자를 전달하기 위해서는 어떻게 해야 할까? monkeypatch f..

Backend/pytest 2023.06.15

[pytest] Fixture

Fixture 테스팅을 하는데 있어서 필요한 조건들을 미리 준비해놓은 리소스 또는 코드 예) 특정 조건으로 구성된 데이터베이스, 데이터 셋 Fixture 생성 예시 @pytest.fixture 데코레이터를 함수에 붙여 fixture로 만들 수 있다. import pytest @pytest.fixture def my_fruits(): return ["apple", "banana", "grape", "orange"] Fixture를 사용하지 않는 경우 def test1(): fruits = ["apple", "banana", "grape", "orange"] assert len(fruits) == 4 def test2(): fruits = ["apple", "banana", "grape", "orange"]..

Backend/pytest 2023.06.10

[pytest] 파이썬 테스팅을 위한 pytest 사용법

pytest 설치 방법 pip install pytest pytest 실행 방법 1. 현재 디렉토리에서 테스트 pytest 현재 디렉토리 내에 존재하는 test_*.py 또는 *_test.py 형식의 파일들을 모두 테스트한다. 2. 특정 파일만 테스트 # pytest pytest test_file.py 3. 특정 경로에서 테스트 # pytest pytest testing/ 이 때, 테스트해야 하는 파일의 이름은 test_*.py 또는 *_test.py 형식이어야 한다. 4. 특정 키워드를 갖는 요소만 테스트 # pytest -k pytest -k 'MyClass and not method' keyword expression에 부합하는 이름을 갖는 파일, 클래스, 함수를 테스트한다. 위 명령어를 입력할 경..

Backend/pytest 2023.06.09

딥러닝 모델 패키징

이번 포스팅에서는 개체 간 관계 추출 프로젝트에서 사용했던 SangwonYoon/klue-roberta-large-tapt 모델을 Docker 컨테이너로 패키징하고, Docker Hub에 이미지를 push하기까지 진행한 작업들을 공유하고자 한다. 가상환경 생성 >> pip install --user virtualenv pip install: 설치된 파이썬 패키지가 /usr/local/lib/pythonX.X 경로에 설치되어 전역적으로 패키지를 설치한다. pip install --user: 사용자 디렉토리에 로컬하게 패키지를 설치한다. >> virtualenv mlops_practice # 가상환경 생성 >> source mlops_pracitce/bin/activate # 가상환경 활성화 >> vim ...

Backend/기타 2023.06.06

[FastAPI 에러 해결] ERR_EMPTY_RESPONSE in Docker Container

실행 환경 OS: MacOS FastAPI: 0.96.0 버전 문제 상황 로컬에서 정상적으로 작동하는 FastAPI 애플리케이션을 Docker 이미지로 빌드한 뒤, 컨테이너로 실행시켰더니 ERR_EMPTY_RESPONSE 메세지를 출력하며 아무런 응답을 보내지 않음 # Dockerfile FROM python:3.10 RUN python3 -m pip install --upgrade pip COPY ./requirements.txt /ws/requirements.txt WORKDIR /ws RUN pip install -r requirements.txt COPY ./webapp/ /ws CMD ["uvicorn", "main:app"] 문제 해결 uvicorn을 실행할 때 --host 옵션이 있는데, 이..

코드 스타일 통일을 위해 Black 적용하기

팀원들과 파이썬 프로젝트를 진행하면서 코드의 스타일과 포맷을 일관성 있게 맞춰야겠다는 필요성을 느끼게 되었다. 파이썬에는 PEP8이라는 파이썬 코드의 공식 스타일 가이드가 존재한다. PEP 8 – Style Guide for Python Code | peps.python.org PEP 8 – Style Guide for Python Code Author: Guido van Rossum , Barry Warsaw , Nick Coghlan Status: Active Type: Process Created: 05-Jul-2001 Post-History: 05-Jul-2001, 01-Aug-2013 Table of Contents This document gives coding conventions for t..

Backend/Python 2023.04.26

[Python] File Handling

파이썬에서 파일을 다루는 방법에 관해서 알아보자. with 자원을 획득하고, 사용한 뒤, 반납할 때 주로 사용한다. with open('myFile.txt', 'r') as my_file: contents = my_file.read() print(contents) with 블록을 나가면서 자동으로 자원을 반납하기 때문에 파일 처리 시 close() 함수를 사용하지 않아도 된다. readlines 함수 파일을 한 줄씩 읽어 list 타입으로 반환한다. with open('myFile.txt', 'r') as my_file: content_list = my_file.readlines() print(type(content_list)) # 출력: list readline 함수 실행할 때마다 한 줄씩 반환한다. ..

Backend/Python 2023.03.08