머신러닝과 딥러닝, 그리 AI(인공지능)!!!
AI 서비스를 개발하기 위한 환경을 만들어본다.
최종 목표는 Kubeflow 기반의 AutoML 환경 구성이고, IaC(Infra as Code) 기반으로 Automation 하는것이 목적이다.
1편 "가상환경 만들기" 호스트 서버 구성
- 호스트 OS : Ubuntu 20.04 LTS
- 호스트 서버 : Intel i7-10700, 16GiB DDR4, 1TB SSD, 10TB HDD
- 가상화(Virtualization) 도구 : Virtualbox 6.1
- 프로비저닝(Provisioning) 도구 : Vagrant 2.2.14
- IaC(Infra as Code) : Ansible 2.5.1
가. Ubuntu 설치
Ubuntu 20.04를 설치한다. (설치방법 생략)
나. VirtualBox 설치
버추얼박스(이하 VBox)는 Oracle에서 제공하는 Repository를 이용하여 설치한다.
apt로 설치하면 간편하긴하지만 버전을 지정할 수 없다.
Oracle Site에서 직접 원하는 버전을 다운로드해서 설치할 수도 있으나, 자동 업데이트가 안되는 문제가 있다.
1. Oracle Repository 등록
sudo sh -c 'echo "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib" >> /etc/apt/sources.list.d/virtualbox.list'
2. VBox 다운로드
sudo apt update
sudo apt upgrade
# VBox 설치 파일을 다운로드할 경로
cd ~/download
sudo wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
sudo wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
sudo apt update
3. VBox 설치
sudo apt install virtualbox-6.1
# VBox Extension 설치(추가)
sudo wget https://download.virtualbox.org/virtualbox/6.1.8/Oracle_VM_VirtualBox_Extension_Pack-6.1.8.vbox-extpack
sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.8.vbox-extpack
[참고] VboxManage extpack 설치할 때 라이센스 이용 약관이 표시되면 "동의", "Y"를 입력할 것
[참고] VBox 제거 : sudo apt remove virtualbox virtualbox-*
다. Vagrant 설치
Vagrant는 HashiCorp에서 만든 Provisioning 도구이다.
VBox를 이용하여 가상머신을 자동으로 생성할 수 있을 뿐만 아니라, 기본적으로 필요한 서버의 셋팅도 자동화할 수 있다.
1. Vagrant 설치
# 다운로드할 경로로 이동
cd ~/download
curl -O https://releases.hashicorp.com/vagrant/2.2.14/vagrant_2.2.14_x86_64.deb
sudo apt install ./vagrant_2.2.14_x86_64.deb
# 버추얼박스 Plugin 설치
vagrant plugin install vagrant-vbguest
[참고] 설치 확인 : vagrant --version
라. Ansible 환경 구축
Vagrant를 이용하여 Ubuntu Guest 머신을 생성하고, Ansible 서버를 설치한다.
이제 부터 Vagrant로 가상머신(이하 VM)을 만들고 지우는 작업을 반복해야하고, 또 많은 VM을 한번에 생성해야할 수 있기 때문에 별도의 작업공간을 설정하는 것이 좋다.
나는 /work 경로에 4TB의 디스크파티션을 할당했고, 사용자 계정 권한을 부여했다.(예: chwon [계정명]:[그룹명] /work)
1. Vagrantfile 생성
# 작업 디렉토리 생성 및 이동
mkdir /work/vagrant/ansible
cd /work/vagrant/ansible
vagrant init
"vagrant init" 명령을 수행하면 "Vagrantfile"이 생성된다.
Vagrantfile을 수정하여 ansible-server를 구성한다.
2. Vagrantfile 수정 - Ansible Master Server 생성
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
#ansible-server 설치
config.vm.define "ansible-server" do |cfg|
cfg.vm.box = "ubuntu/bionic64"
cfg.vm.provider "virtualbox" do |vb|
vb.name = "ansible-server"
end
cfg.vm.host_name = "ansible-server"
cfg.vm.network "public_network", ip: "192.168.1.11"
cfg.vm.network:forwarded_port, host: 61122, guest: 22, auto_correct: true, id: "ssh"
cfg.vm.synced_folder "../shared_data", "/shared_data", disabled: true
cfg.vm.provision:shell, inline: "apt-get update -y"
cfg.vm.provision:shell, inline: "apt-get install ansible -y"
cfg.vm.provision:shell, path: "bootstrap.sh"
end
end
우선 서버 한대를 Ansible Master Server로 생성한다.
Ansible Master Server 를 포함하여 Ansible Worker Server(멤버들) 들이 계속 추가될 것이고, 모든 서버에 동일한 환경을 구성하기 위해 서버 기동 시 적용할 "bootsrap.sh"를 작성해서 적용한다.
[주요내용]
- cfg.vm.box = "ubuntu/bionic64" : 우분투 18.04 Vagrant Box 사용 (우분투 20.04 Box를 사용하려면 "ubuntu/focal64")
- cfg.vm.provider "virtualbox" : 가상화 도구로 VBox 사용
- cfg.network "public_network", ip: [가상머신IP] : BridgeAdapter Network을 구성, NAT를 통한 외부망 연결 가능, IP는 NAT 영역과 충돌하지 않도록 다른 영역의 CIDR 사용할 것. (예: NAT=10.0.2.0/24, Bridge=192.168.1.0/24)
- cfg.network:forwarded_port : "SSH" 포트 포워딩 적용(guest=VM, host=로컬서버를 의미함, 즉 서버 '61122' 포트를 VM '22' 포트로 포워딩)
- cfg.vm.provision:shell, inline: "..." : VM내에서 쉘 명령 실행
- cfg.vm.provision:shell, path: "..." : path 경로에 있는 쉘 스크립트 파일 실행
[참고URL]
Vagrant Cloud by HashiCorp
Vagrant Cloud by HashiCorp
app.vagrantup.com
3. bootstrap.sh 작성
VBox, Vagrant, Ansible 등 다양한 프로비저닝 자동화 도구를 사용하는 이유는 "Script"와 "Template"을 이용하여 다수의 서버를 핸들링하기 위함이다. 개발을 위해서든 운영을 위해서든 단독서버 보다는 여러 서버를 사용하는 경우가 많을 것이고, 각 서버들은 계정, 디스크, 보안 등 공통적인 관리 항목이 존재한다. 자동 프로비저닝을 사용하면 필요한 서버를 원하는 시기에 원하는 형태로 만들 수 있다.
bootstrap.sh 스크립트를 작성하여 서버의 기본 설정을 구현한다.
#! /bin/bash
# 모든 멤버(서버)를 대상으로 공통사항을 설정하거나 필요한 유틸을 설치
# Ansible 은 Server(마스터)와 Clients(멤버들)로 구성됨.
# 마스터 서버와 멤버들의 설정이 다를 수 있으므로 host_name 구분을 위해 사용
MASTER_NAME="ansible-server"
HOST_NAME=$HOSTNAME
step=1
# 공통 설정 단계와 단계 별 안내 메세지 출력
print_step() {
echo "STEP $step $1"
step=$((step+1))
}
# 모든 서버의 공통사항 설정
setup_env() {
print_step "###===== Initialize Evironment =====###"
apt-get update -y
apt-get install -y net-tools
# /etc/hosts 파일에 멤버들을 등록
setup_hosts
# SSH 접속 환경 설치
setup_ssh
setup_root_login
# Master, Worker에 따라 달라지는 설정 적용
if [ $MASTER_NAME = $HOSTNAME ]
then
setup_master
else
setup_worker
fi
}
# Master 설정
setup_master() {
print_step "###===== Initialize Master : Ansible Server =====###"
# 멱등성의 문제 고려
# (주의) Ansible의 설정을 bootstrap에서 설정할 경우 반복 실행 시 내용이 중복될 수 있음
# 예: /etc/ansible/hosts 파일 수정 등
# 멱등성을 고려하여 Ansible을 위해 필요한 고유 설정은 ansible 기능을 사용하는 것이 좋음
#echo "[webservice]" >> /etc/ansible/hosts
#echo "ansible-client01" >> /etc/ansible/hosts
}
# Worker 설정
setup_worker() {
print_step "###===== Initialize Worker =====###"
}
# 호스트 도메인 등록 : /etc/hosts
setup_hosts() {
print_step "###===== Setup /etc/hosts =====###"
ADD_HOSTS = $(grep "bootstrap" /etc/hosts)
# /etc/hosts 파일 중복 작성 방지
if [[ -z $ADD_HOSTS ]]
then
echo "192.168.1.11 ansible-server" >> /etc/hosts
echo "192.168.1.12 ansible-client-01" >> /etc/hosts
fi
}
# SSH 환경 설정
setup_ssh() {
print_step "###===== Install OpenSSH =====###"
apt-get update -y
apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
apt-get install -y openssh-server
apt-get install -y ssh
service ssh enable
#systemctl enable ssh
service ssh start
print_step "###===== Setup SSH Authentication without password input =====###"
# 비밀번호 입력 없이 SSH Connection
apt-get install -y sshpass
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
service ssh restart
}
# Root 계정 활성화
setup_root_login() {
print_step "###===== Enalbe Root Setup =====###"
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
service ssh restart
echo "root:rootroot" | chpasswd
}
# 멤버 접속 시 웰컴 메세지 출력
print_welcome_cow() {
print_step "###===== Create Welcome Message =====###"
WELCOME=$(grep "Welcome" /home/vagrant/.bashrc)
# $WELCOME 의 문자열 길이가 '0' 이면
# 메세지 중복 방지
if [[ -z $WELCOME ]]
then
apt-get install -y cowsay
echo -e "\necho \"Welcome to Ubuntu 18 .04, VM Vagrant\" | cowsay\n" >> /home/vagrant/.bashrc ln -s /usr/games/cowsay /usr/local/bin/cowsay
fi
}
main() {
setup_env
print_welcome_cow
}
main
4. 가상 서버 생성 - Provisioning
Vagrantfile을 실행하면 추가한 머신(ansible-server)이 VBox에 생성된다.
# 머신 생성을 위한 베이그런트 실행
vagrant up
# 버추얼박스 실행, 확인
virtualbox &
# 생성한 Guest 머신 접속
vagrant ssh
[Vagrant 명령어 참고]
- vagrant init : 베이그런트 환경 초기화
- vagrant up : Vagrantfile 내용 최초 실행
- vagrant reload --provision : VM 재실행 및 새로운 프로비저닝 설정 적용
- vagrant halt : VM 실행 중지
- vagrant status : 프로비저닝된 VM 리스트 및 상태확인
Vagrantfile에 서버를 새로 추가했다면 vagrant up 명령을 사요하면 되고, 기존 서버의 설정을 변경하거나 추가했다면 vagrant reload --provision 명령을 사용하면 된다.
기본적인 서버(가상서버)의 프로비저닝 환경을 만들었다.
Vagrant와 VBox만으로도 상당히 편리한 Infra 관리 자동화가 가능하다.
하지만 애플리케이션 개발을 위해서는 WEB, WAS, DB 등 Middleware 환경을 구성해야하고, Application Runtime을 위한 의존성 라이브러리 관리, 소스관리, 배포환경 등 다양한 환경 구성이 필요하다.
인공지능 서비스 개발을 위한 개발환경 역시 머신러닝, 딥러닝을 위한 Model 생성, Traning, Validation, Production 등 Pipeline 환경 구성이 필수적이다.
이를 위한 다양한 SW를 일일히 설치하고, 기존 설정을 변경하거나 추가하는 것은 매우 어렵고, 시간이 많이 드는 작업이다. 이런 작업을 자동화할 수 있도록 Infra as Code(IaC) 적용이 필요하다.
Ansible을 이용하여 IaC 자동화 환경을 만들고, AI 서비스 개발에 필요한 환경을 쉽게 관리할 수 있도록 Automation 작업을 계속 해보자.
AI 개발환경 구축기 #2-IaC Automation(Ansible)
AI 개발환경 구축기 #2-IaC Automation(Ansible)
"작성중" 머신러닝과 딥러닝, 그리 AI(인공지능)!!! AI 서비스를 개발하기 위한 환경을 만들어본다. 최종 목표는 Kubeflow 기반의 AutoML 환경 구성이고, IaC(Infra as Code) 기반으로 Automation 하는것이 목적
jarikki.tistory.com
'Automation > system' 카테고리의 다른 글
[자동화] AI 개발환경 구축기 #3-Kubernetes Cluster(with kubespray) (0) | 2021.03.31 |
---|---|
[자동화] AI 개발환경 구축기 #2-IaC Automation(Ansible) (0) | 2021.03.11 |
[ETL] - Talend Open Studio DB2DB 이관 #2 (0) | 2020.10.22 |
[ETL] - Talend Open Studio 설치 #1 (0) | 2020.10.20 |
서버 자동화 #1 - 개요 (0) | 2020.09.24 |