[Python] 비동기 프로그래밍으로 크롤링 속도 개선(asyncio)
·
Python
1. 동기? 비동기? 동기 프로그래밍 : 동기 프로그래밍은 작업들이 순차적으로 실행되며, 하나의 작업이 끝나야 다음 작업이 시작됩니다. 이것은 작업들 간의 의존성이 높고, 순서가 중요한 경우에 주로 사용됩니다. 비동기 프로그래밍 : 비동기 프로그래밍은 작업들이 동시에 진행되며, 하나의 작업이 완료될 때까지 다른 작업을 차단하지 않습니다. 빅데이터에서는 코드에 필요한 데이터를 얻어오는 작업에 병목이 생길 수 있습니다. 이런 I/O bound 위주의 프로그램에서는 I/O 효율을 비동기적으로 개선함으로써 실행속도를 빠르게 할 수 있습니다. 네이버에서 300개 기업의 재무제표를 크롤링하는 경우를 예로 보겠습니다.2. 동기 프로그래밍from pykrx import stock import pandas as pd i..
[Python] 컴파일로 속도 개선하기(Cython)
·
Python
0. Cython? line_profiler 같은 프로파일링 툴로 알고리즘을 최적화하여 CPU에서의 계산량, RAM에서의 병목을 어느 정도 개선했다면 노력 대비 속도 개선이 줄어드는, 즉 한계 효용이 감소하는 시기가 옵니다. 그러면 다음으로 시간을 줄이는 가장 쉬운 방법은 기계어로 컴파일하는 것입니다. 컴파일을 하게 되면 CPU에서 바로 실행 가능한 기계어로 변환되며, 이는 같은 연산을 반복하는 루프나 list, array에 대한 역참조, 수학 계산과 같은 곳에서 시간을 줄여줄 수 있습니다. 대표적으로 파이썬을 C언어로 컴파일 해주는 라이브러리인 사이썬(Cython)이 있습니다. 사이썬은 파이썬 코드를 컴파일된 확장 모듈로 변경해 주고 이 확장 모듈을 import 해서 쓰기만 하면 되기 때문에 비교적 사..
[Python] 프로파일링으로 병목 찾기 (line_profiler)
·
Python
자신이 작성한 코드가 오래 걸린다 싶을 때 어느 부분에서 병목이 생기는지 알 수 있는 방법을 소개하려고 합니다. 0. 코드 다음 코드는 '줄리아 집합'을 생성하는 코드입니다. import numpy as np @profile def julia_set(width, height, c, max_iter): x_min, x_max = -2.0, 2.0 y_min, y_max = -2.0, 2.0 x_range = np.linspace(x_min, x_max, width) y_range = np.linspace(y_min, y_max, height) img = np.empty((width, height)) for x in range(width): for y in range(height): zx, zy = x_ra..
[Python] 언어모델의 출력을 스트리밍 방식으로 출력하기
·
Python
언어모델을 GPU에 올려 사용할 경우 출력까지 길게는 30초 이상 걸리는 경우가 있습니다. 만약 서비스에 적용한다고 하면 사용자 입장에서는 이 시간이 길게 느껴질 것입니다. 따라서 이 부분을 스트리밍 방식으로 출력하면 결과까지 걸리는 시간은 같지만 사용자는 기다린다는 느낌이 적어지므로 UX관점에서 해결할 수 있습니다. ChatGPT를 웹에서 사용할 때의 방식이라고 보시면 될 것 같습니다. 0. 한 번에 출력하는 방식 Koalpaca 5.8b 모델로 다음과 같은 질문을 했을 때 20초 정도가 걸렸습니다. 이걸 허깅페이스를 통해 스트리밍 방식으로 바꿔보겠습니다. %%time inputs = tokenizer("###질문:피보나치 수열을 파이썬 코드로 만들어줘", return_tensors="pt",retur..
[Python] PEFT 라이브러리 알아보기
·
Python
저번 글을 통해 LORA(Low Rank Adaptation)에 대한 원리와 공식 Github를 통해 사용법을 알아봤습니다. 이번에는 LORA를 쉽게 사용할 수 있게 해주는 PEFT (Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware)에 대해 알아보겠습니다. PEFT는 LORA뿐만 아니라 P-tuning, Prompt Tuning 등의 파인튜닝을 도와주는 Huggingface에서 만든 라이브러리입니다. PEFT에서 사용가능한 파인튜닝 방법들 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS Prefix Tuning: Prefix-Tuning: Optimizing Cont..
[Python] Folium으로 지도에 행정구역 경계 표시하기
·
Python
지리 데이터를 통해 지도에 행정구역 경계를 표시할 수 있는 folium 라이브러리의 사용법을 소개하려고 합니다. 0. 설치 pip install folium 1. 데이터 대한민국 행정동 경계 또는 통계청 API를 통해 받을 수 있습니다. 저는 API를 사용해서 데이터를 받았습니다. params = { 'accessToken': access_token, 'year':'2021', 'adm_cd':code, # 행정구역코드 2(시) or 5(구) or 8(행정동) 자리 'low_search':1 # 하위 정보 단계 } res = requests.get('https://sgisapi.kostat.go.kr/OpenAPI3/boundary/hadmarea.geojson',params=params).json() ..
[Python] selenium 사용 시 chromedriver 자동 업데이트하기
·
Python
크롤링을 위해 selenium을 사용하다 보면 크롬이 업데이트될 때마다 chromedriver도 같은 버전으로 다운받아줘야 하는 번거로움이 있습니다. 이를 위해 자동으로 chromedriver를 현재의 크롬 버전과 같도록 해주는 파이썬 패키지가 있어 소개하려고 합니다. 두 가지가 있는데 첫 번째는 chromedriver-autoinstaller이고 두 번째는 webdriver-manager입니다. chromedriver-autoinstaller 1. 설치 $ pip install chromedriver-autoinstaller 2. 메서드 get_chrome_version() : 현재 크롬 버전 확인 import chromedriver_autoinstaller ver = chromedriver_autoi..
[Python] Faiss, 효율적인 유사도 검색 엔진
·
Python
Faiss(Facebook AI Similarity Search)는 페이스북에서 만든 유사도 검색 라이브러리입니다. GPU를 사용할 수 있고 C++ 기반이기 때문에 sklearn보다 빠르다는 장점이 있습니다. 0. 설치 pip install faiss-gpu or pip install faiss-cpu 1. 벡터 생성 후 index 구축 ※ faiss는 index라는 객체를 사용합니다. 쉽게 말해서 db라고 생각하면 될 것 같습니다. import numpy as np import faiss # 5차원 벡터 10000개 생성 db_vector = np.array(np.random.random((10000,5)),np.float32) # 유사도 찾을 벡터 query_vector = np.array(np.ra..