2020년 7월 23일 목요일

centos7 kernel update

퍼옴 : https://deepcell.co.kr/m/101?category=803342

CentOS 7.x 의 경우 Linux Kerne Version이 3.10입니다.

참고로 최신 Linux Kernel Version은 5.6(2020년 2월 현재 기준)이며 Ubuntu 16.04의 경우 4.x 입니다.

상대적으로 CentOS의 Kernel Version이 낮은 것을 알 수 있습니다.

그런데 3.x의 Kernel 버전이 Memory 처리에 문제가 있는 것 같습니다. 딥러닝 관련되어 큰 작업을 실행할 경우 문제가 될 수 있으므로 Kernel을 4.x 이상으로 업데이트하라는 문서가 있습니다.

OS가 CentOS 7인 Host에서 Docker Container로 Ubuntu를 사용하는 경우 Kernel은 Host의 Kernel을 사용하게 되므로 Container가 Ubuntu OS여도 Kernel Version이 3.10이 됩니다. 그래서 Ubuntu Container에서 TensorFlow를 사용하는 경우에도 Kernel Update가 필요합니다.


Version 확인

# uname -msr

-> Linux 3.10.0-957.el7.x86_64 x86_64

참고로 CentOS Package Version 확인

# cat /etc/redhat-release && cat /etc/os-release

 

elrepo 저장소를 이용한 Kernel Update

Kernel을 Update하는 방법은 여러 가지가 있지만 가장 편리한 방법은 elrepo 저장소를 이용하는 방법입니다. 여기서는 이 방법만을 설명합니다. 

elrepo 는 Enterprise Linux 용 커뮤니티 기반 저장소이며, RHEL(RedHat Enterprise Linux) 및 이를 기반으로 꾸며진 기타 배포판들(Fedora, CentOS, Scientific)에 대한 지원을 제공하는 저장소입니다.

 

1) elrepo 저장소의 커널을 이용하여 업그레이드하기 위한 사전 작업

yum update를 할 때 기본적으로 OS Package의 마이너 업그레이드를 합니다. 즉 CentOS 7.6에서 yum update를 하면 CentOS 7.7로 update됩니다. 이 업데이트를 막으려면 /etc/yum.conf에 아래와 같은 줄을 추가합니다.

/etc/yum.conf 파일 수정 : 아래 줄 추가
exclude=centos-release* redhat-release*

# yum -y update
# yum install yum-plugin-fastestmirror (업데이트와 설치를 빠르게 할 수 있도록 입력)

2) 인증 키 설치

* GPG-KEY 는 GNU Privacy Guard-KEY : 배포되고 있는 패키지가 안전한 패키지가 맞는지 확인하는 일종의 인증키랍니다.
# rpm —import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

3) elrepo 저장소 추가(최신 URL은 elrepo.org에서 확인)

# yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# yum repolist (정상적으로 저장소가 추가 되었는지 확인)
4) 가능한 업데이트 보기 : 

# repoquery --enablerepo=elrepo-kernel -qi kernel (공식 커널 버전)
# repoquery --enablerepo=elrepo-kernel -qi kernel-lt (lt; long term 커널 버전)
# repoquery --enablerepo=elrepo-kernel -qi kernel-ml (ml; maine line, 최신 커널 버전)

(상세 보기)
# yum list available --disablerepo='*' --enablerepo=elrepo-kernel

참고 : 2020/02/21 현재 버전
공식 커널(CentOS 7.5) : 3.10.0
lt(long term) : 4.4.214 (현재 4.4 버전을 설치하였을 때 Asus Board의 네트워크 포트가 정상 작동하지 않는다.)
ml(main line) : 5.5.5

5) 새로운 커널 설치를 : 아래 명령 중 선택하여 설치(예, lt로 업데이트)

# yum --enablerepo=elrepo-kernel install kernel-lt (필수 : 최신 버전(lt)을 설치)

# yum --enablerepo=elrepo-kernel install kernel-lt-devel.x86_64 (선택 : devel version 설치)

# yum --enablerepo=elrepo-kernel install kernel-lt-headers.x86_64 (선택 : header file 설치)

(확인)
# ls -l /usr/src/kernels/$(uname -r)

6) grub1 부트 로더 설정(부팅할 때 업데이트 된 커널이 자동으로 선택되도록 변경)

# grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2 (부팅 가능한 커널 목록이 나온다.)
# grub2-set-default "CentOS Linux (4.4.214-1.el7.elrepo.x86_64) 7 (Core)" (디폴트 부팅 커널, 다음 줄 반드시 실행)
# grub2-mkconfig -o /boot/grub2/grub.cfg

# grub2-editenv list (확인)

7)yum update할 때 kernel은 업데이트되지 않게 하기.

# yum update --exclude=kernel*
vi /etc/yum.conf : 한 줄 추가
exclude=kernel*
exclude=kernel* centos-release* redhat-release*

# reboot

딥러닝 GPU 스펙 최소_최대

텐서플로우 GPU 추천 최소 사양

퍼옴:  https://hiseon.me/data-analytics/tensorflow/tensorflow-requirements/

최신 버전의 텐서플로우를 사용하기 위해서는, NVIDIA GPU 에서 지원되는 Compute capability(Version, 계산 능력)이 3.5 이상이 되어야 합니다. Compute capability란 GPU 에서 지원되는 연산 특징 버전으로서, NVIDIA GPU에서 지원되는 Compute capability는 아래의 페이지에서 확인 하실 수 있습니다.

https://developer.nvidia.com/cuda-gpus

Quadro , Tesla, NVS 비싸서 패스 ㅜ.ㅜ


Recommended GPU for Developers

NVIDIA TITAN RTX

NVIDIA TITAN RTX is built for data science, AI research, content creation and general GPU development. Built on the Turing architecture, it features 4608, 576 full-speed mixed precision Tensor Cores for accelerating AI, and 72 RT cores for accelerating ray tracing. It also includes 24 GB of GPU memory for training neural networks with large batch sizes,


현재 최신 NVIDIA 드라이버 버전인 410.x 이상을 지원하는 NVIDIA GPU이어야 합니다. 갖고 계신 NVIDIA GPU의 드라이버가 410.x 이상을 지원하는지 확인하기 위해서는 아래 사이트에서 방문 하신뒤에 조회하시면 됩니다.

http://www.nvidia.com/Download/Find.aspx?lang=en-us


실제 텐서플로우에서 개발된 모델을 학습하고, 테스트하기 위해서는 GeForece GTX 시리즈를 권장해 드립니다. GeForce GTX 750, GeForce GTX 750 Ti 그리고 GeForce GTX 780이상의 모델들입니다.


필요한 Bert 파일은 modeling.py, optimization.py, run_squad.py, tokenization.py이며, Pre-trained Model은 BERT-Base Multilingual Cased로 여러 국가의 언어로 pre-train된 모델입니다. BERT는 학습 권장 GPU 메모리가 최소 12g를 요구하는 큰 모델입니다.


Bert 학습하고 테스트 하고 싶으면 최소사양은 달라 집니다. 

GeForce GTX 1080 Ti   11G  120만원

GeForce GTX 2080 Ti   11G  160만원






 


2020년 6월 29일 월요일

머신러닝을 위한 특성 임베딩 추출 및 제공

https://cloud.google.com/solutions/machine-learning/overview-extracting-and-serving-feature-embeddings-for-machine-learning?hl=ko

개요: 머신러닝을 위한 특성 임베딩 추출 및 제공

이 문서는 ML(머신러닝)을 위한 특성 임베딩 추출 및 제공 과정을 살펴보는 시리즈 중 하나입니다. 이 문서에서는 특성 임베딩의 개념과 특성 임베딩이 중요한 이유를 설명합니다. 또한 텍스트 및 이미지의 의미적 유사성에 집중하여 특성 임베딩과 관련된 도메인과 사용 사례를 살펴봅니다. 또한 이 문서에서는 Google Cloud에서 특성 임베딩 추출 및 제공을 대규모로 사용 설정할 수 있는 TensorFlow Hub(tf.Hub)와 같은 아키텍처 및 기술을 설명합니다.

이 시리즈의 두 번째 문서인 TensorFlow Hub 및 Cloud Dataflow를 사용한 텍스트 시맨틱스 유사성 분석에서는 텍스트 임베딩을 사용하여 문서의 시맨틱스 유사성을 수행하는 방법을 설명합니다.

소개

머신러닝의 목적은 데이터에서 패턴을 추출하고 이러한 패턴을 이용해서 예측을 수행하는 것입니다. 이러한 예측적인 패턴은 입력 데이터 특성과 예측할 결과 대상 사이의 관계를 나타냅니다. 일반적으로 비슷한 특성 값을 지닌 인스턴스는 비슷한 예측 결과로 이어집니다. 따라서 이러한 입력 특성의 표현은 학습된 패턴의 본질 및 품질에 직접적으로 영향을 줍니다.

예를 들어 주택 상태 데이터를 기준으로 주택 임대료를 산정하기 위한 가격 견적기를 작성한다고 가정해보세요. 이를 위해서는 각 주택을 실제(숫자) 값의 특성 벡터로 표현해야 합니다. 그리고 이러한 벡터의 각 요소는 주택의 한 특성이 지닌 가치를 나타냅니다. 이 경우에 유용한 특성에는 주택 크기, 연식, 방 개수, 위치, 방향(주택이 바라보는 방향)과 같은 것들이 포함될 수 있습니다. 특성이 비슷한 주택들은 비슷한 가격이 도출될 것입니다.

주택 가격 책정 예시의 특성에 지정된 값은 이미 숫자일 수도 있고, 원-핫 인코딩을 통해 숫자 특성으로 변환될 수도 있습니다. 하지만 다른 사례들에 사용되는 특성 표현은 더 복잡합니다. 다음 사례들을 고려해보세요.

  • 문서 제목 또는 내용으로 문서의 주제 식별
  • 특정 잡지 표지를 보고 비슷한 잡지 찾기
  • 텍스트 기반 리뷰를 통해 특정 제품과 관련된 고객의 정서 이해
  • 사용자가 지난 주에 들었던 음악에 따라 새로운 음악 목록 생성
  • 사용자가 현재 보고 있는 것과 비슷한 패션 아이템이나 예술품 제안
  • 자연어 쿼리에 따라 FAQ 목록에서 가장 관련 있는 답변 검색

이러한 예에서 볼 수 있듯이, 입력 데이터는 구조화되어 있지 않거나, 구조화되지 않은 콘텐츠가 포함된 특성을 갖습니다. 이러한 유형의 특성에는 문서 제목 및 내용 또는 고객 제품 리뷰와 같은 텍스트, 잡지 표지, 패션 아이템 또는 예술품과 같은 이미지, 노래와 같은 오디오가 포함됩니다. 머신러닝 작업을 위해 이러한 유형의 데이터를 사용하기 위해서는 이러한 유형의 데이터가 실제 값으로 표현된 간결한 특성 벡터 표현이 필요합니다. 이러한 벡터를 임베딩이라고 부릅니다.

임베딩이란 무엇인가요?

임베딩은 고차원 벡터를 저차원 공간으로 변환하는 것입니다. 이상적으로, 임베딩은 임베딩 공간에서 의미적으로 비슷한 입력 사항들을 가깝게 배치함으로써 입력에 포함된 의미 중 일부를 포착합니다.

텍스트 임베딩

텍스트 표현 예를 고려해보세요. 문서의 제목과 같이 영어 문장에 포함된 단어들을 다음 방법 중 하나로 표현할 수 있습니다.

  • 각 셀이 별개의 영어 단어를 나타내는 매우 크고(고차원) 희박한 벡터 방법을 사용합니다. 이 방법에서는 백만 개의 개별 단어를 나타내기 위해 백만 개의 요소가 사용될 수 있습니다 한 셀의 값은 해당 단어가 문장에서 나타나는 횟수를 나타냅니다. 하나의 영어 문장은 단어가 50개 이상 사용될 가능성이 높지 않으므로, 벡터에 포함된 거의 모든 셀에는 0이 포함될 것입니다.

  • 비교적 작지만 밀도가 높은 벡터(일반적으로 수백 개 정도의 요소만 포함) 방법을 사용합니다. 이 방법에서 각 요소는 단어의 서로 다른 특성을 나타내며, 각 요소에는 단어가 관련 특성을 대표하는 정도를 나타내는 0과 1 사이의 값이 포함됩니다. 실제로 단어는 벡터에 있는 것 만큼 많은 속성을 사용해서 의미적으로 인코딩됩니다. 이 벡터가 임베딩이고, 문서 제목의 의미를 포착하려고 시도합니다.

임베딩 벡터 공간에서 특정 제목에 대한 임베딩은 제목 단어 나열이 다르더라도 비슷한 제목의 임베딩에 가까이 배치됩니다. 예를 들어 'The squad is ready to win the football match'와 'The team is prepared to achieve victory in the soccer game'는 의미가 같지만, 비슷한 어휘가 거의 없습니다. 하지만 이러한 임베딩 표현에서는 시맨틱스 인코딩이 매우 유사하기 때문에 임베딩 공간에서 서로 가까이 놓여야 합니다.

NNLM(Neural-Net Language Model)GloVe(Global Vectors for Word Representation)ELMo(Deep Contextualized Word Representations)Word2vec 등의 여러 모델은 각 단어마다 실제 값 특징 벡터인 단어 임베딩을 학습하도록 설계되었습니다.

예를 들어 영문 위키백과 자료와 같은 대규모 텍스트 자료를 사용하여 Word2vec 모델을 학습하면 남성-여성, 동사 시제, 국가-수도 관계와 같은 시맨틱스 관계가 있는 단어들 간의 의미적 거리와 방향을 캡처하는 임베딩이 생성됩니다. 그림 1은 일부 예제 벡터의 임베딩 공간을 보여줍니다. 자세한 내용은 연속 공간 단어 표현의 언어적 일반성 문서를 참조하세요.

단어 사이의 시맨틱스 관계
그림 1. 단어 사이의 시맨틱스 관계

Universal Sentence Encoder는 단어 길이보다 큰 텍스트를 실제 값 특징 벡터(예: 문장, 구 또는 짧은 단락)로 인코딩합니다. 의미적 유사성이 있는 문장들은 임베딩 공간에서 밀접한 거리의 벡터로 인코딩됩니다.

이미지 임베딩

텍스트 시스템과 달리, 이미지 처리 시스템은 개별적인 원시 픽셀 강도를 지닌 이미지를 나타내는 풍부하고 고차원적인 데이터세트로 작동합니다. 하지만 원래의 밀도가 높은 형태의 이미지는 일부 작업에 그리 유용하지 않을 수 있습니다. 예를 들어 잡지 표지 이미지를 보고 비슷한 잡지를 찾거나 참조 사진과 비슷한 사진을 찾아야 한다고 가정해보세요. 입력 사진의 원시 픽셀(2,048 ✕ 2,048)을 다른 사진과 비교하여 비슷한지 여부를 찾는 것은 효율적이거나 효과적이지 않습니다. 하지만 이미지의 저차원 특징 벡터(임베딩)를 추출하면 이미지에 포함된 내용이 무엇인지 알 수 있으므로 더 효과적으로 비교할 수 있습니다.

핵심은 대규모 이미지 데이터 세트(예: ImageNet)에서 InceptionResNet(Deep Residual Learning) 또는 NASNet(Network Architecture Search)과 같은 이미지 분류 모델을 학습시키는 것입니다. 그런 다음 마지막 softmax 분류 기준이 없는 모델을 사용하여 입력 테스트에 따라 특징 벡터를 추출합니다. 이 유형의 특징 벡터로 검색 작업 또는 유사성 일치 작업에서 이미지를 효과적으로 표현할 수 있습니다. 특징 벡터는 다른 특성과 함께 ML 작업용 추가 입력 특성(벡터)으로 작동할 수 있습니다. 예를 들어 의류를 쇼핑 중인 고객에게 패션 아이템을 추천하는 시스템에서는 색상, 치수, 가격, 유형, 하위유형을 비롯한 개별 항목을 기술하는 속성이 사용될 수 있습니다. 패션 아이템 이미지에서 추출된 특성과 함께 이러한 모든 특성을 추천자 모델에서 사용할 수 있습니다.

그림 2에서 보여주는 t-SNE Map 실험은 임베딩을 사용하여 비슷한 예술작품을 찾는 예시 중 하나입니다. 다음 이미지는 Google Arts & Culture 컬렉션에 있는 콘텐츠 중 일부에서 에서 가져온 것입니다.

Google ML을 기반으로 t-SNE를 사용하여 유사성에 따라 매핑된 이미지
그림 2. Google ML을 기반으로 t-SNE를 사용하여 유사성에 따라 매핑된 이미지

이와 마찬가지로 오디오 데이터의 경우에는 고차원 파워 스펙트럼 밀도 계수로부터 저차원 특징 벡터를 추출할 수 있습니다. 그런 다음 다양한 검색 태스크, 추천 앱, 기타 ML 기반 애플리케이션에서 이러한 특징 벡터를 효율적으로 사용할 수 있습니다.

협업 필터링 및 임베딩

임베딩은 협업 필터링(CF) 작업에서 비롯되었습니다. CF는 다른 여러 사용자의 관심사를 기준으로 특정 사용자의 관심 항목을 예측해야 하는 추천 시스템에서 사용되는 기술입니다. 예를 들어 영화를 추천한다고 가정해보세요. 사용자 수가 1,000,000명이고, 영화가 500,000개 있고, 각 사용자가 시청한 영화 목록이 있습니다. 이 예시에서는 영화 또는 사용자에 대한 다른 어떠한 정보도 사용하지 않고 사용자 ID, 영화 ID, watched 플래그만 사용합니다. 이러한 정보를 하나로 합하면 데이터 세트가 거의 생성되지 않습니다.

사용자의 시청 기록을 기준으로 서로 유사한 영화를 확인하려고 합니다. 이를 위해서는 특정 사용자가 시청한 영화는 '영화 선호도' 공간(임베딩)에서 가까이 배치되는 저차원적인 공간으로 영화를 임베딩하면 됩니다. 또한 사용자가 시청한 영화를 기준으로 동일한 공간에서 사용자에 대한 임베딩을 만들 수도 있습니다. 그에 따른 공간에서 사용자 임베딩은 사용자가 시청한 영화의 임베딩과 가깝게 배치됩니다. 이러한 방법에서는 인접한 사용자와 영화는 선호도를 공유하므로 사용자 임베딩에 대한 영화 근접성을 기준으로 다른 영화를 추천할 수 있습니다.

사용자 및 영화와 같은 임베딩은 행렬 분해단일 값 분해신경 협업 필터링신경 분해 머신과 같은 기법을 사용하여 학습시킬 수 있습니다. 그림 3은 2차원 공간의 영화 임베딩 예를 보여줍니다. 첫 번째 차원은 어린이(음수 값) 또는 성인(양수 값) 영화인지 여부를 기술합니다. 두 번째 차원은 각 영화가 블록버스터(양수 값) 또는 저예산 영화(음수 값)에 가까운 지를 나타냅니다. 이 설명에서 음수 값 및 양수 값의 할당은 임의적이며, 좌표 확인을 위해서만 사용됩니다. 이 예시에서 '슈렉' 및 '인크레더블'과 같은 영화는 모두 어린이 영화이자 블록버스터 영화로 간주되므로 임베딩 공간에서 서로 가깝게 배치됩니다.

ML 알고리즘은 이러한 값이 성인 대 어린이 또는 블록버스터 대 저예산 영화와 관련된 요소라는 것을 알지 못하면서도 각 영화의 이러한 차원 값을 학습합니다. 이와 같은 시스템을 빌드하는 방법에 대한 자세한 내용은 TensorFlow로 추천 시스템 빌드를 참조하세요.

2차원 공간의 영화 임베딩 예시
그림 3. 2차원 공간의 영화 임베딩 예시

기타 임베딩 유형

임베딩 기반 학습은 그래프 연결과 관련하여 그래프에 있는 노드나 전체 그래프 구조와 같은 복잡한 데이터 구조를 나타내기 위한 용도로 사용할 수도 있습니다. 임베딩은 약품 설계, 소셜 네트워크의 친구 추천, 단백질 간 상호작용 감지와 같은 연결 중심의 도메인에서 유용합니다. 이러한 유형의 작업 기술에는 그래프 컨볼루셔널 신경망과 그래프 행렬 완성이 포함됩니다.

또 다른 임베딩 적용 분야는 하나의 모달리티에서 다른 모달리티로 정보를 변환하는 것을 목표로 하는 다중 모달 학습입니다. 예를 들어 자동 이미지 캡션(그림 4 참조)에서는 이미지에 대해 캡션이 자동으로 생성됩니다. (이미지에 표시된 것처럼 완벽하게 변환되지 않는 경우도 있습니다. 예를 들어 아래의 한 캡션에 'fruit stand'와 같은 단어 대신 'fruit salad'가 생성된 것을 볼 수 있습니다.) 또한 사용자는 자연어 설명과 일치하는 이미지를 검색할 수 있습니다. 또는 제공된 비디오 영상에 대해 음악을 생성할 수 있습니다. 이러한 유형의 매칭을 사용 설정하기 위해 동일한 임베딩 공간에서 다중 모달 항목을 인코딩할 수 있습니다.

자동 이미지 캡션을 보여주는 프로세스 흐름
그림 4. 자동 이미지 캡션: 비전 모델의 임베딩에서 캡션 생성

제공된 컨텍스트로부터 도메인 항목을 나타내는 임베딩 기반 학습의 개념(예: Word2vec 사용)은 다른 도메인에도 적용될 수 있으므로, 비슷한 컨텍스트의 항목은 비슷한 임베딩을 가질 수 있습니다. 여기에는 문서(Doc2vec), 고객 데이터(Customer2vec), 동영상 파일(Movie2vec), 그래프(Graph2vec), 유전자 지도(Gene2vec), 단백질 구조(Protein2vec) 등으로부터의 임베딩 생성이 포함될 수 있습니다.

요약하자면, 임베딩을 추출하여 다음을 나타낼 수 있습니다.

  • 텍스트(단어, 문장, 전체 문서), 이미지, 오디오 등과 같은 구조화되지 않은 데이터
  • 사용자가 시청한 영화 목록 및 사용자 ID와 같이 상호 작용 컨텍스트만 있고 입력 특성이 없는 항목
  • 그래프 및 네트워크와 같은 복잡한 구조 데이터. 예: 소셜 네트워크 및 생화학 화합물
  • 텍스트 설명을 사용한 이미지 검색 및 이미지 캡션 작성과 같은 다중 모달 변환
  • 위치 및 점유와 같은 희소 특성(이를 밀집 특성으로 변환)
  • 인구통계, 사회, 금융, 행동 속성이 300개 이상 포함된 고객 레코드와 같은 고차원 항목(이러한 항목을 보다 간결한 표현으로 변환)

임베딩 사용 사례

패션 아이템, 영화, 휴양지, 뉴스 기사와 같은 항목을 주요 특성이 인코딩된 간결하고 실제 값으로 표현된 특징 벡터(임베딩)로 나타내면 흥미로운 사용 시나리오를 다양하게 지원할 수 있습니다. 이 섹션에서는 이러한 항목 임베딩의 몇 가지 사용 사례를 설명합니다.

유사성 분석

항목이 저차원의 실제 값으로 표현된 특징 벡터로 인코딩된 후에는 탐색 분석 및 시각화를 수행하여 흥미로운 정보와 패턴을 탐색할 수 있습니다. 여기에는 다음이 포함될 수 있습니다.

  • 특정 항목에 가장 가까운 항목을 찾을 수 있습니다. 예를 들어 앞에서 설명한 것처럼 뉴스 기사 또는 연구 논문 저장소가 있으면 특정 항목과 가장 비슷한 문서를 찾을 수 있습니다. 이 기술을 사용하면 문서에 다른 이웃 문서 제목을 표시할 수도 있습니다.
  • 시판 제품, 영화 또는 자산 목록과 같은 임베딩 공간에서 유사한 항목 그룹을 식별할 수 있습니다. 그런 후 마케팅 캠페인 조정을 위해 각 그룹의 일반적인 고객 특성을 연구할 수 있습니다.
  • 특정 항목의 이웃 범위에서 항목의 밀도를 찾을 수 있습니다. 이렇게 하면 인기 있는 주제, 패션 아이템 종류, 음악 장르 등을 찾아낼 수 있습니다.
  • 예외 또는 이상 항목 뿐만 아니라 경계 또는 그룹 간 항목을 식별할 수 있습니다. 이 기능은 사기 탐지에 유용할 수 있습니다.

검색

임베딩에서 가장 중요하고, 널리 사용되는 시나리오 중 하나는 비슷한 또는 관련이 있는 항목을 검색하는 것입니다. 이러한 사용 사례는 두 가지 서로 다른 방식인 수동 및 능동으로 구현될 수 있습니다.

수동 검색에서는 사용자가 검색할 항목을 제공하고, 데이터 저장소에서 이것과 유사한 항목을 검색합니다. 예를 들어 사용자의 애완동물 사진과 비슷한 애완동물 사진을 찾거나, 사용자가 제공하는 문서와 비슷한 연구 논문을 검색할 수 있습니다. 이 경우, 시스템은 사용자 항목의 임베딩을 온라인으로 추출합니다. 그런 후 시스템이 유사도 측정항목을 기준으로 입력 임베딩과 가장 비슷한 임베딩 항목을 데이터 저장소에서 검색합니다.

능동 검색에서는 시스템이 컨텍스트를 자동으로 식별하고 이를 검색 쿼리로 변환하여 가장 비슷한 항목을 검색합니다. 예를 들어 다큐멘터리 비디오 라이브러리가 있고 애플리케이션에서 사용자가 비디오를 검색하고 업로드하도록 허용할 수 있습니다. 사용자가 로그인할 때, 여기에서의 컨텍스트는 단지 사용자 ID 뿐입니다(날짜/시간 및 위치와 같은 다른 선택적인 속성도 일부 포함될 수 있음). 이 정보는 사용자 임베딩과 비디오 임베딩 사이의 유사성을 기준으로 해당 사용자에 대해 가장 관련이 있는 동영상을 검색하기 위해 검색 쿼리로 사용됩니다.

수동 및 능동 검색 모두, 시스템이 암시적 또는 명시적 쿼리를 임베딩으로 전환하고, 이러한 임베딩을 저장된 항목의 임베딩과 비교하고, 가장 비슷한 항목을 검색할 수 있어야 합니다.

검색에 임베딩을 사용하는 방법에 대한 추가 예는 다음과 같습니다.

  • 제공된 검색 쿼리에 대해 가장 관련 있는 뉴스 기사를 검색합니다.
  • 사용자가 제공한 사진과 가장 비슷한 사진을 검색합니다.
  • 사용자가 제공한 음악 트랙과 가장 비슷한 음악 트랙을 찾습니다.
  • 사용자가 최근에 설치한 것과 관련이 있는 게임 또는 앱 목록을 찾습니다.
  • 자연어 쿼리에 따라 FAQ 목록에서 가장 관련 있는 답변을 검색합니다.
  • 특정 사용자를 위해 새롭고 흥미로운 영화 또는 노래를 찾습니다.

기계 전이 학습

ML 모델 학습을 위해 희소 데이터, 복잡한 데이터, 고차원 데이터, 구조화되지 않은 데이터를 임베딩으로 인코딩하는 많은 사용 사례가 있습니다.

텍스트, 이미지 또는 다른 유형의 입력 데이터를 특징 벡터로 인코딩하기 위해 선행 학습된 임베딩을 사용하는 것을 전이 학습이라고 부릅니다. 본질적으로 전이 학습은 하나의 머신러닝 작업에서 다른 작업으로 정보를 전달합니다. 일반적인 사용 사례는 데이터가 적은 작업을 위해 대량의 데이터로 학습된 모델을 사용하는 것입니다. 예를 들어 제품 고객 리뷰가 10,000건 뿐인 정서 분류 모델을 학습시키기 위해 수십억 개의 단어 및 문장이 포함된 대규모 텍스트 언어 자료에서 사전 학습된 텍스트 임베딩을 사용할 수 있습니다.

전이 학습을 사용할 경우, 대량의 데이터로부터 추출된 지식(임베딩)을 재사용할 수 있을 뿐만 아니라, 이러한 임베딩 학습을 위해 필요한 수천 시간의 CPU 및 GPU 가동 시간도 절약할 수 있습니다.

특성 임베딩은 머신러닝 모델 학습을 위한 다른 기능들과 함께 사용할 수 있습니다. 앞에서 살펴본 한 가지 사용 사례는 다음을 기준으로 휴양지의 임대 가격을 예상하는 것입니다.

  • 크기, 방 수, 방향(예: 해변 조망), 위치, 해당 지역의 평균 가격, 임대 날짜, 계절 등과 같은 속성에 대한 기본 특성
  • 속성의 자연어 설명 및 속성 이미지와 같은 임베딩된 특성

임베딩은 두 가지 방법으로 모델에 사용할 수 있습니다. 첫 번째 방법은 임베딩을 추출하여 이를 입력 특성 벡터로 사용하는 것입니다. 기본 입력 특성을 사전 학습된 임베딩(이전에 오프라인 전처리 단계에서 추출한 임베딩)에 연결하여 하나의 입력 특성 벡터를 형성합니다. 핵심은 이러한 임베딩이 학습 불가능한 상태라는 것입니다. 이러한 임베딩은 이 모델을 학습하는 중에 조정되지 않으며, 대신 입력 항목으로 취급됩니다. 그림 5는 이러한 접근 방식을 보여줍니다.

선행 학습된 임베딩을 입력으로 사용
그림 5. 선행 학습된 임베딩을 입력으로 사용

또는 모델에서 학습 가능한 레이어로 임베딩을 포함할 수 있습니다. 이 접근 방식에서는 해당 양상을 위해 사전 학습된 임베딩 계층을 모델 아키텍처에 포함합니다. 이렇게 하면 모델 작업을 위해 학습 과정 중 임베딩 가중치를 미세 조정할 수 있습니다. 그림 6에 표시된 것처럼 텍스트 및 이미지 특성은 임베딩되지 않고 원시 형식으로 모델에 공급됩니다. 모델의 내부 아키텍처에 대한 하나의 입력 특징 벡터를 형성하기 위해 기본 입력 특성과 결합되기 전, 선행 학습된 임베딩이 학습 가능한 레이어로 연결됩니다.

선행 학습된 임베딩을 학습 가능한 레이어로 사용
그림 6. 선행 학습된 임베딩을 학습 가능한 레이어로 사용

두 번째 접근 방법을 사용하면 더 효율적인 모델을 생성하기 위해 모델 작업과 관련하여 임베딩을 조정할 수 있습니다. 하지만 임베딩 가중치가 포함되기 때문에 모델 크기는 일반적으로 첫 번째 접근 방식보다 훨씬 큽니다.

TensorFlow Hub의 임베딩 모듈

TensorFlow Hub(tf.Hub)는 재사용 가능한 ML 모듈의 라이브러리입니다. 이러한 모듈은 선행 학습된 모듈이거나 텍스트, 이미지 등에서 추출한 임베딩일 수 있습니다.

더 정확히 말해 모듈은 여러 작업 간에 재사용될 수 있는 TensorFlow 그래프에서 가중치 및 자산과 함께 독립 실행이 가능한 부분입니다. 모듈을 재사용하면, 비슷한 데이터세트를 사용하여 모델을 학습시키거나, 일반화를 향상시키거나, 단순히 학습 속도를 높일 수 있습니다. 각 모듈에는 해당 내부 구조에 대한 지식이 거의 없더라도 교체 가능한 방식으로 사용할 수 있게 해주는 인터페이스가 포함되어 있습니다. 모듈은 TensorFlow 그래프의 일부를 작성하기 위한 일반 Python 함수처럼 적용되거나 TensorFlow 에스티메이터에서 특성 열로 사용될 수 있습니다.

다음 코드 스니펫은 지정된 입력 텍스트의 임베딩을 가져오는 함수로 Universal Sentence Encoder(버전 2) 모듈을 사용하는 방법을 보여줍니다. 유사성 분석 또는 검색용 임베딩에 대해 또는 ML 모델을 학습시키기 전 텍스트 사전 처리를 수행할 때 이 코드를 사용할 수 있습니다(앞의 그림 5 참조).

embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
review_embeddings
= embed(["The movie was super interesting!])

다음 코드 스니펫은 Universal Sentence Encoder(버전 2) 모듈을 text_embedding_column으로 사용하여 입력 특성을 인코딩하고(검토) DNNClassifier 에스티메이터에서 이를 사용하는 방법을 보여줍니다. 이 코드를 사용하면 ML 모델에서 임베딩을 학습 가능한 레이어로 지정할 수 있습니다(그림 6 참조).

review_column = hub.text_embedding_column("review",
               
"https://tfhub.dev/google/universal-sentence-encoder/2", trainable=True)
estimator
= tf.estimator.DNNClassifier(hidden_units, feature_columns=[review_column])

여기서 볼 수 있듯이 모듈 URL은 게시자, 모듈 이름, 버전을 지정합니다. 모듈이 디스크에 다운로드되면 독립 실행이 가능하며 모듈 생성 및 학습에 사용된 코드와 데이터에 대한 액세스 권한이 없는 개발자가 모듈을 사용할 수 있습니다. 또한 학습 가능한 매개변수를 True로 설정하면 임베딩 가중치가 모델 학습에 따라 조정됩니다.

그림 7은 텍스트 임베딩 및 이미지 특징 벡터 모듈(tf.Hub에서 제공됨)의 목록을 보여줍니다. 이러한 모듈은 Google에서 개발, 학습, 게시됩니다.

tf.Hub의 텍스트 임베딩 및 이미지 특징 벡터 모듈
그림 7. tf.Hub의 텍스트 임베딩 및 이미지 특징 벡터 모듈

상위 수준 아키텍처

이 섹션에서는 유사성 일치를 구현하고 Google Cloud에서 대규모로 ML을 사용하도록 임베딩 추출을 효율적으로 사용 설정할 수 있는 아키텍처를 설명합니다.

문서 또는 이미지에서 임베딩 추출

텍스트 문서 또는 이미지 데이터 세트가 있고 유사성 분석을 수행하거나 실시간 검색 시스템을 빌드하려는 경우 구조화되지 않은 항목(문서 또는 이미지)을 실제 값 특징 벡터로 변환해야 합니다. 선행 학습된 tf.Hub 모듈을 사용하여 이러한 작업을 수행할 수 있습니다. tf.Hub 모듈은 ML 모델의 학습 가능한 부분으로 사용되지 않습니다. 대신 입력 데이터(텍스트 또는 이미지)를 출력 특징 벡터(임베딩)로 변환하기 위해 ETL(추출, 변환, 로드) 프로세스에서 사용됩니다.

큰 입력 데이터 세트(수백만 개의 문서 또는 이미지가 포함된 자료)가 있으면 이러한 임베딩을 대규모로 추출해야 합니다. 이를 위해 Google Cloud에서 데이터 처리 파이프라인을 대규모로 실행하기 위한 완전 관리형의 안정적인 서버리스 서비스인 Cloud Dataflow를 사용할 수 있습니다. 스트리밍 및 일괄 데이터 처리 작업을 모두 실행하는 오픈소스 통합 프로그래밍 모델인 Apache Beam을 사용하여 파이프라인을 구현합니다. 자세한 예시는 TensorFlow Hub 및 Cloud Dataflow를 사용한 텍스트 시맨틱스 유사성 분석을 참조하세요.

그림 8은 Apache Beam을 사용하여 ETL 파이프라인을 구현하여 임베딩을 추출하는 방법을 보여줍니다.

대규모로 임베딩을 추출하기 위한 상위 수준 아키텍처
그림 8. 대규모로 임베딩을 추출하기 위한 상위 수준 아키텍처

그림은 다음과 같은 흐름을 보여줍니다.

  1. Cloud Storage에서 원시 데이터를 읽습니다.
  2. tf.Hub 모듈을 호출하여 각 항목을 처리합니다. 이 모듈은 각 항목을 나타내는 특징 벡터를 반환합니다. 예를 들어 뉴스 기사를 처리하는 경우 Universal Sentence Encoder를 사용하여 제목을 실제 값 특징 벡터로 변환할 수 있습니다.
  3. Cloud Storage에 인코딩된 데이터를 기록합니다.

머신 전이 학습의 첫 번째 접근 방식에서 설명한 대로 임베딩을 사용하여 TensorFlow ML 모델을 학습시키려는 경우 데이터를 .tfrecords 파일로 기록할 수 있습니다. 또한 탐색적 유사성 분석을 위해 BigQuery에서 추출된 임베딩을 사용할 수 있습니다.

비슷한 임베딩 매칭 및 검색

사용자가 제공한 이미지를 수용하고 저장소에서 가장 비슷한 이미지를 검색하는 이미지 검색 앱을 작성하는 경우, 전체 아키텍처의 여러 부분에서 수행되는 특정 작업들을 수행해야 합니다.

  1. 프런트엔드 앱에서 사용자가 제공한 이미지를 사용합니다.
  2. tf.Hub 이미지 모듈(예: inception_v3/feature_vector)을 사용하여 백엔드 앱에서 입력 이미지를 특징 벡터로 변환합니다.
  3. 데이터베이스에 저장된 이미지 임베딩에 대해 입력 이미지의 추출된 특징 벡터와 일치하는 항목을 찾아 검색합니다. 이 작업도 백엔드 앱에서 수행됩니다.

문제는 매칭 및 검색 시간을 최소화하는 방식으로 특징 벡터를 구성하고 저장하는 것입니다. 가장 비슷한 항목을 찾기 위해 저장소에 있는 모든 벡터에 대해 입력 쿼리 특성 벡터를 비교하지는 않아야 합니다. 최상의 일치 항목의 검색 및 순위 지정 속도가 빨라야 하는 애플리케이션의 경우, 비교 횟수를 줄이기 위해 일종의 인덱싱 메커니즘을 사용해서 특성 벡터를 정리해야 합니다. 로컬 구분 해싱k-d 트리vantage-point 트리계층적 군집화와 같은 적절한 최근접 이웃 탐색 기법을 통해 검색 성능을 향상시킬 수 있습니다.

특성 벡터 인덱스는 메모리에서 유지 관리되며, 실제 콘텐츠(참조)는 키/값 저장소로 유지 관리됩니다. 여기서 키는 특성 벡터의 해시이며, 값은 문서 또는 이미지의 Cloud Storage URL입니다. 이 접근 방식은 낮은 대기 시간 검색을 제공합니다. 그림 9에서 이 접근 방식의 흐름을 보여줍니다.

임베딩 학습 및 제공을 위한 상위 수준 아키텍처
그림 9. 임베딩 학습 및 제공을 위한 상위 수준 아키텍처

ML 모델 학습 및 제공

임베딩 사용 시나리오 섹션의 설명대로 선행 학습된 임베딩은 특히 소규모 학습 데이터 세트가 있거나 대규모 데이터 세트에서 학습 속도를 높이려는 경우에 ML 모델을 학습하고 일반화 가능성을 향상시키는 데 유용할 수 있습니다. tf.Hub 모듈은 수천 시간 동안 GPU를 사용한 대규모 데이터 세트에서 학습되었습니다. 또한 tf.Hub 모듈을 모델의 일부로 사용하여 필요한 경우에 가중치를 학습하도록 할 수 있습니다.

tf.Hub 모듈을 대규모로 포함하는 모델을 관리하려면 AI Platform을 사용하면 됩니다. AI Platform은 DevOps에 필요한 관리를 최소화하여 대규모로 TensorFlow 모델을 학습, 조정(초매개변수 조정 기능 사용), 제공할 수 있는 서버리스 플랫폼입니다. AI Platform은 온라인 예측용으로 학습된 모델을 REST API로 배포하고 일괄 예측 작업을 제출할 수 있도록 지원합니다. 그림 10에서는 이러한 프로세스를 보여줍니다.

TensorFlow 모델 학습 및 제공을 위한 상위 수준 아키텍처
그림 10. TensorFlow 모델 학습 및 제공을 위한 상위 수준 아키텍처

다음 단계

2018년 2월 6일 화요일

리눅스 카산드라 설치

카산드라 설치전 필요 요구사항

jdk 1.8_131  (jdk_1_9 호환안됨) , jdk_1_8_161 (RMI 에러발생)

wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz

카산드라
wget http://apache.tt.co.kr/cassandra/3.11.1/apache-cassandra-3.11.1-bin.tar.gz

$ tar -xvzf apache-cassandra-3.11.1-bin.tar.gz
$ cd apache-cassandra-3.11.1/
$ bin/cassandra
(디폴트로 백그라운드로 실행됨)
# Use -f to start Cassandra in the foreground

$ bin/nodetool status

$ bin/cqlsh

cqlsh> CREATE KEYSPACE "users"
WITH REPLICATION = {
'class': 'SimpleStrategy', 'replication_factor': 1
};

keyspace = collection
SimpleStrategy = replication strategy
replication_factor = 클러스터 내에서 replication 개수

cqlsh> USE "users";
cqlsh:users> CREATE TABLE "personal_info" (id int PRIMARY KEY, name text, dob text);
cqlsh:users> INSERT INTO personal_info (id, name, dob)
VALUES ( 1 , 'Alice' , '02-25-1954' );

cqlsh:users> SELECT * FROM personal_info WHERE id = 1;




2018년 2월 4일 일요일

리눅스 자바 스칼라 설정

# JDK1.8 URL

wget --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u112-b15/jdk-8u112-linux-x64.tar.gz

# 디렉토리 생성

mkdir /usr/local/java

# 파일 이동

mv jdk-8u112-linux-x64.tar.gz /usr/local/java

#압축 해제

tar xvzf jdk-8u112-linux-x64.tar.gz

#명령어 등록

alternatives --install /usr/bin/java java /usr/local/java/jdk1.8.0_112/bin/java 1

alternatives --install /usr/bin/java javac /usr/local/java/jdk1.8.0_112/bin/javac 1

alternatives --install /usr/bin/java javaws /usr/local/java/jdk1.8.0_112/bin/javaws 1

alternatives --set java /usr/local/java/jdk1.8.0_112/bin/java

alternatives --set javac /usr/local/java/jdk1.8.0_112/bin/javac

alternatives --set javaws /usr/local/java/jdk1.8.0_112/bin/javaws

#확인

java -version

java version "1.8.0_112"

Java(TM) SE Runtime Environment (build 1.8.0_112-b15)

Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

#sbt ( scala build tool ) 설치

wget https://github.com/sbt/sbt/releases/download/v1.1.0/sbt-1.1.0.tgz


# 디렉토리 생성

mkdir /usr/local/sbt

# 파일 이동

mv sbt-1.1.0.tgz /usr/local/sbt

#압축 해제

tar xvzf sbt-1.1.0.tgz


#PATH 설정

vi /etc/profile

export JAVA_HOME=/usr/local/java

export SCALA_HOME=/usr/local/scala

export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin

. /etc/profile

# scala 샘플 프로젝트 생성

sbt new scala/scala-seed.g8


#프로젝트 명 생성

scalaTest ( build.sbt )

# 프로젝트 실행

cd scalaTest

sbt test

http://docs.scala-lang.org/getting-started-sbt-track/testing-scala-with-sbt-on-the-command-line.html

Setup

  1. On the command line, create a new directory somewhere.
  2. cd into the directory and run sbt new scala/scala-seed.g8
  3. Name the project ScalaTestTutorial.
  4. The project comes with ScalaTest as a dependency in the build.sbt file.
  5. cd into the directory and run sbt test. This will run the test suiteCubeCalculatorTest with a single test called CubeCalculatorTest.cube.
sbt test
[info] Loading global plugins from /Users/travislee/.sbt/0.13/plugins
[info] Loading project definition from /Users/travislee/workspace/sandbox/my-something-project/project
[info] Set current project to scalatest-example (in build file:/Users/travislee/workspace/sandbox/my-something-project/)
[info] CubeCalculatorTest:
[info] - CubeCalculator.cube
[info] Run completed in 267 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 1 s, completed Feb 2, 2017 7:37:31 PM

Understanding tests

  1. Open up two files in a text editor:
    • src/main/scala/CubeCalculator.scala
    • src/test/scala/CubeCalculatorTest.scala
  2. In the file CubeCalculator.scala, you’ll see how we define the function cube.
  3. In the file CubeCalculatorTest.scala, you’ll see that we have a class named after the object we’re testing.
  import org.scalatest.FunSuite

  class CubeCalculatorTest extends FunSuite {
      test("CubeCalculator.cube") {
          assert(CubeCalculator.cube(3) === 27)
      }
  }
Let’s go over this line by line.
  • class CubeCalculatorTest means we are testing the object CubeCalculator
  • extends FunSuite lets us use functionality of ScalaTest’s FunSuite class such as the test function
  • test is function that comes from FunSuite that collects results from assertions within the function body.
  • "CubeCalculator.cube" is a name for the test. You can call it anything but one convention is “ClassName.methodName”.
  • assert takes a boolean condition and determines whether the test passes or fails.
  • CubeCalculator.cube(3) === 27 checks whether the output of the cube function is indeed 27. The === is part of ScalaTest and provides clean error messages.

Adding another test case

  1. Add another assert statement after the first one that checks for the cube of 0.
  2. Execute sbt test again to see the results.

Conclusion

You’ve seen one way to test your Scala code. You can learn more about ScalaTest’s FunSuite on the official website. You can also check out other testing frameworks such as ScalaCheck and Specs2.