Pre-commit 패키지?

pre-commit은 Git 저장소에서 커밋을 수행하기 전에 코드 품질을 보장하고 코드 스타일을 일관되게 유지할 수 있도록 도와주는 도구입니다. 이 패키지는 Git의 훅(hook) 시스템을 활용하여 커밋 전 다양한 자동화 작업을 실행할 수 있게 해줍니다. 이를 통해 코드의 품질을 유지하고, 협업 시 코드 스타일의 일관성을 보장할 수 있습니다.

주요 기능은 아래와 같습니다.

  1. 자동화된 코드 검사 및 포매팅: 코스 스타일을 검사하는 테스트입니다. 협업시 꽤 유용합니다.
  2. 다양한 훅(hook): hook은 스크립트나 명령어를 의미합니다. 여러가지 검사방법을 적용해볼 수 있습니다.
  3. 확장성: `pre-commit-config.yaml`을 변경하여 훅을 추가/제거 할 수 있습니다.

 

Pre-commit 패키지 설치방법

1. `pip`을 이용한 설치

$ pip install pre-commit
$ pre-commit --version # pre-commit 이 올바르게 설치되어있나 버전확인

2. configuration 세팅

  • `.pre-commit-config.yaml`이라는 파일을 만듭니다.
$ touch .pre-commit-config.yaml
$ pre-commit sample-config
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files

위 내용을 `.pre-commit-config.yaml`에 작성하고 저장하면 됩니다.

 

3. git hook script설치

pre-commit은 git의 hook시스템을 사용하하기 때문에 설치가 `.git/hooks`이하에 저장됩니다.

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

 

4. 실행: 아래와 같이 whitespace가 있는지 등을 알아서 검사해주고 ,문제가 있는 경우 exit code 1을 반환합니다.

$ pre-commit run --all-files
[INFO] Initializing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Installing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
Trim Trailing Whitespace.................................................Failed
- hook id: trailing-whitespace
- exit code: 1
- files were modified by this hook

Fixing notebooks/publications/figure1.sh
Fixing README.md
Fixing tiling_version17.py

Fix End of Files.........................................................Failed
- hook id: end-of-file-fixer
- exit code: 1
- files were modified by this hook

Fixing .gitignore
Fixing notebooks/publications/figure1.sh

Check Yaml...........................................(no files to check)Skipped
Check for added large files..............................................Passed

 

 

Pre-commit 패키지 언제 사용해야하나?

 

  1. Python 코드 포맷팅이 사람마다 다를 때: black 같은 코드 포맷터를 사용해 커밋 전에 코드를 자동으로 포맷팅.
  2. 정적 코드 분석: flake8을 사용해 코드 내 잠재적인 오류나 스타일 위반 사항을 검사.
  3. 보안 검사: bandit 같은 도구를 사용해 보안 관련 잠재적 취약점을 사전에 검사.

 

 

 

반응형

'Data science > MLOps' 카테고리의 다른 글

[MLOps] 디자인 패턴  (0) 2024.08.26
nvidia-driver, cuda toolkit update  (0) 2024.05.03
API token bucket: API 요청수 관리  (0) 2024.04.08
pip install -e 옵션에 대해  (0) 2024.04.02
[mlflow] child run id 조회하기  (0) 2023.09.25

 

cuda toolkit 12.1 지원

pytorch 2버전이상부터는 cuda toolkit 12.1으로 사용하는게 pip 이나 설치가 편하기에, toolkit 12.1을 설치하려고함.

sudo ubuntu-drivers autoinstall

 

cuda toolkit 12.1 install

ubuntu 공식 도큐먼트(URL)을 따라서 설치하려고함. 

 

Trouble shooting 1: package has invalid Support PBheader, cannot determine support level

ubuntu 그레픽드라이버 유틸리티인 `ubuntu-drivers list`로 현재 설치가능한 드라이버를 찾다보면 위와 같은 경고를 볼 수 있는 습니다. 아래와 같이 해결했습니다 [URL]. 

$ sudo apt update
$ sudo apt upgrade

 

Trouble shooting 2: but it is not going to be installed

 

sudo apt remove nvidia*
sudo apt autoremove
반응형

'Data science > MLOps' 카테고리의 다른 글

[MLOps] 디자인 패턴  (0) 2024.08.26
Pre-commit 패키지 사용  (0) 2024.08.09
API token bucket: API 요청수 관리  (0) 2024.04.08
pip install -e 옵션에 대해  (0) 2024.04.02
[mlflow] child run id 조회하기  (0) 2023.09.25

API 요청을 관리하는 데에는 여러 이유가 있습니다. 그 중에서도 토큰 버킷을 사용하는 이유는 다음과 같습니다:

  1. 트래픽 제어: 토큰 버킷을 사용하면 API로 들어오는 트래픽을 제어할 수 있습니다. 이를 통해 서버에 과도한 부하가 걸리는 것을 방지하고, 서비스의 안정성을 유지할 수 있습니다.
  2. 사용량 제한: 토큰 버킷을 이용하면 API를 사용하는 클라이언트의 요청 수를 제한할 수 있습니다. 이는 과도한 사용량으로 인한 서버 과부하를 방지하고, 공정한 서비스 이용을 보장합니다.

 

TokenBucket 만들기

토큰 버킷 패턴은 고정된 속도로 토큰을 생성하고, 요청이 들어올 때마다 토큰을 소비하여 일정량의 토큰을 가지고 있는지 확인하여 처리하는 방식입니다. 알고리즘은 아래와 같습니다.

  1. TokenBucket은 버켓(바구니)가 있다고 가정합니다.
  2. 요청이 들어오면, 버켓에서 1개를 소비해서 그 다음의 로직을 진행시킵니다. 요청이 들어왔을 때 버킷에 토큰이 없으면 drop합니다.
  3. 고정된 속도(r)로 버킷에 토큰채웁니다. 

https://www.researchgate.net/figure/Diagram-representing-token-bucket-algorithm_fig1_351452059

 

TokenBucket 을 middle ware 에 추가

- FastAPI의 starlette을 베이스로 작성되어있어서, 이 미들웨어를 서브클레싱해서 손쉽게 token bucket을 사용할 수 있습니다.

- starlette.middleware.base.BaseHTTPMiddleware을 초기화시 app을 받게되어있고 이 베이스클레스는 dispatch라는 함수를 구현하게어 있습니다.

class BaseHTTPMiddleware:
    ...
    
    async def dispatch(
        self, request: Request, call_next: RequestResponseEndpoint
    ) -> Response:
        raise NotImplementedError()  # pragma: no cover

 

dispatch을 함수를 아래와 같이 구현해서 bucket.consume_token()이라는 함수가 bool으로 false or True을 구현하게 함에따라, 예외를 일으킬것인지 다음 로직을 실행시킬것인지를 결정하게 작성합니다.

 

위의 구현을 위해 아래와 같이 tokenbucket을 정의합니다.

초기화시, 버킷의 토큰 최대 저장량(max_len)과 토큰을 채우는 시간(r, refill_rate)을 지정하여 아래와 같이 작성합니다.

 

실행

- 다음과 같이 python3으로 fastAPI을 구동시킵니다.

(misc) (base) heon@gpusvr03:~/repositories/misc/tokenbucket_ex$ python3 app.py 
INFO:     Started server process [4121818]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:30000 (Press CTRL+C to quit)

 

그 후 요청 15개를 보내봅니다. 아래와 같이 10개를 토큰을 다 소비한경우 5개의 요청이 예외처리됩니다.

>>> import requests
>>> requests.get("http://0.0.0.0:30000/")
<Response [200]>
>>> for _ in range(15):
...     requests.get("http://0.0.0.0:30000/")
... 
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [500]> # 토큰 10개 소비되어 예외처리
<Response [500]>
<Response [500]>
<Response [500]>
<Response [500]>

 

반응형

"-e" 옵션은 설치한 경우 파이썬 패키지를 담는 "site-packages" 디렉토리에 설치되는 것은 동일하나, 심볼릭 링크로 설치가되어 원본소스코드가 변경된 후, 별도의 pip install 명령어 없이, import시 바로 변경사항이 반영되는 옵션

 

pip install -e 옵션

종종 github에서 `pip install -e .`로 "-e"옵션을 함께 전달하여 파이썬 패키지를 설치하라는 리포지토리가 있습니다

 

예시로 아래와 같은 패키지 디자인의 경로가 있다고 가정합니다. 

(camelyon) @gpusvr03:~/repositories/camelyon$ tree -L 1
.
├── camelyon
├── data
├── LICENSE
├── logs
├── notebooks
├── README.md
├── setup.py
├── tiling_version16.py
├── tiling_version17.py
└── utils.py

이 패키지의 setup.py에는 다음과 같이 설치 명령어가 있습니다. 이 setup.py을 이용하여 "$pip install ."을 해보겠습니다.

아래와 같이 잘 설치됨을 알 수 있습니다. 패키지 설치장소는 가상환경인 "/home/heon/anaconda3/envs/camelyon"에 설치되었습니다. 

 

 

설치한 패키지를 들어가보면, setup.py에서 지정한 p.y파일들이 들어가있습니다.

 

이 패키지를 지우고, pip install -e 옵션으로 설치해보겠습니다. 패키지가 설치된 장소를 들어가보면, *.egg-link만 있습니다.

이 링크의 내용물은 경로만 담겨져 있습니다.

 

*egg.link 파일은 내부에 파일하나나 디렉토리만 담고있습니다. 심볼릭링크를 지원하기위한 파일입니다. 즉, 설치는 했지만 바라보는 소스코드는 원본을 바라보고 있어서, 디렉토리의 변경사항을 바로 추적할 수 있습니다.

https://wiki.python.org/moin/PythonPackagingTerminology

반응형
import mlflow
from setting import parent_run_id

mlflow.set_tracking_uri(TRACKING_URI)

child_run_ids = list()
for run in client.search_runs(experiment_ids=[6]):

    if "mlflow.parentRunId" not in run.data.tags:
        continue

    if run.data.tags["mlflow.parentRunId"] != parent_run_id:
        continue

    child_run_ids.append(run.info.run_id)
반응형

+ Recent posts