2. 본 강연에서 다룰 내용
목차
1. Motivation - Udacity 수업
2. Spot Price란? - Region별 가격 Query하기
3. AWS CLI로 Spot Fleet Request 요청하기
4. Tensorflow Optimization on P2 Instance
5. 마무리 앞으로...
12. Spot Instance의 단점
{
"Message": "Your Spot instance was terminated because the number of Spot requests with
equal or higher prices exceeds the available capacity in this pool.",
"Code": "instance-terminated-capacity-oversubscribed",
"UpdateTime": "2017-06-22T17:30:37.000Z"
}
Spot Price로 요청하는 경우 위의 경우 처럼 Instance가 강제 종료될 위험
추가적으로 Instance Monitoring이 필요 종료 ( 종료 2분전 Message )
언제나 종료될 수 있는 가정하에 코드 작성 및 결과물 백업을 수행
1. Spot Fleet Request 옵션중 Block Durations 이용 (최대 6시간)
2. 다른 Spot 또는 On Demand로 이동 - 단, Monitoring 필요
다른 Spot으로 이동하는 예 https://github.com/atramos/ec2-spotter
13. AWS Spot Block 소개
1. 일반적인 요청 (Request)
2. 지정한 숫자를 유지 (Maintain)
3. 시간동안 유지 (Duration) - Batch성 작업에 적합
14. Instance Limit Check!
EC2에서 Limits를 보시면 On-Demand로 사용가능한 인스턴스 개수를 알 수 있습니다.
유저가 알수는 없지만 P2의 경우 Spot Limit도 존재 한다고 하니 Request Limit Increase로 요청시 Spot
Limit을 명시하여 요청 하셔야 합니다.
16. AWS Command Line Interface
● AWS CLI Reference Site
○ http://docs.aws.amazon.com/cli/latest/reference/index.html#cli-aws
● 사용 예제 사이트
○ http://awscli.com
○ https://cloudacademy.com/blog/aws-cli-10-useful-commands/
○ https://www.codementor.io/michaelwittig/tips-and-tricks-aws-command-line-ninjas-du1089vpf
○ http://blog.xi-group.com/2015/01/small-tip-how-to-use-aws-cli-filter-parameter/
AWS 명령을 쉽게 내릴 수 있어 자동화 가능
만들어 놓으면 재사용이 가능합니다
콘솔 클릭이 처음에는 편하나
같은 클릭을 매번 하셔서서 클릭이 귀찮아 지시는
분들께...
17. Spot Fleet Request에 필요한 항목들
1. Instance Type 정하기
a. p2.xlarge
2. Region 정하기
a. Spot Fleet은 Region
b. Spot Request는 AZ
3. AMI Image 정하기
a. Amazon 제공 Image
4. Role 지정
5. 그외 Security Group (SSH), Key, Instance Profile, Userdata
20. AWS CLI - 1 Spot Price Query
AWS CLI이외에도 AWS에서 제공하는 Wep API
SDK등을 이용하는 방법이 있습니다.
python SDK 예: https://github.com/Jakobovski/aws-spot-bot
21. AWS CLI - 2 AMI Image ID
1. Amazon에서 제공하는 Deeplearning AMI를 Region별 AMI Image를 구합니다.
2. Ubuntu 14.04와 Amazon Linux 버전을 제공합니다. TF v1.1
a. Amazon https://aws.amazon.com/marketplace/pp/B01M0AXXQB
b. Ubuntu https://aws.amazon.com/marketplace/pp/B06VSPXKDX
REGION="us-east-1"
AMI_TYPE="Ubuntu" # Allowed values are Ubuntu, Amazon
AMI_ID=`aws ec2 describe-images --output text --region $REGION
--executable-users all --query "Images[*][ImageId]"
--filters Name="owner-id",Values="898082745236"
Name="name",Values="*${AMI_TYPE}*Jun2017*"`
if [ -n "$AMI_ID" ]; then echo $AMI_ID; else "AMI_ID Not Found"; fi
22. AWS CLI - 3 Key
Key를 다운 받으려면 Console에 접근 해야 함으로
사용하고 있는 Key를 AWS에 등록 합니다.
#REGION="us-east-1"
#KEY_FILE="~/.ssh/id_rsa.pub"
#PROJECT="AWSKRUG"
KEY_ID=`aws ec2 describe-key-pairs --output text --region $REGION
--filter Name="key-name",Values="$PROJECT" --query 'KeyPairs[*].KeyName'`
if ! [ -n "$KEY_ID" ]; then echo "KeyName $PROJECT Not Found"
if [ -n "$KEY_FILE" ]; then echo "Creating Key $PROJECT"
KEY_BODY=`cat $KEY_FILE`
KEY_ID=`aws ec2 import-key-pair --region $REGION --output text
--query 'KeyName' --key-name "$PROJECT" --public-key-material
"$KEY_BODY" `
else echo "export KEY_FILE=<YOUR_KEY_FILE>";
fi;
fi; echo $KEY_ID;
23. AWS CLI - 4 Security Group
Public IP로 접근하려면 아래 포트들을 Security Group에서 허용 해야 합니다.
보안상 현재 NAT Gateway가 물려있는 공인 IP로만 허용합니다.
Jupyter Notebook:8888, TensorBoard:6006, SSH:22
SG_ID=`aws ec2 describe-security-groups --output text --region $REGION
--filter Name="group-name",Values="$PROJECT" --query "SecurityGroups[*].GroupId"`
if ! [ -n "$SG_ID" ]; then echo "Security Group $PROJECT Not Found"
echo "Creating Security Group $PROJECT"
SG_ID=`aws ec2 create-security-group --output text --region $REGION
--group-name $PROJECT --description $PROJECT`
# Get current IP Address
IP_ADDR=`curl -s checkip.amazonaws.com`
# Allowing for 22, 8888, 6006
aws ec2 authorize-security-group-ingress --region $REGION --group-name $PROJECT
--protocol tcp --port 22 --cidr "${IP_ADDR}/32"
aws ec2 authorize-security-group-ingress --region $REGION --group-name $PROJECT
--protocol tcp --port 8888 --cidr "${IP_ADDR}/32"
aws ec2 authorize-security-group-ingress --region $REGION --group-name $PROJECT
--protocol tcp --port 6006 --cidr "${IP_ADDR}/32"
fi; echo $SG_ID