Skip to content

Instantly share code, notes, and snippets.

@pochi
Created April 6, 2018 04:52
Show Gist options
  • Save pochi/ff88d47fdfa86d3bb64f514856f75372 to your computer and use it in GitHub Desktop.
Save pochi/ff88d47fdfa86d3bb64f514856f75372 to your computer and use it in GitHub Desktop.

ディレクトリ構成

tensorflow_serving以下にソースが配置されている

  • core
    • サーバコア部分
    • Policy部分の設定はavailability_preserving_policy.hを見て欲しいとのこと
  • batching
    • バッチ処理
  • g3doc
    • ドキュメント
  • servables
    • 変数
  • sources
    • ファイルシステムとの接続
  • tools
    • ツール
  • apis
    • 提供API
    • gRPCサーバの実装はprediction_service.protoにあるらしい
  • config
    • 設定ファイル群
  • example
  • model_servers
    • サーバコア部分
  • resources
    • ??
  • test_util
    • テスト周り
  • util
    • 便利ツール

モデルのバージョンはディレクトリ構造を意識している。例えば/tmp/my_model/123となっている場合base_pathは/tmp/my_model,バージョンは123となる。 バッチを許容するときは--enable_batchingを有効にする

model_servers/main.cc#main()

ここのmain関数でRunServerを実行してサーバを立ち上げる。 立ち上げるまでは以下のようなフローで実行する。

  • portは8500を利用する
  • バッチ機能は使わない
  • プロセス毎にGPUメモリの負荷を行う
  • use_saved_modelはデフォルトtrueになっている、動的にもモデルを読み込みやすそう?
  • tensorflow_session_parallelismが0になっているときはthread poolを自動で設定する、チューニングポイントになりそう
  • 引数設定を考える
    • ポートの指定(port)
    • バッチを利用するかどうかの指定(enable_batching)
    • バッチ設定ファイル(batch_parameters_file)
    • モデル設定ファイル(model_config_file)
    • モデル名(model_name)
    • モデルのベースパス(model_base_path)
    • 新しいモデルバージョンを確認する間隔(file_system_poll_wait_seconds)
    • ファイルシステムのキャッシュを最初にservableを読み込んだ後に削除する、これによってモデルサーバのキャッシュを減らすことができる(flush_filesystem_caches)
    • 一つのtensorflow sessionで利用できるthreadの数を指定する,platform_config_fileが指定されているとそちらを優先する(platform_config_file)
    • 1プロセスあたりのGPUメモリ利用率の調整を行う(per_process_gpu_memory_fraction)
    • メタ情報として登録しているタグ名の指定ができる(saved_model_tags)
    • grpc周りの設定を行う、例えばgrpc.max_connection_age_ms=2000(grpc_channel_arguments)
  • デフォルトのモデル設定はBUildSingleModelConfigが呼ばれる
    • tensorflow::serving::ModelConfigを新たに作ってモデル名とモデルのベースパスをセットする
    • ModelConfigはproto形式で記述されておりconfig/model_server_config.protoの中に入っている
      • 1: 名前
      • 2: ベースパス
      • 3: モデルタイプ -> deprecated to model_platform
      • 4: モデルのプラットフォーム
      • 5: 予約
      • 6: ログ設定
      • 7: モデルのバージョンポリシー
    • カスタムできるのはログ設定とモデルのバージョンポリシーになりそう
  • プラットフォームの設定ファイルを指定する
    • バッチファイルの指定
    • GPUのオプション指定、プロセスごとのメモリ制限
    • 内部の並列スレッド設定
    • 外部の並列スレッド設定
  • オプションの設定
    • カスタムモデル設定
    • バージョンポリシー設定
    • ファイルシステムの更新設定
    • ファイルシステムのflushの設定
  • 今までの設定周りは全てoptionsという変数に押し込まれる
  • サーバ設定チェックをとおこなう
  • RunServerでサーバを実行する

model_servers/main.cc#RunServer()

  • ServerBuilderを利用してサーバ設定を行う
    • アドレスとポートを設定して(AddListeningPort)
    • モデルサービスを登録して(RegisterService(ModelServiceImpl))
    • 推論サービスを登録して(RegisterService(PredictionServerImpl))
    • マックスメッセージサイズを指定する
    • Channel設定をして
    • サーバを起動 -> Wait状態にする

この登録サービスを一つずつ見ていく

model_servers/model_service_impl.cc

  • GetModelStatusはgRPCのステータスをみるやつ
  • HandleReloadConfigRequestは設定ファイルの動的読み替え
  • 要はモデル管理するためのサービスの模様

model_servers/model_service_impl.cc#PredictionServiceImpl#PredictionService

  • 推論サービス(grpc::Status Predict)
  • モデルのメタデータ取得(grpc::Status GeteModelMetadata)
  • 分類API(grpc::Status Classify)
  • 回帰API(gprc::Status Regress)
  • MultiInference...? 上記のサービスを呼び出すときはtensorflow::RunOptionsを共通的に呼び出している。 RunOptionはTensorFlowに依存している。

tensorflow/tensorflow/core/protobuf/config.proto

TensorFlow実行時のオプションをいろいろ指定できる。

  • GPUオプション
    • GPUのメモリプールの設定(per_process_gpu_memory_fraction): プロセスあたりのGPUメモリ利用量
    • GPUメモリアロケート時の処理(allocator_type): default(システムデフォルト) or "BFC"アルゴリズム
    • deferred_deletion_bytes
    • GPUメモリ利用アプローチ(allow_growth): 最初から必要な分確保するのか少しずつ必要な分確保するようにするのか
    • 物理GPUから仮想GPUへの紐付け(visible_device_list)
    • ポーリング間隔(polling_active_delay_usecs): キューが空じゃない時に定期間隔で取得しに行くもの
    • oポーリング間隔(polling_active_delay_usecs): キューが空の時に定期間隔で取得しに行くもの
    • GPU強制サポート: CPU tensorで処理が終わらない時に強制的にGPUを使うようにしてしまうもの、大きすぎるモデルのみを対象とする
  • 最適化オプション
    • グラフ内の共通オプションを削除(do_common_subexpression_elimination)
    • 定数の畳み込みを行うかどうか(do_constant_folding)
    • グラフの中に関数を入れ込むかどうか(do_function_inlining)
    • JITの設定レベル(GlobalJitLevel)
  • グラフオプション
    • 受信ノードの活性化するスケジューラとしてcontrol flowを利用するかどうか(enable_recv_scheduling)
    • グラフ最適化オプション(optimizer_options)
    • コストモデルのアップデートを行う間隔(build_cost_model)
    • コストモデルの統計をとり始めるステップ数(build_cost_model_after)
    • それぞれのOpに対しての出力Shapeを返すかどうか(inferred_shapes)
    • デバックノード設定(place_pruned_graph)
    • floatをbfloatとして扱うかどうか(enable_bfloat16_sendrecv)
    • グラフを再描画するための量とタイプを管理する
  • スレッドプールオプション
    • スレッドプールの数
  • RPCオプション
    • クライアント-マスター間の通信をRPCを常に使うか最適化された手法を利用するか(use_rpc_for_inprocess_master)
  • Session設定
    • CPUやGPUを利用するデバイス数(device<name, 数>のmapで指定)
    • 並列化できるオペレーションの並列化数(intra_op_parallelism_threads)
    • 各プロセス内で並行して実行可能な並列オペレーション数(inter_op_parallelism_threads) => 要実装確認
    • ダイレクトセッション上で利用されるセッション内で利用可能なプロセス数(use_per_session_threads)
    • セッション内でバックグラウンドにある小さい限られたスレッドプールを利用したい時に確保するプール数(session_inter_op_thread_pool) => 要実装確認
    • Nodeを物理デバイスにひもづける際に再計算する間隔(placement_period)
    • 利用しないデバイスを指定(device_filters)
    • GPUに対する共通設定(gpu_options)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment