Browse Source

load hashes from cache for checkpoints that have them
add checkpoint hash to footer

AUTOMATIC 2 years ago
parent
commit
08c6f009a5
6 changed files with 48 additions and 19 deletions
  1. 16 9
      javascript/ui.js
  2. 19 7
      modules/hashes.py
  3. 6 3
      modules/sd_models.py
  4. 1 0
      modules/shared.py
  5. 2 0
      modules/ui.py
  6. 4 0
      script.js

+ 16 - 9
javascript/ui.js

@@ -143,14 +143,6 @@ function confirm_clear_prompt(prompt, negative_prompt) {
 
 
 
 
 opts = {}
 opts = {}
-function apply_settings(jsdata){
-    console.log(jsdata)
-
-    opts = JSON.parse(jsdata)
-
-    return jsdata
-}
-
 onUiUpdate(function(){
 onUiUpdate(function(){
 	if(Object.keys(opts).length != 0) return;
 	if(Object.keys(opts).length != 0) return;
 
 
@@ -160,7 +152,7 @@ onUiUpdate(function(){
     textarea = json_elem.querySelector('textarea')
     textarea = json_elem.querySelector('textarea')
     jsdata = textarea.value
     jsdata = textarea.value
     opts = JSON.parse(jsdata)
     opts = JSON.parse(jsdata)
-
+    executeCallbacks(optionsChangedCallbacks);
 
 
     Object.defineProperty(textarea, 'value', {
     Object.defineProperty(textarea, 'value', {
         set: function(newValue) {
         set: function(newValue) {
@@ -171,6 +163,8 @@ onUiUpdate(function(){
             if (oldValue != newValue) {
             if (oldValue != newValue) {
                 opts = JSON.parse(textarea.value)
                 opts = JSON.parse(textarea.value)
             }
             }
+
+            executeCallbacks(optionsChangedCallbacks);
         },
         },
         get: function() {
         get: function() {
             var valueProp = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value');
             var valueProp = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value');
@@ -201,6 +195,19 @@ onUiUpdate(function(){
     }
     }
 })
 })
 
 
+
+onOptionsChanged(function(){
+    elem = gradioApp().getElementById('sd_checkpoint_hash')
+    sd_checkpoint_hash = opts.sd_checkpoint_hash || ""
+    shorthash = sd_checkpoint_hash.substr(0,10)
+
+	if(elem && elem.textContent != shorthash){
+	    elem.textContent = shorthash
+	    elem.title = sd_checkpoint_hash
+	    elem.href = "https://google.com/search?q=" + sd_checkpoint_hash
+	}
+})
+
 let txt2img_textarea, img2img_textarea = undefined;
 let txt2img_textarea, img2img_textarea = undefined;
 let wait_time = 800
 let wait_time = 800
 let token_timeout;
 let token_timeout;

+ 19 - 7
modules/hashes.py

@@ -42,23 +42,35 @@ def calculate_sha256(filename):
     return hash_sha256.hexdigest()
     return hash_sha256.hexdigest()
 
 
 
 
-def sha256(filename, title):
+def sha256_from_cache(filename, title):
     hashes = cache("hashes")
     hashes = cache("hashes")
     ondisk_mtime = os.path.getmtime(filename)
     ondisk_mtime = os.path.getmtime(filename)
 
 
-    if title in hashes:
-        cached_sha256 = hashes[title].get("sha256", None)
-        cached_mtime = hashes[title].get("mtime", 0)
+    if title not in hashes:
+        return None
+
+    cached_sha256 = hashes[title].get("sha256", None)
+    cached_mtime = hashes[title].get("mtime", 0)
+
+    if ondisk_mtime > cached_mtime or cached_sha256 is None:
+        return None
+
+    return cached_sha256
+
+
+def sha256(filename, title):
+    hashes = cache("hashes")
 
 
-        if ondisk_mtime <= cached_mtime and cached_sha256 is not None:
-            return cached_sha256
+    sha256_value = sha256_from_cache(filename, title)
+    if sha256_value is not None:
+        return sha256_value
 
 
     print(f"Calculating sha256 for {filename}: ", end='')
     print(f"Calculating sha256 for {filename}: ", end='')
     sha256_value = calculate_sha256(filename)
     sha256_value = calculate_sha256(filename)
     print(f"{sha256_value}")
     print(f"{sha256_value}")
 
 
     hashes[title] = {
     hashes[title] = {
-        "mtime": ondisk_mtime,
+        "mtime": os.path.getmtime(filename),
         "sha256": sha256_value,
         "sha256": sha256_value,
     }
     }
 
 

+ 6 - 3
modules/sd_models.py

@@ -44,9 +44,11 @@ class CheckpointInfo:
         self.title = name
         self.title = name
         self.model_name = os.path.splitext(name.replace("/", "_").replace("\\", "_"))[0]
         self.model_name = os.path.splitext(name.replace("/", "_").replace("\\", "_"))[0]
         self.hash = model_hash(filename)
         self.hash = model_hash(filename)
-        self.ids = [self.hash, self.model_name, self.title, f'{name} [{self.hash}]']
-        self.shorthash = None
-        self.sha256 = None
+
+        self.sha256 = hashes.sha256_from_cache(self.filename, "checkpoint/" + self.title)
+        self.shorthash = self.sha256[0:10] if self.sha256 else None
+
+        self.ids = [self.hash, self.model_name, self.title, f'{name} [{self.hash}]'] + ([self.shorthash, self.sha256] if self.shorthash else [])
 
 
     def register(self):
     def register(self):
         checkpoints_list[self.title] = self
         checkpoints_list[self.title] = self
@@ -269,6 +271,7 @@ def load_model_weights(model, checkpoint_info: CheckpointInfo, vae_file="auto"):
     model.sd_model_hash = sd_model_hash
     model.sd_model_hash = sd_model_hash
     model.sd_model_checkpoint = checkpoint_info.filename
     model.sd_model_checkpoint = checkpoint_info.filename
     model.sd_checkpoint_info = checkpoint_info
     model.sd_checkpoint_info = checkpoint_info
+    shared.opts.data["sd_checkpoint_hash"] = checkpoint_info.sha256
 
 
     model.logvar = model.logvar.to(devices.device)  # fix for training
     model.logvar = model.logvar.to(devices.device)  # fix for training
 
 

+ 1 - 0
modules/shared.py

@@ -458,6 +458,7 @@ options_templates.update(options_section(('sampler-params', "Sampler parameters"
 
 
 options_templates.update(options_section((None, "Hidden options"), {
 options_templates.update(options_section((None, "Hidden options"), {
     "disabled_extensions": OptionInfo([], "Disable those extensions"),
     "disabled_extensions": OptionInfo([], "Disable those extensions"),
+    "sd_checkpoint_hash": OptionInfo("", "SHA256 hash of the current checkpoint"),
 }))
 }))
 
 
 options_templates.update()
 options_templates.update()

+ 2 - 0
modules/ui.py

@@ -1841,4 +1841,6 @@ xformers: {xformers_version}
 gradio: {gr.__version__}
 gradio: {gr.__version__}
  • 
  • 
 commit: <a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/{commit}">{short_commit}</a>
 commit: <a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/{commit}">{short_commit}</a>
+ • 
+checkpoint: <a id="sd_checkpoint_hash">N/A</a>
 """
 """

+ 4 - 0
script.js

@@ -14,6 +14,7 @@ function get_uiCurrentTabContent() {
 
 
 uiUpdateCallbacks = []
 uiUpdateCallbacks = []
 uiTabChangeCallbacks = []
 uiTabChangeCallbacks = []
+optionsChangedCallbacks = []
 let uiCurrentTab = null
 let uiCurrentTab = null
 
 
 function onUiUpdate(callback){
 function onUiUpdate(callback){
@@ -22,6 +23,9 @@ function onUiUpdate(callback){
 function onUiTabChange(callback){
 function onUiTabChange(callback){
     uiTabChangeCallbacks.push(callback)
     uiTabChangeCallbacks.push(callback)
 }
 }
+function onOptionsChanged(callback){
+    optionsChangedCallbacks.push(callback)
+}
 
 
 function runCallback(x, m){
 function runCallback(x, m){
     try {
     try {