AWS Lambda Python 라이브러리 numpy 배포 패키지 만들기 matmul 실행
AWS Lambda 실행 환경
AWS Lambda 실행 환경에서 Python 라이브러리를 설치하고 올려야합니다.
Lambda가 실행되는 환경을 살펴봅시다.
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/current-supported-versions.html
AWS 콘솔에 로그인을하고 여기를 클릭합니다.
AMI를 확인할 수 있습니다. 인스턴스를 실행하기 위해 Launch 버튼을 클릭합니다.
free tier인 t2.micro를 선택하고 Review and Launch 버튼을 클릭합니다.
Launch 버튼을 클릭합니다.
ssh로 접속하기 위한 key pair를 선택하고 I acknowledge 를 체크하고 Launch Instances 버튼을 클릭합니다.
VM 인스턴스 가 실행됩니다. View Instances 버튼을 클릭합니다.
인스턴스가 실행됩니다.
VM 인스턴스를 체크하고 Connect 버튼을 클릭합니다.
다음의 팝업창을 확인하고 터미널로 가봅시다.
다음의 ssh 명령어 접속을 진행합니다.
Numpy 설치를 위한 작업들
$ sudo -i
# yum -y upgrade
# yum -y groupinstall "Development Tools"
# yum install -y gcc zlib zlib-devel openssl openssl-devel atlas-sse3-devel
# yum -y install blas --enablerepo=epel
# yum -y install lapack --enablerepo=epel
# yum -y install Cython --enablerepo=epel
# exit
Python 가상환경 설정 및 라이브러리 설치
Python 2.7 버전으로 라이브러리를 담을 예정입니다.
$ python2.7
$ pip --version
$ sudo pip install --upgrade pip
$ vi ~/.bashrc
마지막 라인에 다음의 PATH를 환경설정으로 추가합니다.
PATH="/usr/local/bin/pip:$PATH"
export PATH
$ source ~/.bashrc
$ pip --version
AWS에서 추천하는 virutalenv를 설치하여 독립적인 가상 환경을 설치합니다.
$ pip install virtualenv
가상 환경을 설정합니다.
$ virtualenv --python=python2.7 lambda_python_build
source 명령어를 이용해 가상 환경으로 접속합니다.
$ source ~/lambda_python_build/bin/activate
$ pip install numpy
numpy가 설치되면서 AMI 환경에 맞는 build가 진행되면서 시간이 오래 걸립니다.
$ ls -1 /usr/lib64/atlas-sse3/
설치된 라이브러리를 패키징으로 압축을 해봅시다.
$ cd ~/lambda_python_build/lib64/python2.7/site-packages/
$ ls
$ cp /usr/lib64/atlas-sse3/* ./
$ ls
$ cp /usr/lib64/libgfortran* ./
$ cp /usr/lib64/libquadmath* ./
$ zip -r9 ~/matmul-function.zip .
AWS Lambda Function 생성
AWS Lambda 콘솔로 이동하여 Create Function 버튼을 클릭합니다.
Lambda 이름을 설정합니다. Python Runtime은 2.7 그리고 Role 설정을 해야합니다.
생성된 Lambda가 보입니다. ARN 주소를 이용할 예정입니다.
AWS Lambda Python 코드 작성
다음은 Lambda의 Python handler를 작성해봅시다.
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-programming-model-handler-types.html
$ vi lambda_function.py
import numpy as np
import time
def lambda_handler(event, context):
A = np.random.rand(event['LR'] , event['LC'])
B = np.random.rand(event['LC'], event['RC'])
start_time = time.time()
C = np.matmul(A, B)
end_time = time.time()
print "A shape : " + str(A.shape)
print "B shape : " + str(B.shape)
print "C shape : " + str(C.shape)
print "latency : " + str(end_time - start_time)
작성이 완료되었으면 압축한 zip 파일에 추가합니다.
$ zip -g matmul-function.zip lambda_function.py
AWSCLI를 위한 Configure 설정
$ aws configure
ACCESS_KEY와 SECRET_ACCESS_KEY 그리고 Lambda의 Region을 입력합니다.
AWS Lambda에 zip 파일 업로드
$ aws lambda update-function-code --function-name [FUNCTION-ARN] --zip-file fileb:/[ZIP-FILE-PATH]
$ aws lambda update-function-code --function-name arn:aws:lambda:us-east-1:741926482963:function:matmul --zip-file fileb://matmul-function.zip
업로드가 완료되었습니다.
AWS Lambda TEST
콘솔에서 테스트를 실행해봅시다.
Select a test event.. 옆의 down-arrow 버튼을 클릭하고 Configure test events 버튼을 클릭합니다.
Event name에 이벤트 이름을 입력합니다.
입력 받을 인자를 JSON 형식으로 입력합니다. Create 버튼을 클릭합니다.
128MB 메모리 크기에 대해서 실행 가능한 매트릭스의 크기를 늘려봅시다.
우선 실행 시간을 설정합니다. 3분으로 설정합니다.
이벤트 설정에 들어가서 Matrix의 크기를 늘려봅시다.
마지막 REPORT 를 살펴보면 Max Memory Used를 통해 사용된 메모리의 양을 볼 수 있습니다.
2배로 다시 늘려보고 실행해보겠습니다. 오류가 발생합니다.
메모리의 크기를 늘려봅시다. 1024 MB로 늘립니다. Save 버튼을 클릭하고 다시 Test 합니다.
잘 동작하네요.
좀 더 크기를 늘려봅시다. 2배로
105초 정도 소요되네요. 메모리 크기를 늘린다면 소요시간이 줄어들지 확인해봅시다 2048 MB, Lambda 최대 메모리인 3008 MB로 설정하고 돌려보겠습니다.
확실히 시간이 개선이 됩니다. 75초, 45초로 개선이 되네요
이상 글을 마치겠습니다.