たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

AC6考察: ゴースト(所属不明機体)

オールマインドが派遣しているステルス機体「ゴースト」。
「所属不明機体」として作中に多数出現し、ミッション『ザイレム制御修正』にてオールマインドの管理下と明かされる。

単なる敵としてではなく、情報ログを抱えた期待残骸などの形でも登場。
オールマインドがルビコン3で活動するための手足として暗躍していたと考えられる。

MDD方式とやらで機能している(ステルスの方式?通信の方式?)

カーラは『機密情報漏洩阻止』で「見覚えがある」「調べておく必要がある」と発言。これがのちの『ザイレム制御修正』に影響?

出現ミッション/場所/状態

  • 『グリッド135掃討』不時着地点、敵対。近くにはMTの残骸が3つ
  • 『BAWS第2工廠調査』各所、敵対。近距離型と遠距離型がいる
  • 『ウォッチポイント襲撃』ビル頂上、残骸。情報ログ『観測データ:変異波形反応』を抱えている
  • 『機密情報漏洩阻止』屋外、敵対。遠近両タイプ
  • 無人洋上都市調査』ドローン落下地点、敵対。惑星封鎖機構とオールマインドの両方が攻撃してくる珍しいミッション
  • 『ザイレム制御修正』各所、敵対。カーラの制御下にあり、撃破すると収集していたパラサイトモジュールTGT情報を出す

双子の自信 - 他人の言葉 & 自分の実績

自信は全てに通ずる。
自信の源となる双子のアイテムを欠かしてはいけない。

他人の言葉

「肯定してくれる他人」とその人の言葉。
根拠が無くても他人が言ってくれればそう思える。
根拠のない自信を与えてくれる他人が自分の根っこにあるといい。

自分の実績

実績は全てを解決する。
実際に過去の自分が結果を残した証が「実績」なのだから、自分を証明する厳然たる事実として実績は自信を与えてくれる。
実績を積む、実績を覚えておく、実績を正しく評価する、が大事。

双子の自信

他人の言葉 & 自分の実績は片方だとダメ。

他人の言葉だけだとモンスター化しかねない。
全肯定の囲みを侍らせていたら能力無でも自信だけ増長してしまう。
結局何にも繋がらない自信だけになってしまう。

自分の実績だけだと鶏卵になる。
実績を積むには自信が必要だが、自信を得るためにはそもそも実績が必要。となって詰む。
分野変更すると実績リセットされるので、実績だけに頼るタイプの人は大胆な新挑戦が出来なくなる。

だから最初の自走に必要な自信を他人の言葉から貰い、これを最初の燃料にして自分の実績を積みあげ、根拠ある自信を付けていく。

PyTorch AMP対応演算子

FP16へ autocast されるCUDA Ops:

  • Conv系
    • Conv系
      • conv1d
      • conv2d
      • conv3d
    • ConvT系
      • conv_transpose1d
      • conv_transpose2d
      • conv_transpose3d
  • RNN系
    • RNNCell
    • LSTMCell
    • GRUCell
  • Linear系
    • linear
    • matmul
    • __matmul__
    • chain_matmul
    • baddbmm
    • addbmm
    • addmm
    • addmv
    • addr
    • bmm
    • mm
    • mv
    • multi_dot
  • Activation系
    • prelu

PyTorchの `Tensor.to`

キャストとデータ転送を担う関数。

device で転送先デバイスdtype で変換型を指定。既存Tensorを渡してそのdeviceとdtypeを参照させることも可能。
オプションは3つ:

  • non_blocking: 非同期のデータ転送
  • copy: キャスト/転送が実現済みが否かに関わらず新規Tensorを生成
  • memory_format: ?

PyTorchのプロファイラ

PyTorch Lightning:

Class device unit internal
SimpleProfiler L's action
PyTorchProfiler PyTorch’s Autograd Profiler
AdvancedProfiler
XLAProfiler TPU
(PassThroughProfiler) any (default) Just pass-through, do nothing

SimpleProfilerとDataLoader

データロードの経過時間は _TrainingEpochLoop.train_dataloader_next アクションとして記録される。
worker有りのDataLoaderはprefetchをするため、理想的にはこのアクションがほぼ0になる。
ここが非ゼロということはデータ供給が追い付いていないことを意味する。

Trainerの奥深くにしまい込まれており、実装の理解は面倒。
call関係は以下になっており、Trainer.fitの前処理でprofilerがフックされている。

<Trainer>.__init__(...):
    self.fit_loop = _FitLoop(...)

<Trainer>.fit(...):
    call._call_and_handle_interrupt(self._fit_impl, ...)

<Trainer>._fit_impl(...):
    self._run(model, ...)

<Trainer>._run(model, ...):
    results = self._run_stage()

<Trainer>._run_stage():
    self.fit_loop.run()


<_FitLoop>.__init__(...):
    self.epoch_loop = _TrainingEpochLoop(trainer)

<_FitLoop>.run():
    while not self.done:
        self.advance()

<_FitLoop>.advance():
    self.epoch_loop.run(self._data_fetcher)


<_TrainingEpochLoop>.run(data_fetcher):
    self.on_run_start(data_fetcher)
    while not self.done:
        self.advance(data_fetcher)

<_TrainingEpochLoop>.on_run_start(data_fetcher):
    data_fetcher._start_profiler = self._on_before_fetch
    data_fetcher._stop_profiler  = self._on_after_fetch
<_TrainingEpochLoop>._on_before_fetch():
    self.trainer.profiler.start(f"[{self.__class__.__name__}].train_dataloader_next")
<_TrainingEpochLoop>._on_after_fetch():
    self.trainer.profiler.stop(f"[{self.__class__.__name__}].train_dataloader_next")

<_TrainingEpochLoop>.advance(data_fetcher):
    next(data_fetcher)


<_DataFetcher>.__next__():
    self._start_profiler()
    data = next(self.iterator)
    self._stop_profiler()
    return data

<_PrefetchDataFetcher>.__next__():
    batch = self.batches.pop(0)
    self._fetch_next_batch(self.iterator)
    return batch

<_PrefetchDataFetcher>._fetch_next_batch(iterator):
    self._start_profiler()
    batch = next(iterator)
    self._stop_profiler()
    self.batches.append(batch)

_data_fetcherの初期化に関して:

<_FitLoop>.__init__(...):
    self._combined_loader = None
    self._data_fetcher = None

<_FitLoop>.run():
    self.setup_data()
    self.reset()
    self.on_run_start()
    while not self.done:
        self.on_advance_start()
        self.advance()
        self.on_advance_end()
    self.on_run_end()

<_FitLoop>.on_run_start():
    self._data_fetcher = _select_data_fetcher(trainer)

<_FitLoop>.advance():
    combined_loader = self._combined_loader
    self._data_fetcher.setup(combined_loader)
    self.epoch_loop.run(self._data_fetcher)


def _select_data_fetcher(trainer) -> _DataFetcher:
    lightning_module = trainer.lightning_module
    if trainer.testing:
        step_fx_name = "test_step"
    elif trainer.training:
        step_fx_name = "training_step"
    elif trainer.validating or trainer.sanity_checking:
        step_fx_name = "validation_step"
    elif trainer.predicting:
        step_fx_name = "predict_step"
    else:
        raise RuntimeError(f"DataFetcher is unsupported for {trainer.state.stage}")
    step_fx = getattr(lightning_module, step_fx_name)
    if is_param_in_hook_signature(step_fx, "dataloader_iter", explicit=True):
        rank_zero_warn(
            f"Found `dataloader_iter` argument in the `{step_fx_name}`. Note that the support for "
            "this signature is experimental and the behavior is subject to change."
        )
        return _DataLoaderIterDataFetcher()
    return _PrefetchDataFetcher()

成果に拘るなら評価に拘れ

出力 (output) でなく成果 (outcome) に拘る姿勢。
これを取るなら、出力が成果に繋がっていることが必須条件。
これを確かめるのが「評価」の段階。
だから評価方法とタイミングを事前にしっかりと構想しておくことは必須。
これをしていないということは成果でなく出力に拘っているのと同義。
成果に拘るなら評価に拘れ。