huggingface / huggingface/diffusers
Confusion about `FrozenDict` in `configuration_utils.py`
- 主要语言
- Python
- 星标
- 34.5k
- 派生
- 7.3k
- 平均合并
- 3 天 3 小时
- 30 天内合并 PR
- 91
描述
I am confused about the design of `FrozenDict` in `configuration_utils.py` and the usage of it.
### 1. Is `FrozenDict` really frozen?
From the code, `FrozenDict` sets `self.__frozen = True` during initialization. It then checks `if hasattr(self, "__frozen") and self.__frozen` in methods like `__setattr__` or `__setitem__` to raise an exception if it's supposed to be frozen. However, in Python, using double underscores (`__`) triggers name mangling, which means `hasattr(self, "__frozen")` couldn't find `__frozen` as it is `_FrozenDict__frozen` actually. This check would always return False, rendering the intended freeze ineffective – `__setattr__` and `__setitem__` can still be used, making the `FrozenDict` not truly frozen.
Is this what we expect?
### 2. If we were to modify `FrozenDict` to be truly immutable, how would we use it as `model.config`?
Typically, we register parameters needed for model initialization as a `FrozenDict` via `register_to_config`. These are often accessed during the forward method with checks like `if self.config.xxx == xxx` to determine execution paths. However, in some models, certain properties of `self.config` might need to be altered after initialization, as seen in [IP-Adapter](https://github.com/huggingface/diffusers/blob/main/src/diffusers/loaders/unet.py#L851)
```py
self.config.encoder_hid_dim_type = "ip_image_proj"
```
Does this contradict the design philosophy of `FrozenDict`?
### 3. If `models.config` could be mutable, how should one go about changing it?
In the example above, should we use `__setattr__` to modify `self.config.encoder_hid_dim_type` or `__setitem__` to add an additional key-value pair to `FrozenDict` which appears more in line with typical dictionary usage, like
```diff
- self.config.encoder_hid_dim_type = "ip_image_proj"
+ self.config['encoder_hid_dim_type'] = "ip_image_proj"
```
I was just wondering if you might have a moment to clarify these points for me?
贡献指南
调研方向
先阅读 configuration_utils.py,然后将 FrozenDict 的行为与 loaders/unet.py 中的 self.config.encoder_hid_dim_type 赋值进行比较。明确预期结果是不可变配置、支持 mutation,还是记录当前行为;只有在确定该范围和预期行为后,issue 才算完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- machine-learning
- Issue 类型
- 缺陷
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 20/100