Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Bridge TensorFlow* to run on Intel® nGraph™ backends v0.4 : ソースコード解析


Intel nGraph Library を TensorFlow から使えるようにする「Bridge TensorFlow to run on Intel nGraph backends」の
v0.4 のソースコードを解析資料を Slideshare にアップしました。


作成は、8月11日と19日で公開は、2018年9月3日に公開ということに。

v0.5についても解析したので、明日公開します。

5月24日にLeapMindさんで行った
「TensorFlow : Dynamically loadable XLA Pluginソースコード解析」独演会
では、Intel Nervana が提案した「Dynamically loadable XLA Plugin」というものについて説明しました。

この「Dyamically loadable XLA Plugin」を使った
Bridge TensorFlow*/XLA to run on Intel® nGraph™ backendsについても調べました。

しかしながら、Intel Nervana は、

イメージ 1


にあるように、
    We developed a new implementation of the nGraph-TensorFlow bridge without the XLA and is available 

だって。。。。

ということで、今回公開したスライドは、
この新しいコードであるBridge TensorFlow* to run on Intel® nGraph™ backendsの v0.4 のソースコードの解析結果です。

XLAデバイスではなく、独自に、NGRAPHというデバイスを作り、Passを使ったグラフ変換において、
 ・PRE_PLACEMENT
 ・POST_REWRITE_FOR_EXEC
の2つのPassにて、それぞれグラフ変換をやっています。

やっていることは、XLAと同じで、
_Xlalaunch_ ノードの代わりに、
NGgraphEncapsulate ノードにて Intel nGraph Library を使って計算するようにしています。

追記)、2018.09.01
LinkedInにて見つけたよ。

Intel nGraph Library を TensorFlow にインテグレートされていました。
nGraph Integration with TensorFlow #21122
実際に、TensorFlowのgithub を覗いてみたら、ありました。ここ
ngraph_tf.BUILDを見ると、
引用します。
licenses(["notice"])  # 3-Clause BSD

exports_files(["LICENSE"])

load(
    "@org_tensorflow//tensorflow:tensorflow.bzl",
    "tf_cc_test",
)

cc_library(
    name = "ngraph_libs_linux",
    srcs = [
        "lib/libiomp5.so",
        "lib/libmklml_intel.so",
    ],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "ngraph_tf",
    srcs = [
        "src/ngraph_builder.h",
        "src/ngraph_builder.cc",
        "src/ngraph_cluster.h",
        "src/ngraph_cluster.cc",
        "src/ngraph_cluster_manager.h",
        "src/ngraph_cluster_manager.cc",
        "src/ngraph_confirm_pass.cc",
        "src/ngraph_device.cc",
        "src/ngraph_encapsulate_op.cc",
        "src/ngraph_encapsulate_pass.cc",
        "src/ngraph_freshness_tracker.h",
        "src/ngraph_freshness_tracker.cc",
        "src/ngraph_graph_rewrite_passes.cc",
        "src/ngraph_liberate_pass.cc",
        "src/ngraph_op_kernels.cc",
        "src/ngraph_stub_ops.cc",
        "src/ngraph_utils.h",
        "src/ngraph_utils.cc",
        "src/ngraph_send_recv_ops.cc",
        "src/ngraph_variable_ops.cc",
        "src/tf_graphcycles.cc",
        "logging/ngraph_log.h",
        "logging/ngraph_log.cc",
        "logging/tf_graph_writer.h",
        "logging/tf_graph_writer.cc",
    ],
    hdrs = [
        "src/tf_graphcycles.h",
    ],
    deps = [
        "@org_tensorflow//tensorflow/core:protos_all_proto_text",
        "@org_tensorflow//tensorflow/core:framework_headers_lib",
        "@org_tensorflow//tensorflow/core:core_cpu_headers_lib",
        "@ngraph//:ngraph_core",
    ],
    copts = [
        "-I external/ngraph_tf/src",
        "-I external/ngraph_tf/logging",
        "-I external/ngraph/src",
        "-D NGRAPH_EMBEDDED_IN_TENSORFLOW=1",
    ],
    alwayslink = 1,
    visibility = ["//visibility:public"],
)

tf_cc_test(
    name = "ngraph_tf_tests",
    size = "small",
    srcs = [
        "test/tf_exec.cpp",
        "test/main.cpp",
    ],
    deps = [
        ":ngraph_tf",
        "@com_google_googletest//:gtest",
        "@org_tensorflow//tensorflow/cc:cc_ops",
        "@org_tensorflow//tensorflow/cc:client_session",
        "@org_tensorflow//tensorflow/core:tensorflow",
    ],
    extra_copts = [
        "-fexceptions ",
        "-D NGRAPH_EMBEDDED_IN_TENSORFLOW=1",
        "-I external/ngraph_tf/src",
        "-I external/ngraph_tf/logging",
        "-I external/ngraph/src",
    ],
)

このコード、ngraph-tf の r0.4でした。
つまり、このブログの内容です。

知らんかったわ。