This page was translated by the Cloud Translation API.
Switch to English

এওটি সংকলন ব্যবহার করা হচ্ছে

Tfcompile কি?

tfcompile হ'ল একক সরঞ্জাম যা সামনের সময়ের (এওটি) টেনসরফ্লো গ্রাফগুলি সম্পাদনযোগ্য কোডে সংকলন করে। এটি মোট বাইনারি আকার হ্রাস করতে পারে এবং কিছু রানটাইম ওভারহেডও এড়াতে পারে। tfcompile একটি সাধারণ ব্যবহারের tfcompile হল মোবাইল ডিভাইসের জন্য এক্সিকিউটেবল কোডে একটি অনুমিতি গ্রাফ সংকলন করা।

টেনসরফ্লো গ্রাফটি সাধারণত টেনসরফ্লো রানটাইম দ্বারা সম্পাদিত হয়। গ্রাফের প্রতিটি নোড কার্যকর করার জন্য এটি কিছু রানটাইম ওভারহেড অনুগ্রহ করে। এটি গ্রাফের পাশাপাশি টেনসরফ্লো রানটাইমের কোডও উপলব্ধ হওয়া দরকার বলে এটি বৃহত্তর মোট বাইনারি আকারের দিকে নিয়ে যায়। tfcompile দ্বারা উত্পাদিত এক্সিকিউটেবল কোড tfcompile রানটাইম ব্যবহার করে না, এবং কেবল কার্নেলের উপর নির্ভরশীলতা রয়েছে যা প্রকৃতপক্ষে tfcompile ব্যবহৃত হয়।

সংকলকটি এক্সএলএ কাঠামোর উপরে নির্মিত হয়েছে। এক্সএলএ কাঠামোতে টেনসরফ্লো ব্রিজিং কোডটি টেনসরফ্লো / সংকলকের অধীনে থাকে।

Tfcompile কি করে?

tfcompile একটি সাবগ্রাফ নেয়, ফিডস এবং tfcompile ধারণাগুলি দ্বারা চিহ্নিত এবং একটি ফাংশন জেনারেট করে যা সেই অনুচ্ছেদটি কার্যকর করে। feeds fetches ফাংশনটির জন্য ইনপুট আর্গুমেন্ট এবং আনতে ফাংশনটির আউটপুট আর্গুমেন্ট। সমস্ত ইনপুটগুলি অবশ্যই ফিড দ্বারা নির্দিষ্টভাবে নির্দিষ্ট করা উচিত; ফলস্বরূপ ছাঁটাই করা অনুচ্ছেদে স্থানধারক বা পরিবর্তনশীল নোড থাকতে পারে না। সমস্ত স্থানধারক এবং ভেরিয়েবলগুলি ফিড হিসাবে নির্দিষ্ট করা সাধারণ, যা নিশ্চিত করে যে ফলস্বরূপ সাবগ্রাফার মধ্যে আর এই নোড নেই। উত্পন্ন ফাংশনটি একটি cc_library হিসাবে প্যাকেজ করা হয়, ফাংশনটির স্বাক্ষর রফতানি করে একটি cc_library ফাইল এবং বাস্তবায়ন সম্বলিত একটি অবজেক্ট ফাইল। ব্যবহারকারী উত্পন্ন ফাংশন যথাযথভাবে অনুরোধ করার জন্য কোড লিখেছেন।

Tfcompile ব্যবহার করে

এই বিভাগটি একটি tfcompile সাবগ্রাফ থেকে tfcompile সহ একটি এক্সিকিউটেবল বাইনারি তৈরির জন্য উচ্চ স্তরের পদক্ষেপের বিবরণ দেয়। পদক্ষেপগুলি হ'ল:

  • পদক্ষেপ 1: সংকলন করতে সাবগ্রাফটি কনফিগার করুন
  • পদক্ষেপ 2: tf_library সংকলন করতে tf_library বিল্ড ম্যাক্রো ব্যবহার করুন
  • পদক্ষেপ 3: উপগ্রহ শুরু করার জন্য কোড লিখুন
  • পদক্ষেপ 4: চূড়ান্ত বাইনারি তৈরি করুন

পদক্ষেপ 1: সংকলন করতে সাবগ্রাফারটি কনফিগার করুন

উত্পন্ন ফাংশনটির জন্য ইনপুট এবং আউটপুট আর্গুমেন্টের সাথে মিলিত ফিড এবং ফেচগুলি সনাক্ত করুন। তারপর কনফিগার feeds এবং fetches একটি tensorflow.tf2xla.Config প্রোটো।

 # 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" }
}
 

পদক্ষেপ 2: উপগ্রহটি সংকলন করতে tf_library বিল্ড ম্যাক্রো ব্যবহার করুন

এই পদক্ষেপটি tf_library বিল্ড ম্যাক্রো ব্যবহার করে tf_library cc_library রূপান্তরিত করে। cc_library গ্রাফ থেকে উত্পন্ন cc_library একটি অবজেক্ট ফাইল থাকে এবং একটি শিরোনাম ফাইল যা উত্পন্ন cc_library অ্যাক্সেস দেয়। tf_library tfcompile গ্রাফকে এক্সিকিউটেবল কোডে সংকলন করতে tf_library ব্যবহার করে।

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

এই উদাহরণে, চালানোর জন্য GraphDef প্রোটো (test_graph_tfmatmul.pb) নির্মাণ করতে make_test_graphs.py এবং --out_dir পতাকা দিয়ে আউটপুট অবস্থান উল্লেখ করুন।

সাধারণ গ্রাফগুলিতে Variables প্রশিক্ষণের মাধ্যমে যে tfcompile তা tfcompile তবে tfcompile Variables এমন একটি tfcompile সংকলন করতে পারে না। ফ্রিজ_গ্রাফ.পি সরঞ্জামটি চেকপয়েন্ট ফাইলটিতে সঞ্চিত মান ব্যবহার করে ভেরিয়েবলগুলিকে স্থিরস্থানে রূপান্তর করে। সুবিধার্থ হিসাবে, tf_library ম্যাক্রো freeze_checkpoint যুক্তি সমর্থন করে, যা সরঞ্জামটি চালায়। আরও উদাহরণের জন্য টেনসরফ্লো / সংকলক / আওট / পরীক্ষা / বিল্ড দেখুন

সংকলিত সাবগ্রাফ্টে প্রদর্শিত কনস্ট্যান্টগুলি সরাসরি উত্পন্ন কোডে সংকলিত হয়। ধ্রুবকগুলিকে সংকলিত হওয়ার পরিবর্তে উত্পন্ন ফাংশনে পাস করার জন্য কেবল তাদের ফিড হিসাবে প্রবেশ করুন।

tf_library বিল্ড ম্যাক্রো সম্পর্কে বিশদ জানতে tfcompile.bzl দেখুন

অন্তর্নিহিত tfcompile সরঞ্জাম সম্পর্কে বিশদ জানতে tfcompile_main.cc দেখুন

পদক্ষেপ 3: উপগ্রহ শুরু করার জন্য কোড লিখুন code

এই পদক্ষেপটি উত্পন্ন tf_library শুরু করতে পূর্ববর্তী ধাপে tf_library বিল্ড ম্যাক্রোর দ্বারা উত্পাদিত শিরোলেখ ফাইলটি ( test_graph_tfmatmul.h ) ব্যবহার করে। শিরোনাম ফাইলটি বিল্ড প্যাকেজটির সাথে সম্পর্কিত bazel-bin ডিরেক্টরিতে অবস্থিত এবং tf_library বিল্ড ম্যাক্রোতে সেট নামের নামটির উপর ভিত্তি করে নামকরণ করা হয়েছে। উদাহরণস্বরূপ, test_graph_tfmatmul জন্য উত্পন্ন test_graph_tfmatmul হবে test_graph_tfmatmul.h । নীচে কী উত্পন্ন হয় তার সংক্ষিপ্ত সংস্করণ দেওয়া আছে। bazel-bin উত্পন্ন ফাইলটিতে অতিরিক্ত দরকারী মন্তব্য রয়েছে।

 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
 

উত্পন্ন সি ++ শ্রেণিকে foo::bar নেমস্পেসে MatMulComp বলা হয়, কারণ এটি tf_library ম্যাক্রোতে উল্লিখিত cpp_class ছিল। সমস্ত উত্পন্ন ক্লাসগুলির মধ্যে একই রকমের এপিআই থাকে, কেবল পার্থক্য এবং ফলাফল বাফারগুলি হ্যান্ডেল করার পদ্ধতিগুলির মধ্যে পার্থক্য রয়েছে। সেই পদ্ধতি নম্বর এবং বাফার, যা দ্বারা নির্দিষ্ট করা হয়েছে ধরনের উপর ভিত্তি করে ভিন্ন feed এবং fetch আর্গুমেন্ট tf_library ম্যাক্রো।

উত্পন্ন শ্রেণীর মধ্যে তিন ধরণের বাফার পরিচালনা করা হয়: ইনপুটগুলিকে উপস্থাপন করে args , results উপস্থাপন করে results এবং অস্থায়ী বাফারগুলির প্রতিনিধিত্বকারী temps গণনা সম্পাদনের জন্য অভ্যন্তরীণভাবে ব্যবহৃত হয়। ডিফল্টরূপে, উত্পন্ন শ্রেণীর প্রতিটি উদাহরণ আপনার জন্য এই সমস্ত বাফার বরাদ্দ করে এবং পরিচালনা করে। এই আচরণ পরিবর্তন করতে AllocMode নির্মাণকারী যুক্তি ব্যবহার করা যেতে পারে। সমস্ত বাফারগুলি 64-বাইট সীমানায় সংযুক্ত থাকে।

উত্পন্ন সি ++ শ্রেণিটি এক্সএলএ দ্বারা উত্পাদিত নিম্ন-স্তরের কোডের চারদিকে কেবল একটি মোড়ক।

tfcompile_test.cc উপর ভিত্তি করে উত্পন্ন ফাংশনটি 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: চূড়ান্ত বাইনারি তৈরি করুন

এই পদক্ষেপটি চূড়ান্ত বাইনারি তৈরি করতে tf_library দ্বারা উত্পন্ন লাইব্রেরিটি পদক্ষেপ 2 এবং 3 ধাপে লিখিত tf_library একত্রিত করে। নীচে bazel বিল্ড ফাইলের একটি উদাহরণ দেওয়া আছে।

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