자주 묻는 질문(FAQ)

Cloud TPU에서 지원되는 모델은 무엇인가요? 지원되는 모델 목록은 공식 지원 모델에서 확인할 수 있습니다.

Compute Engine을 사용하여 추론할 수 있나요? TPUEstimator의 Predict 모드를 통해 Compute Engine에서 학습된 모델의 추론을 수행할 수 있습니다. TPUEstimator predict 메서드를 참조하세요.

Compute Engine에서 사용할 수 없는 기본 제공 TensorFlow 작업이 있나요?

현재 Compute Engine에서 사용할 수 없는 몇 가지 기본 제공 TensorFlow 작업이 있습니다. 사용 가능한 TensorFlow 작업 가이드에서 최신 해결책을 참조하세요.

Compute Engine에서 자리표시자 및 피드 사전을 사용할 수 있나요?

이 사용 패턴은 Compute Engine에서 기술적으로는 사용 가능하지만 사용하지 않는 것이 좋습니다. 자리표시자 및 피드 디렉터리를 사용하면 단일 Compute Engine 코어로 제한되며 과도한 오버헤드가 발생합니다.

대신 학습 파이프라인을 만들려면 TPUEstimator API와 Dataset API를 사용합니다. ResNet 가이드에서는 TPUEstimatorDataset를 사용하여 간단한 학습 루프를 만드는 방법의 예시를 제공합니다.

Compute Engine에서 강화 학습(RL) 모델을 학습시킬 수 있나요?

강화 학습에는 광범위한 분야의 기술이 수반되며 그중 일부는 현재 TPU의 소프트웨어 추상화와 호환되지 않습니다. 일부 강화 학습 구성을 위해서는 CPU를 학습 루프의 일부로 사용하는 '시뮬레이션 환경' 블랙박스를 실행해야 합니다. 이러한 방식이 Compute Engine을 따라잡을 수 없고 결과적으로 효율성이 현저하게 떨어진다는 점이 확인되었습니다.

Compute Engine에서 단어 임베딩을 사용할 수 있나요?

예, tf.nn.embedding_lookup()은 단지 tf.gather()를 묶는 래퍼이고 Compute Engine에서 구현되기 때문에 Compute Engine에서 지원합니다. 그러나 tf.nn.embedding_lookup_sparse()는 Compute Engine에서 지원되지 않습니다. tf.embedding_lookup()에 대한 입력 ID 텐서는 학습 도중 정적 형태를 유지해야 합니다(즉, 배치 크기 및 시퀀스 길이가 모든 배치에서 동일해야 함). 이는 Compute Engine 사용 시 모든 텐서에 적용되는 일반적인 제한 사항입니다.

Compute Engine에서 가변 길이 시퀀스를 사용할 수 있나요?

TensorFlow에서 변수 길이 시퀀스를 표현하는 방법에는 패딩, tf.while_loop(), 추론된 텐서 차원, 버케팅 등 여러 가지가 있습니다. 하지만 현재 Compute Engine 실행 엔진은 이러한 시퀀스의 하위 집합만 지원합니다. 변수 길이 시퀀스는 tf.while_loop(), tf.dynamic_rnn(), 버케팅, 패딩 또는 시퀀스 이어붙이기를 사용하여 구현해야 합니다.

Compute Engine에서 순환 신경망(RNN)을 학습시킬 수 있나요?

특정 구성에서는 tf.static_rnn()tf.dynamic_rnn()이 현재 TPU 실행 엔진과 호환됩니다. 보다 일반적으로는 TPU가 tf.dynamic_rnn()을 구현하는 데 사용되는 tf.while_loop()TensorArray를 모두 지원합니다. CuDNN과 같은 특수 툴킷은 GPU 특수 코드를 포함하므로 TPU에서 지원되지 않습니다. TPU에서 tf.while_loop()를 사용하려면 TPU 실행 엔진이 통계에 따라 메모리 사용량을 결정할 수 있도록 루프 반복 횟수의 상한을 지정해야 합니다.

Compute Engine에서 생성적 적대 신경망(GAN)을 학습시킬 수 있나요?

GAN을 학습시키려면 일반적으로 생성자 학습과 구분자 학습을 번갈아 반복해야 합니다. 현재 TPU 실행 엔진은 단일 실행 그래프만 지원합니다. 그래프를 번갈아 실행하려면 완전히 다시 컴파일해야 하며 여기에는 30초 이상의 시간이 걸릴 수 있습니다.

가능한 해결책 중 하나는 항상 생성자와 구분자 모두의 손실 합계를 계산하는 것입니다. 단, 이러한 손실을 입력 텐서 두 개(g_wd_w)로 곱해야 합니다. 생성자를 학습시켜야 하는 배치에서는 g_w=1.0d_w=0.0으로 전달할 수 있고, 구분자를 학습시켜야 하는 배치에서는 반대로 전달할 수 있습니다.

Compute Engine에서 멀티태스크 학습 모델을 학습시킬 수 있나요?

작업이 집계 손실 함수가 포함된 하나의 대형 그래프로 나타나는 경우 멀티태스크 학습에 특별한 지원이 필요하지 않습니다. 그러나 TPU 실행 엔진은 현재 단일 실행 그래프만 지원합니다. 따라서 변수를 공유하지만 구조가 다른 여러 개의 실행 그래프를 신속하게 번갈아 실행하는 것이 불가능합니다. 실행 그래프를 변경하려면 그래프 컴파일 단계를 다시 실행해야 하며 여기에는 30초 이상이 소요될 수 있습니다.

Compute Engine에서 즉시 실행(eager) 모드를 지원하나요?

아니요, 즉시 실행(eager) 모드는 새로운 동적 실행 엔진을 사용하지만 Compute Engine은 실행 그래프의 정적 컴파일을 수행하는 XLA를 사용합니다.

Compute Engine에서 모델 동시 로드를 지원하나요?

모델 동시 로드(또는 단일 Compute Engine 기기 내의 여러 코어에서 서로 다른 프로그램 실행)는 현재 지원되지 않습니다.

Compute Engine에서 tf.Print 또는 tfdbg와 같은 중간 텐서의 실제 값을 검사하려면 어떻게 해야 하나요?

이 기능은 현재 Compute Engine에서 지원되지 않습니다. Compute Engine에서 개발과 관련하여 제안된 절차는 TPUEstimator 프레임워크를 사용하여 모델을 구현하는 것입니다. 이를 통해 TPU와 CPU/GPU(use_tpu 플래그) 간에 쉽게 전환할 수 있습니다. 표준 TensorFlow 도구를 사용하여 CPU/GPU에서 모델을 디버깅한 다음 모델이 본격적으로 학습할 준비가 되면 Compute Engine으로 전환하는 것이 좋습니다.

내 학습 계획이 TPUEstimator API를 사용하기에 너무 복잡하거나 특화되어 있습니다. 사용 가능한 낮은 수준의 API가 있나요?

TPUEstimator는 Cloud TPU 학습을 위한 기본 프레임워크입니다. 그러나 TPUEstimator는 오픈소스 TensorFlow에 포함된 tpu API를 래핑하므로 기술적으로 낮은 수준의 tpu API를 직접 사용할 수 있지만 지원되지는 않습니다. 학습 파이프라인에 Compute Engine과 CPU 간의 빈번한 통신이 필요하거나 실행 그래프를 빈번하게 변경해야 하는 경우에는 Compute Engine에서 연산이 효율적으로 실행되지 않습니다.