マーチンゲール・ココモ法・ダランベールは無意味
マーチンゲール・ココモ法・ダランベールのようなベッティングシステムはすべて無意味である。なぜなら、ベッティングシステムはゲームの期待値に影響を与えないからだ。
勝率が 50% でリターンが2倍であるゲームを考える。掛け金を b とすると、そのリターンの期待値は
Textual Inversion の使い方
目次
Waifu Diffusion で効率的に画像を生成する
プロンプトリストはプロンプトやよく検索されているプロンプト(R18)、danbooru タグ検索を参照。
目次
Blender の輪郭抽出技法まとめ
目次
- ディスプレイスモディフィア
- ベベルモディフィア
- 辺分離モディフィア
- コンポジター
- レンダラー依存
分散の使い分け
分散には母分散と標本分散と標本不偏分散とがあるが、計算可能なのは標本分散と標本不偏分散とだ。データの要約が目的の場合は標本分散を使い、母分散の推定や仮説検定を行う場合は標本不偏分散を使う。
Blender 用の PC スペックについて
Blender 用の PC で一番重要なのはメモリ容量で、その次が CPU や GPU 性能だ。なぜならメモリ容量が不足する場合、できない作業があるからだ。CPU(GPU)性能は作業速度に影響を与えるだけで、CPU(GPU)性能が低いからできない作業はほとんどない。
Blender では以下の作業がボトルネックになりやすい。
CPU ボトルネック
- ハイポリゴンモデリング
- スカルプト
- アニメーション・リギング
- 物理シミュレーション
GPU ボトルネック
- レンダリング
- ビューポート操作
CPU や GPU のレンダリング速度は Blender Open Data が参考になる。
メモリ容量
Blender でリバースフットリグを組む
目次
概要
リバースフットリグは脚を IK で操作しているときにつま先立ちができるようにするリグだ。
通常の足のボーン構造はルートからつま先へ向かう。このボーン構造では爪先立ちが作りづらい。そこで足のボーンの向きを反転することで、IK 時につま先立ちが作れるようになる。
足の回転軸となるボーンの親子構造がデフォーム用ボーンのそれと逆向きになっていることから、このリグ Reverse Foot Rig と呼ばれる。
FK が不要な場合はこの構造のままウェイトをつけられる。FK が必要な場合は、IKFK 切り替えスイッチを使うか、IK 後に FK で調整できるリグを使う。
ウェイトを付けたボーンを変更せず、FK も必要な場合は FK ボーンの上にリグを組み、IKFK 切り替えスイッチを追加する。
CUDA 用語のまとめ
CUDA は1コア1スレッドごとに制御できない。Streaming Multiprocessor に対し Thread Block を割り付けるのが制御の最小単位だ。GPU のドライバは Thread Block を Warp に分割し、Warp のスレッドを CUDA Core 割り付け、実行する。なのでスレッドブロックと Warp との対応を理解していないと思った通りのパフォーマンスが出せない。
ハードウェアの概念
CUDA Core
Streaming Processor と呼ばれることもある。スレッドを実行する。明示的なスレッド割り付け制御はできない。
Streaming Multiprocessor(SM)
CUDA Core をまとめたもの。SM 内に CUDA Core がいくつあるかは GPU によって異なる。
SM には制約がある。Ada Lovelace 世代では以下の2つの制約がある。
- キューイングできる Warp 数の上限が 48(1Warp あたり 32 スレッド)
- 割り付けられる Thread Block 数の上限が 24
SM のリソースに余裕があれば、複数の Thread Block を同時に実行できる。上記の場合、Thread Block のスレッド数が 768 の Thread Block は2つ同時に実行できる。Thread Block は全てのスレッドの実行が完了するまでリソースを解放しないことに注意が必要。
Warp
スレッドをまとめたもの。1Warp = 32 スレッド。
Warp 内のスレッドは同じ命令を実行する。しかし CUDA Core ごとに命令カウンタとレジスタステートを保持しているので分岐実行が可能。ただし Warp 内で同じ命令を実行する必要があるため、分岐実行は以下のようになる。
- 片方のパスを実行している間、もう片方のパスのスレッドを停止させる
- 実行したパスのスレッドを停止させ、停止させていた方のスレッドを実行する
- 停止していたスレッドを起こして、実行を再開する
Occupancy
Warp で測った SM の使用率。たとえば Ada Lovelace 世代では 48 Warp キューイングできる。このとき 192 スレッドの Thread Block を8個 SM に割り付けると、1,536 / 32 = 48 で Occupancy は 100% になる。Ada Lovelace 世代では割り付けられる Thread Block 数の上限が 24なので、48 スレッドの Thread Block を 32 個割り付けることはできない。余った Thread Block は別の SM に割り付けられる。24 の Thread Block を割り付けた SM の Occupancy は 75% になる。
Occupancy は 100% にすれば速いわけではない。たいていの GPU で Occupancy 50% 程度でスループットが頭打ちになる。これはレジスタが不足するために起こる。
ソフトウェアの概念
Kernel
CUDA Core で実行する関数。
Thread Block
単一 SM 上で実行されるスレッドをまとめたもの。上限はデバイスごとに異なり、512・1,024・2,048スレッド。Thread Block はほかの Thread Block と独立している必要がある。なので Thread Block を跨いだ処理はできない。
Thread Block のスレッド数が Warp のスレッド単位で割り切れない場合は、何もしないスレッドを割り付けて数を調整する。
Thread Block あたりのスレッド数は大きい方がいい。
Thread Block あたりのスレッド数が 64 の倍数の時、最も効率的になる。
Grid
Thread Block をまとめたもの。Global Memory を経由してほかの Grid の計算結果を参照する場合は、Grid 単位に行う必要がある。
メモリ
Register
スレッドごとに割り当てられる、コンパイラが管理するレジスタ。
Ada Lovelace 世代では以下のようなスペックになっている。
- SM ごとに、ファイルサイズ 64K 32-bit
- 各スレッドの最大レジスタ数は 255
Thread Block あたりのスレッド数が 64 の倍数の時、最も効率的になる。
Local Storage
スレッドごとに割り当てられる、コンパイラが管理するメモリ。レジスタが不足する場合に使われる。DRAM 上に配置されるため、レイテンシは大きく、スループットも低い。
Shared Memory
スレッドブロックごとに割り当てられる。レイテンシは小さく(数サイクル)、スループットが大きい。
Ada Lovelace 世代では以下のようなスペックになっている。
- SM ごとに 100KB
- Thread Block あたりの最大割り付け量は 99KB
Global Memory(GDDR や HBM)
CPU や全スレッドからアクセス可能。レイテンシは大きく、スループットも低い。
外部リンク
NVIDIA GPU の構造と CUDA スレッディングモデル
Using CUDA Warp-Level Primitives
ガチャの確率計算
計算器はこちら。
目次
当選確率 1% のガチャを 100 回やったときに、ひとつ以上あたる確率は?
当選確率 2% のガチャを 100 回やったときに、ふたつ以上あたる確率は?
当選確率 1%、天井 100 回のガチャがある。このガチャを 250 回やって、5枚あたりが手に入る確率は?
当選確率 2% のガチャを 99% の確率で手に入れるには何回やればいいか?
当選確率 1% のガチャを 100 回やったときに、ひとつ以上あたる確率は?
これは外れる確率 99% のガチャを 100 回連続で外す現象の余事象だ。つまり
1 - 0.99100 = 63.4%
Google でべき乗を計算するのには ^ を使う。以下の式で Google 検索すると、上記の式を計算できる。
1 - 0.99^100