분류 전체보기 236

HuggingFace Transformers에서 Zero-shot Classification의 원리

HuggingFace Transformers 라이브러리에서는 다양한 파이프라인들을 제공한다. 그 중 하나로 ZeroShotClassificationPipeline 이라는 것이 있는데, 미리 학습되지 않은 라벨들에 대해서 분류를 하는 기법이다. 알다시피, 모델 학습에는 다양한 공수와 리소스가 소요되기 때문에 현업에서는 필요에 따라 ZeroShot 혹은 FewShot 모델들을 잘 활용해야 하는 경우가 많이 있다. GPT-4와 같은 생성형 모델에서는 LLM의 성능을 통해 이러한 Zero Shot Classification을 수행하게 되는데, BERT와 같은 임베딩 모델 기반 환경에서는 Zero Shot Classification을 어떻게 다루게 될까? 허깅페이스 트랜스포머 소스코드 (transformers/s..

AI/Transformers 2024.03.06

SQLAlchemy에서 session.commit()과 session.flush()의 차이

SQLAlchemy를 사용해서 어떤 데이터를 추가/변경 또는 삭제를 할 때 session.commit() 메소드와 session.flush() 메소드가 자주 사용되어지곤 한다. 기본적으로 둘 다 모든 적용되지 않은 변경 사항들을 저장하는 역할을 하나, session.commit()의 경우에는 한가지 추가적인 작업을 진행하게 되는데, 바로 연결된 모든 객체들을 expire 처리하고 다시 로딩을 한다는 점이다. 이 기능을 하는 여러가지 이유가 있겠지만, 대표적인 이유 중 하나로는 INSERT 후에 autoincrement id 값을 가져오기 위해서가 있다. 복잡한 비즈니스 로직을 구현하다보면 M:N의 문제들이 많이 발생하게 되는데, 이러한 경우 primary key들을 저장하는 매핑 테이블이 존재하기 마련이..

Python/sqlalchemy 2024.02.23

SQLAlchemy Session과 AsyncSession은 synchronizable한 객체일까?

SQLAlchemy에서 세션은 단일 데이터베이스 트랜잭션을 나타내는 변경 가능한 상태 저장 객체이다. 따라서 세션 객체는 신중한 동기화 없이는 동시 스레드 또는 비동기 작업 간에 공유할 수 없다. 세션은 non-concurrent 방식으로 (즉 특정 Session 객체는 한 번에 하나의 스레드 또는 작업에서만) 사용되어야 한다. SQLAlchemy의 asyncio 확장 기능에서 AsyncSession 객체를 사용하는 경우, 이 객체는 Session 객체를 기반으로 만들어지는 단순한 프록시일 뿐이며 동일한 규칙이 적용된다. AsyncSession은 동기화되지 않고 mutable(변경 가능)한 stateful한 특성을 가지는 객체이므로 여러 asyncio 작업에서 단일 인스턴스의 AsyncSession을 ..

Python/sqlalchemy 2024.02.23

Ray 개요 :: 파이썬 기반 분산 컴퓨팅

Ray는 파이썬 데이터 과학 커뮤니티를 위해서 만든 유연한 분산 컴퓨팅 프레임워크이다. Ray는 간결한 구조를 바탕으로 분산 프로그램을 효율적으로 작성 가능하다. 노트북에서 Ray를 사용하면 파이썬 프로그램을 효율적으로 병렬화하고, 로컬에서 테스트한 코드를 변경 없이도 클러스터에서 실행한다. Ray Core(Ray의 기본 API)는 C++로 개발되었으나, 애초에 파이썬을 위한 프레임워크이며 자바를 비롯한 여러 언어를 바인딩하도록 설계되었다. Ray가 데이터 과학 생태계에 여러 중요한 언어를 지원하기 때문에 데이터 과학자들 및 엔지니어들이 더 쉽게 효율적인 분산 데이터 처리 파이프라인 및 엔진을 구축할 수 있도록 큰 기여를 했다는 점은 부정할 수 없는 사실이다. 알다시피, 분산 컴퓨팅은 매우 어렵다는 인식..

Python/ray 2024.02.11

PostgreSQL Vacuum 관련 쿼리 간단 모음

PostgreSQL를 사용하는 프로젝트에서 DevOps 업무를 맡았을 때 자주 사용했던 쿼리들을 간단히 정리해보았다. -- t_product 테이블의 Auto VACUUM 설정을 비활성화 ALTER TABLE public.t_product SET (autovacuum_enabled = false); -- 가장 오래된 20개의 테이블들의 목록 조회 SELECT c.oid::regclass AS table_name, greatest(age(c.relfrozenxid), age(t.relfrozenxid)) AS age, pg_size_pretty(pg_table_size(c.oid)) AS table_size FROM pg_class c LEFT JOIN pg_class t ON c.reltoastrelid..

DB/PostgreSQL 2024.02.07

[MySQL 8.0] 중복된 인덱스 및 거의 사용되지 않는 인덱스 조회하기

데이터베이스 성능 향상을 위해 모든 엔지니어가 가장 먼저 고려하는 것이 바로 인덱스의 적용이다. 적절한 인덱스를 추가하는 것만으로 왠만하면 성능이 개선되기 때문에 인덱스 추가는 DB 성능 관련해서는 빠질수가 없는 솔루션이다. 인덱스는 성능에 있어 필요하지만 때때로 엔지니어들은 너무 과도하게 인덱스를 사용하는 경우가 있다. 이러한 경우, 중복 인덱스가 발생해서 오히려 전체 성능이 크게 저하되기 마련이다. 인덱스가 많아지게 되면 각 인덱스에 필요한 용량이 늘어나기 때문에 역설적으로 각 인덱스가 사용할 수 있는 가용 메모리의 크기가 줄어들게 된다. 또한, INSERT 등의 write 요청에 대해 고려해야 하는 인덱스의 수가 늘어나게 되면 해당 쿼리의 성능이 점점 떨어지게 된다. MySQL 5.x에서는 중복 인..

DB/MySQL 2024.02.07

파이썬에서 더 빠른 JSON serialization 사용하기

보통 파이썬에서 JSON을 string으로 직렬화(serialization)하거나 직렬화된 데이터로부터 JSON 객체(dict 타입)를 로딩하는 방법은 아래와 같이 json 표준 모듈을 사용하는 것이다. import json data = {'a': 'a', 'b': 'b'} data_str = json.dumps(data) new_data = json.load(data_str) 그러나, 이 표준 라이브러리는 파이썬으로 구현되어 있기 때문에 C/C++이나 Rust로 구현된 구현체들보다 더 느리다. 보통 빠른 JSON 직렬화 및 역직렬화를 위해서는 ujson과 orjson이 사용된다. ujson은 C로 작성된 JSON 모듈의 파이썬 바인딩이다. 해당 라이브러리는 파이썬 3.7부터 지원되고 있다. orjson..

Python 2024.01.22

MySQL where문에서 boolean 체크 관련 성능 튜닝

MySQL에서 boolean 타입의 플래그를 추가하기 위해 보통 BOOLEAN 타입을 사용하게 된다. 이 boolean 타입은 사실 tinyint(1)과 유의하다고 볼 수 있다. MySQL에서 제공해주는 false나 true와 같은 상수를 사용해서 where문에 조건을 추가해 줄 수가 있게 된다. 이 불린 값 체크를 위해서 아래와 같이 많은 방법이 있을 수 있다: -- is문 사용 SELECT * FROM TABLE WHERE flag is true; -- boolean값 자체를 조건문으로 사용 SELECT * FROM TABLE WHERE flag; -- '='을 사용해서 값을 비교 SELECT * FROM TABLE WHERE flag = true; 논리적인 관점에서 위의 3가지 타입의 쿼리는 모두 ..

DB/MySQL 2024.01.17

python psutil을 사용해서 간단한 모니터링 스크립트 구축하기

Bash 스크립트에서 ps를 사용하면 프로세스 정보를 알 수 있듯이, 파이썬에서는 psutil 라이브러리를 사용하면 프로세스 상태를 가져올 수 있는 API를 사용할 수가 있게 된다. https://pypi.org/project/psutil/ 아래는 psutil을 사용해서 작성한 간단한 프로세스 상태 모니터링 스크립트이다. import psutil from datetime import datetime import pandas as pd import time import os def get_size(bytes): """ Returns size of bytes in a nice format """ for unit in ['', 'K', 'M', 'G', 'T', 'P']: if bytes < 1024: ret..

Python 2024.01.02

sqlalchemy로 MySQL 연결 시 필요한 라이브러리

알다시피, sqlalchemy의 기본 데이터베이스는 PostgreSQL이다. 따라서, psycopg나 asyncpg와 같은 PostgreSQL용 드라이버 및 라이브러리는 자동으로 함께 설치가 되나, MySQL을 사용하는 사람들은 필요한 라이브러리를 일일히 추가해주어야 한다. pip install mysqlclient pip install mysql-connector pip install mysql-connector-python 위와 같이 "mysqlclient"와 "mysql-connector", 그리고 "mysql-connector-python"까지 설치를 해주어야 한다. 처음 시도할 때에는 "mysqlclient"와 "mysql-connector"만 설치하고 에러 메시지를 정독하면서 왜 안되는지 열심..

Python/sqlalchemy 2024.01.02