
GPU
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
Amazon EC2 ã§ AMI äžã§å©çšã§ããã€ã³ã¹ã¿ã³ã¹ã¿ã€ããæå®ã§ããããã«ãªããŸãã ããã®AMIããã£ããé¢ä¿ãªãã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã§èµ·åãããŠèµ·å倱æãããã¿ãããªäºæ
ãå°å³ã«èµ·ããã¡ã§ãã ä»åãAMIåŽã«å©çšã§ããã€ã³ã¹ã¿ã³ã¹ã¿ã€ããå®çŸ©ã§ããã¢ããããŒããå
¥ã£ãã®ã§ãå®éã«è§Šã£ãŠæåã確èªããŠã¿ãŸããã Amazon EC2 ã AMI ãšäºææ§ã®ããã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã®æå®ããµããŒã 察象ãšããŠããèªè
ç¬èªAMIãé
åžã»éçšããŠããŠãæå³ããªãã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã§èµ·åãããã®ãé²ãããæ¹ ARMãGPUãªã©ç¹å®ã¢ãŒããã¯ãã£å°çšã®AMIãããã£ããé察å¿ã®ã€ã³ã¹ã¿ã³ã¹ã¿âŠ
ã¯ããã« # ãªãŒãã³ãœãŒã¹LLMãæ¥éã«é²åããäžããæ©å¯æ
å ±ã瀟å
ã³ãŒããæ°ã«ããæ±ãããèªåå°çšã®ããŒã«ã«LLMç°å¢ã欲ãããªããšæãç«ã¡ãŸããã ãã ãããæ¬æ Œçã«æå
ïŒãªã³ãã¬ãã¹ïŒã§åããããšãããšã倧容éVRAMãç©ãã GPUæèŒPCãå¿
èŠã«ãªãã 調éããã®ã«æ°åäžåãã®åæè²»çšïŒã€ãã·ã£ã«ã³ã¹ãïŒ ãããã£ãŠããŸããŸããããŸãã¯å¹æãããã詊ããŠã¿ããããšããæ€èšŒæ®µéã§ããããªãé«é¡ãªããŒããŠã§ã¢è³Œå
¥çšè°ãéãã®ã¯ããŒãã«ãé«ããã®ã§ãã ã ãããããåææè³ãŒãã»äœ¿ã£ãæéåã ãïŒæ°ååãæ°çŸååäœïŒã§ããã«å§ããããäžèŠã«ãªãã°ãã€ã§ãæ€éã§ãã ãã¹ã¢ãŒã«ã¹ã¿ãŒãããšããã¯ã©ãŠãæå€§ã®å©ç¹ ãæŽ»ãããããšèããŸããã ãã¯ã©ãŠãäžã§æè»œã«LLMãåããã«ã¯ã©ãããã°ãããâŠâŠããšæããå·¡ãããŠãããšãããããžã¡ã³ãã³ã³ãœãŒã«ããæåã§GPUã€ã³ã¹ã¿ã³ã¹ãç«ã¡äžããŠã»ããã¢ããããæ¹æ³ãèããŸããã ããããã€ã³ãã©ãšã³ãžãã¢ãšããŠå®çšçãªéçºç°å¢ã暡玢ããäžã§ãã©ãããŠã倧äºã«ãããæ³ããæ¹§ããŠããŸããã ãããããç»å Žããæ§ã
ãªãªãŒãã³ãœãŒã¹ã¢ãã«ããæ°å
Œããªãã©ãã©ã詊ããç°å¢ã«ãããïŒã 次ã
ãšæ°ããã¢ãã«ããªãªãŒã¹ãããæšä»ãã¢ãã«ãå
¥ãæ¿ãããæ€èšŒããããããã³ã«æåã§ã»ããã¢ãããç¹°ãè¿ãã®ã¯å€§å€ã§ããã䜿ã£ãŠããªãæéã«å€§å®¹éã¹ãã¬ãŒãžïŒEBSïŒã®ç¶æè²»ïŒæé¡1,500å匷ïŒãçºçãç¶ããã®ãé¿ããããšããã§ãã ãŸããã䜿ãçµãã£ããæåã§åæ¢ã»åé€ãããããšæã£ãŠããŠãããã£ãã忢ãå¿ããŠæãã¬èª²éãçºçããŠããŸããªã¹ã¯ãé²ããããšããã§ãã ããã§ä»åã¯ãããããæ§ã
ãªã¢ãã«ãå¿«é©ã«è©ŠããŠããããã®åå°ãšããŠã ãèµ·åã®å
šèªååïŒUserDataïŒã ãš ã䜿ããªãæéã®åºå®è²»ã»ãŒãŒãåïŒS3ã¢ãã«ä¿ç®¡ ïŒ EBSå³æç Žæ£ïŒã ãäž¡ç«ãããšãã§ã¡ã©ã«ïŒäœ¿ãæšãŠïŒæšè«åºç€ãæ§ç¯ããŸããã ä»åæ§ç¯ããã¢ãŒããã¯ãã£ã®ãŽãŒã« # Linux (Ubuntu 22.04 Deep Learning AMI) à UserData ã«ããå®å
šç¡äººã»ããã¢ãã ã¢ãã«ããŒã¿ã¯S3ãã³ã³ããã€ã¡ãŒãžã¯ECRã«éé¿ãããèµ·åæã«åäžãªãŒãžã§ã³éïŒè»¢éæç¡æïŒã§é«éåæã»Pull é«ã¹ã«ãŒãããæšè«ãšã³ãžã³ãvLLMããDockerã³ã³ããã§èªåèµ·å æ€èšŒåŸã¯ã€ã³ã¹ã¿ã³ã¹ããšå³åº§ã«ãçµäºïŒTerminateïŒãããŠEBSãç Žæ£ïŒ 忢æã®ä¿æã³ã¹ãã»ãŒãŒãéçš ãã®æ§æãäœã£ãŠããã°ãã¢ãã«ã®å·®ãæ¿ããS3ã®ãã¹ãå€ããã ãã§æžã¿ããã€ã§ãã³ãã³ãäžçºã§ææ°ã®ãªãŒãã³ãœãŒã¹LLMãå®å
šã»æå®ã§è©ŠãæŸé¡ã«ãªããŸãã ã¯ã©ãŠãèªå®å
šå ãšã³ãžãã¢ã®èŠç¹ãããã³ã¹ããšèªååã远æ±ããæ§ç¯æé ã詳ããã玹ä»ããŸãïŒ å
šäœã¢ãŒããã¯ãã£ãšãšãã§ã¡ã©ã«èšèš # ä»åã®å
šäœæ§æã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã flowchart TD subgraph ClientEnv ["ã¯ã©ã€ã¢ã³ãç°å¢ / éçºPC"] Client["éçºè
端æ«<br>(curl / APIåŒã³åºã)"] LaunchScript["èµ·åã¹ã¯ãªãã<br>(03_ec2_launch.sh)"] end subgraph AWS ["AWS æ±äº¬ãªãŒãžã§ã³ (ap-northeast-1)"] subgraph EC2Env ["EC2: g6.xlarge (äœ¿ãæšãŠ)"] UserData["UserData ã¹ã¯ãªãã<br>(èµ·åæã«å®å
šèªåå®è¡)"] vLLM["Docker: vLLM OpenAI Server<br>(Port 8000)"] UserData -->|èµ·åæåæ| LocalStorage[("/data/models<br>(ç¡æNVMe SSD 250GB: è¶
çéI/O)")] LocalStorage --> vLLM end S3[("Amazon S3<br>s3://my-llm-models-tokyo<br>(ã¢ãã«æ°žç¶ä¿ç®¡)")] ECR[("Amazon ECR<br>vllm-openai:latest<br>(ã³ã³ããä¿ç®¡)")] S3 -->|åäžãªãŒãžã§ã³é é«éåæ<br>ãããŒã¿è»¢éæ: å®å
šç¡æã| LocalStorage ECR -->|åäžãªãŒãžã§ã³é é«éPull<br>ãããŒã¿è»¢éæ: å®å
šç¡æã| vLLM end LaunchScript -->|1. EC2èµ·å & IPååŸ| EC2Env Client -->|"2. OpenAIäºæAPIåŒã³åºã<br>(/v1/chat/completions)"| vLLM ãã®æ§æã®ãã€ã³ã # å®å
šãšãã§ã¡ã©ã«ïŒäœ¿ãæšãŠïŒãªEC2éçš : éããã¢ãã«æ¬äœïŒçŽ15GBïŒã¯Amazon S3ã«ãvLLMã³ã³ããã€ã¡ãŒãžã¯Amazon ECRã«æ°žç¶åããŠãããŸããEC2èµ·åæã«UserDataçµç±ã§S3ã»ECRããããŒã«ã«ã«ãµããšåŒãåºããæ€èšŒãçµãã£ããEC2ãèºèºãªãã TerminateïŒçµäºïŒ ãããŸããã«ãŒãããªã¥ãŒã ãèªåç Žæ£ããããããé«äŸ¡ãªEBSã®æŸçœ®èª²éãå®å
šã«æé€ã§ããŸãã ç¡æä»å±ã®ããŒã«ã«NVMe SSDïŒã€ã³ã¹ã¿ã³ã¹ã¹ã㢠250GBïŒããã«æŽ»çš : g6.xlarge ã«ã¯è¿œå è²»çš 0 åïŒç¡æïŒã§ 250GB ã®ããŒã«ã« NVMe SSDïŒã€ã³ã¹ã¿ã³ã¹ã¹ãã¢ïŒ ãæåããä»å±ããŠããŸããäžè¬çã«ã€ã³ã¹ã¿ã³ã¹ã¹ãã¢ã¯ã忢ãçµäºã§ããŒã¿ãæ®çºïŒæ¶æ»
ïŒãããããæ¬é ãããã¡ã§ãããæ¬æ§æã¯ ãéã¿ã¯S3ãã³ã³ããã¯ECRã«æ°žç¶åããEC2ã¯äœ¿ãæšãŠãã ãšããèšèšã®ãããæ®çºæ§ãäžåãã¡ãªããã«ãªããŸãããPCIe çŽçµã®çé I/OïŒ1,000ã2,000MB/sè¶
ïŒããã«æŽ»çšããŠã¢ãã«ã®GPUããŒãæéãåæ°ç§ã¬ãã«ã«ççž®ãã€ã€ãã«ãŒãEBS容éã 100GB â \rightarrow â 40GB ïŒâ»DLAMIã®ã¹ãããã·ã§ããå¶çŽäžã®æå°ãµã€ãºïŒãžå€§å¹
ã¹ãªã åã§ããŸãã 忢æã®ç¶æã³ã¹ãã¯ãã»ãŒãŒãïŒæé¡çŽ145åïŒãïŒããŠã³ããŒã転ééã¯å®å
šç¡æ : ãS3ãECRã«çœ®ããšããŠããä¿ç®¡æã転éæéããããã®ã§ã¯ïŒããšå¿é
ã«ãªããããããŸããããå®è³ªçãªã³ã¹ãã¯ã»ãŒç¡èŠã§ããã¬ãã«ã§ãïŒâ»1ãã«=165åæç®ïŒïŒ S3 Standardä¿ç®¡æ : 15GB à $0.025/GB = æé¡ çŽ$0.38ïŒçŽ 62 å / æïŒ ECRä¿ç®¡æ : å§çž®ã³ã³ããã€ã¡ãŒãž çŽ5GB à $0.10/GB = æé¡ çŽ$0.50ïŒçŽ 83 å / æïŒ åèšä¿ç®¡ã³ã¹ã : æé¡ çŽ$0.88ïŒçŽ 145 å / æïŒ ããŒã¿è»¢éæïŒS3 / ECR â \rightarrow â EC2ïŒ : åäžãªãŒãžã§ã³ïŒæ±äº¬ïŒé転éã®ãã å®å
šç¡æïŒ0 åïŒ EBSä¿æãšã®æ¯èŒ : ããåã100GBã®EBSããªã¥ãŒã ïŒgp3ïŒãåæ¢ç¶æ
ã§ä¿æãç¶ãããš æé¡ çŽ$9.6ïŒçŽ 1,584 å / æïŒ ãæº¶ãç¶ããŸããS3ãšECRã«éããããšã§ çŽ91%ã®ã³ã¹ãåæž ã«ãªãã䜿ããªãæã®ç¶æè²»ããããçŽ145åã«æããããŸãã Docker Hub ã§ã¯ãªã Amazon ECR ã䜿ãçç± : vLLM ã®å
¬åŒã€ã¡ãŒãžã¯ Docker HubïŒ vllm/vllm-openai:latest ïŒã§ãé
åžãããŠããŸãããã€ã³ã¿ãŒãããçµç±ã§ã®ããŠã³ããŒããšãªããããåç·æ··éã Docker Hub ã®å¿åã¬ãŒããªãããïŒPull åæ°å¶éïŒã«ééãããªã¹ã¯ããããŸããåäžãªãŒãžã§ã³ã® ECR ã«é
眮ããããšã§ãAWS å
éšã®è¶
é«éããã¯ããŒã³çµç±ã§å®å®ããŠçé Pull ãå¯èœã«ãªããŸãã vLLM ã®æ¡çš : PagedAttentionæè¡ã«ãããé«ã¹ã«ãŒããããã€çã¡ã¢ãªã§å€§èŠæš¡ã¢ãã«ãæ±ããæšè«ãšã³ãžã³ãvLLMããDockerã§èµ·åããŸããæšæºã§OpenAIäºæAPIïŒããŒã8000ïŒãå
¬éããŠããããããæ¢åã®æ§ã
ãªAIããŒã«ãã¹ã¯ãªãããããã®ãŸãŸå©çšå¯èœã§ãã äºåæºåã»åææ¡ä»¶ # æ¬æé ãé²ããã«ããããããŒã«ã«ç«¯æ«åŽã«ä»¥äžã®ããŒã«ãã»ããã¢ãããããŠããããšãåæãšããŸãã AWS CLI : S3ãã±ããã®äœæãEC2ã®èµ·åã«äœ¿çšããŸããé©åãªæš©éïŒS3ã»EC2ãžã®ã¢ã¯ã»ã¹æš©ïŒãæã€IAMãŠãŒã¶ãŒ/ããŒã«ã§ aws configure ãæžãŸããŠãããŠãã ããã Hugging Face CLI ( huggingface-cli ) : ã¢ãã«ã®ããŠã³ããŒãã«äœ¿çšããŸããPythonç°å¢ã§ä»¥äžãå®è¡ããŠã€ã³ã¹ããŒã«ããŸãã pip install -U "huggingface_hub[cli]" â»ãªããLlamaç³»ãGemmaç³»ãªã©ã®å©çšèŠçŽãžã®åæãå¿
èŠãªã²ãŒãããã¢ãã«ããããã¯ã¬ãŒãå¶éãåé¿ããŠå®å®ããŠã³ããŒããããå Žåã¯ãäºåã« huggingface-cli login ãå®è¡ã㊠Hugging Face ã®ã¢ã¯ã»ã¹ããŒã¯ã³ãèšå®ããŠãããŸãããã jq : ã¹ã¯ãªããå
ã§JSONè§£æãè¡ããããã€ã³ã¹ããŒã«ïŒ sudo apt install jq ã brew install jq çïŒããŠãããšäŸ¿å©ã§ãã ãæéèŠãAWS Service QuotasïŒGPUã€ã³ã¹ã¿ã³ã¹ã®å²ãåœãŠäžéç·©åïŒ : AWSã®åæã¢ã«ãŠã³ããå€ãã®ç°å¢ã§ã¯ãGPUã€ã³ã¹ã¿ã³ã¹ïŒGç³»ã»Pç³»ïŒã®èµ·åå¯èœæ°ïŒvCPUæ°ïŒã ããã©ã«ãã§ã0ã ã«èšå®ãããŠããŸãããã®å¶éãè§£é€ããªããšãEC2èµ·åæã« VcpuLimitExceeded ãšã©ãŒãçºçããŠèµ·åã«å€±æããŸãã 察象ã¯ã©ãŒã¿å : Running On-Demand G and VT instances ïŒãªã³ããã³ã G ããã³ VT ã€ã³ã¹ã¿ã³ã¹ã®å®è¡ïŒ ç³è«å Žæ : AWSãããžã¡ã³ãã³ã³ãœãŒã« â ãService Quotasã â ãAmazon Elastic Compute Cloud (Amazon EC2)ã å¿
èŠvCPUæ° : g6.xlarge 㯠1å°ããã 4 vCPU ãæ¶è²»ããŸãã â ïž ãªãŒãžã§ã³ããšã«ç³è«ãå¿
èŠ : ã¯ã©ãŒã¿ã¯ãªãŒãžã§ã³åäœã§ç¬ç«ããŠç®¡çãããŠããŸããæ±äº¬ãªãŒãžã§ã³ã§å¶éè§£é€ããŠããªã¬ãŽã³ãããŒãžãã¢ã«ã¯åæ ãããŸããã®ã§ãå¿
ãã€ã³ã¹ã¿ã³ã¹ãç«ã¡äžãããªãŒãžã§ã³ïŒä»åã¯æ±äº¬: ap-northeast-1 ïŒãéžæããç¶æ
ã§ç³è«ããŠãã ããã ð¡ å©çšå®çžŸã«ããå²ãåœãŠå¶é : ã¢ã«ãŠã³ãã«GPUã€ã³ã¹ã¿ã³ã¹ã®å©çšå®çžŸããŸã ãªãå Žåãç³è«æã«ã8ããã16ããªã©ãåžæããŠãããŸã㯠ã4ãã®ã¿ãæ¿èªã»å²ãåœãŠããã ã®ãéäŸã§ãïŒ1å°åããåã«ã¯4ã§ååã§ãïŒã â±ïž è§£é€éç¥ãŸã§ã®æèŠæé : AWSå
¬åŒã«ã¯ãæ°æ¥ãããå Žåãããããšæ¡å
ãããŠããŸããã çè
ã®å®éã®æ€èšŒç°å¢ã§ã¯ãç³è«ããããã3ã4æéã»ã©ã§è§£é€å®äºïŒæ¿èªïŒã®éç¥ã¡ãŒã«ãå±ããŸãã ããšã¯ããå³æåæ ã§ã¯ãªããããæ€èšŒãæãç«ã£ããçã£å
ã«ç³è«ãåºããŠããããšã匷ãããããããŸãïŒ ç°å¢æ§ç¯ã¹ããã # ããã§ã¯ãå®éã«ç°å¢ãäœã£ãŠãããŸããããæ§ç¯ã«å¿
èŠãªè³æã¯ãã¹ãŠã¹ã¯ãªããåããŠãããŸãã å
±éèšå®ãã©ã¡ãŒã¿ïŒç°å¢å€æ°äžèŠ§ïŒ # æ¬æé ã§å©çšããã¹ã¯ãªããçŸ€ïŒ 01_sync_assets.sh , 02_ec2_userdata.sh , 03_ec2_launch.sh , 04_ec2_terminate.sh ïŒã¯ãç°å¢å€æ°ãéããŠæè»ã«æåãã«ã¹ã¿ãã€ãºã§ããããã«èšèšãããŠããŸãã å¿
èŠã«å¿ããŠãäºåã«ã¿ãŒããã«ã§ export ããŠæå®ããããã¹ã¯ãªããå
é ã®ããã©ã«ãå€ãç·šéããŠãã ããã ç°å¢å€æ°å ããã©ã«ãå€ å¿
é /ä»»æ 説æã»èšå®äŸ AWS_REGION ap-northeast-1 ä»»æ ãããã€å
ã®AWSãªãŒãžã§ã³ïŒæ±äº¬: ap-northeast-1 , ãªã¬ãŽã³: us-west-2 ãªã©ïŒ S3_BUCKET_NAME my-llm-models-tokyo èŠå€æŽ ã¢ãã«éã¿ãä¿ç®¡ããS3ãã±ããåïŒâ»å
šäžçã§äžæã®ååãæå®ããŠãã ããïŒ HF_MODEL_ID Qwen/Qwen2.5-Coder-7B-Instruct ä»»æ Hugging Faceäžã®ã¢ãã«èå¥åïŒè©ŠããããªãŒãã³ãœãŒã¹ã¢ãã«ãæå®å¯èœïŒ SERVED_MODEL_NAME Qwen/Qwen2.5-Coder-7B-Instruct ä»»æ OpenAIäºæAPIã§å€éšïŒã¯ã©ã€ã¢ã³ãïŒã«å
¬éã»èŠæ±ããã¢ãã«å DOCKER_IMAGE vllm/vllm-openai:latest ä»»æ 䜿çšããvLLMã€ã¡ãŒãžïŒECRã®URIããŸãã¯Docker Hubã®ã€ã¡ãŒãžåïŒ INSTANCE_TYPE g6.xlarge ä»»æ GPUã€ã³ã¹ã¿ã³ã¹ã¿ã€ãïŒ g6.xlarge : NVIDIA L4 24GB VRAM ïŒ 250GB NVMeä»å±ïŒ EBS_SIZE_GB 40 ä»»æ ã«ãŒãEBSãµã€ãºïŒGBïŒãã¢ãã«ãDockerã¯NVMeã«çœ®ããããDLAMIæå°ã¹ãããã·ã§ãããµã€ãºã®40GBã§åå IAM_ROLE_NAME EC2-S3-ECR-ReadOnly-Profile ä»»æ EC2ã«ã¢ã¿ããããIAMãããã¡ã€ã«åïŒæªäœææã¯ã¹ã¯ãªãããèªåçæïŒ SECURITY_GROUP_IDS (æªæå®æã¯èªåäœæ) ä»»æ é©çšããã»ãã¥ãªãã£ã°ã«ãŒãIDïŒç©ºã®å Žåã¯ããŒã8000/22ãéæŸããSGãèªåçæïŒ KEY_NAME (æªæå®) ä»»æ SSHæ¥ç¶çšã®ããŒãã¢åïŒSSHãã³ãã«ãOSå
ãããã°ãè¡ãå Žåã«æå®ïŒ MAX_MODEL_LEN 4096 ä»»æ vLLMã®æå€§ã³ã³ããã¹ãããŒã¯ã³é·ïŒé·æãæ±ãå Žå㯠8192 çã«èª¿æŽïŒ GPU_MEMORY_UTILIZATION 0.85 ä»»æ vLLMãäºå確ä¿ããGPUã¡ã¢ãªïŒVRAMïŒã®å²åïŒ0.85ã0.90ãæšå¥šïŒ --> Information ð¡ æçã§å§ããå Žåã®èšå®äŸ S3ãã±ããåã ããèªèº«ã®äžæãªååã«èšå®ããã°ããã®ä»ã®ãã©ã¡ãŒã¿ã¯ãã¹ãŠããã©ã«ãå€ã®ãŸãŸããã«èµ·åå¯èœã§ãã export AWS_REGION="ap-northeast-1" # ã¢ã«ãŠã³ãIDãä»äžããŠäžæãªãã±ããåã«ããäŸ export S3_BUCKET_NAME="my-llm-models-$(aws sts get-caller-identity --query Account --output text)-tokyo" Step 1: S3ãžã®ã¢ãã«é
眮 ïŒ ECRãžã®ã³ã³ããã€ã¡ãŒãžç»é² # ãŸãã¯ã¢ã»ããã®æ¯èŠãšãªã S3 ãã±ãããš Amazon ECR ãªããžããªãæ±äº¬ãªãŒãžã§ã³ã«çšæããã¢ãã«éã¿ãšã³ã³ããã€ã¡ãŒãžãç»é²ããŠãããŸããä»åã¯ã³ãŒãã£ã³ã°ç¹ååãšããŠé«ãå®çžŸãšå®è©ãèªãå®çªãªãŒãã³ãœãŒã¹ã¢ãã« Qwen/Qwen2.5-Coder-7B-Instruct ãäŸã«é²ããŸãïŒâ»å¥œã¿ã®ã¢ãã«ãéžã³ããæ¹ã¯ Hugging Face ModelsäžèЧ ããæ¢ããŠã¿ãŠãã ããïŒã --> Information ð¡ æ¬æ§æïŒg6.xlarge / 24GB VRAMïŒã§åãããã¢ãã«ã®éžå®åºæº ãQwen以å€ã®ãªãŒãã³ãœãŒã¹ã¢ãã«ã詊ãããå Žåãã©ãéžã¹ã°ãããïŒãã®ç®å®ããŸãšããŸããã ãã©ã¡ãŒã¿èŠæš¡ã®ç®å®ïŒVRAM 24GB ã®å¶çŽïŒ : 7Bã9B ã¯ã©ã¹ïŒbfloat16 / fp16ïŒ : æãããããïŒã¹ã€ãŒãã¹ãããïŒ ãéã¿ïŒçŽ14ã18GBïŒãå±éããŠãKVãã£ãã·ã¥ã«çŽ4ã8GBæ®ãã4Kã8KããŒã¯ã³ãäœè£ã§åŠçã§ããŸãïŒäŸ: Qwen/Qwen2.5-Coder-7B-Instruct , meta-llama/Llama-3.1-8B-Instruct , google/gemma-2-9b-it , google/gemma-4-E4B-it ïŒã 14B ã¯ã©ã¹ : ç¡éååïŒbfloat16: çŽ28GBïŒã§ã¯24GBã«åãŸããŸãããã AWQ / GPTQ / FP8 ãªã©ã®éååçïŒçŽ8ã10GBïŒ ãéžã¹ã°24GB VRAMã§å¿«é©ã«åäœããŸãïŒäŸ: Qwen/Qwen2.5-14B-Instruct-AWQ ïŒã 32B ã¯ã©ã¹ : AWQïŒ4bit: çŽ17GBïŒã§åäœå¯èœã§ãããKVãã£ãã·ã¥ã®æ®äœãå°ãªããªãããé·æåŠçã«ã¯ã³ã³ããã¹ãå¶éãå¿
èŠã§ãã ã¢ãŒããã¯ãã£ïŒGQAã¢ãã«ãæšå¥šïŒ : GQAïŒGrouped Query AttentionïŒ ãæ¡çšããã¢ãã«ïŒQwen 2.5ç³»ãLlama 3.1ç³»ãGemma 2ç³»ãªã©ïŒã¯KVãã£ãã·ã¥ã®ã¡ã¢ãªæ¶è²»ã極ããŠå°ãããããé·æãé«ã¹ã«ãŒãããæšè«ã«æé©ã§ããå代Gemma 7Bã®ãããªMHAïŒMulti-Head AttentionïŒã¢ãã«ã¯KVãã£ãã·ã¥ãå€§éæ¶è²»ããããã³ã³ããã¹ãé·ãæ§ããã«ããå¿
èŠããããŸãã ã¢ãã«çš®å¥ïŒå¿
ããInstruct / Chatããéžã¶ïŒ : ãã£ããAPIãClaude Codeçã®ãšãŒãžã§ã³ãããåŒã³åºãã«ã¯ãæç€ºè¿œåŸã»å¯Ÿè©±çšãã¥ãŒãã³ã°ãæœããã -Instruct ã -it ã -Chat ãä»ããã¢ãã«ãæå®ããŠãã ããïŒç¡å°ã®ããŒã¹ã¢ãã«ã¯æç« ã®ç¶ããè£å®ããã ãã«ãªããã察話ã§ããŸããïŒã Hugging Face Gatedã¢ãã«ã®æ³šæç¹ : Llamaç³»ãGemmaç³»ãªã©å©çšèŠçŽãžã®åæãå¿
èŠãªã¢ãã«ã¯ãäºåã«Hugging Faceäžã§æ¿èªïŒAcknowledge licenseïŒãè¡ããååS3åææã« HF_TOKEN ãå¿
èŠã«ãªããŸãïŒS3æ ŒçŽåŸã¯EC2åŽã§ã®ããŒã¯ã³ç®¡çã¯äžèŠã§ãïŒã 以äžã®ã¹ã¯ãªããïŒ 01_sync_assets.sh ïŒãå®è¡ããŸãã #!/bin/bash set -euo pipefail AWS_REGION="ap-northeast-1" AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) S3_BUCKET_NAME="my-llm-models-tokyo" MODEL_ID="Qwen/Qwen2.5-Coder-7B-Instruct" LOCAL_MODEL_DIR="/tmp/models/${MODEL_ID}" ECR_REPO_NAME="vllm-openai" ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME}:latest" # 1. æ±äº¬ãªãŒãžã§ã³ã«S3ãã±ãããäœæ if ! aws s3api head-bucket --bucket "${S3_BUCKET_NAME}" 2>/dev/null; then aws s3api create-bucket \ --bucket "${S3_BUCKET_NAME}" \ --region "${AWS_REGION}" \ --create-bucket-configuration LocationConstraint="${AWS_REGION}" fi # 2. Hugging Faceããã¢ãã«ãããŠã³ããŒãããŠS3ãžåæ mkdir -p "${LOCAL_MODEL_DIR}" huggingface-cli download "${MODEL_ID}" --local-dir "${LOCAL_MODEL_DIR}" --local-dir-use-symlinks False aws s3 sync "${LOCAL_MODEL_DIR}" "s3://${S3_BUCKET_NAME}/models/${MODEL_ID}" \ --region "${AWS_REGION}" \ --no-progress # 3. Amazon ECR ãªããžããªã®äœæãšã³ã³ããã€ã¡ãŒãžã®ç»é² if ! aws ecr describe-repositories --repository-names "${ECR_REPO_NAME}" --region "${AWS_REGION}" 2>/dev/null; then aws ecr create-repository \ --repository-name "${ECR_REPO_NAME}" \ --region "${AWS_REGION}" \ --image-scanning-configuration scanOnPush=true fi # ECRãžã®Dockerãã°ã€ã³ aws ecr get-login-password --region "${AWS_REGION}" | \ docker login --username AWS --password-stdin "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com" # vLLMå
¬åŒã€ã¡ãŒãžãPullããŠECRãžPush docker pull vllm/vllm-openai:latest docker tag vllm/vllm-openai:latest "${ECR_IMAGE}" docker push "${ECR_IMAGE}" ãã®äºåæºåã¯ååã«1床ã ãè¡ãã°OKã§ããã¢ãã«éã¿ãšã³ã³ããã€ã¡ãŒãžãAWSå
ã«æããŠããããšã§ã以éã¯EC2ãäœåäœãçŽããŠããåäžãªãŒãžã§ã³å
ã®S3ãšECRããçéã§åŒãåºãããšãã§ããŸãã Step 2: UserDataã«ããèªåã»ããã¢ããã¹ã¯ãªãã # æšè«çšEC2ã€ã³ã¹ã¿ã³ã¹ã®èµ·åæã«èªåå®è¡ãããã·ã§ã«ã¹ã¯ãªããïŒ 02_ec2_userdata.sh ïŒã§ãã ã€ã³ã¹ã¿ã³ã¹èµ·åã®åºæ¬ä»æ§ AMI : Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2.x (Ubuntu 22.04) â»AWSå
¬åŒã®Deep Learning AMIã䜿çšããããšã§ãNVIDIAãã©ã€ããDockerãNVIDIA Container Toolkitãã»ããã¢ããæžã¿ã®ç¶æ
ã§ã¹ã¿ãŒãã§ããŸãã ã€ã³ã¹ã¿ã³ã¹ã¿ã€ã : g6.xlarge (NVIDIA L4 GPU / 24GB VRAM) â»å
èšäºã§æ€èšŒãããŠããæè»œãª g4dn.xlarge ïŒT4 / 16GBïŒãçŽ æŽãããéžæè¢ã§ãããä»åã¯é·æã³ã³ããã¹ããæ±ãã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãçšéãèŠæ®ãã倧容é24GB VRAMãåããçŸè¡äžä»£ã® g6.xlarge ãæ¡çšããŸããåŸè¿°ã®éããé·æã³ã³ããã¹ããæ±ãçšéã§ã¯24GBã®VRAMã倧ããªã¢ããã³ããŒãžã«ãªããŸãã IAMããŒã« : S3ãã±ããã«å¯Ÿããèªã¿åãæš©éïŒ s3:GetObject , s3:ListBucket ïŒããã³ Amazon ECR ã«å¯Ÿããèªã¿åãæš©éïŒ AmazonEC2ContainerRegistryReadOnly ïŒ ãä»äžããã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ãã¢ã¿ããããŸãã ã¹ãã¬ãŒãž (EBS ïŒ NVMe SSD) : ã«ãŒãããªã¥ãŒã (EBS) : 40GB (gp3) ããçµäºæã«åé€ (Delete on Termination)ãã True ã«èšå®ã䜿çšããDeep Learning AMIã®ã«ãŒãã¹ãããã·ã§ãããµã€ãºã40GBã®ããããããæå®å¯èœãªæå°ãµã€ãºãšãªããŸããã¢ãã«ãDockeræ¬äœã¯NVMeã«éãããããOSãšåºæ¬ããŒã«ã®ã¿ãé
眮ããæå°éã®40GBã§ååã§ãã ã¢ãã« ïŒ Docker/containerdé
眮å
(ããŒã«ã« NVMe SSD) : g6.xlarge ã«æåãã ç¡æïŒè¿œå æé0åïŒã§ä»å±ãã 250GB ã®ããŒã«ã« NVMe SSDïŒã€ã³ã¹ã¿ã³ã¹ã¹ãã¢ïŒ ãæŽ»çšãã¢ãã«éã¿ïŒçŽ15GBïŒã ãã§ãªããDocker ããã³ containerd ã®ä¿åé åïŒ /var/lib/docker ããã³ /var/lib/containerd : çŽ15GBè¶
ïŒã NVMe äžã«ãã€ã³ãããŠã³ãããããšã§ã40GB EBS ã®æ¯æžïŒ write ...: no space left on device ïŒãå®å
šã«é²ãã€ã€ã³ã³ããã® Pull & ã¬ã€ã€ãŒå±éãçéåããŸãã ã·ã£ããããŠã³æã®åäœ : --instance-initiated-shutdown-behavior terminate ãæå®ãOSå
éšããã·ã£ããããŠã³ãå®è¡ãããéã«ãåãªã忢ïŒStopïŒã§ã¯ãªã èªåçã«ã€ã³ã¹ã¿ã³ã¹ããçµäºïŒTerminateïŒãããŠEBSããšå
šç Žæ£ ããããã«èšå®ããŸãã UserData ã®äžèº« ( 02_ec2_userdata.sh ) #!/bin/bash set -euo pipefail # ============================================================================== # 02_ec2_userdata.sh # EC2èµ·åæã«å®è¡ãããUserDataã¹ã¯ãªãã # # åæ: # - AMI: Ubuntu 22.04 Deep Learning AMI (NVIDIA Driver & Dockerå°å
¥æžã¿) # - ã€ã³ã¹ã¿ã³ã¹ã¿ã€ã: g6.xlarge (NVIDIA L4 GPU: 24GB VRAM, 250GB NVMe SSDä»å±) # - IAMããŒã«: S3(ReadOnly/FullAccess) åã³ ECR(ReadOnly) æš©éã¢ã¿ããæžã¿ # ============================================================================== LOG_FILE="/var/log/userdata-vllm.log" exec > >(tee -a "${LOG_FILE}") 2>&1 echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] UserData å®è¡éå§ ===" # èšå®ãã©ã¡ãŒã¿ AWS_REGION="${AWS_REGION:-ap-northeast-1}" S3_BUCKET_NAME="${S3_BUCKET_NAME:-my-llm-models-tokyo}" HF_MODEL_ID="${HF_MODEL_ID:-Qwen/Qwen2.5-Coder-7B-Instruct}" SERVED_MODEL_NAME="${SERVED_MODEL_NAME:-Qwen/Qwen2.5-Coder-7B-Instruct}" VLLM_PORT="8000" GPU_MEMORY_UTILIZATION="0.85" MAX_MODEL_LEN="4096" DOCKER_IMAGE="${DOCKER_IMAGE:-vllm/vllm-openai:latest}" echo "ååŸã¢ãã«(HF) : ${HF_MODEL_ID}" echo "å
¬éã¢ãã«å : ${SERVED_MODEL_NAME}" echo "S3ãã±ãã : s3://${S3_BUCKET_NAME}" # 1. ããŒã«ã« NVMe ã€ã³ã¹ã¿ã³ã¹ã¹ãã¢ïŒ250GBïŒã®æ€åºãšæŽ»çš # â» AWS Deep Learning AMI (DLAMI) ã¯ãèµ·åæã«ããŒã«ã«NVMeãèªåã§ /opt/dlami/nvme ã«ããŠã³ãããŠãããŸã NVME_DIR="/opt/dlami/nvme" if mountpoint -q "${NVME_DIR}" || [ -d "${NVME_DIR}" ]; then echo "DLAMIæ¢å®ã® NVMe ããŠã³ã (${NVME_DIR}) ãæ€åºããŸãããã¢ãã«ïŒDockeré åãšããŠæŽ»çšããŸã..." mkdir -p "${NVME_DIR}/models" "${NVME_DIR}/docker" mkdir -p /data ln -sfn "${NVME_DIR}/models" /data/models else # DLAMI以å€ã®AMIãæªããŠã³ãæã®ãã©ãŒã«ããã¯åŠç NVME_DEV=$(lsblk -d -n -o NAME,SIZE | grep -E '250G|232G' | head -n1 | awk '{print $1}') if [ -n "${NVME_DEV}" ]; then echo "ããŒã«ã« NVMe SSD (/dev/${NVME_DEV}) ãæ€åºããŸããã/data ã«ããŠã³ãããŸã..." mkfs.ext4 -F "/dev/${NVME_DEV}" || true mkdir -p /data mount -o noatime "/dev/${NVME_DEV}" /data || true else mkdir -p /data fi mkdir -p /data/models /data/docker NVME_DIR="/data" fi LOCAL_MODEL_ROOT="/data/models" LOCAL_MODEL_DIR="${LOCAL_MODEL_ROOT}/${HF_MODEL_ID}" mkdir -p "${LOCAL_MODEL_DIR}" chmod 777 "${LOCAL_MODEL_ROOT}" # 2. Docker & containerd ã®ããŒã¿é åã NVMe ã«é
眮ããEBSæ¯æžé²æ¢ïŒã¬ã€ã€ãŒå±éãçéå # â» Docker 24+ ããã³ containerd 㯠/var/lib/containerd ã«ã¹ãããã·ã§ãããå±éããããã # äž¡æ¹ã 250GB NVMe SSD ã«ãã€ã³ãããŠã³ãã㊠40GB EBS ã®ãã£ã¹ã¯æºæ¯ (no space left on device) ãå®å
šã«é²æ¢ããŸã echo "Docker/containerd ã忢ã㊠NVMe é åãžã®ãã€ã³ãããŠã³ããèšå®ããŸã..." systemctl stop docker containerd || true mkdir -p "${NVME_DIR}/docker" "${NVME_DIR}/containerd" mkdir -p /var/lib/docker /var/lib/containerd # æ¢åããŒã¿ãããã°ç§»è¡ cp -a /var/lib/docker/* "${NVME_DIR}/docker/" 2>/dev/null || true cp -a /var/lib/containerd/* "${NVME_DIR}/containerd/" 2>/dev/null || true mount --bind "${NVME_DIR}/docker" /var/lib/docker mount --bind "${NVME_DIR}/containerd" /var/lib/containerd if ! grep -q "/var/lib/docker" /etc/fstab; then echo "${NVME_DIR}/docker /var/lib/docker none defaults,bind 0 0" >> /etc/fstab fi if ! grep -q "/var/lib/containerd" /etc/fstab; then echo "${NVME_DIR}/containerd /var/lib/containerd none defaults,bind 0 0" >> /etc/fstab fi mkdir -p /etc/docker cat <<EOF > /etc/docker/daemon.json { "data-root": "/var/lib/docker" } EOF systemctl daemon-reload systemctl start containerd systemctl start docker # 3. ã¢ãã«ããŒã¿ã®æºå (S3ã«ããã°é«éåæãç¡ããã°EC2äžã§Hugging FaceããçŽæ¥ååŸããŠS3ãžããã¯ã¢ãã) echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] ã¢ãã«ããŒã¿ã®æºå確èª... ===" S3_SRC="s3://${S3_BUCKET_NAME}/models/${HF_MODEL_ID}" echo "S3ã¿ãŒã²ãã: ${S3_SRC}/ (ãªãŒãžã§ã³: ${AWS_REGION})" aws configure set default.s3.max_concurrent_requests 20 # IAMã¯ã¬ãã³ã·ã£ã«ãšS3çéã®åŸ
æ© (èµ·åçŽåŸã¯ã¡ã¿ããŒã¿ãµãŒãã¹ããã®STSããŒã¯ã³åæ ã«æ°ç§ãããå Žåããã) echo "IAMèªèšŒããã³S3ãã±ããæ¥ç¶ã確èªäž..." for i in {1..15}; do if aws s3 ls "s3://${S3_BUCKET_NAME}" --region "${AWS_REGION}" >/dev/null 2>&1; then echo "S3ãã±ãããžã®æ¥ç¶ã確èªããŸããã" break fi echo "S3æ¥ç¶/IAMèªèšŒåŸ
æ©äž ($i/15)..." sleep 2 done HAS_S3_MODEL=false echo "S3äžã®ã¢ãã«ååšãã§ãã¯ãå®è¡äž: aws s3 ls ${S3_SRC}/ --region ${AWS_REGION}" S3_CHECK=$(aws s3 ls "${S3_SRC}/" --region "${AWS_REGION}" 2>&1 || true) echo "S3ãã§ãã¯çµæ:" echo "${S3_CHECK}" if echo "${S3_CHECK}" | grep -E '(\.safetensors|\.bin|\.json)' >/dev/null; then HAS_S3_MODEL=true fi if [ "${HAS_S3_MODEL}" = "true" ]; then echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] S3äžã«ã¢ãã«ãçºèŠããŸãããS3ããé«éåæããŸã... ===" aws s3 sync "${S3_SRC}" "${LOCAL_MODEL_DIR}" \ --region "${AWS_REGION}" \ --no-progress else echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] S3äžã«ã¢ãã«ããããŸãããEC2äžã§çŽæ¥Hugging Faceããé«éååŸããŸã... ===" python3 -m pip install -U "huggingface_hub[cli]" || pip3 install -U "huggingface_hub[cli]" || true echo "Hugging Face ('${HF_MODEL_ID}') ããã¢ãã«ãçŽæ¥ããŠã³ããŒãäž..." python3 -c " import sys from huggingface_hub import snapshot_download try: snapshot_download(repo_id='${HF_MODEL_ID}', local_dir='${LOCAL_MODEL_DIR}', local_dir_use_symlinks=False) print('Hugging Faceããã®ããŠã³ããŒãã«æåããŸããã') except Exception as e: print(f'ããŠã³ããŒããšã©ãŒ: {e}', file=sys.stderr) sys.exit(1) " echo "ããŠã³ããŒãå®äºã容é:" du -sh "${LOCAL_MODEL_DIR}" fi echo "ã¢ãã«æºåå®äºãããŒã«ã«å®¹é確èª:" du -sh "${LOCAL_MODEL_DIR}" # 4. vLLMã³ã³ããã®èµ·å echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] vLLMã³ã³ããèµ·å ===" CONTAINER_NAME="vllm-server" # ECR ã€ã¡ãŒãžã®å Žåã¯ãã°ã€ã³èªèšŒãå®è¡ if [[ "${DOCKER_IMAGE}" == *".dkr.ecr."* ]]; then echo "ECR ã€ã¡ãŒãžãæ€åºããŸããããã°ã€ã³èªèšŒãå®è¡äž..." ECR_REGISTRY=$(echo "${DOCKER_IMAGE}" | cut -d'/' -f1) aws ecr get-login-password --region "${AWS_REGION}" | docker login --username AWS --password-stdin "${ECR_REGISTRY}" || true fi # æ¢åã³ã³ãããããã°åæ¢ã»åé€ if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo "æ¢åã® ${CONTAINER_NAME} ã忢ã»åé€ããŸã..." docker rm -f "${CONTAINER_NAME}" fi docker run -d \ --name "${CONTAINER_NAME}" \ --restart unless-stopped \ --gpus all \ --ipc=host \ -p "${VLLM_PORT}:8000" \ -v "${LOCAL_MODEL_ROOT}:/models" \ "${DOCKER_IMAGE}" \ --model "/models/${HF_MODEL_ID}" \ --served-model-name "${SERVED_MODEL_NAME}" \ --gpu-memory-utilization "${GPU_MEMORY_UTILIZATION}" \ --max-model-len "${MAX_MODEL_LEN}" \ --trust-remote-code # 5. ãã«ã¹ãã§ã㯠(èµ·ååŸ
æ©) echo "vLLM ãµãŒããŒã®èµ·åãã«ã¹ãã§ãã¯ãéå§ããŸã (ããŒã ${VLLM_PORT})..." MAX_RETRIES=120 # ååèµ·åã»CUDAã°ã©ãæ§ç¯ã«äœè£ãæããã (æå€§10å) RETRY_COUNT=0 while [ ${RETRY_COUNT} -lt ${MAX_RETRIES} ]; do if curl -s "http://127.0.0.1:${VLLM_PORT}/health" > /dev/null 2>&1; then echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] vLLMãµãŒããŒãæ£åžžã«èµ·åããŸããïŒ ===" break fi echo "èµ·ååŸ
æ©äž... (${RETRY_COUNT}/${MAX_RETRIES})" sleep 5 RETRY_COUNT=$((RETRY_COUNT + 1)) done if [ ${RETRY_COUNT} -eq ${MAX_RETRIES} ]; then echo "èŠå: vLLMãã«ã¹ãã§ãã¯ãã¿ã€ã ã¢ãŠãããŸããã'docker logs ${CONTAINER_NAME}' ã確èªããŠãã ããã" else # èµ·åæåæ: HFããçŽæ¥ããŠã³ããŒãããŠããå Žåã¯ãè£ã§S3ãžèªåããã¯ã¢ãã (I/Oåªå
床ãäžããŠæšè«ãé»å®³ããªã) if [ "${HAS_S3_MODEL}" = "false" ]; then echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] èµ·åå®äºã確èªã次å以éã®é«éåæã®ãããè£ã§S3ãžããã¯ã¢ãããéå§ããŸã ===" ( if ! aws s3 ls "s3://${S3_BUCKET_NAME}" --region "${AWS_REGION}" 2>/dev/null; then if [ "${AWS_REGION}" = "us-east-1" ]; then aws s3api create-bucket --bucket "${S3_BUCKET_NAME}" 2>/dev/null || true else aws s3api create-bucket --bucket "${S3_BUCKET_NAME}" --region "${AWS_REGION}" --create-bucket-configuration LocationConstraint="${AWS_REGION}" 2>/dev/null || true fi fi ionice -c 3 aws s3 sync "${LOCAL_MODEL_DIR}" "${S3_SRC}" --region "${AWS_REGION}" --no-progress 2>/dev/null || \ aws s3 sync "${LOCAL_MODEL_DIR}" "${S3_SRC}" --region "${AWS_REGION}" --no-progress 2>/dev/null || true echo "[$(date '+%Y-%m-%d %H:%M:%S')] S3ã¢ãã«ããã¯ã¢ããå®äºïŒæ¬¡åããã¯S3ããè¶
é«éåæãããŸãã" ) > /var/log/s3-backup.log 2>&1 & fi fi # 6. 1æéã¢ã€ãã«æã®èªåã·ã£ããããŠã³ïŒèªçTerminateïŒããŒã¢ã³èµ·å echo "=== ã¢ã€ãã«èªåçµäºããŒã¢ã³ãèšå®ã»èµ·åããŸã ===" cat <<'EOF' > /usr/local/bin/auto-idle-shutdown.sh #!/bin/bash IDLE_LIMIT_SEC=3600 # 1æé (3600ç§) IDLE_COUNT=0 CHECK_INTERVAL=300 # 5åããã«ãã§ã㯠while true; do sleep "${CHECK_INTERVAL}" # çŽè¿5åéã®vLLMãžã®æšè«ãªã¯ãšã¹ãæ°ããã°ããã«ãŠã³ã REQ_COUNT=$(docker logs --since 5m vllm-server 2>&1 | grep -c "POST /v1" || true) if [ "${REQ_COUNT}" -eq 0 ]; then IDLE_COUNT=$((IDLE_COUNT + CHECK_INTERVAL)) echo "[$(date '+%Y-%m-%d %H:%M:%S')] ã¢ã€ãã«ç¶ç¶äž: ${IDLE_COUNT}s / ${IDLE_LIMIT_SEC}s" if [ "${IDLE_COUNT}" -ge "${IDLE_LIMIT_SEC}" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 1æéã¢ã€ãã«ç¶æ
ãç¶ç¶ãããããèªåçµäº(Terminate)ãå®è¡ããŸãã" shutdown -h now exit 0 fi else IDLE_COUNT=0 # ãªã¯ãšã¹ãããã£ããã¿ã€ããŒãªã»ãã fi done EOF chmod +x /usr/local/bin/auto-idle-shutdown.sh nohup /usr/local/bin/auto-idle-shutdown.sh > /var/log/auto-idle-shutdown.log 2>&1 & echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] UserData å
šåŠçå®äº (èªåã¢ã€ãã«ç£èŠçšŒåäž) ===" --> Information ð¡ ã€ã³ãã©æ¥µéãã¥ãŒãã³ã°ïŒãªãEBSã100GBçããããç¡æã®NVMeãã䜿ãã¹ããªã®ãïŒ AWS ã® GPU ã€ã³ã¹ã¿ã³ã¹ïŒ g6.xlarge ã g4dn.xlarge ãªã©ïŒã®ã¹ããã¯è¡šãããèŠããšãã¹ãã¬ãŒãžæ¬ã« ã1 x 250 NVMe SSDã ãšèšèŒãããŠããŸããããã¯ã€ã³ã¹ã¿ã³ã¹ã«ç©ççŽçµãããããŒã«ã« SSDïŒã€ã³ã¹ã¿ã³ã¹ã¹ãã¢ïŒã§ã ã€ã³ã¹ã¿ã³ã¹æéã«å«ãŸããŠãã远å 課éã¯äžåããããŸããïŒ0åïŒ ã æ¯èŒé
ç® EBS (gp3 40ã100GB) ããŒã«ã« NVMe SSD (250GB) 远å è²»çš åŸé課é察象 å®å
šç¡æïŒ0 å / ã€ã³ã¹ã¿ã³ã¹ä»å±ïŒ èªã¿æžã垯å ãããã¯ãŒã¯çµç±ïŒåºæ¬ 125 MB/s ïŒ 1,000 ã 2,000 MB/s è¶
ïŒPCIeçŽçµç©çSSDïŒ 15GBã¢ãã«ã®GPUèªèŸŒæé çŽ 15 å ïŒãã£ã¹ã¯I/Oç«¶åã§é·æéã®åŸ
æ©ïŒ 1 åæªæºïŒå§åççéïŒïŒ ããŒã¿ã®æ°žç¶æ§ ä¿æå¯èœ ã€ã³ã¹ã¿ã³ã¹åæ¢ã»çµäºã§æ¶æ»
ïŒæ®çºæ§ïŒ 宿©æ€èšŒã§ãã EBSäžã«ã¢ãã«ã眮ããŠãããšãã¯GPUãžã®éã¿ããŒãã ãã§çŽ15åãåŸ
ããããŠããã®ããããŒã«ã«NVMe SSDã«éãããããšã§ã1åæªæºããžãšåçã«ççž® ãããŸããïŒ éåžžã®ã·ã¹ãã æ§ç¯ã§ã¯ããµãŒããŒã忢ãããšããŒã¿ãæ¶ããŠããŸãããšããæ®çºæ§ã匱ç¹ã«ãªããŸããã ãã¢ã»ãã㯠S3/ECR ã«æ°žç¶åããEC2 ã¯äœ¿ãæšãŠãã ãšãããšãã§ã¡ã©ã«èšèšãæ¡ãããšã§ã ãæ®çºæ§ã®ãã¡ãªããã¯ãŒããNVMe ã®å§åç I/O é床㚠EBS åæžã®ã¡ãªããã ããç·åãã ã§ããããã«ãªããŸãïŒ ããã«å¬ããããšã«ãä»å䜿çšããŠãã AWS å
¬åŒã® Deep Learning AMI (Ubuntu 22.04) ã¯ãèµ·åæã«ããŒã«ã« NVMe ãèªåæ€åºã㊠/opt/dlami/nvme ã«èªåããŠã³ã ããŠããã芪åèšèšã«ãªã£ãŠããŸãã æåã§ããŒãã£ã·ã§ã³äœæãããå¿
èŠãããªããã¢ãã«éã¿ã ãã§ãªã Docker/containerd ã®ä¿åé åããã® NVMe ã«åãã ããšã§ã倧容é Docker ã€ã¡ãŒãžã«ãã EBS å§è¿«ãå®å
šåé¿ããã³ã³ããã®ã¬ã€ã€ãŒå±éé床ãåçã«é«éåãããŸãã --> Information ð¡ å¯èœã¡ã»åæ¢å¿ã察çïŒã1æéã¢ã€ãã«ã§èªåèªçïŒTerminateïŒãããå®å
šè£
眮 ãæ€èšŒã«å€¢äžã«ãªã£ãŠäœæ¥ããŠããããæ·±å€ã«ãªã£ãŠãã®ãŸãŸãããã§å¯èœã¡ããŠããŸã£ãâŠâŠã ã䜿ãçµãã£ãã®ã«ç Žæ£ã³ãã³ããå©ãã®ãå¿ããŠäžžäžæ¥æŸçœ®ããŠããŸã£ãâŠâŠã GPUã€ã³ã¹ã¿ã³ã¹ãè§Šããšã³ãžãã¢ãªã誰ããäžåºŠã¯çµéšããææã®ã·ããªãªã§ãããªã³ããã³ãã®GPUã€ã³ã¹ã¿ã³ã¹ã¯1æéãããçŽ200åãäžæ©ïŒ8æéïŒæŸçœ®ããã ãã§çŽ1,600åãå¹ãé£ã³ãŸãã ããã§æ¬æ§æã§ã¯ãUserDataã®æ«å°Ÿã§ ãçŽè¿1æéïŒ3600ç§ïŒæšè«ãªã¯ãšã¹ããæ¥ãªãã£ããèªåã§OSãã·ã£ããããŠã³ïŒ shutdown -h now ïŒããç£èŠããŒã¢ã³ã ãããã¯ã°ã©ãŠã³ãèµ·åããŠããŸãã ããã«ãEC2èµ·åãªãã·ã§ã³ã« --instance-initiated-shutdown-behavior terminate ãä»äžããŠãããããOSã·ã£ããããŠã³ãšåæã« EC2ã€ã³ã¹ã¿ã³ã¹ãèªåçã«TerminateïŒå®å
šçµäºïŒãããEBSããªã¥ãŒã ãæ ¹ãããéé£ãç Žæ£ ãããŸãïŒ é«äŸ¡ãªCloudWatchã¢ã©ãŒã ãLambdaãå€åŽã«çµãŸãªããŠããã€ã³ã¹ã¿ã³ã¹åäœã®èªå·±é²è¡ããžãã¯ïŒèªçè£
眮ïŒãšããŠæé¡è¿œå ã³ã¹ããŒãã§å®å
šãªã»ãŒããã£ããããæ©èœããŸãã Step 3: ã¯ã³ã³ãã³ãèµ·åã¹ã¯ãªãã ( 03_ec2_launch.sh ) # ãããžã¡ã³ãã³ã³ãœãŒã«ã§æ¯åããããèµ·åããã®ã倧å€ãªã®ã§ãCLIãã1çºã§åŒã³åºããã¹ã¯ãªããïŒ 03_ec2_launch.sh ïŒãçšæããŸããã #!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" USER_DATA_FILE="${SCRIPT_DIR}/02_ec2_userdata.sh" INSTANCE_STATE_FILE="${SCRIPT_DIR}/../.current_instance_id" AWS_REGION="${AWS_REGION:-ap-northeast-1}" INSTANCE_TYPE="${INSTANCE_TYPE:-g6.xlarge}" # NVIDIA L4 GPU (24GB VRAM) IAM_ROLE_NAME="${IAM_ROLE_NAME:-EC2-S3-ECR-ReadOnly-Profile}" EBS_SIZE_GB="${EBS_SIZE_GB:-40}" # DLAMIã¹ãããã·ã§ããå¶çŽïŒ40GB以äžïŒã®æå°å€ãã¢ãã«ãDockerã¯NVMeã«é
眮ãããã40GBã§åå # 1. ææ°ã® Deep Learning OSS Nvidia Driver AMI ãèªåæ€çŽ¢ echo "Ubuntu 22.04 Deep Learning AMI ãèªåæ€çŽ¢äž..." AMI_ID=$(aws ec2 describe-images \ --region "${AWS_REGION}" \ --owners amazon \ --filters "Name=name,Values=Deep Learning OSS Nvidia Driver AMI GPU PyTorch * (Ubuntu 22.04)*" "Name=state,Values=available" \ --query 'sort_by(Images, &CreationDate)[-1].ImageId' \ --output text) # 2. ã»ãã¥ãªãã£ã°ã«ãŒãã®èªå確èªã»äœæ (ããŒã8000, 22) DEFAULT_VPC=$(aws ec2 describe-vpcs --region "${AWS_REGION}" --filters "Name=isDefault,Values=true" --query "Vpcs[0].VpcId" --output text) EXISTING_SG=$(aws ec2 describe-security-groups --region "${AWS_REGION}" --filters "Name=vpc-id,Values=${DEFAULT_VPC}" "Name=group-name,Values=vllm-sg" --query "SecurityGroups[0].GroupId" --output text 2>/dev/null || echo "") if [ -n "${EXISTING_SG}" ] && [ "${EXISTING_SG}" != "None" ]; then SG_ID="${EXISTING_SG}" else SG_ID=$(aws ec2 create-security-group --region "${AWS_REGION}" --group-name "vllm-sg" --description "SG for vLLM API" --vpc-id "${DEFAULT_VPC}" --query "GroupId" --output text) aws ec2 authorize-security-group-ingress --region "${AWS_REGION}" --group-id "${SG_ID}" --protocol tcp --port 8000 --cidr "0.0.0.0/0" aws ec2 authorize-security-group-ingress --region "${AWS_REGION}" --group-id "${SG_ID}" --protocol tcp --port 22 --cidr "0.0.0.0/0" fi # 3. IAM ã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ã®äœæ (S3 & ECR èªã¿åãæš©é) if ! aws iam get-instance-profile --instance-profile-name "${IAM_ROLE_NAME}" >/dev/null 2>&1; then aws iam create-role --role-name "${IAM_ROLE_NAME}-Role" \ --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]}' aws iam attach-role-policy --role-name "${IAM_ROLE_NAME}-Role" --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess aws iam attach-role-policy --role-name "${IAM_ROLE_NAME}-Role" --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly aws iam create-instance-profile --instance-profile-name "${IAM_ROLE_NAME}" aws iam add-role-to-instance-profile --instance-profile-name "${IAM_ROLE_NAME}" --role-name "${IAM_ROLE_NAME}-Role" sleep 5 # IAMäŒæåŸ
æ© fi # 4. UserData ã Base64 ãšã³ã³ãŒãããŠã€ã³ã¹ã¿ã³ã¹èµ·å USERDATA_BASE64=$(base64 -w 0 "${USER_DATA_FILE}" 2>/dev/null || base64 "${USER_DATA_FILE}" | tr -d '\r\n') INSTANCE_ID=$(aws ec2 run-instances \ --region "${AWS_REGION}" \ --image-id "${AMI_ID}" \ --instance-type "${INSTANCE_TYPE}" \ --iam-instance-profile "Name=${IAM_ROLE_NAME}" \ --security-group-ids "${SG_ID}" \ --user-data "${USERDATA_BASE64}" \ --block-device-mappings "[{\"DeviceName\":\"/dev/sda1\",\"Ebs\":{\"VolumeSize\":${EBS_SIZE_GB},\"VolumeType\":\"gp3\",\"DeleteOnTermination\":true}}]" \ --instance-initiated-shutdown-behavior terminate \ --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=vllm-server-temp}]" \ --query 'Instances[0].InstanceId' \ --output text) echo "ã€ã³ã¹ã¿ã³ã¹èµ·åéå§: ${INSTANCE_ID}" echo "${INSTANCE_ID}" > "${INSTANCE_STATE_FILE}" # 5. èµ·åå®äºãšãããªãã¯IPååŸåŸ
æ© aws ec2 wait instance-running --region "${AWS_REGION}" --instance-ids "${INSTANCE_ID}" PUBLIC_IP=$(aws ec2 describe-instances --region "${AWS_REGION}" --instance-ids "${INSTANCE_ID}" --query 'Reservations[0].Instances[0].PublicIpAddress' --output text) echo "ã€ã³ã¹ã¿ã³ã¹èµ·åå®äº: IP = ${PUBLIC_IP}" echo "vLLM ã®èµ·åãã«ã¹ãã§ãã¯åŸ
æ©äž (éåžž7ã10åçšåºŠ)..." # 6. /health ã 200 OK ãè¿ããŸã§ããŒãªã³ã° while ! curl -s "http://${PUBLIC_IP}:8000/health" > /dev/null 2>&1; do echo -n "." sleep 5 done echo "" echo "ð vLLMãµãŒããŒã®æºåãå®äºããŸããïŒ (http://${PUBLIC_IP}:8000)" ãã®ã¹ã¯ãªãããå®è¡ããã ãã§ïŒ ææ°ã® Deep Learning AMI ãèªåæ€çŽ¢ ããŒã8000ãš22ãéæŸããã»ãã¥ãªãã£ã°ã«ãŒããèªåæ§æ S3ããã³ECRã®èªã¿åãæš©éãæã£ãIAMã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ãèªåçŽä»ã DeleteOnTermination: true ããã³ --instance-initiated-shutdown-behavior terminate ãæå®ããŠäœ¿ãæšãŠEC2ãèµ·å ã€ã³ã¹ã¿ã³ã¹ã®èµ·åãšãããªãã¯IPååŸåŸã http://<PUBLIC_IP>:8000/health ã 200 OK ãè¿ããŸã§ããŒãªã³ã°åŸ
æ©ïŒS3ããã®ã¢ãã«åæãECRããã®å€§å®¹éã€ã¡ãŒãžPullã»è§£åãå«ãã éåžž7ã10åçšåºŠã§èªåèµ·å ïŒ èµ·åããã€ã³ã¹ã¿ã³ã¹IDãæ¬¡åç Žæ£çšã« .current_instance_id ã«èªåä¿å --> Information â±ïž èµ·åæèŠæéïŒçŽ7ã10åïŒã®ãªã¢ã«ãªå
èš³ ãã³ãã³ããå©ããŠãã䜿ããããã«ãªããŸã§ã©ããããåŸ
ã€ãïŒãã¯å®éçšã§æ°ã«ãªããã€ã³ãã§ããå®éã®æ€èšŒç°å¢ã§ã®å
èš³ã¯ä»¥äžã®éãã§ãïŒ EC2ã€ã³ã¹ã¿ã³ã¹åæå ïŒ NVMeãã€ã³ãããŠã³ã : çŽ30ç§ã1å ECRããã®vLLMã€ã¡ãŒãžPull ïŒ ã¬ã€ã€ãŒå±é : çŽ4ã6å ïŒâ»CUDAãPyTorchãå«ãvLLMã³ã³ããã€ã¡ãŒãžã¯å±éæ16GB以äžã®å€§å®¹éãšãªãããããããæãæéãèŠããŸãïŒ S3ããã®ã¢ãã«éã¿ïŒçŽ15GBïŒé«éåæ : çŽ1ã2åïŒåäžãªãŒãžã§ã³éïŒ vLLMã³ã³ããèµ·å ïŒ GPUãžã®éã¿ããŒãã»CUDAã°ã©ãæ§ç¯ : çŽ1ã2å ïŒâ»EBSäžã«ã¢ãã«ãé
眮ããŠããéã¯GPUãžã®éã¿ããŒãã ãã§çŽ15åããã£ãŠããŸããããNVMeåã«ãã1åæªæºãžãšåçã«é«éåãããŠããŸãïŒ æåã§GUIãSSHã«å
¥ã£ãŠäœåã³ãã³ããå©ããŠã»ããã¢ããããã®ã«æ¯ã¹ãã°ã ãã³ãã³ã1çºå©ããŠåžãç«ã¡ãã³ãŒããŒãæ·¹ããŠäžæ¯ã€ããŠæ»ã£ãŠããé ïŒçŽ7ã10ååŸïŒã«ã¯èªåå°çšã®GPUæšè«ç°å¢ã宿ããŠããã ãšããäœéšã¯éåžžã«å¿«é©ã§ãïŒ ã³ã³ãœãŒã«ã«ãæºåå®äºïŒããšè¡šç€ºãããããããvLLMãµãŒããŒã¯å³åº§ã«å©çšå¯èœã§ãïŒ åäœç¢ºèªïŒOpenAIäºæAPIãå©ããŠã¿ã # ã¿ãŒããã«ãã curl ã§ãªã¯ãšã¹ããéã£ãŠã¿ãŸãããã WindowsïŒPowerShell / Git BashïŒãMac/Linuxãåããã¯ã©ãŒãç Žæãã©ãã«ãé²ããããJSONãã¡ã€ã«ãäœæã㊠-d @req.json 圢åŒã§æž¡ãã®ãæã確å®ã§ãã PUBLIC_IP="<èµ·åããEC2ã®ãããªãã¯IP>" # 1. ãªã¯ãšã¹ãããã£ã®JSONãäœæ cat <<'EOF' > req.json { "model": "Qwen/Qwen2.5-Coder-7B-Instruct", "messages": [ {"role": "user", "content": "AWSã®æ±äº¬ãªãŒãžã§ã³ã§GPUã€ã³ã¹ã¿ã³ã¹ããšãã§ã¡ã©ã«ã«éçšããã¡ãªããã3è¡ã§æããŠãã ããã"} ] } EOF # 2. vLLMã®OpenAIäºæãšã³ããã€ã³ããžãªã¯ãšã¹ã curl http://${PUBLIC_IP}:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d @req.json --> Information Windowsç°å¢ã§ã®Tips : -d '{ ... }' ã®ããã«ã³ãã³ãã©ã€ã³åŒæ°ãžçŽæ¥ã€ã³ã©ã€ã³ã§JSONãèšè¿°ãããšãWindowsïŒPowerShellãã³ãã³ãããã³ãããGit BashïŒã®åŒæ°ãšã¹ã±ãŒãåŠçã«ããããã«ã¯ã©ãŒããå¥ããã {"detail":"There was an error parsing the body"} ãšããJSONããŒã¹ãšã©ãŒãçºçãããããªããŸããäžèšã®ããã«ãã¡ã€ã«ïŒ -d @req.json ïŒçµç±ã§æž¡ãããšã§ãã©ã®OSç°å¢ã§ãå®å
šã«å®è¡ã§ããŸãã å®è¡çµæïŒã¬ã¹ãã³ã¹äŸïŒ: { "id": "chatcmpl-a662010ed226ea08", "object": "chat.completion", "created": 1789410574, "model": "Qwen/Qwen2.5-Coder-7B-Instruct", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "1. ã³ã¹ãå¹ç: ãšãã§ã¡ã©ã«ãªGPUã€ã³ã¹ã¿ã³ã¹ã¯ãäœ¿çšæéãçãå Žåãäžæçãªäœæ¥ã«é©ããŠãããããè²»çšãããããªãæé垯ãå©çšã§ããŸãã\n2. ã¹ã±ãŒã©ããªãã£: å¿
èŠã«å¿ããŠç°¡åã«ã€ã³ã¹ã¿ã³ã¹ã墿žãããããšãã§ããŸãã\n3. å®å
šæ§: 䜿çšåŸããã«ã€ã³ã¹ã¿ã³ã¹ãåé€ãããããŒã¿æŒæŽ©ãªã©ã®ãªã¹ã¯ã軜æžãããŸãã" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 58, "total_tokens": 163, "completion_tokens": 105 } } èŠäºã«èªåã®GPUãµãŒããŒããé«éã«å¿çãè¿ã£ãŠããŸããïŒ æšæºçãªOpenAIäºæãšã³ããã€ã³ããªã®ã§ãPythonã® openai ã©ã€ãã©ãªãåçš®GUIã¯ã©ã€ã¢ã³ãïŒOpen WebUIçïŒããããã®ãŸãŸç¹ãããšãã§ããŸãã --> Caution â ïž ã»ãã¥ãªãã£ã«é¢ããéèŠãªæ³šæç¹ïŒéä¿¡ã®å¹³æïŒHTTPïŒãšã»ãã¥ã¢å ä»åã®æ€èšŒæ§æã§ã¯ãæè»œã«åäœç¢ºèªãè¡ãããã« ããŒã8000ã®HTTPïŒå¹³æïŒ ã§çŽæ¥ãªã¯ãšã¹ããéã£ãŠããŸãã ããããã€ã³ã¿ãŒãããçµç±ã§å¹³æéä¿¡ãè¡ããšãéåä¿¡ããããã³ãããã¢ãã«ã®åçãéäžã®çµè·¯ã§çèŽã»æ¹ããããããªã¹ã¯ããããŸãã æ¬çªç°å¢ãæ©å¯æ§ã®é«ãã³ãŒãã»ããŒã¿ãæ±ãå Žåã¯ãå¿
ã以äžã®ããããã®æ¹æ³ã§ éä¿¡ãã»ãã¥ã¢å ããŠãã ããã SSHããŒããã©ã¯ãŒãïŒæãæè»œã§ããããïŒ : EC2ã®ã»ãã¥ãªãã£ã°ã«ãŒãã§ããŒã8000ãã€ã³ã¿ãŒãããã«éæŸãããSSHïŒããŒã22ïŒã®ã¿ãèš±å¯ããŸããããŒã«ã«ç«¯æ«ãã以äžã®ã³ãã³ãã§ãã³ãã«ãæãããšã§ãæå·åãããSSHéä¿¡çµç±ã§ http://localhost:8000 ãšããŠå®å
šã«ã¢ã¯ã»ã¹ã§ããŸãã ssh -i <your-key.pem> -N -L 8000:localhost:8000 ubuntu@<EC2ã®ãããªãã¯IP> ãªããŒã¹ãããã·ã«ããSSL/TLSåïŒHTTPSïŒ : EC2å
ã« Nginx ã Caddy ãªã©ã®ãªããŒã¹ãããã·ãé
眮ããLet's Encrypt çã®èšŒææžãé©çšããŠHTTPSéä¿¡ïŒããŒã443ïŒãçµç«¯ãããŸãããŸãã¯ãAWSã® Application Load Balancer (ALB) ãš AWS Certificate Manager (ACM) ãæåã«é
眮ããã®ãã¯ã©ãŠããã€ãã£ããªçéæ§æã§ãã ãã©ã€ããŒããããã¯ãŒã¯ïŒVPN / TailscaleïŒã®æŽ»çš : AWS Client VPN ã TailscaleãWireGuard ãªã©ãå°å
¥ãããããªãã¯IPãçµç±ãããã©ã€ããŒãIPã¢ãã¬ã¹ç©ºéå
ã§éä¿¡ãå®çµãããŸãã æ€èšŒãçµãã£ããå³åº§ã«å®å
šç Žæ£ïŒïŒå¯èœã¡ããŠãå®å¿ã®äºéé²åŸ¡ïŒ # äœæ¥ãçµãã£ããã ã€ã³ã¹ã¿ã³ã¹ãã忢ïŒStopïŒãã§ã¯ãªããçµäºïŒTerminateïŒã ããŸãã çšæããç Žæ£ã¹ã¯ãªããïŒ 04_ec2_terminate.sh ïŒãå®è¡ããã ãã§ãã #!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" INSTANCE_STATE_FILE="${SCRIPT_DIR}/../.current_instance_id" AWS_REGION="${AWS_REGION:-ap-northeast-1}" INSTANCE_ID="${1:-}" if [ -z "${INSTANCE_ID}" ] && [ -f "${INSTANCE_STATE_FILE}" ]; then INSTANCE_ID=$(cat "${INSTANCE_STATE_FILE}" | tr -d '[:space:]') fi if [ -z "${INSTANCE_ID}" ]; then echo "ãšã©ãŒ: çµäºå¯Ÿè±¡ã®ã€ã³ã¹ã¿ã³ã¹IDãæå®ãããŠããŸããã" exit 1 fi echo "=== EC2ã€ã³ã¹ã¿ã³ã¹ã®å®å
šçµäº (Terminate) ===" echo "察象ã€ã³ã¹ã¿ã³ã¹ID: ${INSTANCE_ID}" echo "â» EBSããªã¥ãŒã (DeleteOnTermination=true)ãé£åããŠå®å
šç Žæ£ãããŸãã" aws ec2 terminate-instances \ --region "${AWS_REGION}" \ --instance-ids "${INSTANCE_ID}" \ --output table echo "ã€ã³ã¹ã¿ã³ã¹ã®çµäºå®äºãåŸ
æ©äž..." aws ec2 wait instance-terminated \ --region "${AWS_REGION}" \ --instance-ids "${INSTANCE_ID}" rm -f "${INSTANCE_STATE_FILE}" echo "==========================================================" echo " ã€ã³ã¹ã¿ã³ã¹ããã³EBSããªã¥ãŒã ã®å®å
šç Žæ£ãå®äºããŸããïŒ" echo " ãã以éãæ¬ã€ã³ã¹ã¿ã³ã¹ã«é¢ããã³ã³ãã¥ãŒã/EBS課éã¯äžåçºçããŸããã" echo "==========================================================" å®è¡ã¯ã¯ã³ã³ãã³ãã§ãïŒ ./scripts/04_ec2_terminate.sh EBSããªã¥ãŒã ã®ãDelete on Terminationããæå¹ã«ãªã£ãŠãããããã€ã³ã¹ã¿ã³ã¹çµäºãšåæã«100GBã®EBSã¹ãã¬ãŒãžã綺éºãµãããªæ¶æ»
ããŸãã ãããã§é«äŸ¡ãªEBSæŸçœ®èª²éã¯ãŒãïŒåæ¢äžã®ç¶æè²»ãæé¡ãããçŸæ°ååã®ä¿ç®¡æã®ã¿ïŒããšããå§åçãªå®å¿æ ãåŸãããšãã§ããŸãã ããç Žæ£ã¹ã¯ãªããã®å®è¡ãå¿ããŠå¯èœã¡ããŠããŸã£ããïŒ # ãå®å¿ãã ãããå
ã»ã© UserData ã«ä»èŸŒãã ãã¢ã€ãã«èªåçµäºããŒã¢ã³ã ãæ§ããŠããŸãã æåŸã®APIãªã¯ãšã¹ããã1æéæšè«ãªã¯ãšã¹ããéçµ¶ãããšãã€ã³ã¹ã¿ã³ã¹èªèº«ãèªåã§ shutdown -h now ãå®è¡ããã㊠--instance-initiated-shutdown-behavior terminate ãèšå®ãããŠããããããã®ãŸãŸèªåã§ã€ã³ã¹ã¿ã³ã¹çµäºïŒTerminateïŒïŒEBSéé£ãç Žæ£ãããŸãïŒ ãæåã§ã®å³æç Žæ£ããšã1æéã¢ã€ãã«ã®èªåèªçããšãã äºéã®å®å
šè£
眮 ããããããæ·±å€ã®æ€èšŒã§ãå®å¿ããŠç ãã«ã€ãããšãã§ããŸãã ãŸãè§Šããããªã£ããïŒ S3ã«ã¢ãã«ã¯ä¿ç®¡ãããŠããã®ã§ã ./scripts/03_ec2_launch.sh ãå©ãã°ãæ°ååŸã«ã¯å
šãåãç°å¢ãèããŸããããããŸãã«ã¯ã©ãŠãã®ééå³ã§ãã ããããã€ã³ããšå¯Ÿç # 1. IAMããŒã«ã®ä»ãå¿ãã»ããªã·ãŒäžè¶³ # UserDataå
ã§ aws s3 sync ã aws ecr get-login-password ãå®è¡ãããããEC2ã«ã¢ã¿ããããIAMããŒã«ã«ã¯ä»¥äž2ã€ã®ããªã·ãŒãå¿
é ã§ãïŒ S3ãã±ãããžã®èªã¿åãæš©éïŒ s3:GetObject ããã³ s3:ListBucket ããŸã㯠AmazonS3ReadOnlyAccess ïŒ ECRãªããžããªããã®ã€ã¡ãŒãžPullæš©éïŒ AmazonEC2ContainerRegistryReadOnly ïŒ ããŒã«ãããªã·ãŒãä»ããŠããªããšãUserDataã®å®è¡ãã°ïŒ /var/log/userdata-vllm.log ïŒã« AccessDenied ãåºåãããã¢ãã«ãã³ã³ããã€ã¡ãŒãžã®ååŸã§èµ·åãæ¢ãŸã£ãŠããŸããŸãã 2. ãªãŒãžã§ã³ã®äžäžèŽã«ããããŒã¿è»¢éæèª²é # S3ãã±ãããšEC2ã®ãªãŒãžã§ã³ãç°ãªã£ãŠãããšïŒäŸ: S3ã us-east-1 ã§EC2ã ap-northeast-1 ïŒãã¢ãã«ããŠã³ããŒãæã« ã€ã³ã¿ãŒãããçµç±ã®ãªãŒãžã§ã³éããŒã¿è»¢éæïŒæ°GBãæ°åGBåïŒããã£ãã課é ãããŠããŸããŸããå¿
ãäž¡è
ãåããªãŒãžã§ã³ïŒä»åã¯æ±äº¬ ap-northeast-1 ïŒã«æããŸããããåäžãªãŒãžã§ã³å
ã§ããã°è»¢éæã¯ 0å ã§ãã 3. vLLMèµ·åæã®VRAMã¡ã¢ãªç¢ºä¿èšå® ( --gpu-memory-utilization ) # vLLMã¯ããã©ã«ãã§GPUã¡ã¢ãªïŒVRAMïŒã®90%ã95%ãäžæ°ã«äºå確ä¿ããããšããŸãã ã¢ãã«ã®éã¿ãµã€ãºã«å¯ŸããŠã³ã³ããã¹ãé·ïŒ --max-model-len ïŒã倧ããåãããããšãKVãã£ãã·ã¥ã®é åãè¶³ããã«Out Of Memory (OOM) ã§ã³ã³ãããã¯ã©ãã·ã¥ããããšããããŸãã VRAM 24GBã®ã€ã³ã¹ã¿ã³ã¹ã§åããå Žåã --gpu-memory-utilization 0.90 ã --max-model-len 8192 ããããã調æŽãå§ããã®ãããããã§ãã 4. GPUã€ã³ã¹ã¿ã³ã¹ã®èµ·åãšã©ãŒ ( VcpuLimitExceeded ) # èµ·åã¹ã¯ãªãããå®è¡ããéã«ä»¥äžã®ãããªãšã©ãŒãåºãå Žåãã¢ã«ãŠã³ãã®GPUã€ã³ã¹ã¿ã³ã¹å²ãåœãŠäžéïŒvCPUäžéã0ïŒã«éããŠããŸãã An error occurred (VcpuLimitExceeded) when calling the RunInstances operation: You have requested more vCPU capacity than your current vCPU limit of 0 allows for the instance bucket that the specified instance type belongs to... äºåæºåã®é
ç®ã«èšèŒããéããAWSãããžã¡ã³ãã³ã³ãœãŒã«ã® Service Quotas ãã Running On-Demand G and VT instances ã®äžéç·©åç³è«ïŒ4 vCPU以äžïŒãè¡ã£ãŠãã ããã ãŸãšã # ä»åã¯ãæ¥ã
ã®éçºãæè¡æ€èšŒã§ãªãŒãã³ãœãŒã¹LLMãå¿«é©ã«äœ¿ãåãããã®åå°ãšããŠã ãLinux à UserData à vLLM à S3 ïŒ ECRãã«ããå®å
šèªåã»ãšãã§ã¡ã©ã«ãªLLMæ€èšŒç°å¢ ãæ§ç¯ããŸããã ç°å¢æ§ç¯ã®å®å
šèªåå : UserDataã«ãããèµ·åããvLLMã®ã³ã³ãã皌åãŸã§ãå®å
šèªååã 忢æã®ç¶æè²»ãã»ãŒãŒããã®å®çŸ : ã¢ãã«ãS3ãã³ã³ããã€ã¡ãŒãžãECRã«éããããšã§ãEC2ãå®å
šäœ¿ãæšãŠïŒTerminateïŒå¯èœã«ããé«äŸ¡ãªEBSã®æŸçœ®ã³ã¹ããå®å
šã«æé€ïŒåæ¢äžã®ç¶æè²»ã¯æé¡ãããçŽ145åã®ä¿ç®¡æã®ã¿ïŒã å¯èœã¡ã»åæ¢å¿ã察çã®èªåèªçæ©èœ : 1æéæšè«ãªã¯ãšã¹ãããªããšOSãèªåŸã·ã£ããããŠã³ããEC2ãšEBSãèªåTerminateãé«äŸ¡ãªGPUã®èª²éççºã培åºé²åŸ¡ã OpenAIäºæã®ãšã³ããã€ã³ã : ããŒã8000ã§æšæºAPIãç«ã¡äžãããããããããã¯ã©ã€ã¢ã³ãããæ¥ç¶å¯èœã ãã¯ã©ãŠãã®GPUã䜿ã£ãŠã¿ããããã©ãã³ã¹ããç°å¢ç¶æãå¿é
âŠâŠããšããæ¹ã¯ããã²ãã®ãæããªãèŽ
æ²¢ããªãšãã§ã¡ã©ã«æ§æã詊ããŠã¿ãŠãã ããïŒ
ã¯ããã« æ¬ããã°ã¯ãæ ªåŒäŒç€Ÿç¬¬äžèåãš Amazon Web Services Japan ãå
±åã§å·çããŸããã æ ªåŒäŒç€Ÿç¬¬äžèå ïŒä»¥äžã第äžèåïŒã§ã¯ãéä¿¡ã«ã©ãªã±ãDAMãã·ãªãŒãºã«ãããæ¡ç¹æ©èœã®é«åºŠåã«åãçµãã§ãããAWS Professional Services ãšå
±åã§ã人éã®èŽæã«å³ããæå£°è©äŸ¡ AI ã¢ãã«ãèŽææ¡ç¹ã¢ãã«ããéçºããŸããããã®æè¡ã¯ãDAM ã®ãã©ãã°ã·ããã¢ãã« LIVE DAM WAO! ã«æèŒãããŠããæ¡ç¹æ©èœ ç²Ÿå¯æ¡ç¹Ai Heart ã®äžæ žãšããŠæŽ»çšãããŠããŸãã 2026 幎 6 æ 25 æ¥ã6 æ 26 æ¥ã«å¹åŒµã¡ãã»ã§éå¬ããã AWS Summit Japan 2026 ã§ã¯ã第äžèåã®ããŒã¹ã«ãŠãã®èŽææ¡ç¹ã¢ãã«ã®ä»çµã¿ãšå®è£
ãã玹ä»ããã ããŸãããæ¬èšäºã¯ãAWS Summit Japan 2026 ã§ã®å±ç€ºå
容ãããšã«åæ§æãããã®ãšãªããŸãã 第äžèåãšã¯ æ ªåŒäŒç€Ÿç¬¬äžèåã¯ãæ¥åçšã«ã©ãªã±æ©åšãDAMãã·ãªãŒãºã®éçºã»è£œé ã»è²©å£²ãæãããäŒæ¥ã§ããã«ã©ãªã±äºæ¥ã«ãããŠã¯ãããã¯ã©ã¹ã®ã·ã§ã¢ãæããææ°æ©çš®ãLIVE DAM WAO!ãã§ã¯ AI æè¡ã掻çšããå€åœ©ãªæ©èœãæèŒããŠããŸãã åçæäŸïŒæ ªåŒäŒç€Ÿç¬¬äžèå ã«ã©ãªã±æ¡ç¹ã«ãããèª²é¡ åŸæ¥ã®ã«ã©ãªã±æ¡ç¹ã¯ãé³çšã»ãªãºã ã»ããã©ãŒããªã©ã®é³é¿ãã©ã¡ãŒã¿ãæ©æ¢°çã«è©äŸ¡ããæ¹åŒã§ããããã®æ¹åŒã¯äžå®ã®ç²ŸåºŠãæã€äžæ¹ã§ã以äžã®ãããªèª²é¡ããããŸããã 人éã®ææ§ãšã®ä¹é¢ : æ©æ¢°æ¡ç¹ã¯é³çšãéèŠããŠãããããäžå®ä»¥äžã®é³çšç²ŸåºŠãæã€æã«å¯ŸããŠã¯åŠ¥åœæ§ãããäžæ¹ã§ã人éããå¿å°ããããšæããæå£°ã®åŸ®åŠãªãã¥ã¢ã³ã¹ãååã«è©äŸ¡ã§ããªã ãæ¡ç¹æãããžã®å¯Ÿå¿ : æ©æ¢°çã«é«åŸç¹ãçãæãæ¹ïŒãããããæ¡ç¹æããïŒã«å¯ŸããŠé倧è©äŸ¡ããŠããŸãåŸåããã é³çšåéã®è©äŸ¡ : 现ããªé³çšã®ãºã¬ã«å¯ŸããŠé床ã«å³ããè©äŸ¡ãšãªãäžæ¹ã声質ã衚çŸåãšãã£ã人éã®ææ§ã«é¢ããèŠçŽ ãåæ ããã«ãã ãããã®èª²é¡ã解決ããããã第äžèå㯠AWS Professional Services ãšå
±åã§ã人éã®èŽæã«åºã¥ãæå£°è©äŸ¡ AI ã¢ãã«ã®éçºã«çæããŸããã èŽææ¡ç¹ã¢ãã«ã®éçºã¢ãããŒã æ¬ãããžã§ã¯ã㯠2019 幎ããçŽ 4 幎ã«ããããAWS Professional Services ã® Machine Learning Research Scientist ããã³ Data Analytics Consultant ããããžã§ã¯ãã«åç»ããæ©æ¢°åŠç¿ã¢ãã«ã®èšèšã»éçºã ãã§ãªããæåž«ããŒã¿ã®å質åäžã®ããã®çµ±èšææ³ã®å°å
¥ããå€§èŠæš¡ããŒã¿åŠçåºç€ã®æ§ç¯ãªã©ãå¹
åºãæè¡æ¯æŽãæäŸããŸããã以äžã§ã¯ããã®äžã§åãçµãã äž»ãªå®éšã»æè¡çã¢ãããŒãã«ã€ããŠè§£èª¬ããŸãã æåž«ããŒã¿ã®åéïŒäžå¯Ÿæ¯èŒæ³ã«ããèŽæã©ããªã³ã° èŽææ¡ç¹ã¢ãã«ã®éçºã«ãããŠæãéèŠãã€å°é£ãªå·¥çšã¯ãã人éã®èŽæããå®éçã«è¡šçŸããæåž«ããŒã¿ã®äœæã§ããã åœå㯠5 段é尺床æ³ã«ããè©äŸ¡ã詊ã¿ãŸãããã審æ»å¡ã«ãããã¬ã倧ããååãªç²ŸåºŠãåŸãããŸããã§ãããããã§ã2 ã€ã®æå£°ãèŽãæ¯ã¹ãŠãã©ã¡ããè¯ããããå€å®ãã äžå¯Ÿæ¯èŒæ³ ãæ¡çšããŸããã絶察å€ã§ç¹æ°ãä»ããæ¹åŒã«æ¯ã¹ãŠå¯©æ»å¡éã®å€æã®ã°ãã€ããå°ããæãããããããæŽåæ§ãé«ãã¹ã±ãŒã«å¯èœãªè©äŸ¡ãå¯èœã«ãªããŸãããçŽ 15 äžåã«åã¶ã©ãã«äœæ¥ãéããŠãé«å質ãªèŽæè©äŸ¡ã®æåž«ããŒã¿ãæ§ç¯ããŸããã äžå¯Ÿæ¯èŒã®çµæã Bradley-Terry æ³ïŒBT æ³ïŒã«ããèŽæã¹ã³ã¢ã«å€æããŸãããBT æ³ã§ã¯ããã¹ãŠã®ãã¢ãç¶²çŸ
çã«æ¯èŒããå¿
èŠããªããã°ã©ããé£çµããŠããã°ã¹ã³ã¢ãæšå®ã§ãããããå€§èŠæš¡ããŒã¿ãžã®ã¹ã±ãŒãªã³ã°ãå¯èœã§ãã ç¹åŸŽéæœåºïŒAudio Embedding Generator æå±é³æºããç¹åŸŽéãæœåºããæ¹æ³ãšããŠããªãŒãã³ãœãŒã¹ã®æ·±å±€åŠç¿ã¢ãã« Audio Embedding Generator ã䜿çšããŸãããããã«ãããé³å£°ããŒã¿ã 1 ç§ããšã« 128 次å
ã®ãã¯ãã«è¡šçŸã«å€æããŸãã å€§èŠæš¡ãªãšã³ããã£ã³ã°åŠçãå¹çåãããããAWS ã®ã³ã³ãããµãŒãã¹ã掻çšããæå€§ 1,000 䞊åã§ã®åŠçåºç€ãæ§ç¯ããŸãããããã«ãããçŽ 13 äžãã¡ã€ã«ã®ãšã³ããã£ã³ã°åŠçã 1.5 æéã§å®äºã§ããããã«ãªããŸããã ã¢ãã«ã®åŠç¿ãšè©Šè¡é¯èª€ åŠç¿ã¢ãã«ã«ã¯ AutoGluon Tabular ã䜿çšããèŽæè©äŸ¡çµæãšé³æºç¹åŸŽéãçµã¿åãããŠåŠç¿ãè¡ããŸããã æé©ãªã¢ãã«æ§æãèŠã€ãããããæééçŽç¹åŸŽéã®çš®é¡ããã«ãã¢ãŒãã«ç¹åŸŽéã®çµã¿åããããã¬ãŒãã³ã°ãµã³ãã«ã®éžææ¹æ³ãã¢ããªã³ã°ææ³ïŒåé¡ã»ååž°ïŒãšãã£ãè€æ°ã®èšèšè»žã«ã€ããŠãããããã®çµã¿åãããã¿ãŒã³ãç¶²çŸ
çã«å®éšããç²ŸåºŠãæ¯èŒæ€èšŒããŸããã AWS ã¢ãŒããã¯ãã£æŠèŠ èŽææ¡ç¹ã¢ãã«ã®ã·ã¹ãã ã¯ä»¥äžã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãã æ©æ¢°åŠç¿ã¢ãã«æ§ç¯ïŒAmazon SageMaker AIïŒ : èŽæè©äŸ¡ã¢ãã«ã®åŠç¿ã»è©äŸ¡ã Amazon SageMaker AI äžã§å®æœãP3 ç³» GPU ã€ã³ã¹ã¿ã³ã¹ã掻çšããæ·±å±€åŠç¿ã¢ãã«ã®å¹ççãªèšç·Žãå®çŸããŠããŸãã æåž«ããŒã¿ç®¡çïŒAmazon SageMaker Ground TruthïŒ : äžå¯Ÿæ¯èŒæ³ã«ããã©ããªã³ã°äœæ¥ã®ãã©ãããã©ãŒã ãšããŠæŽ»çšããŸããã ããŒã¿ä¿åïŒAmazon S3ïŒ : æå±é³æºããŒã¿ããšã³ããã£ã³ã°ç¹åŸŽéããŒã¿ãã¢ãã«ã¢ãŒãã£ãã¡ã¯ãã®ä¿åã«äœ¿çšããŠããŸãã å€§èŠæš¡ãšã³ããã£ã³ã°åŠç : AWS Fargate for Amazon ECS ãæŽ»çšãã䞊ååŠçåºç€ã«ããã倧éã®é³å£°ãã¡ã€ã«ã®ãšã³ããã£ã³ã°åŠçãæå€§ 1,000 䞊åã§é«éã«å®è¡ããŠããŸãã AWS Professional Services ãšã®å
±åéçºã®ææ äžèšã®å®éšãçµãŠãéçºãããèŽææ¡ç¹ã¢ãã«ã¯ä»¥äžã®ãããªç¹æ§ãå®çŸããŠããŸãã ãå¿å°ãããæå£°ã®èå¥ : AI èŽæã¹ã³ã¢ã®äžäœã«ã¯ãããŸãã¡ãªãæå£°ãæ··å
¥ãã«ããç¹æ§ãå®çŸããŸãã ãæ¡ç¹æãããžã®èæ§ : æ©æ¢°æ¡ç¹ãé«åŸç¹ã§ãã£ãŠãããæ¡ç¹æããã®ãããªäžèªç¶ãªæå£°ã«ã¯äœã AI èŽæã¹ã³ã¢ãä»äžããçµæãåŸãŸãã ã³ã³ãã¹ãäžäœæå±ã®é©åãªè©äŸ¡ : å®éã®ã«ã©ãªã±å€§äŒã«ãããããŒã¿ã«ãããŠããã審æ»å¡ãäžäœãšè©äŸ¡ããææã«å¯Ÿãã AI èŽæã¹ã³ã¢ã®è©äŸ¡ãé©åã«åäžããŸãã 人ã®èŽæã«è¿ãåŠç¿ããŒã¿ã®åéã¯ãæ¬ãããžã§ã¯ãæå€§ã®é£æã§ãããåœåã¯è©äŸ¡ã®ã°ãã€ãã«èŠåŽããŸããããAWS Professional Services ãäžå¯Ÿæ¯èŒæ³ãææ¡ããéçºæ¬éšã®å
šç€Ÿå¡ãå¯Ÿè±¡ã«æ°ãæãããŠè©äŸ¡ã宿œããããšã§ã人ã®èŽæã«è¿ãé«å質ãªåŠç¿ããŒã¿ãæºåã§ããŸããããŸãã補ååã«ããã£ãŠã¯ DAM 端æ«ã®ã¹ããã¯ã«åãããŠã¢ãã«ã倧å¹
ã«è»œéåããå¿
èŠãããããã®ç§»æ€ã»è»œéåã®å·¥çšã§ã AWS Professional Services ãç¶ç¶çã«æè¡æ¯æŽãè¡ããŸããããããã®åãçµã¿ã«ãããæ°æ©çš®ã®çºå£²ææã«åãããŠãããžã§ã¯ããæšé²ã§ããŸããã AWS Summit Japan 2026 ã§ã®åé¿ AWS Summit Japan 2026 ã®ç¬¬äžèåããŒã¹ã§ã¯ãç²Ÿå¯æ¡ç¹Ai Heart ã®éçºããã»ã¹ãã¢ãã¿ãŒã§ç޹ä»ãããã¬ãŒã³ããŒã·ã§ã³ã«å ããå®éã«ã¯ã³ã³ãŒã©ã¹æå±ã§ãã£ã¬ã³ãžã§ãããéæã«ã©ãªã±ããã¯ã¹ããèšçœ®ããŸããã90 ç¹ä»¥äžãç²åŸãããæ¹ã«ã¯ãªãªãžãã«ã¹ãã³ã¬ã¹ãã°ããã«ããã¬ãŒã³ãããäŒç»ãšãããšããã2 æ¥éã§ã®ã¹ 300 å以äžã®æ¹ã«ãåå ããã ããŸããã ããªã AWS Summit ã«ã«ã©ãªã±ãïŒããšå€ãã®æ¥å Žè
ã«è¶³ãæ¢ããŠããã ããç²Ÿå¯æ¡ç¹Ai Heart ã®èæ¯ã«ããæ©æ¢°åŠç¿æè¡ãšããããæ¯ãã AWS ã®ã¢ãŒããã¯ãã£ã«é¢ããŠã倿°ã®ã質åãšå¥œæçãªãåå¿ãããã ããŸããããæ®æ®µäœæ°ãªã楜ããã§ããã«ã©ãªã±ã®è£åŽã§ãããã»ã©æ¬æ Œçãªæ©æ¢°åŠç¿ã¢ãã«ãåããŠãããšã¯æããªãã£ããã15 äžåãã®äººæã«ããèŽæè©äŸ¡ãç©ã¿äžããŠæåž«ããŒã¿ãäœã£ãŠããç¹ã«é©ããããã«ã©ãªã±ã AWS ã§åããŠãããã§ããããšãã£ãææ³ãæ°å€ãããã ãã身è¿ãªãšã³ã¿ãŒãã€ã³ã¡ã³ããµãŒãã¹ã«ããã AI 掻çšã®å®äŸãšããŠãå€ãã®ãã«ããŒã®çæ§ãšå¯Ÿè©±ã§ãã貎éãªæ©äŒãšãªããŸããã ããã㫠第äžèåã®èŽææ¡ç¹ã¢ãã«ã¯ãAWS Professional Services ãšã®å
±åéçºã«ãããåŸæ¥ã®æ©æ¢°æ¡ç¹ã§ã¯å®çŸã§ããªãã£ãã人éã®ææ§ã«å¯ãæ·»ã£ãæå£°è©äŸ¡ããå®çŸããŸãããæ¡ç¹åè³ªã®æ žãšãªã 15 äžåã®èŽæã©ããªã³ã°ã¯ãããŠäººéã®è³ã§äžã€ã²ãšã€ç©ã¿éãããã®è²ŽéãªããŒã¿ãæå€§é掻ããããã®ã¢ãã«æ§ç¯ã»éçšåºç€ã« AWS ã®æ©æ¢°åŠç¿ãµãŒãã¹ã掻çšããããšã§ãã«ã©ãªã±äœéšãããè±ããªãã®ã«ããŠããŸãã ä»åŸã®å±æãšããŠã¯ãèŽæã¢ãã«ã§ã¯è£ããããªãã£ããåŸç¹ã«å¯ŸããçŽåŸæããããã«è¿œæ±ããŠããäºå®ã§ããä»åŸã®ç²Ÿå¯æ¡ç¹ã·ãªãŒãºã«æ¯éãæåŸ
ãã ããã èè
ã«ã€ã㊠å·è¡ éæµïŒRie ShigyoïŒ æ ªåŒäŒç€Ÿç¬¬äžèå éçºæ¬éš ã³ã³ã·ã¥ãŒãäºæ¥éš å¿çšæè¡èª² èŽææ¡ç¹ã¢ãã«ã®äŒç»ã»éçºãäž»å°ã äžæ¬ ç¿å€ªïŒShota NakamotoïŒ ã¢ããŸã³ãŠã§ããµãŒãã¹ãžã£ãã³ååäŒç€Ÿ ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã ãµãŒãã¹æ¥çã®ã客æ§ãäžå¿ã«ãå¹
åºãæ¥ç𮿥æ
ã®ã客æ§ããæ¯æŽããŠããŸãã
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã














