Backend 30

CLI 명령어가 잘못된 실행 파일을 참조하는 문제

실행 환경 OS: MacOS Python: 3.10.13 버전 pyenv: 2.3.35 버전 문제 상황 pyenv 가상환경에서 streamlit 명령어를 실행하는 상황에서 아래와 같은 에러가 발생했다. ... TypeError: Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0. If you cannot immediately regenerate your protos, some other possible workarounds are: 1. Downgrade the p..

pyenv는 어떤 방식으로 파이썬 버전을 관리할까

python 또는 pip 명령어가 실행 파일을 찾는 방법 python 또는 pip 명령어를 실행할 때, 운영 체제가 해당 명령의 실행 파일을 찾기 위해 환경변수 PATH의 값을 참조한다. /usr/local/bin:/usr/bin:/bin 환경변수 PATH는 콜론(:)으로 각 디렉토리 경로를 구분한다. 실행 파일을 찾기 위해 가장 왼쪽에 존재하는 디렉토리 경로부터 명령어에 대응하는 실행파일이 있는지 확인한다. 이 경우에는 /usr/local/bin 디렉토리에서 실행 파일을 찾고, /usr/bin, /bin 디렉토리 순서로 해당하는 실행 파일을 발견할 때까지 탐색한다. shim을 통한 명령어 가로채기 pyenv는 환경변수 PATH에 shims 디렉토리를 가장 왼쪽에 추가한다. $(pyenv root)/sh..

Backend/Python 2023.12.28

pyenv와 pyenv-virtualenv로 파이썬 버전 관리하기

프로젝트 별로 파이썬 버전을 다르게 사용해야 할 때, pyenv를 사용하여 파이썬 버전들을 쉽게 관리할 수 있다. pyenv-virtualenv는 pyenv 플러그인으로, 파이썬 가상환경을 관리해 준다. Mac OS와 Z Shell 기준으로 pyenv를 설치하고, 사용하는 방법에 대해 알아보자. pyenv 설치 $ brew install pyenv pyenv 설치 후 쉘 설정 파일(~/.zshrc) 수정해야 한다!! export PATH="$HOME/.pyenv/bin:$PATH" # pyenv가 설치되어 있다면, 현재 쉘에 대한 pyenv 초기화 스크립트를 실행 if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" fi # pyenv-vi..

Backend/Python 2023.12.27

Spring MVC의 Front Controller 패턴과 Adapter 패턴

이번 포스팅에서는 Spring MVC에서 사용되는 디자인 패턴 중 Front Controller 패턴과 Adapter 패턴에 대해 알아보자. Front Controller 패턴 front controller는 모든 요청에 대해 공통으로 처리해야 하는 로직을 수행한 뒤, 요청에 따라 다르게 처리해야 하는 내용은 요청에 맞는 controller에게 처리를 위임한다. Spring MVC의 DispatcherServlet이 front controller의 역할을 한다. HttpServlet 클래스를 상속받은 DispatcherServlet은 모든 url 경로(”/”)에 대해 매핑된 서블릿으로 동작한다. 따라서 모든 url 경로에서 들어오는 요청을 DispatcherServlet이 가장 먼저 처리한 뒤, 요청에 ..

Backend/Spring Boot 2023.12.18

코드 분석을 통해 알아보는 스프링 MVC 동작 과정

이번 포스팅에서는 클라이언트의 HTTP 요청을 받아 컨트롤러가 요청을 처리하고, 그 결과로 HTML 응답이 반환되어 화면이 그려지는 사이에 스프링 MVC 프레임워크가 어떻게 동작하는지 코드를 분석하며 중요한 로직 위주로 알아볼 것이다. 모든 코드를 line by line으로 설명하면 글이 너무 길어지고 산만해지기 때문에 주요 흐름을 제외한 코드들을 상당 부분 생략했다. 1. 클라이언트로부터 HTTP 요청을 받아 DispatcherServlet 클래스의 doService() 메소드가 호출된 후, doService() 메소드 내부에서 doDispatch() 메소드가 호출된다. DispatcherServlet 클래스 https://github.com/spring-projects/spring-framework/..

Backend/Spring Boot 2023.10.13

[Airflow] RuntimeError: Cannot re-initialize CUDA in forked subprocess 에러 해결

실행 환경 OS: MacOS apache-airflow: 2.2.3 버전 문제 상황 Airflow로 개발중인 기능은 다음과 같았다. HuggingFace에 업로드 된 크롤링 데이터를 서버로 가져와 학습시킬 수 있는 형태로 전처리한다. 전처리된 데이터를 Lora 활용하여 kullm(구름)의 fine-tuning을 진행한다. 2번 기능을 테스트하던 중 아래와 같은 에러가 발생했다. RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method airflow 없이 독립적으로 실행할 때는 정상적으로 동작하던 코드였는데, Airflow로 ..

[문제 해결] GitHub Actions가 작동하지 않는 문제 해결

문제 상황 default branch(main branch)가 아닌, 다른 branch에서 GitHub Actions를 실행시키는 과정에서 발생한 문제이다. develop 브랜치에 push하거나, pull request를 할 경우 GitHub Actions가 작동하도록 아래와 같이 workflow 파일을 작성했다. name: CI for backend on: push: paths: "backend/**" branches: [ "develop" ] pull_request: paths: "backend/**" branches: [ "develop" ] ... 그러나, develop 브랜치로 pull request를 해도 GitHub Actions가 동작하지 않았다. 문제 해결 문제의 원인을 한 줄로 요약하자..

Autossh로 SSH 연결 유지하기

이전 글에서 ssh 포트 포워딩을 통해 웹 서버와 모델 추론 서버간의 연결을 구축한 내용을 작성했었다. SSH 포트 포워딩으로 컨테이너에서 실행되는 서버를 외부와 연결하기 현재 진행중인 법률 상담 챗봇 프로젝트에서 서버를 구성하는데 가장 큰 문제는 제공받은 V100 서버가 컨테이너에서 실행된다는 점이었다. ssh 연결을 담당하는 22번 포트만 외부에 열려있었기 있 sangwonyoon.tistory.com 그런데 만약 이 상황에서 V100 서버와 router가 위치한 서버간의 ssh 연결이 끊어진다면, 아무런 알림도 받지 못한 채 서비스가 먹통이 될 것이다. 따라서 ssh 연결이 끊어지면 자동으로 다시 연결하는 기능이 필요했고, 여러 방법을 시도한 결과 Autossh를 사용하여 문제를 해결할 수 있었다...

Backend/기타 2023.07.17

SSH 포트 포워딩으로 컨테이너에서 실행되는 서버를 외부와 연결하기

현재 진행중인 법률 상담 챗봇 프로젝트에서 서버를 구성하는데 가장 큰 문제는 제공받은 V100 서버가 컨테이너에서 실행된다는 점이었다. ssh 연결을 담당하는 22번 포트만 외부에 열려있었기 있었기 때문에 FastAPI에서 8000번 포트를 열어 외부의 API 요청을 받는 것은 불가능해 보였다. 하지만, 23GB 크기의 LLM을 소화할 수 있는 VRAM을 가진 인스턴스를 클라우드에서 빌리기에는 금전적으로 너무 부담이었기 때문에 V100 서버를 반드시 활용해야만 했다. 그러던 중, ssh 포트 포워딩에 대해 알게 되었고, 이를 활용해 문제를 해결했다. ssh 포트 포워딩이란? SSH 포트 포워딩 서버에서 FastAPI로 구현한 모델 추론 API를 테스트하다가 신기한 현상을 겪었다. 원격 서버와 로컬은 VS..

Backend/기타 2023.07.16

SSH 포트 포워딩

서버에서 FastAPI로 구현한 모델 추론 API를 테스트하다가 신기한 현상을 겪었다. 원격 서버와 로컬은 VSCode의 Remote - SSH라는 익스텐션을 활용해 ssh 연결을 한 상태였다. 이 상태에서 평범하게 uvicorn을 통해 8000번 포트를 열어 API 서버를 실행시켰다. 그런데 로컬 환경의 8000번 포트에 접근을 하면 원격 서버의 8000번 포트로 접근이 되는 것이었다! 분명 원격 서버에서 API 서버를 실행시켰는데 로컬의 8000번 포트에서 이 API 서버에 접근할 수 있는 이 상황이 이해가 되지 않아 주변 지인들에게 도움을 구한 끝에 원인을 찾을 수 있었다. 바로 VSCode의 Remote - SSH 익스텐션이 ssh 포트 포워딩(ssh 터널링이라고도 불린다.)을 지원해주기 때문이었..

Backend/기타 2023.07.11