ChatGPT가 발표된 이후로 최근 몇 년간은 생성형 AI Model이 급속도로 발전하는 기간이었습니다.
처음에는 텍스트만 생성하다가 최근 Sora가 보여주듯이 이제는 멋진 영상을 만들어내는 경지에까지 왔습니다.
이 책은 최근 몇 년간 급속도로 발전한 이미지 생성 AI 기술의 여정을 탐구하고 있습니다.
GAN으로 시작되는 이미지 생성 AI의 역사에서부터 최근의 혁신인 Dall-E, 미드저니, 그리고 오픈 소스 프로젝트인 Stable Diffusion까지 각 Model의 특징을 자세히 비교하고 있습니다.
기술적 복잡성을 걷어내고, AI가 어떻게 우리의 창의력을 확장하고 다양한 분야에서 활용될 수 있는지에 초점을 맞춥니다.
이 책은 미드 저니를 중점적으로 사용하고 있으며, 다양한 활용 사례를 통해 이미지 생성 AI가 어떻게 실제 세계에서 응용되고 있는지 구체적인 사례들을 소개하고 있습니다.
SNS 프로필 사진 생성부터 음악 앨범 커버 디자인, 게임의 페르소나 콘셉트 아트 제작, 홍보자료 이미지 제작, Logo 제작에 이르기까지 다양한 활용 방안을 매우 구체적으로 설명하고 있습니다.
이 책의 또 다른 장점 중의 하나는, 독자들이 원하는 이미지를 얻기 위한 prompt 엔지니어링에 대해서도 자세히 설명한다는 것입니다.
특정 효과를 얻기 위한 다양한 prompt 팁과 전략이 포함되어 있어, 독자들이 자신만의 이미지를 더 효과적으로 생성할 수 있도록 돕습니다.
활용법에 대한 소개에 그치지 않고, 이미지 생성 AI 기술의 현재 한계와 이를 넘어서기 위한 연구들에 대해서도 다룹니다.
뿐만 아니라, 이미지 생성 Model의 현실적인 문제점, 예를 들면 학습 데이터의 저작권 문제, 환경에 미치는 영향, 가짜 영상 생성과 같은 딥페이크 문제까지 직면한 도전과 문제점을 솔직하게 탐구합니다.
이 책은 기술적인 디테일에 집중하기보다는, 실제 사용자의 관점에서 이미지 생성 AI를 어떻게 활용할 수 있는지에 대한 실질적인 노하우를 제공합니다.
따라서, 기술적인 접근을 원하는 독자보다는 이미지 생성 AI를 자신의 분야에서 활용하고자 하는 독자에게 더 적합할 수 있습니다.
전반적으로, 이 책은 생성 AI가 우리의 상상력과 창의력을 어떻게 확장시킬 수 있는지를 탐구하는 이들에게 깊은 영감을 제공합니다.
생성 AI를 통해 무엇이 가능한지, 그리고 그 가능성을 어떻게 실현할 수 있는지에 대해 탐구하고 싶은 모든 이들에게 권장되는 책입니다.
]]>
22년 말에 ChatGPT가 생성형 AI로 무장하고 세상에 처음 소개된 이후로 생성형 AI는 우리가 알게 모르게 우리의 상상력을 자극하며 일상의 많은 문제들을 해결해 주는 데 큰 역할을 하고 있습니다.
생성형 AI를 우리 주위에서 쉽게 접할 수는 있지만, 나만을 위한 AI 비서를 두고 싶다는 생각을 할 수도 있을 것입니다.
Hey, 파이썬! 생성형 AI 활용 앱 만들어 줘는 이런 독자들이 찾던 바로 그 책입니다.
이 책은 독자가 직접 나만의 AI 개인 비서 ChatBot을 작성하는 과정을 Step 별로 필요한 지식과 실제 사용법을 친절하고 자세하게 가이드 해줍니다.
단순히 생성형 AI의 기술적인 내용을 복잡한 수식과 어려운 코드의 나열로 설명하는 것이 아니라,
실제 적용 사례를 통해 이론을 실제와 자연스럽게 연결시킨다는 점이 장점 중의 하나입니다.
웹에서 동작하는 자신만의 AI 비서를 만드는 과정에서 저자는 단계별로 어떤 기능을 추가할 것인지 와 이 기능을 구현하는 기술적인 배경들에 대해서 설명해 줍니다.
그 과정에서 이를 읽는 독자들은 자연스럽게 배경지식을 습득하고, 더 나아가 책의 Code를 따라 하면서 실제 사용법도 자연스럽게 익히게 되는 것입니다.
이 분야에 대한 깊은 지식이 없는 독자들도 쉽게 따라 하면서 실습해 볼 수 있도록 만들어져 있습니다.
예를 들면, 책의 초반부에는 AI에서 많이 사용하는 언어인 Python에 대한 설명을 꽤 많은 부분을 할애하여 설명하고 있습니다.
또한, Colab과 Markdown에 대해서도 친절하게 설명하고 있는데, 이런 부분들은 모든 독자들에게 필요하지 않을 수도 있지만,
AI라는 분야를 처음 접하는 독자들을 많이 배려하고 있다는 반증이 될 수도 있고, 이 책이 지향하는 바를 잘 나타낸다고도 할 수 있을 것입니다.
Web에서 UI를 만들기 위해서 Gradio를 소개하고 사용하는 방법을 알려주며,
더 나아가 LangChain을 통해서 ChatBot에 멋지고 다양한 기능을 추가하는 방법들과
내가 말하는 것을 이해하고, 답변을 음성으로도 알려주는 기능을 추가하기도 합니다.
최종적으로 Stable Diffusion을 활용해 멋진 그림도 있는 책을 만들어보기까지 합니다.
이 책은 AI 기술의 기초부터 고급 활용법까지 폭넓게 다루고 있으며, Python을 잘 모르는 초보자들부터 경험 있는 개발자까지 다양한 독자층에게 유용합니다.
그러나, 일부 독자에게는 기본적이고 친절한 설명이 오히려 다소 지루하게 느껴질 수 있으므로, 독자의 현재 지식수준과 관심사에 따라 선택하는 것이 좋습니다.
전반적으로, 이 책은 생성형 AI와 다양한 활용법을 탐색하고자 하는 이들에게 추천할 만한 책입니다.
Multimodal Model이란 다양한 입력의 형태를 받아들여서 결과를 내는 Model을 뜻합니다.
예를 들어, 이미지, 텍스트, 소리 등의 입력을 받아서 학습한 Model을 뜻합니다.
Honeybee의 경우에는 이미지와 텍스트를 입력으로 받아서 텍스트를 출력하는 LLM입니다.
카카오브레인에서 Honeybee를 Open Source로 공개하였고, 실제로 어느 정도 성능인지 제가 한 번 Test해 보도록 하겠습니다.
https://blog.kakaobrain.com/news/1391
https://github.com/kakaobrain/honeybee
https://arxiv.org/pdf/2312.06742.pdf
Honeybee는 PyTorch 2.01이 필요합니다.
우선 가상환경이나 Docker를 이용해서 PyTorch 2.01 설치하셔야 합니다.
Docker를 이용한 PyTorch 설치는 아래 Link에 좋은 글이 있으니 참고하시기 바랍니다.
Naver Blog - PyTorch GPU Docker 설치 on WSL2
Tistory - PyTorch GPU Docker 설치 on WSL2
PyTorch 2.01 환경을 만드신 다음에는 Github에서 Source를 받습니다.
Github에 나와있는 requirements.txt로 나머지 Package들을 설치합니다.
pip install -r requirements.txt
gradio 형태로 Demo를 해보려면 추가의 Package들의 설치가 필요합니다.
pip install -r requirements_demo.txt
Github에는 Pre-Trained Model File도 올라와 있습니다.
저는 가장 작은 Model인 ‘Honeybee-C-7B-M144’를 받아보겠습니다.
13G 정도 되네요. 제일 작은 Model 입니다.
자, 이제 Source도 받았고, Model File도 받았으니, Inference Test를 한 번 해 보도록 하겠습니다.
Inference에 사용할 Code는 https://github.com/kakaobrain/honeybee/blob/main/inference_example.ipynb 를 참고하도록 하겠습니다.
최초 실행시에는 Model File이외에도 아래와 같이 추가로 Download를 조금 하네요
그리고, 아래와 같이 Import Error가 발생하는데, Github에 올라온 Source에 문제가 있습니다.
빠진 Package가 있어서 발생하는 문제이니, 아래와 같이 별도로 하나 더 설치하시면 됩니다.
pip install sentencepiece
Pull하려고 하니, 이미 다른 분이 해 놓으셨네요.
이제 진짜 모든 준비가 끝났으니, 실제 Test를 해 보겠습니다.
inference_example.ipynb를 사용하실 때는, Model File의 Path와 Test할 Image File Name 그리고 Image에 대한 Prompt를 수정해야 합니다.
각각 아래의 변수들을 적절한 값을 넣어주시면 됩니다.
Model File Path : ckpt_path = “../7B-C-Abs-M144/last“
Image File Name : image_list = [”./examples/monday.jpg”]
Prompt : prompts = [construct_input_prompt(“Explain why this meme is funny.”)]
Honeybee Github에 있는 몇 개의 그림파일에 “Explain why this meme is funny.”라는 Prompt를 주고 결과를 보도록 하겠습니다.
꽤 훌륭한 결과를 보여주는 것 같습니다.
그림에 대한 일반적인 묘사와 함께 글자도 제대로 인식하고 있으며, 무엇보다도 이런 사실들을 바탕으로 이 그림이 재미있는 이유를 추론하는 것이 가장 놀라운 점입니다.
하나 더 해보겠습니다. 이번에는 아래 그림을 주고, prompt는 “Tell me how you feel for this picture.”라고 입력했습니다.
아래와 같은 결과를 보여주네요
상당히 정확하게 그림을 묘사하고 있고, 창의적이고 재밌는 그림이라는 평가도 내리고 있는 것을 볼 수 있습니다.
다만, 손 부분을 강아지 손이라는 것을 인식하지 못하고 붓(Paintbrush)라고 판단하고 있네요.
근데, 이건 좀 애매하긴 한 것 같습니다.
똑같은 질문을 DALL-E 에게도 해 보았고, 아래와 같은 답변을 내놓았습니다.
“The image you’ve shared appears to be a humorous take on the classic painting “Mona Lisa” by Leonardo da Vinci.
Instead of the usual human figure, it features a dachshund dog’s face and body superimposed onto the painting’s subject.
The juxtaposition of a classic work of art with a modern meme culture twist tends to evoke amusement and can be seen as a playful commentary on the merging of high and pop culture.
It’s a creative and light-hearted image that might bring a smile to someone’s face.”
여러분들은 어떤 답이 더 나은 것 같으신가요?
이번에는 prompt를 “이 그림에 대해서 설명해봐"이라고 한글로 주었습니다.
한글 Prompt에 대해서는 아직 좀 더 다듬어야 할 것 같습니다.
이번에는 아래 그림을 주면서, prompt로는 “Make a title for the picture and extract 10 keywords.”라고 입력해봤습니다.
Honeybee는 아래와 같이 답변했습니다.
그리고, 동일한 그림과 질문을 했을 때 DALL-E의 답변은 아래와 같았습니다.
Title: “Embrace of the Ocean”
Keywords: Titanic, sunset, romance, iconic, embrace, freedom, sea, Jack, Rose, cinematic
제목은 Honeybee가 좀 더 마음에 들고, Keyword는 DALL-E가 좀 더 나은 것 같네요.
( DALL-E는 영화 타이타닉의 한 장면인 것을 알고 있네요)
이번 Post에서는 카카오브레인에서 발표한 LLM인 Honeybee에 대해서 간단하게 살펴보았습니다.
아직 Train Code가 공개되지는 않았지만, 성능적인 면에서는 굉장히 인상적이었습니다.
아쉬운 점이라면, 한글 Prompt에 대해서 살짝 아쉬운 결과를 보이는 것 정도였습니다.
좀 더 Tuning하면 나아지겠죠?
]]>
ChatGPT가 세상에 나오고 LLM의 힘을 보여주면서 사람들은 NLP가 모든 것을 해결해 줄 수 있는 만능의 도구처럼 생각했습니다.
하지만, 실제로 LLM을 이용한 제품이나 서비스를 구현하려고 하면 어디서부터 어떻게 시작해야 할 지 막막할 따름입니다.
‘쉽고 빠르게 익히는 실전 LLM’은 개발자나 개발자가 아닌 모두에게 LLM의 개념뿐만 아니라, 이를 이용하여 실제로 제품화를 할 수 있도록 안내해주는 훌륭한 가이드입니다.
저자의 이 분야에 대한 오랜 경험을 바탕으로 LLM의 개념에서부터 LLM을 효과적으로 사용하는 데 필요한 모든 정보를 제공합니다.
Transformer와 Encoder / Decoder 설명으로부터 시작하여, Transfer Learning, Fine Tuning, Embedding, Attention, Tokenizing 등과 같이 NLP 분야의 핵심 개념들을 친절하게 설명해 줍니다.
이 책의 진짜 가치는 기본 개념 설명이 아니라, 다양한 사례를 실제로 개발한다는 것입니다.
예를 들어, VQA(Visual Question Answering) Model을 개발하는 사례를 설명하는 부분이 있습니다.
총 3개의 Open Source Model을 Fine Tuning하여 VQA Model을 개발하는 과정을 설명하고 있는데, 전체적인 과정에서 중요한 지점을 놓치지 않고 설명하며, 나아갈 방향을 정확하게 짚어줍니다.
결과가 어떤지 설명하기보다는 어떻게 LLM을 이용해서 제품을 개발하는지 전체적인 Process 설명을 좀 더 중요하게 다루고 있다는 느낌입니다.
이와 함께 최근의 기술 흐름도 놓치지 않고 소개하면서, 구현에 필요한 중요 사항들도 실제 사례 위주로 설명하는 것도 잊지 않고 있습니다.
실제 Model 개발 사례들 중에는 매우 도전적인 과제들도 있는데, 이런 과제를 수행하면서 기존 Open Source Model들을 어떻게 Customize하는지에 대한 작가 본인의 Know-How도 친절하게 전달하고 있습니다.
마무리 부분에서는 실제 개발이 완료된 Model을 제품에 적용할 경우에 현실적으로 고려해야 할 사항들을 꼼꼼하게 짚어주며 책이 끝이 납니다.
LLM을 이용해서 제품 구현을 하려는 분들에게 좋은 가이드가 아닐까 생각합니다.
제가 생각하는 이 책의 단점이라고 하면, Deep Learning, PyTorch, NLP, 특히 Transfomer에 대한 사전 지식이 있어야 이 책을
쉽게 읽어갈 수 있을 것 같습니다.
기본적인 Deep Learning 학습 방법과 PyTorch 기본 문법, Python 등의 사전 지식이 필요하다는 점이 제가 느낀 유일한 단점이었습니다.
]]>
Package들을 설치하다 보면, 특정 Version을 지정해야 할 필요가 있는 경우가 있습니다.
이런 경우에 유용한 Version 지정 방법입니다.
Constraint type | Specification | Result | |
---|---|---|---|
Fuzzy | numpy=1.11 | 1.11.0, 1.11.1, 1.11.2, 1.11.18 etc. | |
Exact | numpy==1.11 | 1.11.0 | |
Greater than or equal to | “numpy>=1.11” | 1.11.0 or higher | |
OR | “numpy=1.11.1 | 1.11.3” | 1.11.1, 1.11.3 |
AND | “numpy>=1.8,<2” | 1.8, 1.9, not 2.0 |
우선 ~/.ssh에 Public Key File이 있는지 확인합니다.
Key File이름은 id_rsa.pub 입니다.
위와 같이 Key File이 없다면 생성해야 합니다.
ssh-keygen으로 Public Key 생성합니다.
Bitbucket으로 가서 방금 만든 Public Key를 등록합니다.
아래 위치로 따라가 주세요
Tensorflow에서 Train을 시작하는 함수인 .fit()을 호출하면 Tensorflow는 마치 브레이크 고장한 폭주 기관차와 같은 상태가 됩니다.
지정한 Epoch을 다 끝마칠 때까지 멈출수도 없고, 현재 상태가 어떤지 알수도 없으며
각종 Training관련 지표들(Loss , Accuracy 등등)이 어떻게 바뀌고 있는지 확인할 방법이 없습니다.
그래서 Tensorflow에서는 이렇게 Train이 진행되는 동안 다양한 제어 및 관찰을 할 수 있도록 다양한 Callback 기능을 구현해 두었습니다.
Tensorflow에서 지원하는 다양한 Callback들은 아래 Link에서 확인할 수 있습니다.
https://www.tensorflow.org/api_docs/python/tf/keras/callbacks
그 중에서 이번 Post에서 알아볼 Callback은 EarlyStopping이라는 Callback입니다.
앞서 말했듯이, Train이 시작되면 Tensorflow는 .fit()에서 지정한 Epoch을 다 진행할 때까지 Train을 멈추지 않습니다.
그래서 어느 정도 Model의 성능이 나오는 시점이 되더라도 Train 중간에 멈출 수가 없습니다.
이 때 필요한 것이 Early Stopping Callback입니다.
EarlyStopping은 우리가 지정해준 특정 지표가 기준치에 도달하면 Train을 멈추도록 하는 역할을 합니다.
아래가 EarlyStopping Class입니다.
tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
min_delta=0,
patience=0,
verbose=0,
mode='auto',
baseline=None,
restore_best_weights=False,
start_from_epoch=0
)
MNIST Dataset의 Classification Example로 실제로 어떻게 사용하는지 확인해 보도록 하겠습니다.
import tensorflow as tf
import tensorflow_datasets as tfds
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
print(type(ds_train))
[1mDownloading and preparing dataset Unknown size (download: Unknown size, generated: Unknown size, total: Unknown size) to C:\Users\Moon\tensorflow_datasets\mnist\3.0.1...[0m
Dl Completed...: 0 url [00:00, ? url/s]
Dl Size...: 0 MiB [00:00, ? MiB/s]
Extraction completed...: 0 file [00:00, ? file/s]
Generating splits...: 0%| | 0/2 [00:00<?, ? splits/s]
Generating train examples...: 0 examples [00:00, ? examples/s]
Shuffling C:\Users\Moon\tensorflow_datasets\mnist\3.0.1.incompleteXYPQ2U\mnist-train.tfrecord*...: 0%| …
Generating test examples...: 0 examples [00:00, ? examples/s]
Shuffling C:\Users\Moon\tensorflow_datasets\mnist\3.0.1.incompleteXYPQ2U\mnist-test.tfrecord*...: 0%| …
[1mDataset mnist downloaded and prepared to C:\Users\Moon\tensorflow_datasets\mnist\3.0.1. Subsequent calls will reuse this data.[0m
<class 'tensorflow.python.data.ops.dataset_ops.PrefetchDataset'>
def normalize_img(image, label):
return tf.cast(image, tf.float32) / 255., label
dataset_train = ds_train.map(normalize_img)
dataset_train = ds_train.batch(128)
dataset_test = ds_test.map(normalize_img)
dataset_test = ds_test.batch(128)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.Adam(0.006),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=2)
history = model.fit(
dataset_train,
epochs=100,
validation_data=dataset_test,
callbacks=[callback]
)
print(len(history.history['loss']))
Epoch 1/100
469/469 [==============================] - 4s 5ms/step - loss: 4.8275 - sparse_categorical_accuracy: 0.7964 - val_loss: 0.5860 - val_sparse_categorical_accuracy: 0.8636
Epoch 2/100
469/469 [==============================] - 2s 4ms/step - loss: 0.4836 - sparse_categorical_accuracy: 0.8838 - val_loss: 0.4888 - val_sparse_categorical_accuracy: 0.8925
Epoch 3/100
469/469 [==============================] - 2s 4ms/step - loss: 0.3803 - sparse_categorical_accuracy: 0.9041 - val_loss: 0.4292 - val_sparse_categorical_accuracy: 0.9078
Epoch 4/100
469/469 [==============================] - 2s 4ms/step - loss: 0.3369 - sparse_categorical_accuracy: 0.9140 - val_loss: 0.3596 - val_sparse_categorical_accuracy: 0.9195
Epoch 5/100
469/469 [==============================] - 2s 4ms/step - loss: 0.3433 - sparse_categorical_accuracy: 0.9141 - val_loss: 0.3465 - val_sparse_categorical_accuracy: 0.9153
Epoch 6/100
469/469 [==============================] - 2s 4ms/step - loss: 0.3428 - sparse_categorical_accuracy: 0.9160 - val_loss: 0.4269 - val_sparse_categorical_accuracy: 0.8972
6
Learning Rate란 Deep Learning Model이 학습할 때 사용하는 Backpropagation 과정에서 오차를 Gradient에 적용하는 비율을 말합니다.
Backpropagation를 수행할 때, Weight는 Loss Function을 오류를 줄이는 방향을 Update됩니다.
이때, 오류를 바로 Weight 변경에 적용하기 않고, Learning Rate를 곱해서 적용하게 됩니다.
예를 들면, Learning Rate가 0.5로 설정된 경우, 0.5 x 오류를 Weight Update에 사용하게 됩니다.
Learning Rate는 Optimizer가 Loss Function의 최소값에 도달하는 Step의 크기를 조절하는 역할을 합니다.
개인적으로 Learning Rate는 Model Train의 가장 중요한 Hyperparameter라고 생각합니다.
이 값이 잘못설정되면 학습이 아예 안되기도 하는 매우 중요하고 큰 역할을 하는 값입니다.
아래 그림은 Learning Rate가 Loss를 찾아가는데 어떤 역할을 하는지 잘 보여줍니다.
각 그림의 가장 낮은 지점이 Model의 Loss가 Minimum이 되는 위치를 나타내고, 빨간색 선은 Model이 Minimum Loss를 찾아가는 순서를 나타냅니다.
오른쪽 그림같은 경우에는 너무 큰 Learning Rate를 사용하는 경우를 나타내며, 변화율이 너무 크기 때문에 최소값을 찾지 못하고 크게 요동치거나 심한 경우 Overflow될 수도 있습니다.
반대로 왼쪽 그림처럼 Learning Rate가 너무 작으면 Optimizer가 최소값을 찾는데 너무 오래 걸릴 수가 있습니다.
이런 경우에는 Optimizer가 Minimum을 찾는데 정체가 되거나 Local Minimum값에 갇혀서 Global Minimum을 찾지 못하는 경우가 생깁니다.
가운데 그림이 가장 이상적인 Learning Rate를 찾는 예로서 처음에는 조금 크게 이동하다가 Global Minimum에 가까이 갈수록 점점 작아지는 형태로 변하는 것을 보여줍니다.
처음부터 이상적인 Learning Rate를 찾기란 쉽지 않습니다. 그래서 이 문제를 해결하기 위해서 Learning Rate Scheduler가 도입되었습니다.
Learning Rate Scheduler는 처음부터 끝까지 동일한 Learning Rate를 사용하여 Train을 진행하지 않고 상황에 맞게 다양한 Learning Rate를 적용할 수 있도록 하는 것이 목적입니다.
다음에 설명드리는 방법들은 어떻게 Learning Rate를 바꿀 것인가에 중점을 두고 구현된 기능들입니다.
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate,
decay_steps,
decay_rate,
staircase=False,
name=None
)
initial_learning_rate : 최초 Learning Rate 값
decay_steps : Learning Rate를 변화시킬 Step 값. 이 값만큰 Step이 될 때마다 Learning Rate가 변경됩니다.
decay_rate : Learning Rate를 변화시킬 비율. 이 값만큼 곱해져서 Learning Rate가 변화됩니다.
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=0.001,
decay_steps=10000,
decay_rate=0.9)
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
tf.keras.optimizers.schedules.PolynomialDecay(
initial_learning_rate,
decay_steps,
end_learning_rate=0.0001,
power=1.0,
cycle=False,
name=None
)
initial_learning_rate : 최초 Learning Rate 값니다.
decay_steps : Learning Rate를 변화시킬 Step 값. 이 값만큰 Step이 될 때마다 Learning Rate가 변경됩니다.
end_learning_rate : 최종 Learning Rate 값
power : Learning Rate를 변화시킬 때 지수에 들어갈 값입니다.
starter_learning_rate = 0.1
end_learning_rate = 0.01
decay_steps = 10000
learning_rate_fn = tf.keras.optimizers.schedules.PolynomialDecay(
starter_learning_rate,
decay_steps,
end_learning_rate,
power=0.5)
model.compile(optimizer=tf.keras.optimizers.SGD(
learning_rate=learning_rate_fn),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
tf.keras.optimizers.schedules.CosineDecay(
initial_learning_rate,
decay_steps,
alpha=0.0,
name=None,
warmup_target=None,
warmup_steps=0
)
tf.keras.callbacks.LearningRateScheduler(
schedule, verbose=0
)
def scheduler(epoch, lr):
if epoch < 10:
return lr
else:
return lr * tf.math.exp(-0.1)
callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
tf.keras.callbacks.ReduceLROnPlateau(
monitor='val_loss',
factor=0.1,
patience=10,
verbose=0,
mode='auto',
min_delta=0.0001,
cooldown=0,
min_lr=0,
**kwargs
)
monitor : Monitoring할 Index니다.
factor : Learning Rate를 감소시킬 비율
patience : 몇 번의 Epoch 동안 Loss가 줄어들지 않을지 지켜보는 횟수.
mode : {‘auto’, ‘min’, ‘max’} 중에 하나.
min_delta : 개선된 것으로 간주하기 위한 최소한의 변화량입니다. 즉, 최소한 이 값 정도는 개선되어야 개선으로 인정한다는 의미입니다.
cooldown : Learning rate가 감소한 후, ReduceLROnPlateau 콜백함수를 다시 실행하기 전에 대기 할 Epoch 수입니다.
min_lr : Learning rate의 하한선을 지정합니다. 현재 Learning Rate에 Factor를 곱한 값이 min_lr보다 작아도 min_lr가 새로운 Learning Rate로 적용됩니다.
callback = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss',
factor=0.1,
patience=10)
지금까지 다양한 Learning Rate 관련 Tensorflow API를 살펴보았습니다.
필요에 맞게 적절히 사용하셔서 좋은 Model 만드시기를 바라겠습니다.
읽어주셔서 감사합니다.
ONNX(Open Neural Network Exchange)는 Facebook과 Microsoft가 공동으로 개발한 Open Source Project입니다.
현재, 다양한 Deep Learning Framework가 존재하고 있으며, 각 Framework는 각기 다양한 형식으로 훈련된 Model File Format을 사용하며, 서로 호환되지 않습니니다.
내가 구현하려는 서비스에 적합한 Pre-Trained Model이 하필 내가 사용하지 않는 Framework으로 Train되었다던지,
적용할 시스템에서 해당 Pre-Trained Model을 사용하지 못하는 환경이라면 난감하기 그지 없겠지요.
이런 상황에서 빛을 발하는 것이 바로 ONNX입니다.
ONNX는 다양한 Deep Learning Framework에서 Train된 Model들을 일관성을 보장하며 서로 호환가능한 Model File Format으로 변환시켜 줍니다.
또한, Python, C++, C# 및 Java와 같은 여러 Programming Language를 지원하고 있습니다.
ONNX의 핵심은 Computational Graphs를 보편적인 방법으로 표현하는 것입니다.
Data Graph라고도 불리는 이 Graph는 각 Model의 구성 요소 또는 Node와 이들 사이를 연결하는 Edge를 정의하고 있습니다.
현재 Neural Network 방식을 사용하는 Deep Learning Framework은 Data Graph 방식을 사용하여 Model을 표현하며,
각 Deep Learning Framework은 개발자가 Data Graph를 구성할 수 있고, 처리할 수 있는 방식을 제공합니다.
ONNX는 Data Graph의 Common Representation을 제공함으로써 개발자가 작업에 적합한 Framework를 선택할 수 있도록 합니다.
ONNX는 현재 많이 사용되고 있는 Deep Learning Framework 대부분을 지원하고 있습니다.
아래 Link에서 ONNX File Format Conversion에 대한 자세한 자료가 있습니다.
Framework / Tool | Installation | Tutorial | |
---|---|---|---|
Caffe | apple/coremltools and onnx/onnxmltools | Example | |
Caffe2 | part of caffe2 package | Example | |
Chainer | chainer/onnx-chainer | Example | |
Cognitive Toolkit (CNTK) | built-in | Example | |
CoreML (Apple) | onnx/onnxmltools | Example | |
Keras | onnx/tensorflow-onnx | Example | n/a |
LibSVM | onnx/onnxmltools | Example | n/a |
LightGBM | onnx/onnxmltools | Example | n/a |
MATLAB | Deep Learning Toolbox | Example | |
ML.NET | built-in | Example | |
MXNet (Apache) | part of mxnet package docs github | Example | |
PyTorch | part of pytorch package | Example1, Example2, export for Windows ML, Extending support | |
SciKit-Learn | onnx/sklearn-onnx | Example | n/a |
SINGA (Apache) - Github (experimental) | built-in | Example | |
TensorFlow | onnx/tensorflow-onnx | Examples |
Framework / Tool | Installation | Tutorial |
---|---|---|
Caffe2 | Caffe2 | Example |
Cognitive Toolkit (CNTK) | built-in | Example |
CoreML (Apple) | onnx/onnx-coreml | Example |
MATLAB | Deep Learning Toolbox Converter | Documentation and Examples |
Menoh | Github Packages or from Nuget | Example |
ML.NET | Microsoft.ML Nuget Package | Example |
MXNet (Apache) - Github | MXNet | API Example |
ONNX Runtime | See onnxruntime.ai | Documentation |
SINGA (Apache) - Github [experimental] | built-in | Example |
Tensorflow | onnx-tensorflow | Example |
TensorRT | onnx-tensorrt | Example |
Windows ML | Pre-installed on Windows 10 | API Tutorials - C++ Desktop App, C# UWP App Examples |
Vespa.ai | Vespa Getting Started Guide | Real Time ONNX Inference Distributed Real Time ONNX Inference for Search and Passage Ranking |
제 생각에는 ONNX를 사용해서 얻을 수 있는 가장 큰 이점은 바로 ONNX Runtime을 사용하는 것이 아닌가 하는데요, 이에 관해서는 다른 Post로 좀 더 알아보도록 하겠습니다.
우리는 다양한 Deep Learning Framework으로 Model을 만듭니다.
우리가 만든 Model이 실제로 실행되는 환경들은 매우 다양합니다.
PC일수도 있고, Edge Device일수도 있고, Mobile Device, Cloud 환경 등등 매우 다양한 Target Device가 존재합니다.
이런 Target Device의 다양화에 어느 정도 대응할 수 있도록 해주는 것이 ONNX입니다.
ONNX(Open Neural Network Exchange, Link)는 Deep Learning Framework간의 Model Conversion이 주된 목적입니다.
이를 잘 활용하여 우리의 Deep Learning Model을 Target Device에서 작동할 수 있도록 할 수 있습니다.
여기에 추가로 이 Post에서 설명하려고 하는 Deep Learning Compiler는 특정 Deep Learning Framework Model을
Target Device에서 동작하도록 Conversion해 줄 뿐만 아니라, 다양한 최적화 기법을 적용하여 Inference 속도도 향상시켜주는 역할을 합니다.
Deep Learning Compiler는 어떤 방식으로 동작하는지 알아보도록 하겠습니다.
Deep Learning Compiler는 일반적인 Compiler와 어느 정도 비슷하며, 일반적인 Compiler와 마찬가지로
Frontend와 Backend로 구성되어 있습니다.
Frontend는 Software적인 최적화에 중점을 두고 있고, Backend는 Target Device에 맞게 Hardware 최적화에 중점을 두고 있습니다.
Frontend와 Backend 둘 다 IR(Intermediate Representation)이 있습니다.
Frontend 쪽의 IR은 High Level IR 혹은 Graph IR 이라고 말하고, Backend 쪽의 IR은 Low Level IR 혹은 Operator IR 이라고 말합니다.
Conversion Part는 우리가 다양한 Deep Learning Framework으로 Train 시킨 Model을 입력으로 받아서 High-Level IR로 변환합니다..
High-Level IR에는 Model이 계산을 어떻게 하며 Flow Control을 어떻게 하는가에 대한 정보가 들어가 있습니다.
High-Level IR은 Model의 구조를 파악하는 단계이기 때문에 아직은 Hardware에 독립적이며 Data와 Operator간의 관계를 확립하는 목표입니다.
Backend는 다음과 같은 기능을 합니다.
Frontend에서 생성된 High-Level IR을 입력으로 받아서, Low-Level IR로 변환합니다.
Backend의 주된 역할은 Hardware에 독립적이었던 High-Level IR을 Target Device의 Hardware 특성을 반영하여 변환하는 것입니다.
이 단계에서는 Hardware 최적화가 적용됩니다.합니다.
특히 이 단계에서는 다양한 최적화 기법, 예를 들면, intrinsic mapping, memory allocation and fetching, memory latency hiding, parallelization, loop oriented optimizations 등과 같은 기법이 적용됩니다.
최종적으로 최적화된 Low-Level IR은 Just-In-Time compiler 혹은 Ahead-Of-Time compiler 같은 Compiler를 사용해 Hardware-Specific Code를 생성합니다.
앞에서 Frontend와 Backend에서 각각 최적화가 이루어진다고 했는데, 구체적으로 어떤 기법들이 사용되는지 알아보도록 하겠습니다.
Frontend에서 수행되는 최적화는 Software 수준에서 수행되는 computational graph optimization입니다.
NOP 라든지 계산결과가 항상 같은 값이거나, 계산 수행이 다음 계산에 영향을 주지 않는 경우에는 최적화를 할 수 있겠죠.
또한, Block Level에서도 최적화가 이루어집니다.
교환법칙, 결합법칙 및 분배법칙 등의 대수학적인 기법을 이용하여 계산을 단순화하여 최적화를 이루는 방법입니다.
마지막으로, Dataflow Level 최적화를 수행합니다.
Dead Code Elimination : 계산 결과에 영향을 주지 않는 부분을 제거
Static Memory Planning : 메모리를 효율적 사용할 수 있게 해줌
Backend Optimization은 Hardware에 따라 다르게 적용되며, 다음과 같은 기법들이 있습니다.
efficient memory allocation and mapping
better data reuse by the method of loop fusion and sliding window.
auto-tuning
일련의 매개변수를 최적으로 선택
병렬화를 통해 성능을 가속화
검색 공간에 유전 알고리즘(genetic algorithms)을 적용함으로써 검색 시간을 줄입니다
널리 쓰이고 있는 Deep Learning Compiler 몇 가지를 살펴보도록 하겠습니다.
변환하고자 하는 Tensorflow / PyTorch / Onnx File을 입력 받습니다.
TVM의 High Level Model Language인 ‘Relay’ 형태로 변환합니다.
TE(Tensor Expression) 형태로 Lowering을 합니다. Lowering이란 High-Level Representation에서 Low-Level Representation으로 바꾸는 것을 말합니다. High-Level Optimizations을 수행하고 난 후에, Relay는 FuseOps이라는 것을 수행하여 여러개의 Subgraph로 쪼개고, 여러개의 Subgraph를 TE로 Lowering합니다. TE는 Tensor Computations을 나타내는 Domain-Specific Language이며, Tiling, Vectorization, Parallelization, Unrolling, Fusion과 같은 Low-Level Loop Optimizations도 수행합니다.
AutoTVM 이나 AutoScheduler과 같은 Auto-Tuning Module을 이용하여 최적의 Schedule을 찾습니다.
Compile하기 전에 최적의 설정을 찾습니다. Tuning이 끝나면 Auto-Tuning Module은 개별 Subgraph의 최고의 Schedule을 찾습니다.
구체적인 방법은 아래 Link를 참고하시기 바랍니다
https://tvm.apache.org/docs/install/index.html
생각보다 간단하네요
https://tvm.apache.org/docs/tutorial/tvmc_python.html#sphx-glr-tutorial-tvmc-python-py
TVM으로 생성 가능한 Backend Target 관련 정보는 아래의 API를 통해서 알 수 있습니다.
https://tvm.apache.org/docs/reference/api/python/target.html
XLA(Accelerated Linear Algebra)는 TensorFlow 모델의 실행 시간을 가속화하기 위한 선형 대수 특화 컴파일러입니다.기만 하면 됩니다.
TensorFlow 모델을 소스 코드 변경 없이 가속화할 수 있다고는 하지만, 예제를 보면, 가속이 필요한 부분의 Source를 조금 수정을 하는 모습을 볼 수 있었습니다.
TensorFlow 모델만을 가속할 수 있는 것 처럼 들리지만, 실제로는 JAX 심지어 PyTorch까지도 가속할 수 있습니다.
XLA는 Tensorflow Package에 포함되어 있고, 가속을 하려는 함수에 tf.function이라는 Wrapping Function을 사용하면 XLA 가속이 가능합니다.
tf.function는 Tensorflow Function을 포함하는 어떤 Function에서도 사용이 가능하므로, Inference 이외에도 사용이 가능합니다.
사용하는 방법은 tf.function을 사용할 때, jit_compile=True 인자를 추가하기만 하면 됩니다.
간단하게 XLA를 기존 Code에 적용하는 예제를 살펴보도록 하겠습니다.
다음과 같은 Code가 있다고 해봅시다.
import tensorflow as tf
model = tf.keras.Sequential(
[tf.keras.layers.Dense(10, input_shape=(10,), activation="relu"), tf.keras.layers.Dense(5, activation="softmax")]
)
위 모델은 차원이 (10, )인 입력을 받아서, 다음과 같이 하면 결과가 나옵니다.
# 모델에 대한 임의의 입력을 생성합니다.
batch_size = 16
input_vector_dim = 10
random_inputs = tf.random.normal((batch_size, input_vector_dim))
# 순전파를 실행합니다.
_ = model(random_inputs)
xla_fn = tf.function(model, jit_compile=True)
_ = xla_fn(random_inputs)
my_xla_fn = tf.function(model.my_xla_fn, jit_compile=True)
XLA 입력에 사용되는 언어를 “HLO IR” 또는 HLO(High Level Operations)라고 하는데, 간단하게 compiler IR이라고 생각하면 됩니다.
XLA는 HLO에 정의된 Graph(“computations”)를 가져와서 다양한 하드웨어 아키텍처에 맞는 machine instructions로 Compile합니다.
XLA는 모듈식 구성으로 되어 있어서 다양한 하드웨어 아키텍처에 맞게 바꿀 수 있는 장점이 있습니다.
x64 및 ARM64용 CPU 백엔드 뿐만 아니라 NVIDIA GPU 백엔드도 TensorFlow 소스 트리에 있습니다.
다음 다이어그램은 XLA의 컴파일 프로세스를 보여줍니다.
XLA는 먼저 CSE , target-independent operation fusion , buffer analysis for allocating runtime memory for the computation와 같은 target-independent한 optimizations과 analysis를 거칩니다.
target-independent 작업을 마친 후에 XLA는 HLO computation을 Backend로 보냅니다.
backend는 추가적인 HLO Level의 Optimization을 수행하고, 이 때에 Target의 정보가 필요합니다
이 단계에서는 backend가 특정 작업 혹은 패턴 조합을 일치시켜서 최적화된 Library 호출을 수행할 수도 있습니다.
다음 단계는 target-specific code generation입니다.
XLA가 지원하는 Backend는 low-level IR, optimization, code-generation에 LLVM을 사용합니다.
Backend는 XLA HLO computation을 효율적으로 표현하는데 필요한 LLVM IR을 내보낸 다음에 LLVM을 호출하여서 LLVM IR에서 Native Code를 생성합니다.
GPU Backend는 현재 LLVM NVPTX Backend를 통해 NVIDIA GPU를 지원하고 있으며, CPU Backend는 여러 CPU ISA를 지원합니다.
XLA의 Github 주소는 아래를 참고하시기 바랍니다.
https://github.com/openxla/xla
Glow는 Machine / Deeo Learning Compiler이며 학습 Model을 가속하기 위한 Execution Engine입니다.
https://github.com/pytorch/glow
Glow는 기존 Neural Network Dataflow Graph를 2단계 Strongly-Typed IR(Intermediate Representation)으로 변환합니다.
High-Level IR은 Domain-Specific Optimizations수행하고, Lower-Level Instruction-Based Address-only IR은 Instruction Scheduling, Static Memory Allocation , Copy Elimination 등과 같은 메모리 관련 최적화를 수행합니다.
Lowest Level에서는 특정 Hardware의 장점을 최대한 활용하기 위한 Machine-Specific Code를 생성합니다.
MacOS와 Linux만 지원합니다.
결과물은 object file / Header File. 즉, C/C++에서만 사용가능합니다.
다른 Language에서 사용하려면 다소 귀찮은 작업을 해주어야 합니다.
조금 더 자세한 사항은 아래 Link를 참고해 주세요.
https://github.com/pytorch/glow#getting-started
실제 사용법은 아래 Link에서 자세하게 설명되어 있습니다.
https://github.com/pytorch/glow/blob/master/docs/AOT.md
보시면 아시겠지만, 여타 다른 Deep Learning Compiler와 기본적인 사용법은 크게 다르지 않습니다.