Criar perfis de cargas de trabalho do TensorFlow
Para criar o perfil de um modelo do TensorFlow em Cloud TPUs, use o TensorBoard e o plug-in TPU TensorBoard. O TensorBoard é pré-instalado nas VMs de TPU. Para saber como instalar o plug-in do TensorBoard do TPU e capturar um perfil de desempenho, consulte Criar o perfil do modelo com as ferramentas do Cloud TPU. Para informações gerais sobre o desempenho do Cloud TPU, consulte o guia de desempenho do Cloud TPU.
Para mais informações, consulte Callbacks do TensorBoard.
Notas sobre o desempenho da função do TensorFlow
Veja a lista completa de operações do TensorFlow disponíveis no Cloud TPU.
tf.matmul
- A transposição do resultado de qualquer um dos operandos é efetivamente gratuita.
- Observe que
tf.matmul
suporta a fusão em sua entrada e saída. Isso significa que as funções de ativação ou as tendências aplicadas diretamente à saída detf.matmul
têm baixa sobrecarga.
tf.nn.conv_n_d
, tf.nn.depthwise_conv2d
, tf.nn.separable_conv2d
- Para as ativações, as dimensões de lote e de característica são preenchidas por um múltiplo de 8 ou 128.
- Primeiro, o XLA rastreia o tamanho mais comum entre as dimensões de lote para convoluções no módulo. Isso ajuda a distinguir entre convoluções progressivas, convoluções de gradiente de ativação e convoluções de gradiente do kernel.
- Se o tamanho de lote mais comum for maior ou igual a 64:
- o lote é preenchido com um múltiplo de 128 e a característica é preenchida com um múltiplo de 8 para convoluções progressivas e regressivas;
- o lote é preenchido com um múltiplo de 8 e a característica é preenchida com um múltiplo de 128 para as convoluções de atualização de gradiente.
- Se o tamanho de lote mais comum for menor que 64:
- o lote é preenchido com um múltiplo de 8 e a característica é preenchida com um múltiplo de 128 para convoluções progressivas e regressivas;
- o lote é preenchido com um múltiplo de 128 e a característica é preenchida com um múltiplo de 8 para as convoluções de atualização de gradiente;
- a transposição das ativações antes de enviá-las para uma convolução será gratuita se ela apenas alternar as dimensões de característica de entrada e de lote.
- No caso do kernel, as dimensões de características de entrada e saída são preenchidas com um múltiplo de 8 ou 128. A determinação exata é influenciada pelos produtores e outros consumidores do kernel.
- A transposição de um kernel antes de enviá-lo para uma convolução será gratuita se ela apenas alternar as dimensões de características de entrada e saída.
- No caso do resultado, as dimensões de lote e de característica são preenchidas com um múltiplo de 8 ou 128.
- A transposição do resultado de uma convolução será gratuita se ela apenas alternar as dimensões de lote e de característica de saída.
- Observe que
tf.nn.conv_n_d
aceita a fusão em seu resultado, nas ativações e/ou no kernel. Isso significa que as funções de ativação ou as tendências aplicadas diretamente à saída têm baixa sobrecarga.
tf.nn.avg_pool
, tf.nn.max_pool
- As regras de preenchimento serão aplicadas se as dimensões espaciais forem maiores do que o lote e a característica. Cada combinação de lote e característica pode ser preenchida com um múltiplo de 8 ou 128.
- Normalmente, o layout de uma operação de pool corresponde às convoluções que entram ou saem dele.
- O cálculo do gradiente para
tf.nn.max
_pool pode ser mais lento que seu equivalentetf.nn.avg_pool
. Considere a possibilidade de mudar do pooling máximo para o médio sempre que possível.
tf.concat
, tf.slice
, tf.strided_slice
- Evite frações e concatenações desnecessários. Frações e concatenações em uma dimensão que foi preenchida são consideravelmente mais custosas.
- A movimentação de dados será minimizada se a dimensão da fração não tiver sobrecarga de preenchimento.
tf.transpose
- A transposição de qualquer um dos operandos de
tf.matmul
ou do respectivo resultado é gratuita. - Transpor as ativações de um
tf.conv_n_d
é gratuito se ele trocar as dimensões do recurso de lote e entrada. - A transposição do kernel de um
tf.conv_n_d
é gratuita se alternar as dimensões do recurso de entrada e saída. - Transpor o resultado de um
tf.conv_n_d
é gratuito se ele trocar as dimensões do recurso de lote e de saída.
tf.batch_to_space
, tf.space_to_batch
, tf.space_to_depth
, tf.depth_to_space
- Essas funções são dispendiosas porque envolvem a movimentação de dados de dimensões preenchidas para não preenchidas e vice-versa.
tf.reshape
- Quando dados são movimentados em uma dimensão preenchida, a reconfiguração da forma pode ser dispendiosa no Cloud TPU.
- Talvez seja útil reconfigurar a forma dos dados para R1 no host e, depois, reconfigurar de volta para uma forma de dimensão mais elevada no dispositivo, se o preenchimento for substancial. Isso pode aumentar a eficiência das transferências entre o host e o dispositivo.
- Essa ação também pode ajudar durante os picos de utilização de memória, porque o parâmetro compactado pode ser descompactado sob demanda.
tf.random_uniform
, tf.distributions.Bernoulli
, tf.random_normal
, tf.multinomial
- A geração de números pseudoaleatórios para distribuições uniformes ou de Bernoulli é muito rápida.
- As distribuições normais são um pouco mais dispendiosas do que as distribuições uniformes ou de Bernoulli.
- A geração de números pseudoaleatórios para distribuições categóricas e multinomiais é consideravelmente mais dispendiosa.
tf.reduce_all
, tf.reduce_any
, tf.reduce_logsumexp
, tf.reduce_max
, tf.reduce_min
, tf.reduce_prod
, tf.reduce_sum
- Várias reduções com a mesma forma de entrada e de saída podem ser realizadas em
paralelo usando a fusão de operações.
- Se possível, reescreva as cadeias sequenciais das reduções em cadeias paralelas.
As reduções são compatíveis com a fusão de operações elemento a elemento nas entradas, mas não nas saídas. Quando possível, reescreva expressões para promover a fusão. Por exemplo:
tf.multiply(tf.reduce_sum(x), y)
em:
tf.reduce_sum(tf.multiply(x, y))
tf.nn.batch_normalization
, tf.nn.fused_batch_norm
, tf.layers.batch_normalization
O compilador XLA pode reduzir de forma eficiente as variantes fundidas do TensorFlow na normalização em lote. Usá-las pode ser consideravelmente mais eficiente do que a outra opção.
- Prefira
tf.nn.fused_batch_norm
atf.nn.batch_normalization
. - Em
tf.layers.batch_normalization
, defina o argumento "fused" como "true".
- Prefira