2022-12-27 12:25:32 -07:00
|
|
|
"""
|
|
|
|
Copyright [2022] Victor C Hall
|
|
|
|
|
|
|
|
Licensed under the GNU Affero General Public License;
|
|
|
|
You may not use this code except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
"""
|
|
|
|
import os
|
|
|
|
import json
|
|
|
|
import logging
|
|
|
|
|
2023-01-17 10:44:18 -07:00
|
|
|
def patch_unet(ckpt_path):
|
2022-12-27 12:25:32 -07:00
|
|
|
"""
|
|
|
|
Patch the UNet to use updated attention heads for xformers support in FP32
|
|
|
|
"""
|
|
|
|
unet_cfg_path = os.path.join(ckpt_path, "unet", "config.json")
|
|
|
|
with open(unet_cfg_path, "r") as f:
|
|
|
|
unet_cfg = json.load(f)
|
|
|
|
|
2023-01-18 11:07:05 -07:00
|
|
|
scheduler_cfg_path = os.path.join(ckpt_path, "scheduler", "scheduler_config.json")
|
|
|
|
with open(scheduler_cfg_path, "r") as f:
|
|
|
|
scheduler_cfg = json.load(f)
|
|
|
|
|
2023-01-17 10:44:18 -07:00
|
|
|
is_sd1attn = unet_cfg["attention_head_dim"] == [8, 8, 8, 8]
|
|
|
|
is_sd1attn = unet_cfg["attention_head_dim"] == 8 or is_sd1attn
|
2022-12-27 12:25:32 -07:00
|
|
|
|
2023-01-18 11:07:05 -07:00
|
|
|
prediction_type = scheduler_cfg["prediction_type"]
|
|
|
|
|
2022-12-27 12:25:32 -07:00
|
|
|
logging.info(f" unet attention_head_dim: {unet_cfg['attention_head_dim']}")
|
2023-01-17 10:44:18 -07:00
|
|
|
|
2023-01-18 11:07:05 -07:00
|
|
|
yaml = ''
|
|
|
|
if prediction_type in ["v_prediction","v-prediction"] and not is_sd1attn:
|
|
|
|
yaml = "v2-inference-v.yaml"
|
|
|
|
elif prediction_type == "epsilon" and not is_sd1attn:
|
|
|
|
yaml = "v2-inference.yaml"
|
|
|
|
elif prediction_type == "epsilon" and is_sd1attn:
|
|
|
|
yaml = "v2-inference.yaml"
|
|
|
|
else:
|
|
|
|
raise ValueError(f"Unknown model format for: {prediction_type} and attention_head_dim {unet_cfg['attention_head_dim']}")
|
|
|
|
|
|
|
|
return is_sd1attn, yaml
|