
Stable Diffusionã¢ãã«ã®ç Žæãã§ãã¯ãšä¿®åŸ©ã«ã€ããŠ
1. æŠèŠ
ã以åãããäžéšã®Stable Diffusionã¢ãã«ã«ãããŠãäžéšã®ããŒã¯ã³ãç¡èŠããããã°ããã€ãŸãå éšããŒã¿ã®ç Žæããããšããæ å ±ãè³ã«ããŠããŸããããã®åŸãåæ§ã®ã¢ãã«ãä»ã«ãè€æ°ååšãããšããšã倿ããã®ã§ãæ¬èšäºã«ãŠãã§ãã¯ãšä¿®åŸ©ã®æé ã説æããŸãããã¡ã€ã«åœ¢åŒã¯ãã.ckptããšã.safetensorsãã®ã©ã¡ãã«ã察å¿ããŠããŸãã
åèæ å ±
ãæ¬èšäºã§ã¯æé ãã説æããŸããã®ã§ããªãã¹ãäžèšã®èšäºãåç §ããŠå 容ã確èªããŠãã ããã
2. ä¿®åŸ©ã®æé (1)
ãå ã«ãæ¬èšäºãšã¯å¥ã®æ¹æ³ã玹ä»ããŸãã
ãAUTOMATIC1111æ°ã®Stable Diffusion web UIäžã®æ¡åŒµæ©èœã§ãç Žæã¢ãã«ã修埩ããããšãå¯èœã§ãã修埩ã®ã»ããåªå®ïŒå§çž®ïŒãVAEã®å梱ãã§ããstable-diffusion-model-toolkitã®å©çšæé ã¯ãäžèšã®èšäºãåç §ããŠãã ããã
3. ç Žæãã§ãã¯ã®æé
ãPCäžã§ãAUTOMATIC1111æ°ã®Stable Diffusion web UIïŒä»¥äžãweb UIïŒãå©çšã§ããããšãåæãšããŸãïŒæè¿ãªãªãŒã¹ãããWindowså°çšçã¯é€å€ïŒãå©çšéå§ãŸã§ã®æé ã¯ãäžèšã®èšäºã«ãŠç޹ä»ããŠããŸãã
å®è¡ãã¡ã€ã«ã®æºå
ããŸããå ã«ç޹ä»ããèšäºã®#3ãããfix_postion_ids.pyããããŠã³ããŒãããŠãé©åœãªãã£ã¬ã¯ããªã«çœ®ããŠãã ãããç§ã®èšäºãèŠãŠãã®ãŸãŸæ§ç¯ãããæ¹ã¯ã\aiworkãã§æ§ããŸããã
ãæ¬¡ã«ãåããã£ã¬ã¯ããªã«ãäžèšã®å 容ã§ããããã¡ã€ã«ãäœã£ãŠãã ããããã¡ã€ã«åã¯çããŠæã¡ããããã®ãè¯ãã§ããããç§ã¯ãchk.batãã«ããŸããã
@echo off
python fix_position_ids.py --model %1 --verboseweb UIã®ä»®æ³ç°å¢ã«åãæ¿ãã
ãã³ãã³ã ããã³ãããéããŠãã ãããäžèšã®äŸãåèã«ãweb UIã®ä»®æ³ç°å¢ã«å ¥ã£ãŠãã ããããã£ã¬ã¯ããªãç°ãªãå Žåã¯é©å®å€æŽããŠãã ãããããããã¡ã€ã«ãäœã£ãŠããã®ãè¯ãã§ãããã
cd \aiwork
stable-diffusion-webui\venv\Scripts\activateãäžèšã®ã³ãã³ããå®è¡åŸãå é ã«ã(venv)ãã®æåãä»ããŠããã°å€§äžå€«ã§ããããããã¡ã€ã«ã眮ããå Žæãç°ãªãå Žåã¯ãããã§ç§»åããŠãã ããã
ãã§ãã¯ã®å®è¡
â ãã£ã¬ã¯ããªåããã¡ã€ã«åã«ãåè§ã¹ããŒã¹ãç¹æ®ãªæåãå«ãŸããŠãããšæ£ããå®è¡ã§ããŸããããææ°ããããŸããäžæçã«ä¿®æ£ããŠãã ããã
ãå ã»ã©ã®ããããã¡ã€ã«ã®ååïŒãchkãçïŒãå ¥ããŠãåè§ã¹ããŒã¹ã1ã€å ¥ããŠããã§ãã¯ãããã¢ãã«ã®ãã¡ã€ã«ãã³ãã³ã ããã³ããã®ãŠã€ã³ããŠã«ãã©ãã°ïŒããããããŠãã ãããäžèšã®ãããªåœ¢ã§ãã¡ã€ã«ã®ãã«ãã¹ãå ¥ãã®ã§ãEnterããŒãæŒããŠãã ããã
(venv) C:\aiwork>chk C:\aiwork\stable-diffusion-webui\models\Stable-diffusion\sd-v1-4-full-ema.ckptãEnterãæŒããæã«ããã®ãã¡ã€ã«ãéãæ¹æ³ãïœãã®è¡šç€ºãåºãŠããŸã£ãå Žåã¯ãããç¡èŠããŠãã³ãã³ã ããã³ããã®ãŠã€ã³ããŠã§ããã«ã¯ãªãã¯ããŠãããæ¹ããŠEnterãæŒããŠãã ããã
ãã§ãã¯çµæã®è¡šç€ºïŒæ£åžžïŒ
ãäžèšã¯ãå®éã®å®è¡çµæã§ããç Žæãç¡ãå Žåã¯ãã®ãããªè¡šç€ºã«ãªããèŠãç®ããã£ããããŠããŸããå®éã®ããŒã¿ã¯ãäžçªäžã®ãcurrent dataãã®éšåã®ã¿ã§ããå€ã®åãint64ã§ããããšããããæå³éèŠã§ãã
loading ... sd-v1-4-full-ema.ckpt
# current data is:
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
<class 'torch.Tensor'>
torch.Size([1, 77])
torch.int64
# == if changed to torch.int64 ==
<class 'torch.Tensor'>
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
torch.int64
# change to:
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
<class 'torch.Tensor'>
torch.int64
#
tensor([[True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True]])ãã§ãã¯çµæã®è¡šç€ºïŒç ŽæïŒ
ãæ¬¡ã«ãç Žæã®å ±åãäžãã£ãŠãããElysium_Anime_V3.safetensorsãã®å Žåã§ããããããã®é åã®æå³ã¯äžããé ã«ãã¢ãã«ãæã€å€ïŒæ¬äŸã§ã¯åãfloat32ïŒãå®å©çšæã«äœ¿çšãããå€ïŒint64ã«å€æããæŽæ°ïŒãæ¬æ¥ããã¹ãå€ïŒåºå®ïŒã䜿çšãããå€ã𿬿¥ã®å€ã®æ£èª€ããšãªã£ãŠããŸãããŸããå€ããããŠããïŒèª€ã®å€å®ã®ïŒäœçœ®ãšã倱ãããå€ãæ«å°Ÿã«ç€ºãããŠããŸãã倱ãããå€ã®äœçœ®ã«ããããŒã¯ã³ã¯ç¡èŠãããŸããéè€ããå€ã®äœçœ®ã«ããããŒã¯ã³ã®æ±ãã«ã€ããŠã¯äžæã§ãã
loading ... Elysium_Anime_V3.safetensors
# current data is:
tensor([[ 0.0000, 1.0000, 2.0000, 2.9995, 3.9999, 4.9985, 5.9990, 6.9994,
7.9999, 9.0004, 9.9971, 11.0013, 11.9979, 13.0021, 13.9988, 15.0031,
15.9998, 16.9965, 18.0007, 19.0049, 19.9942, 20.9984, 22.0025, 23.0068,
23.9958, 25.0000, 26.0042, 26.9935, 27.9976, 29.0019, 30.0061, 30.9954,
31.9996, 33.0037, 33.9930, 35.0121, 36.0015, 36.9907, 38.0098, 38.9991,
39.9884, 41.0074, 41.9967, 42.9861, 44.0051, 44.9944, 46.0137, 47.0028,
47.9917, 49.0107, 50.0000, 50.9897, 52.0084, 52.9983, 53.9869, 55.0066,
55.9953, 56.9852, 58.0039, 58.9935, 60.0122, 61.0019, 61.9908, 63.0102,
63.9991, 64.9880, 66.0075, 67.0262, 67.9860, 69.0047, 70.0242, 70.9832,
72.0030, 73.0214, 73.9815, 75.0000, 76.0197]])
<class 'torch.Tensor'>
torch.Size([1, 77])
torch.float32
# == if changed to torch.int64 ==
<class 'torch.Tensor'>
tensor([[ 0, 0, 1, 2, 3, 4, 5, 6, 7, 9, 9, 11, 11, 13, 13, 15, 15, 16,
18, 19, 19, 20, 22, 23, 23, 25, 26, 26, 27, 29, 30, 30, 31, 33, 33, 35,
36, 36, 38, 38, 39, 41, 41, 42, 44, 44, 46, 47, 47, 49, 50, 50, 52, 52,
53, 55, 55, 56, 58, 58, 60, 61, 61, 63, 63, 64, 66, 67, 67, 69, 70, 70,
72, 73, 73, 74, 76]])
torch.int64
# change to:
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
<class 'torch.Tensor'>
torch.int64
#
tensor([[ True, False, False, False, False, False, False, False, False, True,
False, True, False, True, False, True, False, False, True, True,
False, False, True, True, False, True, True, False, False, True,
True, False, False, True, False, True, True, False, True, False,
False, True, False, False, True, False, True, True, False, True,
True, False, True, False, False, True, False, False, True, False,
True, True, False, True, False, False, True, True, False, True,
True, False, True, True, False, False, True]])
corrupt token indexes : [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 20, 21, 24, 27, 28, 31, 32, 34, 37, 39, 40, 42, 43, 45, 48, 51, 53, 54, 56, 57, 59, 62, 64, 65, 68, 71, 74, 75]
missing token numbers : [8, 10, 12, 14, 17, 21, 24, 28, 32, 34, 37, 40, 43, 45, 48, 51, 54, 57, 59, 62, 65, 68, 71, 75]ã2çªç®ã®ã1.0000ããæŽæ°ã«å€æãããšã0ãã«ãªãã®ã¯äžæè°ãªæ°ãããŸãããå°æ°ã4æ¡ã«äžžããéã«ç¹°ãäžãã£ãŠããŸã£ãã®ãããããŸããã
4. ä¿®åŸ©ã®æé
ãåãã¹ã¯ãªããã䜿çšããŠä¿®åŸ©ããå Žåã¯ãäžèšã®å 容ã§ããããã¡ã€ã«ãäœæããŠïŒãã¡ã€ã«åã¯ãfix.batããªã©ïŒããã§ãã¯ã®æãšåãããã«å®è¡ããŠãã ãããäžæžãã®ç¢ºèªã¯ç¡ãã®ã§æ³šæããŠãã ããã
@echo off
python fix_position_ids.py --model %1 --out %~dp1%~n1_fix%~x1修埩ãè¡ã
â ãã£ã¬ã¯ããªåããã¡ã€ã«åã«ãåè§ã¹ããŒã¹ãç¹æ®ãªæåãå«ãŸããŠãããšæ£ããå®è¡ã§ããŸããããææ°ããããŸããäžæçã«ä¿®æ£ããŠãã ããã
ãå®è¡äŸã§ãããElysium_Anime_V3.safetensorsããå ¥åããŠãåããã£ã¬ã¯ããªã«ãElysium_Anime_V3_fix.safetensorsããåºåããŠããŸãã
(venv) C:\aiwork>fix C:\aiwork\stable-diffusion-webui\models\Stable-diffusion\Elysium_Anime_V3.safetensors
loading ... Elysium_Anime_V3.safetensors
# change to:
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
<class 'torch.Tensor'>
torch.int64
#
tensor([[ True, False, False, False, False, False, False, False, False, True,
False, True, False, True, False, True, False, False, True, True,
False, False, True, True, False, True, True, False, False, True,
True, False, False, True, False, True, True, False, True, False,
False, True, False, False, True, False, True, True, False, True,
True, False, True, False, False, True, False, False, True, False,
True, True, False, True, False, False, True, True, False, True,
True, False, True, True, False, False, True]])
corrupt token indexes : [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 20, 21, 24, 27, 28, 31, 32, 34, 37, 39, 40, 42, 43, 45, 48, 51, 53, 54, 56, 57, 59, 62, 64, 65, 68, 71, 74, 75]
missing token numbers : [8, 10, 12, 14, 17, 21, 24, 28, 32, 34, 37, 40, 43, 45, 48, 51, 54, 57, 59, 62, 65, 68, 71, 75]
Saving...ãåºåããããã¡ã€ã«ããã§ãã¯ããŠã¿ããšãæ£åžžãªå€ã«ãªã£ãããšãåãããŸãã
(venv) C:\aiwork>chk C:\aiwork\stable-diffusion-webui\models\Stable-diffusion\Elysium_Anime_V3_fix.safetensors
loading ... Elysium_Anime_V3_fix.safetensors
# current data is:
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
<class 'torch.Tensor'>
torch.Size([1, 77])
torch.int64
# == if changed to torch.int64 ==
<class 'torch.Tensor'>
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
torch.int64
# change to:
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76]])
<class 'torch.Tensor'>
torch.int64
#
tensor([[True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True]])修埩ã¢ãã«ã®æ³šæç¹
ãã¢ãã«ã修埩ããããšã§ããã³ããã®æ±ããå€åããç Žæã¢ãã«ãšã¯ç°ãªãåºåãåŸãããããšããããŸãïŒå ã®ç Žæå ·åãšäžããããã³ããã«äŸåããŸãïŒãçæã®äžã§ãå©çšãã ããããŸããç Žæã¢ãã«ãç Žæ£ããå Žåã¯ã修埩ã¢ãã«ãæ£ããå©çšã§ããããšã確èªããŠããè¡ã£ãŠãã ããã
çµäºã®æ¹æ³
ããŠã€ã³ããŠãããããã«éããŠãåé¡ãªããšæããŸãããä»®æ³ç°å¢ããæããæ¹æ³ãèŠããŠãããŠãã ããã
deactivateãäžèšã®ã³ãã³ããå®è¡ããã ãã§ãã
5. åã¢ãã«ã®ãã§ãã¯çµæ
ãäžèšã®èšäºã«ãŠãå®éã«ãã§ãã¯ããçµæãèšèŒããŠããŸããå å®¹ã¯æŽæ°ãããå ŽåããããŸãã
6. ããŸã
ãå®éã«äœ¿ã£ãŠããã¹ã¯ãªããã§ãããã§ãã¯ã«äœ¿çšããããããã¡ã€ã«ãäžèšã®å 容ã«å€æŽãããšããã§ãã¯ãããã¡ã€ã«ãšåããã£ã¬ã¯ããªã«çµæãåºåããŸããcertutilã®åºåãæ³å®ãšç°ãªãå Žåã¯ããã·ã¥å€ä»¥å€ã®ã¡ãã»ãŒãžãå«ãŸããŠããŸãã®ã§ãfindstrã®åŠçïŒæå®ããæåãå«ãŸããè¡ãç Žæ£ïŒãä¿®æ£ããŠãã ããã
@echo off
echo %~n1%~x1 > %~dp1%~n1%~x1.txt
certutil -hashfile %1 SHA256 | findstr /v ã³ãã³ã㯠| findstr /v ããã·ã¥ >> %~dp1%~n1%~x1.txt
echo. >> %~dp1%~n1%~x1.txt
python fix_position_ids.py --model %1 --verbose | findstr /v loading >> %~dp1%~n1%~x1.txtïŒããŸãã®è¿œå ïŒãã§ãã¯çµæã®æŠèŠã衚瀺ããŸããã奜ã¿ã§äžèšã®ã³ãŒãã«è¶³ããŠãã ãããïŒ
echo.
echo result of %~n1%~x1
type %~dp1%~n1%~x1.txt | findstr torch.float | findstr /v dtype
type %~dp1%~n1%~x1.txt | findstr tokenãåºåãã¡ã€ã«ã¯ããã§ãã¯ãããã¡ã€ã«åã«ã.txtããä»å ãããã¡ã€ã«åã§ãå 容ã¯äžèšäŸã®ããã«ããã¡ã€ã«åãSHA256ããã§ãã¯çµæãã§ãã
testdata.ckpt
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
# current data is:
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
ïŒç¥ïŒïŒããŸãã®è¿œå ãè¶³ããå Žåãç Žæã¢ãã«ã§ã¯äžèšã®ãããªè¡šç€ºãåºãŸããïŒ
result of testdata.ckpt
torch.float32
corrupt token indexes : [7, 14, 25, 28, 29, 31, 50, 53, 56, 58, 59, 61, 62]
missing token numbers : [7, 14, 25, 29, 31, 50, 53, 56, 59, 62]â ãã€ããæžããŸããããã£ã¬ã¯ããªåããã¡ã€ã«åã«ãåè§ã¹ããŒã¹ãç¹æ®ãªæåãå«ãŸããŠãããšæ£ããå®è¡ã§ããŸããããææ°ããããŸããäžæçã«ä¿®æ£ããŠãã ããã
7. ãã®ä»
ãç§ãæžããä»ã®èšäºã¯ãã¡ãã¥ãŒãããã©ã£ãŠãã ããã
ãnoteã®ã¢ã«ãŠã³ãã¯ã¡ã€ã³ã®@Mayu_Hiraizumiã«çŽä»ããŠããŸãããèšäºã«é¢ããããšã¯ãµãã¢ã«ãŠã³ãã®@riddi0908ãŸã§ãé¡ãããŸãã