AOT derlemesini kullanma

tf derlemesi nedir?

tfcompile öncesinde-of-zaman (AOT) derlenir TensorFlow grafikleri çalıştırılabilir kodun bir 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 kullanım durumunda tfcompile mobil cihazlar için çalıştırılabilir kod içine bir çıkarım grafik derlemek için.

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 bir miktar çalışma zamanı ek yüküne neden olur. Bu ayrıca, grafiğin kendisine ek olarak TensorFlow çalışma zamanı kodunun da mevcut olması gerektiğinden, daha büyük bir toplam ikili boyuta yol açar. Tarafından üretilen çalıştırılabilir kod tfcompile TensorFlow çalışma zamanını kullanın ve yalnızca gerçekten hesaplamasında kullanılan çekirdekler bağımlılıklara sahiptir etmez.

Derleyici, XLA çerçevesinin üzerine inşa edilmiştir. Altında XLA çerçeve Resides TensorFlow köprü kod tensorflow / derleyici .

tfcompile ne işe yarar?

tfcompile yemlerin ve fetches ait TensorFlow kavramları tarafından tanımlanan bir alt grafiğini, sürer ve bir işlev olduğunu uygular o subgraph üretir. feeds fonksiyonu için giriş argümanlar vardır ve fetches fonksiyonu için çıkış bağımsız değişkendir. Tüm girdiler, beslemeler tarafından tam olarak belirtilmelidir; sonuçtaki budanmış alt grafik, Yer Tutucu veya Değişken düğümleri içeremez. Tüm Yer Tutucuları ve Değişkenleri beslemeler olarak belirtmek yaygındır, bu da sonuçtaki alt grafiğin artık bu düğümleri içermemesini sağlar. Oluşturulan fonksiyonu olarak paketlenir cc_library işlevi imza ihraç bir başlık dosyası, ve uygulama içeren bir nesne dosyası ile. 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:

  • Adım 1: Alt grafiği derlenecek şekilde yapılandırın
  • 2. Adım: tf_library subgraph derlemeye inşa makro
  • Adım 3: Alt grafiği çağırmak için kod yazın
  • Adım 4: Son ikili dosyayı oluşturun

Adım 1: Alt grafiği derlenecek şekilde yapılandırın

Oluşturulan işlev için giriş ve çıkış bağımsız değişkenlerine karşılık gelen beslemeleri ve getirmeleri tanımlayın. 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 kademe, bir içine grafik dönüştürür cc_library kullanılarak tf_library inşa makro. cc_library oluşturulan koda erişim sağlayan bir başlık ile birlikte dosya grafik elde edilen kod, ihtiva eden, bir dosya 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 içeren Variables eğitimi ile öğrenilir ağırlıkları temsil eden, fakat tfcompile içeren bir alt grafiğini derleme olamaz Variables . Freeze_graph.py aracı bir kontrol noktası dosyada saklanır değerleri kullanarak, sabitler içine değişkenleri dönüştürür. Kolaylık olması için, tf_library makro destekler freeze_checkpoint aracını çalıştırır argüman. Daha fazla örnek için bkz tensorflow / derleyici / AOT / test / YAPI .

Derlenmiş alt grafikte görünen sabitler, doğrudan oluşturulan koda derlenir. Sabitleri, derlenmek yerine oluşturulan işleve iletmek için, onları besleme olarak iletmeniz yeterlidir.

İlgili ayrıntılar için tf_library inşa makro, bkz tfcompile.bzl .

Altta yatan ilgili ayrıntılar için tfcompile aracı, bkz tfcompile_main.cc .

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

Bu adım, başlık dosyası (kullanan test_graph_tfmatmul.h tarafından oluşturulan) tf_library üretilen kod çağırmak için bir önceki adımda inşa makro. Başlık dosyasında bulunan bazel-bin inşa paketine karşılık gelen dizine ve isim nitelik kümesi temelinde adlı tf_library inşa makro. Örneğin, için oluşturulmuş başlık test_graph_tfmatmul olacaktır test_graph_tfmatmul.h . Aşağıda, oluşturulan şeyin kısaltılmış bir versiyonu bulunmaktadır. Oluşturulan dosya, içinde bazel-bin , ek yararlı yorum 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ı olarak adlandırılır MatMulComp içinde foo::bar oldu, çünkü ad cpp_class belirtilen tf_library makro. Oluşturulan tüm sınıfların benzer bir API'si vardır, tek fark, argüman ve sonuç arabelleklerini işleme yöntemleridir. Bu yöntemler sayısı ve belirtilen edildi tamponlar, türlerine göre farklılık feed ve fetch için bağımsız değişkeni tf_library makro.

Üç 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, tüm bu arabellekleri sizin için tahsis eder ve yönetir. AllocMode yapıcı argüman bu davranışı değiştirmek için kullanılabilir. Tüm arabellekler 64 baytlık sınırlara göre hizalanır.

Oluşturulan C++ sınıfı, yalnızca XLA tarafından oluşturulan düşük seviyeli kodun etrafındaki bir sarmalayıcıdır.

Göre oluşturulur fonksiyonu çağıran Örnek 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;
}

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

Bu adım ile üretilen kütüphane birleştiren tf_library 2. adımda ve son bir ikili oluşturmak için 3. adımda yazılı kodda. Aşağıda bir örnek verilmiştir bazel YAPI dosyası.

# 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",
    ]
)