Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

AOT derlemesini kullanma

Tfcompile nedir?

tfcompile , vaktinden önce (AOT) TensorFlow grafiklerini yürütülebilir koda derleyen bağımsız bir araçtır. Toplam ikili boyutu azaltabilir ve ayrıca bazı çalışma zamanı ek yüklerinden kaçınabilir. Tipik bir tfcompile kullanımı, bir çıkarım grafiğini mobil aygıtlar için yürütülebilir koda derlemektir.

TensorFlow grafiği normalde TensorFlow çalışma zamanı tarafından yürütülür. Bu, grafikteki her bir düğümün yürütülmesi için biraz çalışma zamanı yükü oluşturur. Grafiğin kendisine ek olarak, TensorFlow çalışma zamanı kodunun da mevcut olması gerektiğinden, bu da daha büyük bir toplam ikili boyuta yol açar. tfcompile tarafından üretilen yürütülebilir kod TensorFlow çalışma zamanını kullanmaz ve yalnızca hesaplamada gerçekten kullanılan çekirdeklere bağımlılıkları vardır.

Derleyici XLA çerçevesinin üzerine inşa edilmiştir. TensorFlow'u XLA çerçevesine bağlayan kod, tensorflow / derleyici altında bulunur.

Tfcompile ne yapıyor?

tfcompile , besleme ve getirme TensorFlow kavramları tarafından tanımlanan bir alt tfcompile alır ve bu alt grafiği uygulayan bir işlev oluşturur. feeds işlevin girdi bağımsız değişkenleridir ve fetches işlevin çıktı bağımsız değişkenleridir. Tüm girişler beslemeler tarafından tam olarak belirtilmelidir; elde edilen budama altgrafında Yer Tutucu veya Değişken düğümleri bulunamaz. Sonuçta elde edilen altgrafın artık bu düğümleri içermemesini sağlayan tüm Yer Tutucuları ve Değişkenleri özet akışı olarak belirtmek yaygındır. Oluşturulan işlev, cc_library olarak paketlenir; işlev imzasını veren bir başlık dosyası ve uygulamayı içeren bir nesne dosyası bulunur. Kullanıcı, oluşturulan işlevi uygun şekilde çağırmak için kod yazar.

Tfcompile kullanma

Bu bölüm, bir yürütülebilir ikili üretilmesi için yüksek düzeyde adımları ayrıntılı tfcompile bir TensorFlow alt grafiği ile ilgili. Adımlar:

  • 1. Adım: Alt grafiği derlemek için yapılandırın
  • Adım 2: Alt grafiği derlemek için tf_library derleme makrosunu kullanın
  • 3. Adım: Alt grafiği çağırmak için kod yazın
  • 4. Adım: Son ikili dosyayı oluşturun

1. Adım: Alt grafiği derlemek için yapılandırın

Oluşturulan işlevin girdi ve çıktı bağımsız değişkenlerine karşılık gelen feed'leri ve getirmeleri belirleyin. Sonra yapılandırmak feeds ve fetches bir de tensorflow.tf2xla.Config proto.

 # Each feed is a positional input argument for the generated function.  The order
# of each entry matches the order of each input argument.  Here “x_hold” and “y_hold”
# refer to the names of placeholder nodes defined in the graph.
feed {
  id { node_name: "x_hold" }
  shape {
    dim { size: 2 }
    dim { size: 3 }
  }
}
feed {
  id { node_name: "y_hold" }
  shape {
    dim { size: 3 }
    dim { size: 2 }
  }
}

# Each fetch is a positional output argument for the generated function.  The order
# of each entry matches the order of each output argument.  Here “x_y_prod”
# refers to the name of a matmul node defined in the graph.
fetch {
  id { node_name: "x_y_prod" }
}
 

Adım 2: Alt grafiği derlemek için tf_library derleme makrosunu kullanın

Bu adım, tf_library derleme makrosunu kullanarak grafiği cc_library dönüştürür. cc_library , oluşturulan koda erişim sağlayan bir başlık dosyasıyla birlikte grafikten oluşturulan kodu içeren bir nesne dosyasından oluşur. tf_library kullandığı tfcompile yürütülebilir koduna TensorFlow grafik derlemek.

 load("//tensorflow/compiler/aot:tfcompile.bzl", "tf_library")

# Use the tf_library macro to compile your graph into executable code.
tf_library(
    # name is used to generate the following underlying build rules:
    # <name>           : cc_library packaging the generated header and object files
    # <name>_test      : cc_test containing a simple test and benchmark
    # <name>_benchmark : cc_binary containing a stand-alone benchmark with minimal deps;
    #                    can be run on a mobile device
    name = "test_graph_tfmatmul",
    # cpp_class specifies the name of the generated C++ class, with namespaces allowed.
    # The class will be generated in the given namespace(s), or if no namespaces are
    # given, within the global namespace.
    cpp_class = "foo::bar::MatMulComp",
    # graph is the input GraphDef proto, by default expected in binary format.  To
    # use the text format instead, just use the ‘.pbtxt’ suffix.  A subgraph will be
    # created from this input graph, with feeds as inputs and fetches as outputs.
    # No Placeholder or Variable ops may exist in this subgraph.
    graph = "test_graph_tfmatmul.pb",
    # config is the input Config proto, by default expected in binary format.  To
    # use the text format instead, use the ‘.pbtxt’ suffix.  This is where the
    # feeds and fetches were specified above, in the previous step.
    config = "test_graph_tfmatmul.config.pbtxt",
)
 

Bu örnek, çalışma için GraphDef proto (test_graph_tfmatmul.pb) üretmek için make_test_graphs.py ve --out_dir bayrağıyla çıkış konumunu belirtin.

Tipik grafikler, eğitim yoluyla öğrenilen ağırlıkları temsil eden Variables içerir, ancak tfcompile , Variables içeren bir alt grafiği tfcompile . Freeze_graph.py aracı, bir denetim noktası dosyasında depolanan değerleri kullanarak değişkenleri sabitlere dönüştürür. Kolaylık olması açısından, tf_library makrosu aracı çalıştıran freeze_checkpoint argümanını destekler. Daha fazla örnek için bkz. Tensorflow / derleyici / aot / testler / BUILD .

Derlenen alt sayfada gösterilen sabitler doğrudan oluşturulan koda derlenir. Sabitleri derlemek yerine, oluşturulan işleve aktarmak için, bunları özet akışı olarak iletmeniz yeterlidir.

tf_library derleme makrosu hakkında ayrıntılar için, bkz. Tfcompile.bzl .

Temel tfcompile aracıyla ilgili ayrıntılar için bkz. Tfcompile_main.cc .

3. Adım: Alt grafiği çağırmak için kod yazın

Bu adım, oluşturulan kodu çağırmak için önceki adımda tf_library derleme makrosu tarafından oluşturulan üstbilgi dosyasını ( test_graph_tfmatmul.h ) kullanır. Üstbilgi dosyası derleme paketine karşılık gelen bazel-bin dizininde bulunur ve tf_library derleme makrosunda ayarlanan ad özniteliğine göre adlandırılır. Örneğin, için oluşturulmuş başlık test_graph_tfmatmul olacaktır test_graph_tfmatmul.h . Aşağıda, oluşturulan öğenin kısaltılmış bir sürümüdür. Oluşturulan dosya bazel-bin yararlı ek yorumlar içeriyor.

 namespace foo {
namespace bar {

// MatMulComp represents a computation previously specified in a
// TensorFlow graph, now compiled into executable code.
class MatMulComp {
 public:
  // AllocMode controls the buffer allocation mode.
  enum class AllocMode {
    ARGS_RESULTS_AND_TEMPS,  // Allocate arg, result and temp buffers
    RESULTS_AND_TEMPS_ONLY,  // Only allocate result and temp buffers
  };

  MatMulComp(AllocMode mode = AllocMode::ARGS_RESULTS_AND_TEMPS);
  ~MatMulComp();

  // Runs the computation, with inputs read from arg buffers, and outputs
  // written to result buffers. Returns true on success and false on failure.
  bool Run();

  // Arg methods for managing input buffers. Buffers are in row-major order.
  // There is a set of methods for each positional argument.
  void** args();

  void set_arg0_data(float* data);
  float* arg0_data();
  float& arg0(size_t dim0, size_t dim1);

  void set_arg1_data(float* data);
  float* arg1_data();
  float& arg1(size_t dim0, size_t dim1);

  // Result methods for managing output buffers. Buffers are in row-major order.
  // Must only be called after a successful Run call. There is a set of methods
  // for each positional result.
  void** results();


  float* result0_data();
  float& result0(size_t dim0, size_t dim1);
};

}  // end namespace bar
}  // end namespace foo
 

Oluşturulan C ++ sınıfı, tf_library makrosunda belirtilen cpp_class olduğundan foo::bar ad alanında MatMulComp olarak adlandırılır. Oluşturulan tüm sınıflar benzer bir API'ya sahiptir, tek fark arg ve sonuç arabelleklerini işlemek için kullanılan yöntemlerdir. Bu yöntemler, tf_library makrosuna feed ve fetch bağımsız değişkenleri tarafından belirtilen arabelleklerin sayısı ve türlerine göre farklılık gösterir.

Üç oluşturulan sınıf içindeki yönetilen tampon türleri vardır args giriş temsil results ürünleri yansıtan ve temps hesaplama yapmak için dahili olarak kullanılan geçici tamponlar temsil eder. Varsayılan olarak, oluşturulan sınıfın her bir örneği bu arabelleklerin tümünü sizin için ayırır ve yönetir. Bu davranışı değiştirmek için AllocMode yapıcı bağımsız değişkeni kullanılabilir. Tüm tamponlar 64 baytlık sınırlara hizalanır.

Oluşturulan C ++ sınıfı, XLA tarafından üretilen düşük düzeyli kodun etrafındaki bir paketleyicidir.

Oluşturulan işlevi tfcompile_test.cc göre çağırma tfcompile_test.cc :

 #define EIGEN_USE_THREADS
#define EIGEN_USE_CUSTOM_THREAD_POOL

#include <iostream>
#include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor"
#include "tensorflow/compiler/aot/tests/test_graph_tfmatmul.h" // generated

int main(int argc, char** argv) {
  Eigen::ThreadPool tp(2);  // Size the thread pool as appropriate.
  Eigen::ThreadPoolDevice device(&tp, tp.NumThreads());


  foo::bar::MatMulComp matmul;
  matmul.set_thread_pool(&device);

  // Set up args and run the computation.
  const float args[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  std::copy(args + 0, args + 6, matmul.arg0_data());
  std::copy(args + 6, args + 12, matmul.arg1_data());
  matmul.Run();

  // Check result
  if (matmul.result0(0, 0) == 58) {
    std::cout << "Success" << std::endl;
  } else {
    std::cout << "Failed. Expected value 58 at 0,0. Got:"
              << matmul.result0(0, 0) << std::endl;
  }

  return 0;
}
 

4. Adım: Son ikili dosyayı oluşturun

Bu adım, 2. adımda tf_library tarafından oluşturulan kitaplığı ve 3. adımda yazılan kodu, bir ikili ikili dosya oluşturmak için birleştirir. Aşağıda örnek bir bazel BUILD dosyası verilmiştir.

 # Example of linking your binary
# Also see //tensorflow/compiler/aot/tests/BUILD
load("//tensorflow/compiler/aot:tfcompile.bzl", "tf_library")

# The same tf_library call from step 2 above.
tf_library(
    name = "test_graph_tfmatmul",
    ...
)

# The executable code generated by tf_library can then be linked into your code.
cc_binary(
    name = "my_binary",
    srcs = [
        "my_code.cc",  # include test_graph_tfmatmul.h to access the generated header
    ],
    deps = [
        ":test_graph_tfmatmul",  # link in the generated object file
        "//third_party/eigen3",
    ],
    linkopts = [
          "-lpthread",
    ]
)