전체 글 40

전문가를 위한 파이썬 책 구매

요즘 업무에 계속 파이썬을 사용하고 있습니다. 최대한 좋은 파이썬 코드를 짜보고자 노력하고 있지만, 지식의 한계로 인하여 정체되는 느낌이었습니다. 그래서 좋은 레퍼런스를 참고하고자 책이나 강의 등 여러 자료를 찾아보았지만 마음에 드는 자료가 없었습니다. 그러다 오렐리 출판사에서 발간하고 한빛미디어에서 번역한 '전문가를 위한 파이썬' 책을 찾았습니다. 꽤나 고급 파이썬 테크닉을 다루는 것을 보고 e-북을 구매하였고 계속 공부하고자 합니다. 책의 표지는 아래와 같이 도마뱀이 그려져 있는 내용입니다. 아마 이제 당분간 파이썬 포스팅은 이 책을 보고 리뷰하는 내용일 것 같습니다.

python 2022.07.21

MLFlow 원격 모델 저장소에서 pytorch 모델 로딩 시 에러

현재 회사에서 오프라인 배치 서빙을 수행하는 스크립트를 작성하는 기회가 있었습니다. 이를 위해 타팀 연구원분께서 개발하신 딥러닝 모델을 전달받아 사용하여야 했고, 모델을 공유할 방안을 마련하여야 했습니다. 기존에는 slack이나 google drive를 사용하여 모델을 전달받았지만, 회사에 MLFlow 프로토타입을 구축하여 운용하고 있었으므로 MLFlow 원격저장소 기능을 테스트할 좋은 기회라고 생각했습니다. 아직 딥러닝 연구원분들은 MLFlow를 잘 다루지 못하므로, 일단 slack으로 모델을 전달받고 제가 원격저장소에 업로드하였습니다. 이때 얻은 경험은 MLFlow 운영에 큰 도움이될 것 같았습니다. 전에 포스팅한 것 처럼, MLFlow 업로드는 그리 어렵지 않았습니다. mlflow.pytorch.l..

MLOps 2022.07.20

MLFlow

현재 회사에서 MLOps 엔지니어로 근무하고 있습니다. 기존에는 GPU 병렬 컴퓨팅을 공부했고, 딥러닝에 대한 이론적 지식이 있으며 백엔드 엔지니어링을 공부한 배경을 바탕으로 MLOps 엔지니어 포지션을 제안받았기 때문입니다. MLOps 엔지니어는 아래와 같이 크게 세가지 일을 수행한다고 생각합니다. 1. 데이터 파이프라인 구축 2. 머신러닝 파이프라인 구축 3. 머신러닝 모델 서빙 이 번 포스팅에서는 머신러닝 파이프라인 구축 카테고리에서 머신러닝 모델 관리에 관한 오픈 소스를 리뷰할 까 합니다. 제목과 같이 MLFlow를 리뷰하려고 하고, MLFlow의 여러 기능 중에서 tracking과 registry 기능에 대해 리뷰하려고 합니다. MLFlow는 클라이언트-서버 구조를 갖고 있습니다. 따라서 로컬머..

MLOps 2022.07.04

NGINX

현재 근무하는 회사에서 모델 서빙 인프라를 구축하는 일이 있었습니다. BentoML 기반의 서빙 시스템을 구축하였고, NGINX와 Gunicorn을 사용해서 인프라를 구축해야 했습니다. 이 때 NGINX에 대해 많이 공부하였는데, 이 기회를 빌어서 NGINX에 대해 포스트를 작성하고자 합니다. 웹개발을 공부하는 사람이라면 NGINX에 대해 들어보았을 것입니다. 물론 본인도 웹 인프라를 구성할 때 NGINX를 사용하여야 한다는 것을 들었었고 파이썬을 사용하여 인프라를 구성한다면, Gunicorn과 NGINX를 사용하여야 하여야 한다는 것으로 알고 있었습니다. NGINX 일반적으로 NGINX는 WSGI의 앞단에서 위치하여 정적 파일 요청을 처리하고, 리버시 프록시 서버 역할도 수행한다고 합니다. 따라서 동적..

Json Web Token

JWT(Json Web Token)은 Json 형태로 주고받을 수 있는 토큰입니다. JWT는 Base64를 사용하여 인코딩하지만, URL에서 사용할 수 있도록 URL safe 구조로 이루어져 있습니다. 크게 header, payload, signature라는 구조를 갖고 있으며, 이들은 .으로 구분되도록 구성되었습니다. HEADER.PAYLOAD.SIGNATURE 각 요소가 갖고있는 정보는 아래와 같습니다. Header는 토큰의 종류나 해싱알고리즘이 포함되어 있습니다. Payload에는 사용자 혹은 토큰에 대한 정보를 key-value 형태로 저장합니다. 표준 스펙은 아래와 같습니다. 1. iss(Issuer): 토큰 발급자 2. sub(Subject): 토큰 제목 3. aud(Audience): 토큰 ..

기타 2022.03.20

REST API

최근 기술면접에서 REST API를 질문받은 적이 있었다. 아마 대답을 했던 것 같은데, 완벽한 대답이었다고는 생각하지 않는다. 보통 백엔드 개발자라면 API를 개발하는 업무를 수행하고, 이 때 REST API혹은 RESTful API 아키텍처 형태로 개발할텐데 이에 대해서 정확히 알고 있지 못하는 것 같다. 따라서 본 포스팅을 통하여 REST API에 대해 자세히 정리를 하고 추후 API 설계를 할 때 도움을 받고자 한다. REST란 REpresentational State Transfer의 약자이다. REST는 프로토콜이나 표준이 아니라 아키텍처 원칙 세트인데, 따라서 REST API는 REST 아키텍처를 따르는 조건을 만족하여야 한다. 1. 클라이언트-서버 구조 2. 무상태성이어야 할 것 3. 캐시..

파이썬 동시성 프로그래밍 개요

이전에는 파이썬 웹 프레임워크로 Django 혹은 Flask가 주로 사용되었다. 하지만 두 프레임워크는 생산성이 높다는 장점이 있으나, 속도가 느리다는 단점이 있다. 따라서 국내에서는 파이썬 기반의 웹개발이 비교적 많지 않은 상태였다. 그러나, 속도 문제를 해결하면서도 생산성은 높인 Python 기반의 웹프레임워크인 FastAPI가 탄생하였고, 이벤트 기반 비동기 방식으로 인하여 속도 문제를 해결해주었다. 한 벤치마크에서는 FastAPI가 Node.js, Go와 비슷하거나 더 높은 성능을 보인다고 발표한 바가 있다. 따라서 FastAPI에 대해 공부해보기로 하였다. 위에서 언급했던 것과 같이 FastAPI는 비동기 방식으로 진행되므로 FastAPI를 먼저 공부하는 것보다 Python 기반의 동시성 프로그..

트랜잭션

사실 데이터베이스 강의를 수강한 큰 이유는 트랜잭션에 대해 잘 알고자 하기 위함이었다. 따라서 SQL 강의중에서 트랜잭션과 관련한 비중이 가장 큰 강의를 수강하였는데.. 결과적으로는 학습내용을 더 보충하여야 하지 않을까 싶다. 일단 트랜잭션에 대해 알아보아야 할 것 같다. 트랜잭션은 데이터베이스에서 상호작용의 단위로, 모든 작업이 성공하거나 모든 작업이 실패해야한다. 보통 대부분 은행 송금과 같은 예제를 많이 사용하므로, 본 글에서도 송금에 대한 예제를 사용하도록 하겠다. 아래와 같이 계좌이체 프로세스가 진행된다고 하자. 발신 계좌에서 송금 금액만큼 차감하고 수신계좌에서 송금금액만큼 추가하는 프로세스가 있을 텐데, 이 때 송금 금액만큼 차감은 진행되었는데, 수신계좌에서 추가하는 프로세스가 실패하였을 경우..

서브쿼리

서브쿼리란 하나의 쿼리문 안에 포함되어 있는 또 하나의 쿼리문으로, 여러번의 쿼리를 수행해야만 얻을 수 있는 결과를 하나의 중첩된 쿼리로 처리할 수 있다. SELECT 절에서의 서브쿼리 SELECT cd_plant, nm_plant, (SELECT AVG(um) FROM table_item) AS um FROM table_plant FROM 절에서의 서브쿼리 SELECT cd_plant, nm_plant, am FROM (SELECT * FROM table_plant) AS a WHERE절에서의 서브쿼리 SELECT cd_plant, nm_plant, FROM table_plant WHERE cd_plant IN (SELECT cd_plant FROM table_plant WHERE plant='1000..

Join

Cross Join 모든 경우의 수를 보여주는 Join SELECT * FROM customers, cars Inner Join 두 테이블 조건절을 통해 일치하는 경우에만 Join 실행 SELECT * FROM customers, cars WHERE customers.id = cars.customer_id 혹은 SELECT * FROM customers INNER JOIN cars ON customers.id = cars.customer_id 혹은 SELECT * FROM customers AS a, cars AS B WHERE a.id = b.customer_id Outer Join 조건에 해당하지 않는 결과라도 조회가 가능하도록 JOIN 처리 조건에 해당하지 않는 열값은 Null 처리됨 SELECT ..