Toward tf.keras from tf.Estimator
- From Tensorflow 2.0 perspectives
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
Jaewook Kang (Jae)
About me!
❖ 이 가능할까
❖ 개인적으로 생각하는 가 외면 받았던 이유
❖
ㅈ ㅈ
Fast and Steady
ㅈ ㅈ
❖ 이상적인 모델러의 하루
ㅈ ㅈ
❖ 이상적인 모델러의 하루
– 출근하면서 논문 읽고
– 오전까지 코드 짜고
– 오후에 삽질 디버깅 하고 파라미터 맞추고
– 퇴근전에 훈련 및 평가
ㅈ ㅈ
❖ 이상적인 모델러의 하루
– 출근하면서 논문 읽고
– 오전까지 코드 짜고
– 오후에 디버깅 하고 파라미터 맞추고
– 퇴근전에 훈련 및 평가
ㅈ ㅈ
❖ 이상적인 모델러의 하루
– 출근하면서 논문 읽고
– 오전까지 코드 짜고 → 몇시간 걸림
– 오후에 디버깅 하고 파라미터 맞추고
– 퇴근전에 훈련 및 평가
누구나
ㅈ ㅈ
❖ 딥러닝 코딩 에서 해야할 것 들
– 데이터 구현
– 구현
– 루프 구현 멀티
– 모델 하는 부분을 구현
– 을 이쁘게 볼 수 있게 구현
누구나
ㅈ ㅈ
❖ 생산성 개선을 위한 방향
– 재사용성
– 가독성
누구나
ㅈ ㅈ
❖ 딥러닝 코딩 에서 해야할 것 들
– 데이터 구현 → 재사용
– 구현
– 루프 구현 멀티 → 재사용
– 모델 하는 부분을 구현 → 재사용
– 을 볼 수 있게 구현 → 재사용
누구나
ㅈ ㅈ
❖ 딥러닝 코딩 에서 해야할 것 들
– 데이터 구현
– 구현 → 우리가 주로 할일
– 루프 구현 멀티
– 모델 하는 부분을 구현
– 을 이쁘게 볼 수 있게 구현
누구나
ㅈ ㅈ
❖ 을 위해서는
– 에 집중할 수 있는 환경을 사용해야
– 어떤 프레임워크를 써야 하는가
개인적으로 생각하는
가 외면받은 이유
-
잘만들고 사용자들에게 외면받은 비운의
❖
–
❖
–
❖
–
– 반복되는 코드를 캡슐화하여 로 제공
•
• 는 자동으로 저장됨
누구나
Concept of tf.estimator is actually Good!!
❖ 딥러닝 코딩 에서 해야할 것 들
– 데이터 구현 →
– 을 위한 구현 →
– 루프 구현 → 으로 제공
– 모델 하는 부분을 구현 → 제공
– → 자동 제공
누구나
Concept of tf.estimator is actually Good!!
❖ 딥러닝 코딩 에서 해야할 것 들
– 데이터 구현 →
– 을 위한 구현 →
– 루프 구현 → 으로 제공
– 모델 하는 부분을 구현 → 제공
– → 자동 제공
→ tf.estimator는
“One day, One model”을 위한 생산성 개선에 도움이
될께
분명할텐데...
Concept of tf.estimator is actually Good!!
from model import build_model
from dataloader import Dataloader # using tf.data.Dataset
def model_fn(features, labels, mode, params):
# Define the model to construct the logits
logits = build_model(features)
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
def main():
config = tf.estimator.RunConfig(#...)
train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training)
estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config)
estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps)
estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt)
estimator.export_savedmodel(#...)
Concept of tf.estimator is actually Good!!
from model import build_model
from dataloader import Dataloader # using tf.data.Dataset
def model_fn(features, labels, mode, params):
# Define the model to construct the logits
logits = build_model(features)
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
def main():
config = tf.estimator.RunConfig(#...)
train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training)
estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config)
estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps)
estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt)
estimator.export_savedmodel(#...)
Concept of tf.estimator is actually Good!!
from model import build_model
from dataloader import Dataloader # using tf.data.Dataset
def model_fn(features, labels, mode, params):
# Define the model to construct the logits
logits = build_model(features)
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
def main():
config = tf.estimator.RunConfig(#...)
train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training)
estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config)
estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps)
estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt)
estimator.export_savedmodel(#...)
사실 Dataloader도 한번
개발해 놓으면 재활용
가능하고
build_model()에만 집중하면
됨
누구나
Concept of tf.estimator is actually Good!!
❖ 사실 컨셉은 와 같음
- 훌륭하게 잘 설계된
-
tf.Estimator.estimator tf.keras
loss / opt /
eval_metric
config
model_fn() model.compile()
train /eval estimator.train()
/estimator.eval()
model.fit()
predict estimator.predict() model.predict()
savedmodel
export
estimator.export_savedmodel() tf.contrib.saved_model.save
.keras_model()
누구나
Concept of tf.estimator is actually Good!!
❖ 사실 컨셉은 와 같음
- 에서 사용 차이
- 등의 사용해야함
- 사용
누구나
Concept of tf.estimator is actually Good!!
❖ 그럼에도 불구하고 가 잘 사용되지 않는 이유
– 너무나 빠른 변화에 지친 사용자
• 이제 방식에 익숙해진 유저에게 다시 또 새로운
스타일을 강제함
– 반드시 같이 써야하는 의 사용 난이도
• 한번 읽어 보시길 ㅠㅠ
https://www.tensorflow.org/guide/performance/datasets )
누구나
Concept of tf.estimator is actually Good!!
❖ 그럼에도 불구하고 가 잘 사용되지 않는 이유
– 코드를 굳이 로
• 코드를 굳이 새로운 인 로 짤이유 없음
• 문법이 더 익숙한데
• 기능이 추가됨에 따라서 점점 복잡
– 가독성이 떨어짐
누구나
Concept of tf.estimator is actually Good!!
❖ 요약하면…
❖ 는 아주 기술적으로 완성도 높은 였다
• 숙련된 개발자들이 사용하기에는 손색없음
❖ 하지만 다음과 같은 이유로 에서 되게 되었다
– 하지만 넓은 사용자 층에 대한 이해 부족 → 그들만의 리그
– 다른 프레임워크의 상황인식이 부족
삽질 해보는
변해야 변한다
❖ Tensorflow 2.0에서는 keras가 대표 api라는데...
❖ 로 구현된 내 프로젝트를 어떻게 최소한의
노력으로 로 옮길 수 있을까
– → 는 구글이 로 제공함
• https://www.tensorflow.org/api_docs/python/tf/keras/estima
tor/model_to_estimator
– How about estimator → keras?
내가 을 사용하는 구조
을 빼면
❖ 에서 에 대한 몇 가지 사실
– 왜 매우 를 가지고 있다
– 으로 이 가능하다
– 로 하는 를 제공한다
– 는 이외의 로 만들수 있을까
❖ 에서 에 대한 몇 가지 사실
– 왜 매우 를 가지고 있다
– 으로 이 가능하다
– 로 하는 를 제공한다
– 는 이외의 로 만들수 있을까
내가 을 사용하는 구조
을 빼면
로 다음과 같은 구조로
가능할까
로 다음과 같은 구조로
가능할까
build_model() 입출력을
- get_keras_model()에서
tf.keras.models.Model로
packaging
Packaging MyModel as a tf.keras.models.Model
class MyModel(object):
def __init__(self, args):
# Keras model에서 사용할 파라미터를 정의하는 부분
def build_model(self, inputs):
# model을 정의하는 부분
def build_model(self, inputs):
# tf.keras.models.Model로 packaging 하는 부분
Packaging MyModel as a tf.keras.models.Model
class MyModel(object):
def __init__(self, args):
self.model = None
def build_model(self, inputs):
net = tf.keras.layers.Embedding()(inputs)
…
return outputs = tf.keras.layers.Dense()(net)
def get_keras_model (self):
input = tf.keras.layers.Input(shape=...)
output = self.get_keras_model(input)
self.model = tf.keras.models.Model(inputs=input,outputs=output)
return self.model
해야 할일을 정리하면
❖ 안되있는 경우 파트를 독립적으로 분리한다
❖ 안되있는 경우 를 분리한다
❖ 으로 모델 인스턴스 생성
–
–
❖ 와 으로 훈련한다
주의 사항
❖ 몇가지
– 로 구현한 코드와는 호환되지 않음
•
• 호환
– 대부분의 와는 호환할듯 전부 미확인
• 의 대부분과 호환
• 도 호환될듯 미확인
– 아직 이 동일 하게 생성됐는지 미확인
주의 사항
❖ 몇가지
– 로 구현한 코드와는 호환되지 않음
•
• 호환
– 대부분의 와는 호환할듯 전부 미확인
• 의 대부분과 호환
• 도 호환될듯 미확인
– 아직 이 동일 하게 생성됐는지 미확인
그럼 로 구현한 모델은 어떻하나요
❖ 일단 로는 변환이 어려움
– → 의
프로토콜은 적용 불가능
그럼 로 구현한 모델은 어떻하나요
❖ 에서 다른 훈련 방법도 제공
– 로 가능
– 변화 때문에 날 수도 있음
@ tf.function
def train(model,dataset,optimizer):
for x, y in dataset:
with tf.GradientTape() as tape:
prediction = model(x)
loss = loss_fn(prediction,y)
grads = tape.gradient(target=tr_loss, sources=dnn.variables)
opt.apply_gradients(grads, model.variables)
정리하면
❖ 로 구현된 모델
→ 로 변환 기존 프로젝트 구조 사용 가능
❖ 로 구현된 모델
– 로 변환 불가능
– 방식으로 진행
• 하지만 이경우도 의 변동 때문에 코드 수정 불가피
❖ 가장 좋은 것은 에서 로 저장해 놓고
불러오는것
– 이경우 코드 재사용 불가ㅠㅠ
누구나
마치며
• 일부 엔지니어 개발자들만 잘 쓸 수 있는 오픈소스는 완성도에
상관없이 대중화 되기 힘들다
• 오픈소스를 대중화를 위해서는 지속적인 설명과 이해를 구하면서
사용자와 신뢰 쌓아가는 시간이 필요하다
• 이것은 대중화가 된 대부분의 오픈소스들이 겪어온 과정이다
• 의 교훈에서 는 이부분을 되돌아봐야 하지
않을까
Accelerate your AI coding
with TF 2.0!
Thank you for your attention

JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 perspectives

  • 1.
    Toward tf.keras fromtf.Estimator - From Tensorflow 2.0 perspectives
  • 3.
  • 4.
    ❖ 이 가능할까 ❖개인적으로 생각하는 가 외면 받았던 이유 ❖
  • 5.
  • 6.
    ㅈ ㅈ ❖ 이상적인모델러의 하루
  • 7.
    ㅈ ㅈ ❖ 이상적인모델러의 하루 – 출근하면서 논문 읽고 – 오전까지 코드 짜고 – 오후에 삽질 디버깅 하고 파라미터 맞추고 – 퇴근전에 훈련 및 평가
  • 8.
    ㅈ ㅈ ❖ 이상적인모델러의 하루 – 출근하면서 논문 읽고 – 오전까지 코드 짜고 – 오후에 디버깅 하고 파라미터 맞추고 – 퇴근전에 훈련 및 평가
  • 9.
    ㅈ ㅈ ❖ 이상적인모델러의 하루 – 출근하면서 논문 읽고 – 오전까지 코드 짜고 → 몇시간 걸림 – 오후에 디버깅 하고 파라미터 맞추고 – 퇴근전에 훈련 및 평가
  • 10.
    누구나 ㅈ ㅈ ❖ 딥러닝코딩 에서 해야할 것 들 – 데이터 구현 – 구현 – 루프 구현 멀티 – 모델 하는 부분을 구현 – 을 이쁘게 볼 수 있게 구현
  • 11.
    누구나 ㅈ ㅈ ❖ 생산성개선을 위한 방향 – 재사용성 – 가독성
  • 12.
    누구나 ㅈ ㅈ ❖ 딥러닝코딩 에서 해야할 것 들 – 데이터 구현 → 재사용 – 구현 – 루프 구현 멀티 → 재사용 – 모델 하는 부분을 구현 → 재사용 – 을 볼 수 있게 구현 → 재사용
  • 13.
    누구나 ㅈ ㅈ ❖ 딥러닝코딩 에서 해야할 것 들 – 데이터 구현 – 구현 → 우리가 주로 할일 – 루프 구현 멀티 – 모델 하는 부분을 구현 – 을 이쁘게 볼 수 있게 구현
  • 14.
    누구나 ㅈ ㅈ ❖ 을위해서는 – 에 집중할 수 있는 환경을 사용해야 – 어떤 프레임워크를 써야 하는가
  • 15.
    개인적으로 생각하는 가 외면받은이유 - 잘만들고 사용자들에게 외면받은 비운의
  • 16.
  • 17.
  • 18.
    ❖ – – 반복되는 코드를캡슐화하여 로 제공 • • 는 자동으로 저장됨
  • 19.
    누구나 Concept of tf.estimatoris actually Good!! ❖ 딥러닝 코딩 에서 해야할 것 들 – 데이터 구현 → – 을 위한 구현 → – 루프 구현 → 으로 제공 – 모델 하는 부분을 구현 → 제공 – → 자동 제공
  • 20.
    누구나 Concept of tf.estimatoris actually Good!! ❖ 딥러닝 코딩 에서 해야할 것 들 – 데이터 구현 → – 을 위한 구현 → – 루프 구현 → 으로 제공 – 모델 하는 부분을 구현 → 제공 – → 자동 제공 → tf.estimator는 “One day, One model”을 위한 생산성 개선에 도움이 될께 분명할텐데...
  • 21.
    Concept of tf.estimatoris actually Good!! from model import build_model from dataloader import Dataloader # using tf.data.Dataset def model_fn(features, labels, mode, params): # Define the model to construct the logits logits = build_model(features) loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits) train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) def main(): config = tf.estimator.RunConfig(#...) train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training) estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config) estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps) estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt) estimator.export_savedmodel(#...)
  • 22.
    Concept of tf.estimatoris actually Good!! from model import build_model from dataloader import Dataloader # using tf.data.Dataset def model_fn(features, labels, mode, params): # Define the model to construct the logits logits = build_model(features) loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits) train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) def main(): config = tf.estimator.RunConfig(#...) train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training) estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config) estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps) estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt) estimator.export_savedmodel(#...)
  • 23.
    Concept of tf.estimatoris actually Good!! from model import build_model from dataloader import Dataloader # using tf.data.Dataset def model_fn(features, labels, mode, params): # Define the model to construct the logits logits = build_model(features) loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits) train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) def main(): config = tf.estimator.RunConfig(#...) train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training) estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config) estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps) estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt) estimator.export_savedmodel(#...) 사실 Dataloader도 한번 개발해 놓으면 재활용 가능하고 build_model()에만 집중하면 됨
  • 24.
    누구나 Concept of tf.estimatoris actually Good!! ❖ 사실 컨셉은 와 같음 - 훌륭하게 잘 설계된 - tf.Estimator.estimator tf.keras loss / opt / eval_metric config model_fn() model.compile() train /eval estimator.train() /estimator.eval() model.fit() predict estimator.predict() model.predict() savedmodel export estimator.export_savedmodel() tf.contrib.saved_model.save .keras_model()
  • 25.
    누구나 Concept of tf.estimatoris actually Good!! ❖ 사실 컨셉은 와 같음 - 에서 사용 차이 - 등의 사용해야함 - 사용
  • 26.
    누구나 Concept of tf.estimatoris actually Good!! ❖ 그럼에도 불구하고 가 잘 사용되지 않는 이유 – 너무나 빠른 변화에 지친 사용자 • 이제 방식에 익숙해진 유저에게 다시 또 새로운 스타일을 강제함 – 반드시 같이 써야하는 의 사용 난이도 • 한번 읽어 보시길 ㅠㅠ https://www.tensorflow.org/guide/performance/datasets )
  • 27.
    누구나 Concept of tf.estimatoris actually Good!! ❖ 그럼에도 불구하고 가 잘 사용되지 않는 이유 – 코드를 굳이 로 • 코드를 굳이 새로운 인 로 짤이유 없음 • 문법이 더 익숙한데 • 기능이 추가됨에 따라서 점점 복잡 – 가독성이 떨어짐
  • 28.
    누구나 Concept of tf.estimatoris actually Good!! ❖ 요약하면… ❖ 는 아주 기술적으로 완성도 높은 였다 • 숙련된 개발자들이 사용하기에는 손색없음 ❖ 하지만 다음과 같은 이유로 에서 되게 되었다 – 하지만 넓은 사용자 층에 대한 이해 부족 → 그들만의 리그 – 다른 프레임워크의 상황인식이 부족
  • 29.
  • 30.
    ❖ Tensorflow 2.0에서는keras가 대표 api라는데...
  • 31.
    ❖ 로 구현된내 프로젝트를 어떻게 최소한의 노력으로 로 옮길 수 있을까 – → 는 구글이 로 제공함 • https://www.tensorflow.org/api_docs/python/tf/keras/estima tor/model_to_estimator – How about estimator → keras?
  • 32.
  • 33.
  • 34.
    ❖ 에서 에대한 몇 가지 사실 – 왜 매우 를 가지고 있다 – 으로 이 가능하다 – 로 하는 를 제공한다 – 는 이외의 로 만들수 있을까
  • 35.
    ❖ 에서 에대한 몇 가지 사실 – 왜 매우 를 가지고 있다 – 으로 이 가능하다 – 로 하는 를 제공한다 – 는 이외의 로 만들수 있을까
  • 36.
  • 37.
  • 38.
    로 다음과 같은구조로 가능할까
  • 39.
    로 다음과 같은구조로 가능할까 build_model() 입출력을 - get_keras_model()에서 tf.keras.models.Model로 packaging
  • 40.
    Packaging MyModel asa tf.keras.models.Model class MyModel(object): def __init__(self, args): # Keras model에서 사용할 파라미터를 정의하는 부분 def build_model(self, inputs): # model을 정의하는 부분 def build_model(self, inputs): # tf.keras.models.Model로 packaging 하는 부분
  • 41.
    Packaging MyModel asa tf.keras.models.Model class MyModel(object): def __init__(self, args): self.model = None def build_model(self, inputs): net = tf.keras.layers.Embedding()(inputs) … return outputs = tf.keras.layers.Dense()(net) def get_keras_model (self): input = tf.keras.layers.Input(shape=...) output = self.get_keras_model(input) self.model = tf.keras.models.Model(inputs=input,outputs=output) return self.model
  • 42.
    해야 할일을 정리하면 ❖안되있는 경우 파트를 독립적으로 분리한다 ❖ 안되있는 경우 를 분리한다 ❖ 으로 모델 인스턴스 생성 – – ❖ 와 으로 훈련한다
  • 43.
    주의 사항 ❖ 몇가지 –로 구현한 코드와는 호환되지 않음 • • 호환 – 대부분의 와는 호환할듯 전부 미확인 • 의 대부분과 호환 • 도 호환될듯 미확인 – 아직 이 동일 하게 생성됐는지 미확인
  • 44.
    주의 사항 ❖ 몇가지 –로 구현한 코드와는 호환되지 않음 • • 호환 – 대부분의 와는 호환할듯 전부 미확인 • 의 대부분과 호환 • 도 호환될듯 미확인 – 아직 이 동일 하게 생성됐는지 미확인
  • 45.
    그럼 로 구현한모델은 어떻하나요 ❖ 일단 로는 변환이 어려움 – → 의 프로토콜은 적용 불가능
  • 46.
    그럼 로 구현한모델은 어떻하나요 ❖ 에서 다른 훈련 방법도 제공 – 로 가능 – 변화 때문에 날 수도 있음 @ tf.function def train(model,dataset,optimizer): for x, y in dataset: with tf.GradientTape() as tape: prediction = model(x) loss = loss_fn(prediction,y) grads = tape.gradient(target=tr_loss, sources=dnn.variables) opt.apply_gradients(grads, model.variables)
  • 47.
    정리하면 ❖ 로 구현된모델 → 로 변환 기존 프로젝트 구조 사용 가능 ❖ 로 구현된 모델 – 로 변환 불가능 – 방식으로 진행 • 하지만 이경우도 의 변동 때문에 코드 수정 불가피 ❖ 가장 좋은 것은 에서 로 저장해 놓고 불러오는것 – 이경우 코드 재사용 불가ㅠㅠ
  • 48.
    누구나 마치며 • 일부 엔지니어개발자들만 잘 쓸 수 있는 오픈소스는 완성도에 상관없이 대중화 되기 힘들다 • 오픈소스를 대중화를 위해서는 지속적인 설명과 이해를 구하면서 사용자와 신뢰 쌓아가는 시간이 필요하다 • 이것은 대중화가 된 대부분의 오픈소스들이 겪어온 과정이다 • 의 교훈에서 는 이부분을 되돌아봐야 하지 않을까
  • 49.
    Accelerate your AIcoding with TF 2.0! Thank you for your attention