Buckets:

mishig's picture
|
download
raw
21.4 kB
# 哲孊
🧚 Diffusers は、**最先端の**事前孊習枈み拡散モデルを、耇数のモダリティにわたっお提䟛しおいたす。その目的は、掚論ず孊習の䞡方においお**モゞュヌル化されたツヌルボックス**ずしお機胜するこずです。
私たちは、長期的な信頌性を備えたラむブラリを構築するこずを目暙ずしおおり、そのためAPI蚭蚈を非垞に重芖しおいたす。
芁するに、DiffusersはPyTorchの自然な拡匵ずしお構築されおいたす。そのため、私たちの蚭蚈䞊の刀断の倚くは[PyTorchの蚭蚈原則](https://pytorch.org/docs/stable/community/design.html#pytorch-design-philosophy)に基づいおいたす。最も重芁なポむントをいく぀か芋おいきたしょう。
## 䜿いやすさを性胜より優先
- Diffusersには倚くのパフォヌマンス向䞊機胜が組み蟌たれおいたすが[最適化ずスケヌリング](../optimization/overview)を参照、モデルは垞に最高粟床か぀最䜎限の最適化で読み蟌たれたす。したがっお、ナヌザヌが明瀺的に定矩しない限り、デフォルトでは拡散パむプラむンはCPU䞊でfloat32粟床でむンスタンス化されたす。これにより、異なるプラットフォヌムやアクセラレヌタヌ間で利甚可胜であり、ラむブラリを実行するために耇雑なむンストヌルが䞍芁であるこずが保蚌されたす。
- Diffusers は**軜量な**パッケヌゞであるこずを目指しおおり、必須の䟝存関係は非垞に少ないですが、`accelerate`、`safetensors`、`onnx` など、パフォヌマンスを向䞊させるこずができる倚くの任意の䟝存関係がありたす。他のパッケヌゞぞの䟝存関係ずしお、倧きな懞念なく远加できるように、ラむブラリをできるだけ軜量に保぀よう努めおいたす。
- Diffusersでは、凝瞮されたマゞックなコヌドよりも、シンプルで自己説明可胜なコヌドを優先しおいたす。そのため、ラムダ関数などの短瞮蚘法や、高床なPyTorch挔算子は、倚くの堎合望たしくありたせん。
## シンプルでかんたん
PyTorchが述べおいるように、**明瀺的であるこずは暗黙的であるこずより良い**、そしお**単玔であるこずは耇雑であるこずより良い**です。この蚭蚈思想は、ラむブラリの耇数の郚分に反映されおいたす。
- PyTorch の API に埓い、[`DiffusionPipeline.to`](../api/pipelines/overview#diffusers.DiffusionPipeline.to) のようなメ゜ッドを提䟛するこずで、ナヌザヌがデバむス管理を凊理できるようにしおいたす。
- 誀った入力を黙っお修正するよりも、簡朔な゚ラヌメッセヌゞを送出するこずが掚奚されたす。Diffusersは、ラむブラリをできるだけ䜿いやすくするこずよりも、ナヌザヌに孊習させるこずを目的ずしおいたす。
- 耇雑なモデルずスケゞュヌラのロゞックが内郚で自動的に凊理されるのではなく、明瀺的に公開されおいたす。Scheduler/Samplerは拡散モデルから分離されおおり、盞互の䟝存関係は最小限に抑えられおいたす。これにより、ナヌザヌは展開されたデノむゞングルヌプを自分で蚘述する必芁がありたす。ただし、この分離によりデバッグが容易になり、デノむゞングプロセスの適応や拡散モデルおよびスケゞュヌラの切り替えにおいお、ナヌザヌにより倚くの制埡が可胜になりたす。
- 拡散パむプラむンの個別に孊習されたコンポヌネント、*䟋えば*テキスト゚ンコヌダヌ、unet、倉分オヌト゚ンコヌダヌは、それぞれ独自のモデルクラスを持ちたす。これにより、ナヌザヌは異なるモデルコンポヌネント間の盞互䜜甚を凊理する必芁があり、シリアラむズ圢匏ではモデルコンポヌネントが異なるファむルに分離されたす。ただし、これによりデバッグやカスタマむズが容易になりたす。DreamBoothやTextual Inversionの孊習
Diffusersは拡散パむプラむンの単䞀コンポヌネントを分離できるため、非垞にシンプルです。
## 調敎可胜で、コントリビュヌタヌフレンドリヌな抜象化
ラむブラリの倧郚分においお、Diffusers は [Transformers ラむブラリ](https://github.com/huggingface/transformers) の重芁な蚭蚈原則を採甚しおいたす。それは、急ぎ足で抜象化を行うよりも、コヌドのコピヌ&ペヌストを優先するずいうものです。この蚭蚈原則は非垞に匷い䞻匵を含んでおり、[DRYDon't Repeat Yourself](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) ずいった䞀般的な蚭蚈原則ずは察照的です。芁するに、Transformers がモデリングファむルに察しお行っおいるのず同様に、Diffusers もパむプラむンずスケゞュヌラに察しお、極めお䜎い抜象床ず非垞に自己完結的なコヌドを維持するこずを奜みたす。関数、長いコヌドブロック、堎合によっおはクラス自䜓が耇数のファむル間でコピヌされるため、䞀芋するず、ラむブラリをメンテナンス䞍胜にするような粗末で䞍適切な蚭蚈遞択に芋えるかもしれたせん。**しかし**、この蚭蚈は Transformers においお極めお成功を収めおおり、コミュニティ䞻導のオヌプン゜ヌス機械孊習ラむブラリにずっお非垞に理にかなっおいたす。その理由は以䞋の通りです。
- 機械孊習は、パラダむム、モデルアヌキテクチャ、アルゎリズムが急速に倉化する非垞に動きの速い分野であり、そのため長期的に持続可胜なコヌドの抜象化を定矩するこずが非垞に困難です。
- 機械孊習の実務者は、アむデア出しや研究のために既存のコヌドを玠早く調敎できるこずを奜むため、倚くの抜象化を含むコヌドよりも、自己完結型のコヌドを奜みたす。
- オヌプン゜ヌスのラむブラリはコミュニティの貢献に䟝存しおいるため、貢献しやすいラむブラリを構築する必芁がありたす。コヌドが抜象的であればあるほど、䟝存関係が増え、読み解くのが難しくなり、貢献しにくくなりたす。貢献者は、重芁な機胜が壊れおしたうこずを恐れ、非垞に抜象床の高いラむブラリぞの貢献を止めおしたう傟向がありたす。ラむブラリぞの貢献が他の基本的なコヌドを壊すリスクがなければ、朜圚的な新芏貢献者にずっお参加しやすくなるだけでなく、耇数の郚分ぞのレビュヌや䞊行した貢献もしやすくなりたす。
Hugging Face では、この蚭蚈を**単䞀ファむルポリシヌ**ず呌び、あるクラスのコヌドのほずんどは、単䞀の自己完結型ファむルに蚘述されるべきであるこずを意味したす。この哲孊に぀いお詳しく知りたい堎合は、[このブログ蚘事](https://huggingface.co/blog/transformers-design-philosophy)をご芧ください。
Diffusersでは、パむプラむン、スケゞュヌラ、モデルのすべおにおいお、この哲孊を螏襲しおいたす。この慣䟋より前に登堎した䞀郚の叀いモデルはそのたたの圢で維持されおいたすが、すべおの新しいモデルアヌキテクチャは、自己完結型の個別ファむルに配眮されおいたす。詳现は、以䞋の[Models](#models)セクションを参照しおください。
玠晎らしいですね。これで、🧚 Diffusers がなぜこのように蚭蚈されおいるのか、その理由が抂ねご理解いただけたず思いたす 🀗。私たちは、これらの蚭蚈原則をラむブラリ党䜓に䞀貫しお適甚しおいたす。ただし、この哲孊に察する些现な䟋倖や、残念ながら奜たしくなかった蚭蚈刀断が存圚する箇所もありたす。蚭蚈に関するフィヌドバックをいただければ、[GitHub 䞊で盎接](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feedback.md&title=)お聞かせいただければ ❀ 幞いです。
## 蚭蚈思想の詳现
次に、蚭蚈思想の詳现な点に぀いお説明したす。Diffusersでは、[モデル](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models)ず[スケゞュヌラ](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers)を実行可胜なワヌクフロヌずしお構成する2぀の方法が提䟛されおいたす。1぀は、1぀のパむプラむンクラスごずに1぀のタスクを凊理する単䞀構造の暙準的な[パむプラむン](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines)です。もう1぀は、ブロックベヌスで組み合わせ可胜なModular Diffusersです。以䞋のセクションでは、パむプラむン、モゞュラヌパむプラむン、モデル、スケゞュヌラに぀いお順に説明したす。
### パむプラむン
Pipelines は、暙準型でもモゞュラヌ型でも、掚論のみを目的ずしおいたす。䜿いやすさを重芖しお蚭蚈されおいるため[Simple over easy](#simple-over-easy) を 100% には埓っおいたせん、読みやすく、自己完結的で、調敎が容易であり、[models](#models) ず [schedulers](#schedulers) の䜿い方の䟋ずしお捉えるのが最も適切です。機胜は完党ではありたせん。Diffusers を基盀ずしお機胜の揃ったナヌザヌむンタヌフェヌスを構築するには、[Modular Diffusers](../modular_diffusers/overview) を䜿甚しおください。
以䞋の蚭蚈原則が遵守されおいたす:
- Pipelines follow the single-file policy. All pipelines can be found in individual directories under src/diffusers/pipelines. One pipeline folder corresponds to one diffusion paper/project/release. Multiple pipeline files can be gathered in one pipeline folder, as it’s done for [`src/diffusers/pipelines/stable-diffusion`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/stable_diffusion). If pipelines share similar functionality, one can make use of the [# Copied from mechanism](https://github.com/huggingface/diffusers/blob/125d783076e5bd9785beb05367a2d2566843a271/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py#L251).
- すべおのPipelinesは[DiffusionPipeline](/docs/diffusers/main/ja/api/pipelines/overview#diffusers.DiffusionPipeline)を継承しおいたす。
- すべおのパむプラむンは、[`model_index.json` ファむル](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/model_index.json)にドキュメント化された異なるモデルずスケゞュヌラのコンポヌネントで構成されおおり、パむプラむンの属性ずしお同名でアクセスでき、[`DiffusionPipeline.components`](../api/pipelines/overview#diffusers.DiffusionPipeline.components) 関数を甚いおパむプラむン間で共有できたす。
- すべおのパむプラむンは、[`DiffusionPipeline.from_pretrained`](../api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) 関数によっお読み蟌める必芁がありたす。
- すべおのパむプラむンには、`__call__` メ゜ッド経由で実行するための方法が1぀だけ、か぀1぀だけ存圚する必芁がありたす。`__call__` の匕数の呜名は、すべおのパむプラむン間で䞀貫性を持たせる必芁がありたす。
- Pipelines は、解決しようずするタスクにちなんで呜名されるべきです。
### モゞュヌル型 Diffusers
Modular Diffusers は、暙準的なパむプラむンの代替ずしお、コンポヌザブルなアプロヌチを提䟛したす。再利甚可胜な*パむプラむンブロック*からワヌクフロヌを構築し、それらを組み合わせ、亀換、共有できたす。暙準的なパむプラむンは、モデルずスケゞュヌラヌの䜿甚方法を瀺す緩やかな参考䟋です。Modular Diffusers は、Diffusers の䞊に機胜完党なナヌザヌむンタヌフェヌスを構築するための掚奚される方法であり、コミュニティが分散的な圢で新しいパむプラむンを構築・共有するための基盀です。
以䞋の蚭蚈原則が遵守されおいたす:
- Modular pipelines は単䞀ファむルポリシヌに埓いたす。それぞれは [src/diffusers/modular_pipelines/](https://github.com/huggingface/diffusers/tree/main/src/diffusers/modular_pipelines) 配䞋の独自のフォルダに配眮され、そのフォルダ内でワヌクフロヌをステヌゞごずに1ファむルず぀に分割したす: `encoders.py`、`before_denoise.py`、`denoise.py`、および `decoders.py`。さらに2぀のファむルでパむプラむンが完成したす。`modular_blocks_<model>.py` が各ステヌゞを組み立お、`modular_pipeline.py` がモデルごずの [ModularPipeline](/docs/diffusers/main/ja/api/modular_diffusers/pipeline#diffusers.ModularPipeline) サブクラスを定矩したす。Modular pipelines は盞互にむンポヌトしたせん。
- 各モゞュラヌパむプラむンは、[ModularPipelineBlocks](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) の集合ずしお定矩されたす。リヌフブロックはステヌゞファむル`encoders.py`、`before_denoise.py`、`denoise.py`、`decoders.py`に配眮され、`modular_blocks_<model>.py` では [SequentialPipelineBlocks](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_blocks#diffusers.SequentialPipelineBlocks) や [AutoPipelineBlocks](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_blocks#diffusers.AutoPipelineBlocks) ずいったコンテナクラスを甚いお、それらを完党なワヌクフロヌに組み立おたす。これにより、`DiffusionPipeline combines` で混圚しおいた2぀の抂念が分離されたす。ブロックは玔粋な定矩です。入力、出力、コンポヌネントの䟝存関係を宣蚀したすが、重みを保持せず、単䜓では実行できたせん。`.init_pipeline(repo_id)` で䜜成される [ModularPipeline](/docs/diffusers/main/ja/api/modular_diffusers/pipeline#diffusers.ModularPipeline) は、実行可胜な察応物です。ブロックをステヌトレスか぀重みを持たない状態に保぀こずで、ワヌクフロヌ間で自由に組み合わせ、亀換、共有できるようになりたす。
- 新しいタスクをサポヌトするには、タスク固有のブロックを䜜成し、既存のブロックず組み合わせ、トップレベルのブロックアセンブリにある`_workflow_map`にワヌクフロヌを登録したす。単䞀の`ModularPipeline`は、テキストから画像ぞの倉換、画像から画像ぞの倉換、むンペむンティングなど、耇数のワヌクフロヌをサポヌトできたすが、`DiffusionPipeline`は1぀のワヌクフロヌのみを実行したす。
完党な蚭蚈ず䜿甚ガむドに぀いおは、[Modular Diffusers ドキュメント](../modular_diffusers/overview)を参照しおください。
### モデル
モデルは、[PyTorchのModuleクラス](https://pytorch.org/docs/stable/generated/torch.nn.Module.html)の自然な拡匵ずしお蚭蚈された、蚭定可胜なツヌルボックスです。*単䞀ファむルポリシヌ*に埓う必芁がありたす。この慣䟋より前に䜜成された䞀郚の叀いモデルは、そのたた維持されおいたす。これらは新しいモデルで暡倣すべきパタヌンではなく、レガシヌな䟋倖ずしお扱っおください。䟋えば、元の[UNet2DConditionModel](/docs/diffusers/main/ja/api/models/unet2d-cond#diffusers.UNet2DConditionModel)クラスは、耇数のUNetバリ゚ヌションに䜿甚されおいたした。
以䞋の蚭蚈原則が遵守されおいたす:
- 各モデルアヌキテクチャのタむプは、[src/diffusers/models](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models) 配䞋の個別のフォルダに配眮されおいたす。䟋えば [transformers/](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models/transformers)、[autoencoders/](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models/autoencoders)、たたは [unets/](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models/unets) などです。各モデルファミリヌには、そのフォルダ内に専甚のファむルが甚意されおおり、[transformer_flux.py](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/transformer_flux.py) や [transformer_wan.py](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/transformer_wan.py) などが該圓したす。
- モデルは単䞀ファむルポリシヌに埓いたす。各モデルファむルは自己完結型であるべきですが、タむムステップ埋め蟌みや正芏化レむダヌなど、すべおのモデルが同䞀に䜿甚する暙準モゞュヌルの少数を陀きたす。それらは [embeddings.py](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/embeddings.py) および [normalization.py](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/normalization.py) からむンポヌトしおください。
- モデルは、PyTorchの`Module`クラスず同様に、耇雑さを明瀺的に公開し、明確な゚ラヌメッセヌゞを提䟛するこずを意図しおいたす。
- すべおのモデルは`ModelMixin`ず`ConfigMixin`を継承したす。
- モデルは、倧幅なコヌド倉曎を必芁ずせず、埌方互換性を保ちながら、メモリや蚈算リ゜ヌスに倧きな改善をもたらす堎合に、パフォヌマンスの最適化を行うこずができたす。
- モデルは、デフォルトで最高粟床か぀最䜎パフォヌマンスの蚭定を持぀べきです。
- 既存のモデルアヌキテクチャに類䌌した新しいモデルアヌキテクチャを統合するには、既存のファむルをコピヌしお起点ずし、それに基づいお適応させたす。同䞀のたたのレむダヌには [`# Copied from`](./contribution#copied-from-mechanism) アノテヌションを付䞎し、`make fix-copies` によっおそれらが同期されるようにしたす。
### スケゞュヌラヌ
**単䞀ファむルポリシヌ**を厳密に遵守した個別クラスずしお蚭蚈されおおり、読み蟌み可胜な蚭定ファむルを持぀ Scheduler は、掚論時のノむズ陀去プロセスの制埡ず、孊習時のノむズスケゞュヌルの定矩を担圓したす。
以䞋の蚭蚈原則が遵守されおいたす:
- すべおのスケゞュヌラは、[`src/diffusers/schedulers`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers) にありたす。
- Scheduler は倧きな utils ファむルからのむンポヌトが**蚱可されおいたせん**。非垞に自己完結型に保たれる必芁がありたす。
- 1぀のスケゞュヌラ甚のPythonファむルは、1぀のスケゞュヌラアルゎリズム論文などで定矩されるものに察応したす。
- スケゞュヌラが類䌌した機胜を持぀堎合、`# Copied from` メカニズムを掻甚できたす。
- すべおの Scheduler は `SchedulerMixin` ず `ConfigMixin` を継承しおいたす。
- [`ConfigMixin.from_config`](../api/configuration#diffusers.ConfigMixin.from_config) メ゜ッドを䜿甚するこずで、スケゞュヌラヌを簡単に亀換できたす。詳现は[こちら](../using-diffusers/schedulers)を参照しおください。
- すべおのスケゞュヌラには、`set_num_inference_steps` ず `step` 関数が必芁です。`set_num_inference_steps(...)` は、すべおのノむズ陀去プロセスの前に、*぀たり* `step(...)` が呌び出される前に呌び出す必芁がありたす。
- すべおのスケゞュヌラは、`timesteps` 属性を通じお、ルヌプで反埩されるべきタむムステップを公開したす。これは、モデルが呌び出されるタむムステップの配列です。
- `step(...)` 関数は、予枬されたモデルの出力ず「珟圚の」サンプル (x_t) を受け取り、「前の」、わずかにノむズ陀去されたサンプル (x_t-1) を返したす。
- 拡散スケゞュヌラヌの耇雑さから、`step`関数はすべおの耇雑さを公開しおおらず、ある皮の「ブラックボックス」になり埗たす。
- ほがすべおの堎合においお、新しいスケゞュヌラヌは新しいスケゞュヌリングファむルに実装されるべきです。

Xet Storage Details

Size:
21.4 kB
·
Xet hash:
536c242006a54d8832f082ae5332c4d71de48adc00c0b4bb3d32a7a23e4d76f6

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.