標籤:

劉光聰 | TensorFlow:揭示多語言編程的奧秘

Client是TensorFlow系統中的重要組件。Client負責計算圖的構造,並通過Session為橋樑,連接TensorFlow後端的「運行時」,啟動計算圖的執行過程。

TensorFlow的前端是一個支持多語言的編程環境,支持Client使用多語言構造計算圖。本文通過Session創建過程為例,揭示前端Python與後端C/C++系統實現的通道。

系統架構

TensorFlow的系統結構以C API為界,將整個系統分為「前端」和「後端」兩個子系統:

  • 前端系統:提供編程模型,負責構造計算圖;
  • 後端系統:提供運行時環境,負責執行計算圖。

系統架構

Swig:幕後英雄

TensorFlow使用Bazel的構建工具,在編譯之前啟動Swig的代碼生成過程。首先,Swig通過tf_session.i自動生成了兩個文件:

  • pywrap_tensorflow.py: 負責對接上層Python調用;
  • pywrap_tensorflow.cpp: 負責對接下層C實現。

此外,pywrap_tensorflow.py模塊首次被載入時,自動地載入_pywrap_tensorflow.so的動態鏈接庫。從而實現了pywrap_tensorflow.py到pywrap_tensorflow.cpp的函數調用關係。

在pywrap_tensorflow.cpp的實現中,靜態註冊了一個函數符號表。在運行時,按照Python的函數名稱,匹配找到對應的C函數實現,最終轉調到c_api.c的具體實現。

Swig代碼生成器

編程介面:Python

當Client要啟動計算圖的執行過程時,先創建了一個Session實例,進而調用父類BaseSession的構造函數。

# tensorflow/python/client/session.py class Session(BaseSession): def __init__(self, target=, graph=None, config=None): super(Session, self).__init__(target, graph, config=config) # ignoring othersnn在BaseSession的構造函數中,將調用pywrap_tensorflow模塊中的函數。其中,pywrap_tensorflow模塊自動由Swig生成。nn# tensorflow/python/client/session.pynfrom tensorflow.python import pywrap_tensorflow as tf_sessionnclass BaseSession(SessionInterface): def __init__(self, target=, graph=None, config=None): self._session = None opts = tf_session.TF_NewSessionOptions(target=self._target, config=config)n try:n with errors.raise_exception_on_not_ok_status() as status: self._session = tf_session.TF_NewDeprecatedSession(opts, status)n finally: tf_session.TF_DeleteSessionOptions(opts)nn # ignoring othersn

生成代碼

在pywrap_tensorflow模塊中,通過_pywrap_tensorflow將在_pywrap_tensorflow.so中調用對應的C++函數實現。

# tensorflow/bazel-bin/tensorflow/python/pywrap_tensorflow.pynndef TF_NewDeprecatedSession(arg1, status):nreturn _pywrap_tensorflow.TF_NewDeprecatedSession(arg1, status)nn在pywrap_tensorflow.cpp的具體實現中,它靜態註冊了函數調用的符號表,實現Python的函數名稱到C++實現函數的具體映射。nn// tensorflow/bazel-bin/tensorflow/python/pywrap_tensorflow.cppnstatic PyMethodDef SwigMethods[] = { ... {"TF_NewDeprecatedSession", _wrap_TF_NewDeprecatedSession, METH_VARARGS, NULL}, } PyObject *_wrap_TF_NewDeprecatedSession( PyObject *self, PyObject *args) { TF_SessionOptions* arg1 = ... TF_Status* arg2 = ... TF_DeprecatedSession* result = TF_NewDeprecatedSession(arg1, arg2);n // ignoring others implementsnn}n

最終,自動生成的pywrap_tensorflow.cpp僅僅負責函數調用的轉發,最終將調用底層C系統向上提供的API介面。

CAPI

c_api.h是TensorFlow的後端執行系統面向前端開放的公共API介面之一,自此將進入TensorFlow後端系統的浩瀚天空。

// tensorflow/c/c_api.c TF_DeprecatedSession* TF_NewDeprecatedSession( const TF_SessionOptions*, TF_Status* status) { Session* session; status->status = NewSession(opt->options, &session); if (status->status.ok()) { return new TF_DeprecatedSession({session}); } else { return NULL; } }n

查閱更為簡潔方便的分類文章以及最新的課程、產品信息,請移步至全新呈現的「LeadAI學院官網」:

leadai.org

請關注人工智慧LeadAI公眾號,查看更多專業文章


推薦閱讀:

學習tensorflow庫
anaconda安裝tensorflow,在import tensorflow時報錯,要怎麼解決?
從Google離職後,她開發了CastBox再次征服Google獲2017卓越應用獎!
IOS平台TensorFlow實踐
My solutions for `Google TensorFlow Speech Recognition Challenge`

TAG:TensorFlow |