ヤフーの1 on 1

今では日本でも一般的に行われている1 on 1ミーティングですが、米系IT企業のベストプラクティスのひとつを模倣するモチベーションで導入されている傾向もあって、 正直"定期的な1 on 1ミーティング"なるツールがいつ頃発明されたか、よく分かっていません。

自分の知っている範囲では1995年に出版されたHigh Output Managementで一節を割いて取り上げられている例が文献として最も古く、 シリコンバレーIT企業の第一世代のインテル社の元CEO Andrew Groveによって書かれた本なので、 個人的には、仮に、こちらを起源としています。この本では、1 on 1は企業の価値創造プロセスを円滑にする経営ツールとして取り扱われており、 スタッフ育成やチームビルディングといった現在では中心に据えられているピープルマネジメントとしての役割が非常に薄いようです。

約30年も経てばマネジメントのスタイルは変わって当然ですし、本著が書かれてから社会的に積み重ねられたノウハウもあるかと思います。 そこで、言語化された、アップデート差分を求めて本を探しています。 できれば、日本ドメスティックでない方が良いなと思っているのですが、 1冊目として、こちらの本を選びました。

ヤフーの1on1
ヤフーの1on1
  • 著者: 本間 浩輔
  • 出版社/メーカー: ダイヤモンド社
  • 発売日: 2017/3/24

本書は、どちらかというと会社の方針など何らかの外部的な理由で1 on 1を行うことを決めたけど、具体的に何をしたら良いんだろう、という方を対象にしているようでした。 現代らしく1 on 1の建て付けはコーチングや傾聴を基本にしていました。

メモ

フォーマット的なもの

  • 内容
    • コミュニケーションのやりとりに、コーチング、ティーチング、フィードバックの3種類がある
        コーチング: 成長を促す質問を投げかける
        ティーチング: 正解を教えて学んでもらう、正解の対応を即座にしてもらう
        フィードバック: 部下が自分・同僚からどう見えているか伝える
    • 部下の非言語的な表現に意識をすること
    • 自らも傾聴していることを表現する振る舞いを意識する
    • コンテンツの一例
      • 進捗(うまくいった点、いかなかった点)
      • その前回からの経験と学び
  • 終わり(Next Action)
    • ミーティングで取り上げた問題への対処は部下側に考えさせる
    • 期限を決めさせてコミットを高める (「いつまでにやろうか」)
    • 自分もアクションに関与することで実施率を高める (「手伝えることある?」)

運営的なもの

  • 水曜日午後、木曜日にやると、経験の記憶が新鮮でNext Actionが翌日から実行できる

その他

1 on 1の社内展開をどのように行っていくか、各管理職に実施を確実にしてもらうかという論点もありました。今日現在の自分の問題意識には沿わず、そこは読み飛ばし。

SQPによる非線形モデル予測制御

非線形モデル予測制御

組み込み機器向けプロセッサの高速化に伴いモデル予測制御(Model Predictive Control; MPC)を機械系のリアルタイム制御に適用する事例が見られるようになってきました。 MPCの最も簡単な問題設定は線形システムを非拘束で制御するものです。 しかしながら、この問題設定では(終端コストに特殊な条件を加えるとですが)最適制御LQRと何も変わらない結果になります[Mayne et al., 2000]。 入力制約を加えても同様です。そうなるとPID制御で良いや…まで隣合わせで、いいところを全く見せられません。

そこで非線形システムの制約付き問題にMPCを適用することを考えます。

台車型倒立振子のふり上げ

非線形制御の検証に有名な台車型倒立振子のふり上げ問題(Cart-pole swing up)を取り扱います。振り子が取り付けられた左右に移動可能な台車を左右に振って振り子を逆立ち状態に持っていく問題です。

座標の定義等

制御は台車の左右に力を加えるとして入力制限を $ \pm 10 \text{N} $ 、台車の移動量に制限を加えて制約条件とします。

[参考]Cart Pole · Chachay/ClassicGym Wiki

状態量 単位 最小値 最大値
台車位置 m -3 3
振り子角度 rad $ -2 \pi $ $ 2 \pi $
台車位置 m/s -10 10
振り子角度 rad/s -10 10

非線形最適化問題

さて、非線形MPCでも、周期ごとに最適化問題を解くという点は変わりません。台車型倒立振子の逆立ち静止状態を目標の状態 $ x_{r} $ として二次計画法問題を立てます。

\[ \begin{array}{rl} \displaystyle \min_{\hat{x}, \hat{u}} & \sum_{i=0}^{N-1}(\frac{1}{2}(\hat{x}_{k} - x_{r})^{\intercal} Q (\hat{x}_{k} - x_{r}) + \frac{1}{2}\hat{u}_{k}^{\intercal} R \hat{u}_{k}) + \frac{1}{2}(\hat{x}_{N} - x_r)^{\intercal} Q_T (\hat{x}_{N} - x_r) \\ {\rm s.t.} & \hat{x}_0 = x(0) \\ & \underline{x} \preceq \hat{x}_t \preceq \bar{x} \\ & \underline{u} \preceq \hat{u}_t \preceq \bar{u} \\ & \hat{x}_{t+1} = f(\hat{x}_t, \hat{u}_t) \\ & t \in \{0, 1, \dots, N \} \end{array} \]

この問題は台車倒立振子のシステム $ x_{t+1} = f(x_{t}, u_t) $ が非線形の制約付き非線形最適化問題であります。この問題の解を今回は逐次二次計画法(Sequential Qadratic Problem; SQP)を使って求めます。

蛇足ですが、このとき、制御周期毎の制御出力は $ \hat{u}_0 $ です。

SQPでは、解候補を与えた上でSub Problemの二次計画法(Quadraic Problem; QP)を逐次解いて求めます。イメージとしてはニュートン法に似ています。 Sub Problemは原理的には前掲のWikipedia通りラグランジアンの未定乗数を導入してやるのですが、 ヘッシアンの大胆な近似(Gauss-Newton Hessian Approximation)[Bock, 1983]を行う実装上のノウハウを組み入れ、近似解 $ \hat{x}_{k}, \hat{u}_{k} $ (初期解)に対して

\[ \begin{array}{rl} \displaystyle \min_{x,u} & \sum_{i=0}^{N-1}\frac{1}{2}(x_{k} - x_r)^{\intercal} Q (x_{k} - x_r) + \frac{1}{2}u_{k}^{\intercal} R u_{k} + (\hat{x}_{k} - x_r)^{\intercal} Q x_{k} + \hat{u}_k R u_{k} \\ & + \frac{1}{2}(x_{N} - x_r)^{\intercal} Q_T (x_{N} - x_r) + (\hat{x}_{N} - x_r)^{\intercal} Q_T x_{N}\\ {\rm s.t.} & x_0 = x(0) \\ & \underline{x} \preceq x_t \preceq \bar{x} \\ & \underline{u} \preceq u_t \preceq \bar{u} \\ & x_{t+1} = A_k x_t + B_k u_t + g_k \\ & t \in \{0, 1, \dots, N \} \end{array} \]

(ただし $ A_k, B_k, g_k $ は、$ f(x, u) $ を $ \hat{x}_k, \hat{u}_k $ 近傍で線形化した係数 )

を解くような実装を見かけます。このSub Problemの解 $ x, u $ に対して $ \hat{x} \leftarrow \alpha \hat{x} + (1 - \alpha) x, \alpha \in [0, 1] $ として解を更新します。

もう少し補足

目的関数 $ g(x) = \frac{1}{2} x^\intercal Q x $ に対して大胆に $ \nabla_{xx}^{2} \mathcal{L}(x, \lambda, \sigma) \approx \nabla_{xx}^{2} g(x) $ としてしまいましょう。すると、

\[ \begin{array}{rl} \nabla_{xx}^{2}{\mathcal {L}} &\approx (\nabla x)^\intercal Q \nabla x + x^\intercal Q \nabla^{2} x \\ & = Q \end{array} \]
推定解 $ \hat{x} $ と微小変化 $ \delta x $ に対して $ x = \hat{x} + \delta x $ とすると
\[ \begin{array}{rl} g(\hat{x}) + \frac{1}{2} (\delta x)^\intercal \nabla_{xx}^{2} \mathcal{L} \delta x &\approx \frac{1}{2} \hat{x}^\intercal Q \hat{x} + \frac{1}{2} (\delta x)^\intercal Q \delta x \\ & = \frac{1}{2} x^\intercal Q x \end{array} \]

実装例

Gistに実装例を公開しました(An example of cart pole swing up by SQP.)

最適化問題のモデリングにcvxpyを使っているのでかなり遅いですが、コードの見通しは良いと思います。

Deep Learning RTX 3060ベンチマーク

先日、eGPUを導入したので計算能力の向上幅を大づかみすることにした。

ベンチマークの前に…

計算能力の優劣はコア数や周波数による計算能力だけでなく、メモリ帯域でも決まる。これを簡単にモデル化したものをRooflineモデルと呼ぶ。 データ規模あたりの計算量で計算タスクを抽象化し(横軸)、どの程度の計算能力(縦軸)が期待できるか見積もる際、 あるいは理論上限能力値に対してどの程度性能を発揮しているか評価するときに使う。

Roofline Model
Roofline model (Source:A Survey of FPGA-Based Neural Network Accelerator)

このモデルはデータ量に対して計算量が少ないタスクではメモリ帯域が計算能力の上限を決めることを表現している。モデルを使った、より専門的な分析の事例としてはPerformance Analysis of GPU-Accelerated Applications using the Roofline ModelPerformance Tuning with the Roofline Model on GPUs and CPUsなどが参考になると思う。 これら2つは、計算機の能力がどこで頭打ちになるかデバイスの仕組みとともに解説もされている。

細かい内訳を見ればIn-Datacenter Performance Analysis of a Tensor Processing Unitで示されるようにデバイスごとにRooflineが異なり、 同じタスクでもメモリで性能が制約されたり、コアの性能を出し切ったりということもあるかと思う。

Device Roofline Model
Device Roofline Comparison (Source:In-Datacenter Performance Analysis of a Tensor Processing Unit)

しかし、Adrián Castelló et al., 2019によれば、Deep Learningの有名なネットワークは十分に「コア性能」が使い切れるように設計されているようである。

Deep Learning Model Roofline Model
Deep Learning models on Roofline (Source:Theoretical Scalability Analysis of Distributed Deep Convolutional Neural Networks)

そこで大胆な割り切りをして単純にDeep Learningモデルのトレーニング、推論にかかる単位時間を使って比較を行うことにする

(結局、余所と同じです)

機材

  • Dell Inspiron 7490 (2019)
    • Intel Core i7-10510U
    • RAM 16GB, LPDDR3, 2133MHz
    • 組込GPU: NVIDIA GeForce MX250
    • eGPU: NVIDIA GeForce RTX3060 (12GB)
      • Driver 516.94
    • Thunderbolt 3
  • Windows 11 (22622.450 ni_release)
  • Python 3.10 (Anaconda)
    • CUDA 11.3
    • Pytorch 1.12.1

ベンチマーク

こちらを使います

改めて環境の確認。両方GPUを生かしておくとクラッシュするので片方ずつ有効化する。

$ nvidia-smi --query-gpu=name,driver_version  --format=csv,noheader
NVIDIA GeForce RTX 3060, 516.94

$ python
Python 3.10.4 | packaged by conda-forge | (main, Mar 30 2022, 08:38:02) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'1.12.1'
>>> torch.version.cuda
'11.3'

GPUを切り替えると下記だけ異なる

$ nvidia-smi --query-gpu=name,driver_version  --format=csv,noheader
NVIDIA GeForce MX250, 516.94

結果

比較のため元レポのデータも抜粋した。MX250はメモリ不足でFP32の条件では動作せず、FP16も計測時間が長いのでVGG16のみ。

今回導入した3060は1080Tiにわずかに劣る性能で、Google ColabratoryのTesla T4より快適という位置づけになりそう。GPUの専有時間が心配になりませんし、NeRFなど手元で3Dをグリグリしたい用途で優位性を発揮してもらいましょう。

実行時間(ms)の測定結果
Device 出典 環境 vgg16 resnet152 densenet161
eval(ms) train(ms) eval(ms) train(ms) eval(ms) train(ms)
Titan V github PyTorch 0.3
CUDA 9
FP32
31.3 108.8 48.9 180.2 52.4 174.1
1080 Ti 同上 39.3 131.9 57.8 206.4 62.9 211.9
V100 同上 26.2 83.5 38.7 136.5 48.3 142.5
2080 Ti 同上 30.5 102.9 41.9 157.0 47.3 160.0
Tesla T4 今回計測
Colaboratory
PyTorch 1.12
CUDA 11.3
FP32
72.4 223.6 109.1 375.9 108.3 367.2
3060 今回計測 PyTorch 1.12
CUDA 11.3
FP32
45.6 146.9 69.4 273.6 78.6 293.8
3060 今回計測 PyTorch 1.12
CUDA 11.3
FP16
33.4 112.0 52.4 244.6 60.7 295.7
MX250 今回計測 PyTorch 1.12
CUDA 11.3
FP16
3,147.2 10,344.4 - - - -

考察

ある特定のタスクの結果をもって全体的な性能を示すことは難しい。しかし、個人では資金がアクセスできるデバイスの数に制限をかけることから平等条件でない指標を複数見比べながら購買計画をたてざるえないと思う。

そこで試験的にベンチ結果を推測する手立てを考えた。

理論計算能力との相関

測定した処理時間の逆数がFLOPSの次元なので逆数を取ってプロットし、GPU性能との相関を取った。GPUの性能はGPU DatabaseのFP32の性能(TFLOPS)を使った。

3060はデータバス帯域が狭いため異常値になる予感もあったが、概ねTFLOPSに比例した結果が観察され、VGG16に関しては(標本サイズからあまり意味のない数値かも知れないが) 切片=0の回帰に対して何れも$ R^2_7 = 0.984 $ である。

VGG16
VGG16ベンチマーク結果

Deep Learningの著名モデルを扱う前提であればFP32を指標にGPUの買い替えや買い増しを検討することはあながち間違いではなさそうである。

3Dベンチマークとの相関

理論計算能力値で心配な場合は3Dゲームのベンチマーク結果が実践値という意味で利用可能かもしれない。データソースとしても潤沢でGeForceならばまず数値が見つけられるはず。

結論だけ報告すると、こちらもベンチマークスコアと概ね相関を取れたが、Tesla系列のデータがあるわけもなくGoogle Colaboratoryとの比較などといった実用面の観点から企画倒れであった。

参考