핍 값 계산 방법

마지막 업데이트: 2022년 7월 17일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
그림 47-6 파이썬 가상 환경으로 독립된 공간을 구성

꿈 많은 사람의 이야기

Python faiss 사용법 간단 정리 - Faiss로 효율적인 vector 유사도(similarity) 구하기 본문

Python faiss 사용법 간단 정리 - Faiss로 효율적인 vector 유사도(similarity) 구하기

포스팅 개요

이번 포스팅은 파이썬(Python)에서 효율적인 벡터 유사도(vector similarity)를 구해주는 Faiss에 대해서 간단한 사용법을 정리합니다. 보통 벡터 유사도는 코사인 유사도(cosine similarity) 등이 구현된 라이브러리를 사용하는데요. 그 중 Faiss는 매우 빠르고 효율적입니다.

이러한 Faiss를 활용해서 vector similarity를 구하는 방법과 ID와 Vecotr를 Mapping하는 방법도 정리해보고자 합니다. 제가 참고한 자료는 아래와 같습니다.

포스팅 본문

Faiss는 facebook에서 만든 vector 유사도를 효율적으로 측정하는 라이브러리입니다. 굉장히 빠르고 강력하죠. 보통 벡터 유사도(vector similarity)를 구할 때는 numpy나 scikit-learn에서 제공해주는 cosine similarity(코사인 유사도)등을 많이 사용하는데요. Faiss를 사용하면 훨씬 빠르고 강력하게 유사도를 측정할 수 있습니다. 내부적으로 C++로 구현되어 있고 GPU도 지원해주기 때문입니다.

1. 설치 방법

설치 방법은 아래와 같습니다.

글을 작성하는 시점인 2020.11.29 기준이구요, 자세한 것은 사이트에서 확인해주시면 됩니다!

2. 기본적인 핍 값 계산 방법 사용 방법

먼저 기본적인 사용 방법에 대해서 알아봅니다. 개요에 올린 2번째 링크에 들어가면 매우 간단한 예시가 나와있는데요! 비슷하게 진행해보겠습니다. 먼저 faiss를 import하고 vector sample을 random으로 뽑아보겠습니다.

저는 20개의 vector sample을 32차원으로 뽑아냈습니다.

그리고 단순히 사용하는 방법은 faiss의 IndexFlatL2함수를 호출해서 벡터의 차원이 어떻게 되는지 알려줍니다. 이후에 해당 faiss의 객체에 대해서 add 함수로 vector 값을 넣어주면 됩니다.

자! 이렇게 하면 faiss 내부적으로 벡터 유사도를 계산하였습니다. 그럼 이제 faiss 내부에 계산된 값을 찾아봐야겠죠?

vector sample의 첫 번째 값을 (1, 32) 형태로 shape를 변경해 index.search 함수에 넣어줍니다. 그리고 3이라는 것은 가장 유사한 값 3개를 가지고 오는 것입니다.

그러면 return 값이 Distances, Indices (D, I)가 return 됩니다. Dinstance는 말 그대로 거리 값을 말하구요. indices는 가장 유사한 벡터가 있는 index 값을 나타냅니다.

하지만, 여기에 문제가 있죠. 만약에 ID 값이 있는 vector 값이면 어떻게 할까요?

즉, vector는 vector_sample[0]의 값이고 ID 123의 vector는 vector_sample[6]에 해당된다면 어떻게할까요? 단순히 indexflatl2를 사용하고 add를 사용하게 되면 첫 번째 값부터 0번으로 id 값이 들어가게 되고 그 다음 값은 1번, 2번 이렇게 번호가 들어가게 됩니다. 즉, 0번으로, 6번으로 들어가게 되는 것이죠!!

이것을 해결할 수 있는 방법에 대해 알아봅시다.

3. Python Faiss의 IndexIdMap2 함수를 사용하여 Index와 id를 mapping하기

자! 위에서 언급한 문제를 해결해봅시다. 처음에 제가 만든 vector sample이 20개의 vector 값이 32차원으로 있었는데요. 이 20개의 vector 값에 해당되는 ID 값을 넣어주겠습니다.

위처럼 ids 배열안에 100, 99 등의 숫자를 넣어줬습니다. 즉, id 값들을 순서대로 넣어준 것입니다. 아래처럼 데이터가 구성된 것이죠.

100번의 ID 값을 핍 값 계산 방법 가진 것은 vector_sample의 0번째 값

99번의 ID 값을 가진 값은 vector_sample의 1번째 값을 가지도록 ID 값을 지정한 것입니다. 그러면 이제 Faiss에서 이 Id 값과 vector 값을 어떻게 mapping 시킬 수 있을까요? 아래와 같이 진행하면 됩니다.

faiss.IndexFlatL2는 위에서 소개한 것과 동일합니다. L2 거리를 이용한 유사도를 측정하는 것이죠. 근데 원래 그 뒤에 add 함수로 넣었는데 뒷 부분이 조금 다릅니다!

faiss.IndexIDMap2 함수를 사용해서 다시 한 번 faiss 객체를 넣어줍니다. 이것은 Index를 ID와 Mapping할 수 있는 것으로 만들겠다! 라고 해석하시면 될 핍 값 계산 방법 것 같습니다.

그 다음으로 index.add_with_ids 함수를 사용해서 add_with_ids 함수 안에 vector 값과 아까 위에서 만든 id 값들을 넣어줍니다.

그러면 이제 search하면 어떤 결과가 나오는가?!

자! search를 이용하면 실제 id 값인 100, 1234, 234 값들이 나오는 것을 확인할 수 있습니다.

아~ 또한 Faiss index.search를 할 때 여러 벡터를 한 번에 넣어주면 그 값들을 한 번에 유사도를 구해줍니다.

이렇게 3개를 한 번에 구할 수도 있습니다!

그러면 여기서 궁금한 점이 생길겁니다. Faiss로 구한 벡터 유사도(vector similarity)를 구했는데 그 역을 구할 수 있을까? 그니까 id 값을 넣으면 해당 id 값의 vector를 뽑을 수 있을까? 를 생각하게 됩니다.

4. Faiss index에 id를 넣어서 원래 vector 구하기

Faiss 객체를 사용해서 id 값을 넣으면 faiss에 넣었던 벡터를 구할 수 있습니다. 바로 faiss의 reconstruct를 사용하면 됩니다.

reconstruct(:id)를 해주면 됩니다. 그러면 벡터 값이 나오게 되고 실제로 벡터 값이 같은 것을 확인할 수 있습니다.

5. Faiss 저장 및 가져오기(Faiss save and load)

또한, faiss 객체를 저장하고 가져올 수도 있습니다.

faiss.write_index를 사용해서 저장하고 faiss.read_index를 사용하면 불러올 수 있습니다.

자세한 것은 아래 사진을 보시면 됩니다!

Faiss 에러 정리

Faiss를 사용하다보면 다양한 에러가 나오는데요. 그 에러들을 정리해보고자 합니다.

1. Type Error swigfaiss.py와 관련된 에러

첫 번째로 많이 겪는 에러는 다음과 같은 에러입니다.

TypeError: in method 'IndexIDMap2_add_with_ids', argument 4 of type 'faiss::IndexIDMap2Template< faiss::Index >::idx_t const *'

TypeError IndexIDMap2_add_with_ids와 같은 에러 문구가 나오면서 return _swigfaiss.IndexIDMap2_add_with_ids(self, n, x, xids)과 같은 에러 명이 나옵니다.

이 에러는 faiss에서 add_with_ids를 넣을 때 발생하는 에러인데요. 해결하는 방법은 아래와 같이 진행하시면 됩니다.

faiss 에러나는 코드

즉, add_with_ids를 넣는 2번째 인자 값을 int64로 바꿔주면 됩니다.

이번 포스팅은 Python에서 벡터 유사도를 효율적으로 계산하기 위해 사용되는 Faiss에 대해서 알아보았습니다.

Faiss는 vector similarity를 간단하게 사용할 수 있으면서도 매우 강력하고 빠르게 사용될 수 있는 효율적인 라이브러리입니다.

파이썬 코딩 도장

파이썬을 사용하다 보면 pip 로 패키지를 설치하게 되는데 이 패키지들은 파이썬 설치 폴더(디렉터리)의 Lib/site-packages 안에 저장됩니다. 그래서 pip 로 설치한 패키지는 모든 파이썬 스크립트에서 사용할 수 있게 됩니다. 평소에는 이런 방식이 큰 문제가 없지만 프로젝트를 여러 개 개발할 때는 패키지의 버전 문제가 발생합니다.

예를 들어 프로젝트 A에서는 패키지X 1.5를 사용해야 하고, 프로젝트 B에서는 패키지X 2.0을 사용해야 하는 경우가 생깁니다. 이 패키지X 1.5와 2.0은 호환이 되지 않는다면 개발하기가 상당히 불편해집니다.

그림 47-5 글로벌 파이썬 환경에서 패키지가 호환되지 않는 경우

이런 문제를 해결하기 위해 파이썬에서는 가상 환경(virtual environment)을 제공하는데, 가상 환경은 독립된 공간을 만들어주는 기능입니다. 가상 환경에서 pip 로 패키지를 설치하면 가상 환경 폴더(디렉터리)의 Lib/site-packages 안에 패키지를 저장해줍니다. 즉, 프로젝트 A와 B 각각 가상 환경을 만들어서 프로젝트 A에는 패키지X 1.5를 설치하고, 프로젝트 B에는 패키지X 2.0을 설치할 수 있습니다. 이렇게 하면 파이썬 스크립트를 실행할 때도 현재 가상 환경에 설치된 패키지를 사용하므로 버전 문제가 발생하지 않습니다.

그림 47-6 파이썬 가상 환경으로 독립된 공간을 구성

특히 가상 환경에는 파이썬 실행 파일(인터프리터) 자체도 포함되므로 각 가상 환경 별로 다른 버전의 파이썬 인터프리터가 들어갈 수 있습니다. 따라서 스크립트를 실행할 때는 원래 설치된 파이썬 인터프리터가 아닌 가상 환경 안의 파이썬 인터프리터를 사용합니다.

47.11.1 Windows에서 가상 환경 만들기

그럼 먼저 Windows에서 가상 환경을 만드는 방법을 알아보겠습니다. 가상 환경은 venv 모듈에 가상 환경 이름을 지정해서 만듭니다.

venv 는 파이썬 3.3이상부터 사용 가능

여기서는 C: \project 폴더 아래에 가상 환경을 만들겠습니다. 다음과 같이 명령 프롬프트에서 example 가상 환경을 만들고 example 폴더 안으로 이동합니다. 그다음에 Scripts 폴더 안의 activate.bat 파일을 실행하면 가상 환경이 활성화됩니다.

Windows 명령 프롬프트

Windows PowerShell에서는 Activate.ps1 파일을 실행합니다( ps1 스크립트를 실행할 수 없을 때는 Windows PowerShell을 관리자로 실행한 뒤 Set-ExecutionPolicy RemoteSigned 를 입력하고 Y를 입력).

프롬프트 앞을 보면 (example) 과 같이 가상 환경의 이름이 표시됩니다.

이 상태에서 pip 로 패키지를 설치하면 C: \project \example \Lib \site-packages 안에 패키지가 저장됩니다( dir 로 파일과 폴더 확인해보기, /B 는 최소 포맷 옵션).

이 상태에서 스크립트 파일을 실행하면 현재 가상 환경 안에 있는 파이썬 인터프리터와 패키지를 사용하게 됩니다.

47.11.2 패키지 목록 관리하기

특히 가상 환경에 설치된 패키지는 목록을 저장해 두었다가 나중에 다시 설치할 수 있습니다. 다음과 같이 pip freeze 로 패키지 목록과 버전 정보를 requirements.txt 파일에 저장합니다( git 등으로 버전 관리를 할 때 저장소에 설치된 패키지를 모두 추가하지 않고, requirements.txt 파일만 관리하면 됩니다).

requirements.txt 파일의 내용대로 패키지를 설치하려면 pip install 에서 -r 또는 --requirement 옵션을 사용합니다.

requirement.txt 파일의 내용대로 패키지를 삭제하려면 pip uninstall 에서 -r 또는 --requirement 옵션을 사용합니다.

47.11.3 가상 환경별로 파이썬 버전 구분하기

만약 가상 환경별로 파이썬 인터프리터 버전을 다르게 만들고 싶다면 해당 버전의 파이썬 인터프리터로 venv 모듈을 실행하면 됩니다. 다음은 파이썬 3.4를 사용하는 가상 환경을 만듭니다(파이썬 3.4를 설치했다고 가정).

이렇게 하면 venv 모듈을 실행한 파이썬 실행 파일(인터프리터)이 가상 환경 안에 들어갑니다.

47.11.4 리눅스와 macOS에서 가상 환경 만들기

이번에는 리눅스와 macOS에서 가상 환경을 만드는 방법입니다. 다음과 같이 python3 으로 venv 모듈을 실행하여 가상 환경을 만들고, source 로 bin 디렉터리 안의 activate 파일을 적용하여 가상 환경을 활성화합니다.

리눅스와 macOS에서도 pip 사용 방법은 앞에서 설명한 것과 같습니다.

47.11.5 가상 환경 폴더를 다른 곳으로 이동시켰다면?

가상 환경을 사용할 때 주의할 점이 있는데, 가상 환경을 만들고 나서 폴더(디렉터리)를 다른 곳으로 이동시키면 활성화가 안 됩니다. 왜냐하면 가상 환경을 활성화하는 activate.bat , Activate.ps1 , activate 파일 안에 현재 가상 환경 폴더의 경로가 내장되어 있기 때문입니다. 만약 가상 환경 폴더를 다른 곳으로 이동시켰다면 activate.bat , Activate.ps1 , activate 파일 안의 VIRTUAL_ENV 부분을 이동시킨 폴더 경로로 수정해줍니다.

47.11.6 아나콘다 가상 환경 만들기

아나콘다에서 venv 를 사용해도 되지만 아나콘다는 전용 가상 환경을 제공하므로 이 환경을 사용하는 것을 권장합니다.

아나콘다에서는 conda 를 사용하여 가상 환경을 만듭니다. conda 는 아나콘다 설치 폴더의 Scripts 안에 들어있습니다.

만약 가상 환경에 특정 파이썬 버전을 설치하고 싶다면 python=3.5 처럼 버전을 지정해줍니다. 이때는 64비트 파이썬이 설치됩니다.

32비트 파이썬을 설치하려면 CONDA_FORCE_32BIT 에 1을 지정한 뒤 conda 로 가상 환경을 만들면 됩니다(반드시 명령 프롬프트에서 실행).

conda 는 venv 와는 달리 가상 환경을 현재 폴더에 생성하지 않고 아나콘다 설치 폴더의 envs 안에 생성합니다.

  • 예) C: \Users \dojang \Anaconda3 \envs \example

가상 환경을 활성화할 때는 아나콘다 설치 폴더의 Scripts \activate 에 가상 환경 이름을 지정하여 실행해야 합니다(반드시 명령 프롬프트 cmd 에서 실행).

아나콘다 가상 환경에 패키지를 설치할 때는 pip 대신 conda 를 사용해야 합니다. 만약 pip 를 사용하면 아나콘다 설치 폴더의 Lib/site-packages 안에 패키지가 저장되므로 주의해야 합니다.

다음은 conda 의 주요 명령입니다.

  • conda info : 현재 환경 정보 출력
  • conda search패키지 : 패키지 검색
  • conda install패키지=버전 : 특정 버전의 패키지를 설치(예: conda install numpy=1.11.3 )
  • conda install패키지=버전=파이썬버전 : 파이썬 버전을 지정하여 특정 버전의 패키지를 설치(예: conda install numpy=1.11.3=py36_0 )
  • conda update패키지 : 패키지 업데이트
  • conda list : 패키지 목록 출력
  • conda remove패키지 : 패키지 삭제
  • conda list --export > package-list.txt : 패키지 목록 및 버전 정보 저장:
  • conda install --file package-list.txt : 패키지 목록으로 설치

47.11.7 가상 환경을 사용하는 IDLE 실행하기

venv , conda 가상 환경을 사용하는 IDLE을 실행하려면 가상 환경을 활성화 시킨 뒤 idlelib 모듈을 실행하면 됩니다. 이렇게 하면 IDLE에서도 현재 가상 환경의 패키지를 사용할 수 있습니다.

초보자도 이해할 수 있는 딥러닝(텐서플로우 설치까지)

안녕하세요 클래스메소드 김재욱(Kim Jaewook)입니다. 이번에는 딥러닝에 대한 개념과 텐서플로우 설치 방법에 대해서 정리해봤습니다.

컴퓨터 사이언스에서, 인공지능(AI)이라는 용어는 컴퓨터, 로봇 또는 기타 기계에 의해 표현되는 마치 인간 같은 지능을 의미합니다. 대중적인 용어로, 인공지능은 예제와 훈련으로부터의 학습, 사물 인식, 언어 이해 및 반응, 의사결정, 문제점 해결 그리고 이와 기타 기능을 결합하여 인간이 수행할 수 있는 기능(예: 호텔 손님 접대 혹은 자동차 운전)을 수행하는 인간 사고의 기능을 모방하는 컴퓨터 혹은 머신의 기능을 의미합니다.

  • 인공지능 : 컴퓨터가 인간의 사고를 모방하는 모든 것
  • 머신러닝 : 핍 값 계산 방법 주어진 데이터를 이용하여 컴퓨터가 스스로 학습 하는 것
  • 딥러닝(인공신경망) : 인간 뇌 동작 방식에 착안하여 개발한 머신러닝 학습 방법

크게 인공지능이 있고 그 안에 머신러닝 그리고 머신러닝의 학습방법으로 딥러닝이 존재합니다.

규칙기반 인공지능의 경우 개발자가 스스로 데이터를 입력 해주어야 합니다.

그림에 나온것 처럼 바나나를 인식하기 위해서 바나나의 특징을 인풋값으로 넣어주게 되는데, 바나나는 길다, 노랗다, 약간 휘었다 라는 특징을 넣어줌으로써 바바나로 인식하게 하는것이 규칙기반 인공지능이라 할 수 있겠습니다.

​ 반대로 머신러닝의 인풋값과 아웃풋 값을 가지고 계산을 하게 되는데, 바나나의 사진을 넣어주고 핍 값 계산 방법 결과값으로 바나나라고 한다. 그러면 이 사진이 바나나라고 인식을 할 수 있을 때 까지 컴퓨터가 스스로 학습을 하게 됨으로써 바나나의 사진을 보고, 길다, 노랗다, 약간 휘었다 라고 스스로 학습을 하게 되는데. 이것이 머신러닝입니다.

추가적으로 썰어놓은 바나나의 경우 규칙기반 인공지능은 개발자가 다시 또 입력을 해줘야 합니다.

하얀색, 납작하다, 둥글다 라고 다시 입력을 해주어야 하지만 머신러닝의 경우 인풋값과 결과값만 집어넣게 되면 스스로 학습하게 됩니다. 그러므로 썰어놓은 바나나 이미지를 주고 결과값으로 바나나를 주면, 사진상의 바나나를 보며 썰어놓은것 또한 바나나 이며 하얀색, 납작하다, 둥글다 라고 스스로 학습합니다.

​ 인간도 파악하기 어려운 복잡한 문제는 머신러닝도 해결 어려웠기 때문에, 이러한 머신러닝의 한계를 인공신경망(딥러닝)으로 해결 할 수 있겠다 라고 생각하여 인공신경막(딥러닝)을 연구하기 시작했습니다.

현재 딥러닝(인공신경망)이 부상한 이유는 예전에는 방대한 데이터를 처리하는 일이 없었으므로, 쓰일 일이 거의 없었습니다.

하지만 시간이 지나면 지날수록 사용 되는 데이터양이 많아짐에 따라 빅데이터와 GPU가 발전하게 되고, 다양한 딥러닝 알고리즘들이 개발 되었습니다.

약인공지능(ANI)과 강인공지능(AGI)

약인공지능(ANI)의 경우 현재 존재하는 모든 인공지능이라고 생각하면 됩니다. 규칙을 벗어난 창조적인 분야에서는 사용할수 없으며, 넓은 분야에서 사용할수 없고, 특정 분야에서만 사용이 되고 있습니다.

​ 강인공지능(AGI)의 경우 현재 존재하지 않습니다. 강 인공지능 스스로가 생각하고 창조하며 학습을 하는것을 말하는데, 일반적으로 영화 아이언맨에 나오는 인공지능을 생각하면 될 것 같습니다.

전통 프로그래밍과 머신러닝의 차이점

전통 프로그래밍과 머신러닝의 차이점은 전통 프로그래밍의 경우 데이터를 주고 어떤 식으로 처리해 라는 알고리즘을 전달합니다. 그럼 이것을 바탕으로 컴퓨터가 계산을 해서 결과값을 냅니다.

즉 컴퓨터가 주어진 데이터와 알고리즘을 바탕으로 최종적 아웃풋을 내주는 것이 전통 프로그래밍 기법이라고 할 수 있습니다.

머신러닝의 경우 데이터값(input)과 아웃풋(output)을 준다. 이 인풋값과 아웃풋 값 만으로 컴퓨터가 계산을 해서 스스로 학습하여 하나의 알고리즘을 만들어냅니다.

​ 머신러닝에는 지도학습, 비지도학습, 강화학습이 존재합니다.

​ 지도학습의 경우 정답을 알려주며 학습을 시키고, 비지도학습의 경우 정답을 알려주지 않고, 비슷한 데이터들을 군집화 합니다. 즉 비슷한 데이터들을 입력해주면 컴퓨터 본인 스스로 특징을 잡아서 학습을 합니다.

강화학습은 상과 벌이라는 보상을 주어 학습을 시키는데 대표적인 예로 알파고가 있습니다.

​텐서플로우 설치

이제 텐서플로우를 설치해보도록 하겠습니다.

일단 아나콘다가 설치 되어 있다는 가정하에 진행합니다.

먼저 아나콘다 프롬프트에서 다음 명령을 입력한다.

  • conda update -n base conda

그리고 conda update --all 명령을 통해 설치된 파이썬 패키지를 모두 최신버전으로 업데이트 합니다. 이후 pip install numpy matplotlib pillow 를 통해서 라이브러리들을 설치해줍니다. numpy는 수치 계산, matplotlib 는 그래프, pillow는 이미지 처리 라이브러리입니다.

현재 파이썬 버전이 3 버전이면 pip3를 입력해주면 됩니다. 버전이 2이면 그냥 pip 입니다.

​ 그리고 다음 순으로 설치를 진행 해주면 됩니다.

  • ​ conda update -n base conda
  • pip install --upgrade pip
  • pip install tensorflow
  • conda install tensorflow

명령어를 입력 ​ 하고서 실행해보면

다음과 같은 에러가 뜰 수 있는데, 이때는

  • ​ pip install gast==0.2.2
  • pip uninstall numpy 를 통해서 기존 넘파이를 삭제 해주고
  • pip install "numpy

name tf.Session is deprecated. Please use tf.compat.v1.Session instead.

이러한 에러가 뜰 때도 있는데, 이 때는 적힌 그대로 t1.compat.v1.Session 으로 코드를 수정해주고 다시 실행 해주면 문제없이 작동합니다.

마지막으로

딥러닝에 관심이 많아진 요즘, 이것저것 자료를 찾아가면서 공부해보고 있습니다. 딥러닝이 무엇인지 잘 모르겠다 하시는 분들에게 제 블로그가 도움이 됐으면 좋겠습니다!

[Toy Project] 자동매매 프로그램 만들기 - 3. pyupbit 모듈 알아보기

pyupbit 모듈 이란, 업비트 API를 파이썬에서 쉽게 사용하기 위해서 저자들이 개발한 모듈이다. 굳이 API를 호출할 필요 없이 pyupbit 모듈을 이용하면 간편한 경우가 많다.

먼저 pyupbit 모듈을 설치해보자. 프롬프트 창에 "pip install pyupbit" 를 입력한다.

그 후, 다음 코드를 실행했을 때 오류가 발생하지 않는다면 pyupbit 모듈이 잘 설치가 된 것이다.

이제, pyupbit를 이용할 수 있는 대표적인 기능 몇 가지를 알아보자.

2. 암호화폐 목록 얻기

암호화폐를 거래하기 위해서는 각 화폐별 ticker가 필요하다. get_tickers 함수를 이용하면 업비트에서 거래할 수 있는 모든 암호화폐의 문자열 ticker를 리스트로 반환해준다.

업비트에서는 원화(KRW)뿐만 아니라 BTC, USDT 마켓 또한 지원하므로 주로 이용하는 원화 마켓의 암호화폐를 선별하고 싶다면 다음과 같이 옵션을 추가해주어야 한다.

fiat은 우리가 사용하는 종이 화폐, 즉 명목화폐(fiat money)에서 나온 말이다. 동일한 방법으로 BTC / USDT 마켓의 암호화폐도 골라낼 수 있다.

3. 암호화폐 현재가 얻기

get_current_price 함수를 이용하면 암호화폐의 마지막 체결 가격, 즉 현재가를 얻을 수 있다. 인자에 암호화폐의 ticker를 넣어주면 float형으로 값을 반환한다.

만약 여러 암호화폐를 한 번에 조회하고 싶다면, ticker들을 담은 리스트를 인자로 넘겨주면 된다. 이 경우에는 반환 값으로 가 인 딕셔너리가 반환된다.

몇 분 사이에 값이 비트코인 가격이 소폭 하락한 것을 볼 수 있다. get_current_price 함수는 한 번에 최대 100개의 암호화폐를 조회할 수 있다.

4. 암호화폐 과거 데이터 조회

get_ohlcv 함수를 이용하여 인자에 ticker를 넘겨주면 해당 암호화폐의 OHLCV 데이터를 pandas DataFrame으로 반환한다.

시가 / 고가 / 저가 / 종가 / 거래량 / 거래금액 을 구할 수 있다.

get_ohlcv 함수는 다음과 같이 구성되어 있다.

get_ohlcv(ticker='KRW-BTC', interval='day', count=200, to=None, period=0.1) -> Union[DataFrame, None]

매개변수로 ticker, interval, count, to, period가 존재하며, 반환 값으로 Union[DataFrame, None]을 갖는다.

interval 변수는 조회 단위를 나타낸다. 분(1/3/5/10/15/30/60/240), 일, 주, 월별 데이터를 구할 수 있으며 인자로 넘길 땐 다음과 같다.

[ day / minute1 / minute3 / minute5 / minute10 / minute15 / minute30 / minute60 / minute240 / week / month ]

만약 interval을 지정하지 않는다면 기본값은 day이다.

count 변수는 조회 개수를 나타낸다. 최근 영업일부터 이전 count만큼의 영업일까지의 데이터를 가져오게 된다.

count를 지정하지 않는다면 기본값은 200이다.

to 변수는 입력된 시점의 이전까지의 데이터를 얻을 수 있다. 예를 들어 to="20210101"이라고 하면, 2020년 12월 31일부터 이전 count만큼의 영업일까지의 데이터를 가져온다. 즉, 2020-06-15~2020-12-31의 데이터를 가져온다.

to를 지정하지 않는다면 기본값은 None이며, 이는 현재 일부터 가져오게 된다.

period는 데이터를 수집하는 주기를 말한다. count가 200 이하라면 period 옵션은 무시되며, count가 200보다 큰 경우 다른 API와 함께 사용한다면 조회 주기를 늘려주어야 한다.

일봉을 구하는 경우 기준 시간을 직접 지정할 수 있다.

get_daily_ohlcv_from_base 함수를 이용하여 base에 원하는 시간을 입력하면 해당 시간을 기준으로 하루가 계산된다.

5. 암호화폐 호가 조회

암호화폐의 매수/매도 호가 조회는 get_orderbook 함수를 이용한다. 인자로 ticker를 넘겨주고 반환 값으로 딕셔너리로 구성된 리스트를 반환한다.

market은 ticker이고 timestamp는 조회시간(단위 : ms)이며, total_ask_size, total_bid_size는 총 매도/매수 크기를 말한다.

orderbook_units는 딕셔너리가 원소인 리스트이며, ask_price는 매도 호가, bid_price는 매수 호가, ask_size는 매도 호가 수량, bid_size는 매수 호가 수량을 의미한다.

get_orderbook에 여러 ticker를 넘겨주면 마찬가지로 한 번에 여러 암호화폐에 대한 호가를 구할 수 있다.

6. 잔고 조회

잔고를 조회하기 위해서는 API 사용 신청을 한 후 발급받았던 access key와 secret key가 필요하다. 이를 이용하여 Upbit 클래스의 인스턴스를 생성한 후, get_balances 함수를 이용하면 잔고를 조회할 수 있다.

코인을 하고 남은 흔적들이 있다. 현재 원화가 0.68원 정도, 아주 소량의 리플이 존재하는 것을 볼 수 있다.

avg_buy_price는 평균 매수가를 의미하고, avg_buy_price_modified는 평균 매수가가 수정되었는지 여부를 나타낸다.

get_balances 함수는 실제로 get_balances(contain_req=False) -> Union[tuple, None] 로 이루어져 있다.

만약 get_balances에 True를 넣어주면, API를 호출할 수 있는 빈도의 제한을 추가로 반환한다.

API는 각 API마다 어떤 그룹에 속해있고, 그룹 단위로 호출을 제한한다. 위의 결과는 1분에 최대 899번, 1초당 최대 29번 API를 호출할 수 있다는 의미이다.

만약 특정 암호화폐나 원화에 대해서 잔고가 궁금하다면 get_balance 함수를 이용하면 된다.

인자로는 ticker를 넘겨준다.

7. 지정가 매수/매도

지정한 가격에 매도할 때에는 sell_limit_order 함수를, 매수할 때에는 buy_limit_order 함수를 이용한다.

마찬가지로 Upbit 클래스의 인스턴스를 통해서 호출할 수 있다.

buy_limit_order 함수와 sell_limit_order 함수는 다음과 같이 구성되어 있다.

buy_limit_order(ticker, price, volume, contain_req=False) -> Union[tuple, None]

sell_limit_order(ticker, price, volume, contain_req=False) -> Union[tuple, None]

price에 원하는 매수/매도가를 넣고, volume에 매수/매도할 코인 개수를 넣는다.

위의 예시에서는 비트코인을 100만 원에 1개 매수하려는 코드이다. 잔고가 부족하여 에러가 발생했지만, 만약 잔고가 충분하다면 주문 정보는 딕셔너리로 반환된다. (아래 참고)

예시) https://github.com/sharebook-kr/pyupbit

주문을 통해 반환된 딕셔너리에서 uuid는 주문에 대한 고윳값으로, 이 값을 이용해서 주문을 다시 취소하거나 정정할 수 있다.

8. 시장가 매수/매도

시장가 매수/매도는 최우선 매도/매수 호가에 즉시 주문한다.

시장가 매수는 buy_market_order 함수, 매도는 sell_market_order 함수를 이용한다.

buy_market_order(ticker, price, contain_req=False) -> Union[tuple, None]

sell_market_order(ticker, volume, contain_req=False) -> Union[tuple, None]

시장가 매수를 하는 경우에는 매수할 금액을 넣어준다. 수수료가 제외된 금액이므로 만약 10000원 치를 구매한다면 실제로는 수수료 0.05%가 추가된 10005원의 현금을 가지고 있어야 한다.

시장가 매도를 하는 경우에는 매도할 개수를 넣어준다.

9. 주문 취소/조회

주문 취소를 하기 위해선 이전에 주문했던 정보의 uuid를 이용한다. 이 uuid 값을 cancel_order 라는 함수의 인자로 넘겨주면 주문이 취소된다.

cancel_order(uuid, contain_req=False) -> Union[tuple, None]

주문을 조회하기 위해서는 get_order 함수를 이용한다. 형태는 아래와 같다.

get_order(ticker_or_uuid, state='wait', kind='normal', contain_req=False) -> Union[tuple, None]

기본적으로 get_order 함수에 ticker만 넣으면 해당 암호화폐에 대한 미체결 주문 정보가 반환된다.

만약 state를 done으로 할당해주면 완료된 주문 정보가 반환된다.

get_order 함수에 주문의 고유 정보인 uuid를 넣으면 해당 주문에 대한 상세 정보가 반환된다. 이 경우 다른 매개변수들은 무시된다.

(선택) PyTorch 모델을 ONNX으로 변환하고 ONNX 런타임에서 실행하기¶

이 튜토리얼에서는 어떻게 PyTorch에서 정의된 모델을 ONNX 형식으로 변환하고 또 어떻게 그 변환된 모델을 ONNX 런타임에서 실행할 수 있는지에 대해 알아보도록 하겠습니다. ONNX 런타임은 ONNX 모델을 위한 엔진으로서 성능에 초점을 맞추고 있고 여러 다양한 플랫폼과 하드웨어(윈도우, 리눅스, 맥을 비롯한 플랫폼 뿐만 아니라 CPU, GPU 등의 하드웨어)에서 효율적인 추론을 가능하게 합니다. ONNX 런타임은 여기 에서 설명된 것과 같이 여러 모델들의 성능을 상당히 높일 수 있다는 점이 증명되었습니다. 이 튜토리얼을 진행하기 위해서는 ONNX 와 ONNX Runtime 설치가 필요합니다. ONNX와 ONNX 런타임의 바이너리 빌드를 pip install onnx onnxruntime 를 통해 받을 수 있습니다. ONNX 런타임은 버전 3.5에서 3.7까지의 Python과 호환됩니다. 참고 : 본 튜토리얼은 PyTorch의 master 브랜치를 필요로하며 링크 에서 설치할 수 있습니다.

초해상화(super-resolution)란 이미지나 비디오의 해상도를 높이기 위한 방법으로 이미지 프로세싱이나 비디오 편집에 널리 사용되고 있는 방법입니다. 이 튜토리얼에서는 크기가 작은 초해상화 모델을 사용하도록 하겠습니다.

먼저, 초해상화 모델을 PyTorch에서 구현하겠습니다. 이 모델은 “Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network” - Shi et al 에서 소개된 효율적인 서브픽셀 합성곱 계층을 사용하여 이미지의 해상도를 업스케일 인자만큼 늘립니다. 모델은 이미지의 YCbCr 성분 중 Y 성분을 입력값으로 받고 업스케일된 초해상도의 Y 채널 값을 리턴합니다.

아래는 PyTorch 예제의 모델 을 그대로 가져온 것입니다:

위 과정이 끝나면 일반적인 경우에 모델을 학습시키기 시작할 것입니다. 하지만 본 튜토리얼에서는 미리 학습된 가중치들을 사용하도록 하겠습니다. 참고로 이 모델은 높은 정확도에 이를 때까지 학습되지 않았고 본 튜토리얼을 원활히 진행하기 위한 목적으로 사용하는 것입니다.

모델을 변환하기 전에 모델을 추론 모드로 바꾸기 위해서 torch_model.eval() 또는 torch_model.train(False) 를 호출하는 것이 중요합니다. 이는 dropout이나 핍 값 계산 방법 batchnorm과 같은 연산들이 추론과 학습 모드에서 다르게 작동하기 때문에 필요합니다.

이제 Tracing이나 스크립팅을 통해서 PyTorch 모델을 변환할 수 있습니다. 이 튜토리얼에서는 tracing을 통해 변환된 모델을 사용하도록 하겠습니다. 모델을 변환하기 위해서는 torch.onnx.export() 함수를 호출합니다. 이 함수는 모델을 실행하여 어떤 연산자들이 출력값을 계산하는데 사용되었는지를 기록합니다. export 함수가 모델을 실행하기 때문에, 우리가 직접 텐서를 입력값으로 넘겨주어야 합니다. 이 텐서의 값은 알맞은 자료형과 모양이라면 랜덤하게 결정되어도 무방합니다. 특정 차원을 동적 차원으로 지정하지 않는 이상, ONNX로 변환된 그래프의 경우 입력값의 크기는 핍 값 계산 방법 모든 차원에 대해 고정됩니다. 예시에서는 모델이 항상 배치 사이즈 1을 사용하도록 변환하였지만, torch.onnx.export() 의 dynamic_axes 인자의 첫번째 차원은 동적 차원으로 지정합니다. 따라서 변환된 모델은 임의의 batch_size에 대해 [batch_size, 1, 224, 224] 사이즈 입력값을 받을 수 있습니다.

PyTorch의 변환 인터페이스에 대해 더 자세히 알고 싶다면 torch.onnx 문서 를 참고해주세요.

ONNX 런타임에서 변환된 모델을 사용했을 때 같은 결과를 얻는지 확인하기 위해서 torch_out 를 계산합니다.

ONNX 런타임에서의 모델 결과값을 확인하기 전에 먼저 ONNX API를 사용해 ONNX 모델을 확인해보도록 하겠습니다. 먼저, onnx.load("super_resolution.onnx") 는 저장된 모델을 읽어온 후 머신러닝 모델을 취합하여 저장하고 있는 상위 파일 컨테이너인 onnx.ModelProto를 리턴합니다. onnx.ModelProto에 대해 더 자세한 것은 onnx.proto 기술문서 에서 확인하실 수 있습니다. onnx.checker.check_model(onnx_model) 핍 값 계산 방법 는 모델의 구조를 확인하고 모델이 유효한 스키마(valid schema)를 가지고 있는지를 체크합니다. ONNX 그래프의 유효성은 모델의 버전, 그래프 구조, 노드들, 그리고 입력값과 출력값들을 모두 체크하여 결정됩니다.

이제 ONNX 런타임의 Python API를 통해 결과값을 계산해보도록 하겠습니다. 이 부분은 보통 별도의 프로세스 또는 별도의 머신에서 실행되지만, 이 튜토리얼에서는 모델이 ONNX 런타임과 PyTorch에서 동일한 결과를 출력하는지를 확인하기 위해 동일한 프로세스에서 계속 실행하도록 하겠습니다.

모델을 ONNX 런타임에서 실행하기 위해서는 미리 설정된 인자들(본 예제에서는 기본값을 사용합니다)로 모델을 위한 추론 세션을 생성해야 합니다. 세션이 생성되면, 모델의 run() API를 사용하여 모델을 실행합니다. 이 API의 리턴값은 ONNX 런타임에서 연산된 모델의 결과값들을 포함하고 있는 리스트입니다.

이제 PyTorch와 ONNX 런타임에서 연산된 결과값이 서로 일치하는지 오차범위 (rtol=1e-03, atol=1e-05) 이내에서 확인해야 합니다. 만약 결과가 일치하지 않는다면 ONNX 변환기에 문제가 있는 것이니 저희에게 알려주시기 바랍니다.

ONNX 런타임에서 이미지를 입력값으로 모델을 실행하기¶

지금까지 PyTorch 모델을 변환하고 어떻게 ONNX 런타임에서 구동하는지 가상의 텐서를 입력값으로 하여 살펴보았습니다.

본 튜토리얼에서는 아래와 같은 유명한 고양이 사진을 사용하도록 하겠습니다.

cat

먼저, PIL 라이브러리를 사용하여 이미지를 로드하고 전처리하겠습니다. 이 전처리는 신경망 학습과 테스트에 보편적으로 적용되고 있는 전처리 과정입니다.

먼저 이미지를 모델의 입력값 크기(224x224)에 맞게 리사이즈합니다.

그리고 이미지를 Y, Cb, Cr 성분으로 분해합니다.

Y 성분[역자 주: 휘도 성분]은 그레이스케일(회색조) 이미지를 나타내고, Cb 성분은 파란색에서 밝기를 뺀 색차 성분, Cr은 빨강색에서 밝기를 뺀 색차 성분을 나타냅니다. 사람의 눈은 Y 성분에 더 민감하게 반응하기 때문에 저희에게는 현재 이 성분이 중요하고, 이 Y 성분을 변환할 것입니다. Y 성분을 뽑아낸 뒤에, 추출한 Y 성분을 모델의 핍 값 계산 방법 입력값이 될 텐서로 변환합니다.

다음은 리사이즈된 그레이스케일 고양이 이미지 텐서를 앞서 설명했던 것처럼 초해상도 모델에 넘겨주어 ONNX 런타임에서 실행하도록 하겠습니다.

이렇게 하면 모델의 결과값은 텐서가 됩니다. 이제 모델의 결과값을 처리하여 결과값 텐서에서 마지막 최종 출력 이미지를 만들고 이를 저장해보도록 하겠습니다. 후처리 단계는 링크 에 구현되어있는 초해상도 모델 코드에서 가져온 것입니다.

output\_cat

ONNX 런타임은 크로스플랫폼 엔진으로서 CPU와 GPU 뿐만 아니라 여러 플랫폼에서 실행될 수 있습니다.

ONNX 런타임은 Azure Machine Learning Services와 같은 클라우드에 배포되어 모델 추론을 하는데 사용될 수도 있습니다. 더 자세한 내용은 링크 를 참조해주십시오.

ONNX 런타임의 성능에 관한 것은 여기 에서 확인하실 수 있습니다.

ONNX 런타임에 관한 더 자세한 내용은 이 곳 을 참조해 주세요.

Total running time of the script: ( 0 minutes 0.000 seconds)


0 개 댓글

답장을 남겨주세요