분류 전체보기 109

TOKENIZERS_PARALLELISM=(true | false) 경고 메세지는 무슨 뜻일까?

huggingface의 transformers 라이브러리를 사용하다보면 이런 경고 메세지를 본 적이 있을 것이다. The current process just got forked. Disabling parallelism to avoid deadlocks... To disable this warning, please explicitly set TOKENIZERS_PARALLELISM=(true | false) 대부분의 경고 메세지가 그렇듯, 프로그램은 문제 없이 실행되지만 어느 부분에서 이 경고 메세지가 뜨고 어떤 문제에 대한 경고인지 궁금해졌다. 아래 내용들은 이 경고 메세지에 관한 자세한 탐구이므로 경고 메세지를 없애기 위한 해결책만을 원한다면 마지막 결론 부분만 읽으면 된다. 경고 메세지가 뜨는 조건..

AI/PyTorch 2023.07.21

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

[PyTorch 에러 해결] CUDA out of memory (feat. 주피터 노트북)

실행 환경 OS: Ubuntu 18.04.5 PyTorch 버전: 2.0.1 CUDA 버전: 11.0 문제 상황 모델 크기가 23GB인 LLM을 GPU 메모리에 로드하던 중, CUDA out of memory 에러가 발생했다. GPU 메모리 크기가 32GB인데다, 주피터 노트북 파일에서 테스트 했을 때 문제 없이 실행되었기 때문에 코드 구현 상에 메모리 누수가 있는지 확인했으나, 별다른 문제를 찾지 못했다. 문제 해결 nvidia-smi 명령어로 GPU의 상태를 확인해 본 결과, 파이썬 스크립트를 동작시키지 않은 상황에서 GPU 메모리가 23GB가 할당되어 있는 것을 확인할 수 있었다. 알고보니 주피터 노트북 파일을 실행시켰을 때 GPU 메모리에 올라갔던 모델을 해제하지 않아서 메모리가 반환되지 않고 있..

AI/Trouble Shooting 2023.07.06

[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를 단독적으로 실행할 때는 문제 없이 실행되는..

Open-Domain Question Answering 프로젝트 회고

프로젝트 개요 Open-Domain Question Answering은 지문이 주어지지 않은 상황에서 사전에 구축된 knowledge resource를 기반으로 질문에 맞는 적절한 문서를 찾아 답변하는 task이다. 일반적으로 질문에 적절한 문서를 찾아주는 retriever와 문서를 읽고 적절한 답변을 찾거나 생성하는 reader의 조합으로 task를 해결한다. input: 질문 문장 output: 질문에 알맞은 답변 문장 평가 지표 Exact Match: 모델의 예측과 실제 답이 정확히 일치하는지 평가 F1 Score: 모델의 예측과 실제 답이 결치는 단어가 존재하면 부분 점수를 주는 방식으로 평가 GitHub 협업 PR / Issue 템플릿 배포 팀 GitHub 협업 규칙에 따라 이번 프로젝트에서는 ..

프로젝트 회고 2023.06.25

Huggingface Trainer compute_metrics 파헤치기

Huggingface trainer로 모델을 학습시킬 때 학습중인 모델의 성능을 평가하기 위해서 반드시 필요한 compute_metrics는 어떤 방식으로 동작하고, 어떻게 구현해야 하는지 알아보자. compute_metrics는 transformers 라이브러리의 Trainer 클래스의 객체를 생성할 때, 매개변수로 입력 받는다. trainer = Trainer( model=model, args=args, train_dataset=train_dataset, eval_dataset=valid_dataset, compute_metrics=compute_metrics ) Huggingface의 trainer에 익숙하지 않다면, 아래 글을 읽는 것을 추천한다. HuggingFace Trainer로 모델 학습 ..

AI/기타 2023.06.21

GitHub Actions를 활용한 CI 구축

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

Backend/기타 2023.06.17