.gitattributes CHANGED
@@ -1,32 +1,35 @@
1
- nsfweffnetv2-b02-3epochs.h5 filter=lfs diff=lfs merge=lfs -text
2
- fifth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
3
- ninth.im_.pt filter=lfs diff=lfs merge=lfs -text
4
- tenth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
5
- third.gemb_.pt filter=lfs diff=lfs merge=lfs -text
6
- eigth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
7
- first.gemb_.pt filter=lfs diff=lfs merge=lfs -text
8
- fourth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
9
- ninth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
10
- sixth.gemb_.pt filter=lfs diff=lfs merge=lfs -text
11
- tenth.im_.pt filter=lfs diff=lfs merge=lfs -text
12
- eigth.im_.pt filter=lfs diff=lfs merge=lfs -text
13
- seventh.gemb_.pt filter=lfs diff=lfs merge=lfs -text
14
- sixth.im_.pt filter=lfs diff=lfs merge=lfs -text
15
- third.im_.pt filter=lfs diff=lfs merge=lfs -text
16
- fifth.im_.pt filter=lfs diff=lfs merge=lfs -text
17
- first.im_.pt filter=lfs diff=lfs merge=lfs -text
18
- fourth.im_.pt filter=lfs diff=lfs merge=lfs -text
19
- second.gemb_.pt filter=lfs diff=lfs merge=lfs -text
20
- second.im_.pt filter=lfs diff=lfs merge=lfs -text
21
- seventh.im_.pt filter=lfs diff=lfs merge=lfs -text
22
- image';l';.png filter=lfs diff=lfs merge=lfs -text
23
- second.png filter=lfs diff=lfs merge=lfs -text
24
- sixth.png filter=lfs diff=lfs merge=lfs -text
25
- third.png filter=lfs diff=lfs merge=lfs -text
26
- fifth.png filter=lfs diff=lfs merge=lfs -text
27
- first.png filter=lfs diff=lfs merge=lfs -text
28
- fourth.png filter=lfs diff=lfs merge=lfs -text
29
- *.mp4 filter=lfs diff=lfs merge=lfs -text
30
- *.png filter=lfs diff=lfs merge=lfs -text
31
  *.safetensors filter=lfs diff=lfs merge=lfs -text
32
- last_epoch_ckpt/diffusion_pytorch_model.safetensors
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
25
  *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore DELETED
@@ -1,2 +0,0 @@
1
- __pycache__*
2
- .gradio/
 
 
 
LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 rynmurdock
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -1,26 +1,12 @@
1
  ---
2
- license: mit
3
- title: The Other Tiger
 
 
4
  sdk: gradio
5
- sdk_version: 5.31.0
6
- emoji: 👁
7
- colorFrom: blue
8
- colorTo: purple
9
- pinned: true
10
  ---
11
 
12
- # The Other Tiger
13
-
14
- ## tl;dr
15
- Train on embeddings of media preferred by a specific user -> produce embeddings of media they may enjoy.
16
-
17
- In our case here, we take the ECLIPSE `text embedding -> image embedding` prior (https://arxiv.org/abs/2312.04655) and finetune it to become a `preferred image embeddings -> heldout image embedding` prior.
18
-
19
- ### Related work:
20
-
21
- Patron et al. models preference using a diffusion prior and condition on user ids with ratings: https://arxiv.org/abs/2502.18477
22
-
23
- Wang et al. models preference using a generator conditioned on averaged CLIP embeddings of users: https://arxiv.org/abs/2304.03516
24
-
25
- My previous work based on Collaborative Filtering with CLIP embeddings: https://github.com/rynmurdock/generative_recommender
26
-
 
1
  ---
2
+ title: Generative Recsys
3
+ emoji: 🐨
4
+ colorFrom: purple
5
+ colorTo: blue
6
  sdk: gradio
7
+ sdk_version: 4.25.0
8
+ app_file: app.py
9
+ pinned: false
 
 
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -1,289 +1,169 @@
 
1
 
2
  import gradio as gr
 
 
 
 
 
 
 
 
 
 
 
3
  import random
4
  import time
 
5
  import torch
6
- import glob
7
 
8
- import config
9
- from model import get_model_and_tokenizer
 
10
 
11
- model, model.prior_pipe.image_encoder = get_model_and_tokenizer(config.model_path,
12
- 'cuda', torch.bfloat16)
13
 
14
- # TODO unify/merge origin and this
15
- # TODO save & restart from (if it exists) dataframe parquet
16
 
17
- device = "cuda"
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- import spaces
21
- import matplotlib.pyplot as plt
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- import os
24
- import gradio as gr
25
- import pandas as pd
26
- from apscheduler.schedulers.background import BackgroundScheduler
27
 
28
- import random
29
- import time
30
- from PIL import Image
31
- # from safety_checker_improved import maybe_nsfw
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
- torch.set_grad_enabled(False)
35
- torch.backends.cuda.matmul.allow_tf32 = True
36
- torch.backends.cudnn.allow_tf32 = True
37
 
38
- prevs_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'latest_user_to_rate', 'from_user_id', 'text', 'gemb'])
 
 
 
39
 
40
- import spaces
41
- start_time = time.time()
 
42
 
43
- ####################### Setup Model
44
- from diffusers import EulerDiscreteScheduler
45
- from PIL import Image
46
- import uuid
47
 
 
48
 
49
- @spaces.GPU()
50
- def generate_gpu(in_im_embs, prompt='the scene'):
51
- with torch.no_grad():
52
- in_im_embs = in_im_embs.to('cuda')
53
-
54
- negative_image_embeds = in_im_embs[0] # model.prior_pipe.get_zero_embed()
55
- positive_image_embeds = in_im_embs[1]
56
-
57
- images = model.kandinsky_pipe(
58
- num_inference_steps=50,
59
- image_embeds=positive_image_embeds,
60
- negative_image_embeds=negative_image_embeds,
61
- guidance_scale=11,
62
- ).images[0]
63
- cond = (
64
- model.prior_pipe.image_processor(images, return_tensors="pt")
65
- .pixel_values[0]
66
- .unsqueeze(0)
67
- .to(dtype=model.prior_pipe.image_encoder.dtype, device=device)
68
- )
69
- im_emb = model.prior_pipe.image_encoder(cond)["image_embeds"]
70
- return images, im_emb
71
-
72
-
73
- def generate(in_im_embs, ):
74
- output, im_emb = generate_gpu(in_im_embs)
75
- nsfw = False#maybe_nsfw(output.images[0])
76
-
77
- name = str(uuid.uuid4()).replace("-", "")
78
- path = f"/tmp/{name}.png"
79
-
80
- if nsfw:
81
- gr.Warning("NSFW content detected.")
82
- # TODO could return an automatic dislike of auto dislike on the backend for neither as well; just would need refactoring.
83
- return None, im_emb
84
-
85
- output.save(path)
86
- return path, im_emb
87
 
88
 
89
- #######################
90
 
91
- @spaces.GPU()
92
- def sample_embs(prompt_embeds):
93
- latent = torch.randn(prompt_embeds.shape[0], 1, prompt_embeds.shape[-1])
94
- if prompt_embeds.shape[1] < 8: # TODO grab as `k` arg from config
95
- prompt_embeds = torch.nn.functional.pad(prompt_embeds, [0, 0, 0, 8-prompt_embeds.shape[1]])
96
- assert prompt_embeds.shape[1] == 8, f"The model is set to take `k`` cond image embeds but is shape {prompt_embeds.shape}"
97
- image_embeds = model(latent.to('cuda'), prompt_embeds.to('cuda')).predicted_image_embedding
98
-
99
- return image_embeds
100
-
101
- @spaces.GPU()
102
- def get_user_emb(embs, ys):
103
- positives = [e for e, ys in zip(embs, ys) if ys == 1]
104
- embs = random.sample(positives, min(8, len(positives)))
105
- if len(embs) == 0:
106
- positives = torch.zeros_like(im_emb)[None]
107
- else:
108
- positives = torch.stack(embs, 1)
109
-
110
- negs = [e for e, ys in zip(embs, ys) if ys == 0]
111
- negative_embs = random.sample(negs, min(8, len(negs)))
112
- if len(negative_embs) == 0:
113
- negatives = torch.zeros_like(im_emb)[None]
114
- else:
115
- negatives = torch.stack(negative_embs, 1)
116
-
117
- image_embeds = torch.stack([sample_embs(negatives), sample_embs(positives)])
118
-
119
- return image_embeds
120
-
121
-
122
- def background_next_image():
123
- global prevs_df
124
- # only let it get N (maybe 3) ahead of the user
125
- #not_rated_rows = prevs_df[[i[1]['user:rating'] == {' ': ' '} for i in prevs_df.iterrows()]]
126
- rated_rows = prevs_df[[i[1]['user:rating'] != {' ': ' '} for i in prevs_df.iterrows()]]
127
- if len(rated_rows) < 4:
128
- time.sleep(.1)
129
- # not_rated_rows = prevs_df[[i[1]['user:rating'] == {' ': ' '} for i in prevs_df.iterrows()]]
130
- return
131
-
132
- user_id_list = set(rated_rows['latest_user_to_rate'].to_list())
133
- for uid in user_id_list:
134
- rated_rows = prevs_df[[i[1]['user:rating'].get(uid, None) is not None for i in prevs_df.iterrows()]]
135
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(uid, None) is None for i in prevs_df.iterrows()]]
136
-
137
- # we need to intersect not_rated_rows from this user's embed > 7. Just add a new column on which user_id spawned the
138
- # media.
139
-
140
- unrated_from_user = not_rated_rows[[i[1]['from_user_id'] == uid for i in not_rated_rows.iterrows()]]
141
-
142
- # we don't compute more after n are in the queue for them
143
- if len(unrated_from_user) >= 10:
144
- continue
145
-
146
- if len(rated_rows) < 4:
147
- continue
148
-
149
- global glob_idx
150
- glob_idx += 1
151
-
152
- ems = rated_rows['embeddings'].to_list()
153
- ys = [i[uid][0] for i in rated_rows['user:rating'].to_list()]
154
-
155
- emz = get_user_emb(ems, ys)
156
- img, embs = generate(emz)
157
-
158
- if img:
159
- tmp_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'latest_user_to_rate', 'text', 'gemb'])
160
- tmp_df['paths'] = [img]
161
- tmp_df['embeddings'] = [embs.to(torch.float32).to('cpu')]
162
- tmp_df['user:rating'] = [{' ': ' '}]
163
- tmp_df['from_user_id'] = [uid]
164
- tmp_df['text'] = ['']
165
- prevs_df = pd.concat((prevs_df, tmp_df))
166
- # we can free up storage by deleting the image
167
- if len(prevs_df) > 500:
168
- oldest_path = prevs_df.iloc[6]['paths']
169
- if os.path.isfile(oldest_path):
170
- os.remove(oldest_path)
171
- else:
172
- # If it fails, inform the user.
173
- print("Error: %s file not found" % oldest_path)
174
- # only keep 50 images & embeddings & ips, then remove oldest besides calibrating
175
- prevs_df = pd.concat((prevs_df.iloc[:6], prevs_df.iloc[7:]))
176
-
177
- def pluck_img(user_id):
178
- rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, None) is not None for i in prevs_df.iterrows()]]
179
- ems = rated_rows['embeddings'].to_list()
180
- ys = [i[user_id][0] for i in rated_rows['user:rating'].to_list()]
181
- user_emb = get_user_emb(ems, ys)
182
-
183
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, 'gone') == 'gone' for i in prevs_df.iterrows()]]
184
- while len(not_rated_rows) == 0:
185
- not_rated_rows = prevs_df[[i[1]['user:rating'].get(user_id, 'gone') == 'gone' for i in prevs_df.iterrows()]]
186
- time.sleep(.1)
187
- # TODO optimize this lol
188
-
189
- unrated_from_user = not_rated_rows[[i[1]['from_user_id'] == user_id for i in not_rated_rows.iterrows()]]
190
- if len(unrated_from_user) > 0:
191
- print(unrated_from_user)
192
- # NOTE the way I've setup pandas here is so gdm horrible. TODO overhaul
193
- img = unrated_from_user['paths'].to_list()[-1]
194
- return img
195
-
196
- best_sim = -10000000
197
- for i in not_rated_rows.iterrows():
198
- # TODO sloppy .to but it is 3am.
199
- sim = torch.cosine_similarity(i[1]['embeddings'].detach().to('cpu'), user_emb.detach().to('cpu'), -1)
200
- if len(sim) > 1: sim = sim[1]
201
- if sim.squeeze() > best_sim:
202
- best_sim = sim
203
- best_row = i[1]
204
- img = best_row['paths']
205
- return img
206
-
207
- def next_image(calibrate_prompts, user_id):
208
- with torch.no_grad():
209
- # once we've done so many random calibration prompts out of the full media
210
- if len(m_calibrate) - len(calibrate_prompts) < 5:
211
- cal_video = calibrate_prompts.pop(random.randint(0, len(calibrate_prompts)-1))
212
- image = prevs_df[prevs_df['paths'] == cal_video]['paths'].to_list()[0]
213
- # we switch to just getting media by similarity.
214
- else:
215
- image = pluck_img(user_id)
216
- return image, calibrate_prompts
217
 
218
 
219
 
220
 
221
 
222
 
223
- def start(_, calibrate_prompts, user_id, request: gr.Request):
224
- user_id = int(str(time.time())[-7:].replace('.', ''))
225
- image, calibrate_prompts = next_image(calibrate_prompts, user_id)
226
  return [
227
- gr.Button(value='👍', interactive=True),
228
- gr.Button(value='Neither (Space)', interactive=True, visible=False),
229
- gr.Button(value='👎', interactive=True),
230
  gr.Button(value='Start', interactive=False),
231
- gr.Button(value='👍 Content', interactive=True, visible=False),
232
- gr.Button(value='👍 Style', interactive=True, visible=False),
233
  image,
234
- calibrate_prompts,
235
- user_id,
 
236
  ]
237
 
238
 
239
- def choose(img, choice, calibrate_prompts, user_id, request: gr.Request):
240
- global prevs_df
241
-
242
- if choice == '👍':
243
- choice = [1, 1]
244
- elif choice == 'Neither (Space)':
245
- img, calibrate_prompts = next_image(calibrate_prompts, user_id)
246
- return img, calibrate_prompts
247
- elif choice == '👎':
248
- choice = [0, 0]
249
- elif choice == '👍 Style':
250
- choice = [0, 1]
251
- elif choice == '👍 Content':
252
- choice = [1, 0]
253
- else:
254
- assert False, f'choice is {choice}'
255
-
256
- # if we detected NSFW, leave that area of latent space regardless of how they rated chosen.
257
- # TODO skip allowing rating & just continue
258
- if img is None:
259
- print('NSFW -- choice is disliked')
260
- choice = [0, 0]
261
-
262
- row_mask = [p.split('/')[-1] in img for p in prevs_df['paths'].to_list()]
263
- # if it's still in the dataframe, add the choice
264
- if len(prevs_df.loc[row_mask, 'user:rating']) > 0:
265
- prevs_df.loc[row_mask, 'user:rating'][0][user_id] = choice
266
- prevs_df.loc[row_mask, 'latest_user_to_rate'] = [user_id]
267
  else:
268
- print('Image apparently removed', img)
269
- img, calibrate_prompts = next_image(calibrate_prompts, user_id)
270
- return img, calibrate_prompts
 
271
 
272
  css = '''.gradio-container{max-width: 700px !important}
273
  #description{text-align: center}
274
- #description h1, #description h3{display: block}
275
  #description p{margin-top: 0}
276
- .fade-in-out {animation: fadeInOut 3s forwards}
277
- @keyframes fadeInOut {
278
- 0% {
279
- background: var(--bg-color);
280
- }
281
- 100% {
282
- background: var(--button-secondary-background-fill);
283
- }
284
- }
285
  '''
286
- js_head = '''
287
  <script>
288
  document.addEventListener('keydown', function(event) {
289
  if (event.key === 'a' || event.key === 'A') {
@@ -297,143 +177,54 @@ document.addEventListener('keydown', function(event) {
297
  document.getElementById('like').click();
298
  }
299
  });
300
- function fadeInOut(button, color) {
301
- button.style.setProperty('--bg-color', color);
302
- button.classList.remove('fade-in-out');
303
- void button.offsetWidth; // This line forces a repaint by accessing a DOM property
304
-
305
- button.classList.add('fade-in-out');
306
- button.addEventListener('animationend', () => {
307
- button.classList.remove('fade-in-out'); // Reset the animation state
308
- }, {once: true});
309
- }
310
- document.body.addEventListener('click', function(event) {
311
- const target = event.target;
312
- if (target.id === 'dislike') {
313
- fadeInOut(target, '#ff1717');
314
- } else if (target.id === 'like') {
315
- fadeInOut(target, '#006500');
316
- } else if (target.id === 'neither') {
317
- fadeInOut(target, '#cccccc');
318
- }
319
- });
320
-
321
  </script>
322
  '''
323
 
324
- with gr.Blocks(head=js_head, css=css) as demo:
325
- gr.Markdown('''# The Other Tiger
326
- ### Generative Recommenders for Exporation of Possible Images
327
-
328
- Explore the latent space using binary feedback.
329
-
330
- [rynmurdock.github.io](https://rynmurdock.github.io/)
331
  ''', elem_id="description")
332
- user_id = gr.State()
333
- # calibration videos -- this is a misnomer now :D
334
- calibrate_prompts = gr.State( glob.glob('image_init/*') )
335
- def l():
336
- return None
 
 
 
 
 
 
 
 
337
 
338
  with gr.Row(elem_id='output-image'):
339
- img = gr.Image(
340
- label='Lightning',
341
- interactive=False,
342
- elem_id="output_im",
343
- type='filepath',
344
- height=700,
345
- width=700,
346
- )
347
-
348
-
349
-
350
  with gr.Row(equal_height=True):
351
- b3 = gr.Button(value='👎', interactive=False, elem_id="dislike")
352
-
353
- b2 = gr.Button(value='Neither (Space)', interactive=False, elem_id="neither", visible=False)
354
-
355
- b1 = gr.Button(value='👍', interactive=False, elem_id="like")
356
- with gr.Row(equal_height=True):
357
- b6 = gr.Button(value='👍 Style', interactive=False, elem_id="dislike like", visible=False)
358
-
359
- b5 = gr.Button(value='👍 Content', interactive=False, elem_id="like dislike", visible=False)
360
-
361
  b1.click(
362
  choose,
363
- [img, b1, calibrate_prompts, user_id],
364
- [img, calibrate_prompts, ],
365
  )
366
  b2.click(
367
  choose,
368
- [img, b2, calibrate_prompts, user_id],
369
- [img, calibrate_prompts, ],
370
  )
371
  b3.click(
372
  choose,
373
- [img, b3, calibrate_prompts, user_id],
374
- [img, calibrate_prompts, ],
375
- )
376
- b5.click(
377
- choose,
378
- [img, b5, calibrate_prompts, user_id],
379
- [img, calibrate_prompts, ],
380
- )
381
- b6.click(
382
- choose,
383
- [img, b6, calibrate_prompts, user_id],
384
- [img, calibrate_prompts, ],
385
  )
386
  with gr.Row():
387
  b4 = gr.Button(value='Start')
388
  b4.click(start,
389
- [b4, calibrate_prompts, user_id],
390
- [b1, b2, b3, b4, b5, b6, img, calibrate_prompts, user_id, ]
391
- )
392
  with gr.Row():
393
- html = gr.HTML('''<div style='text-align:center; font-size:20px'>You will calibrate for several images and then roam. </ div><br><br><br>
394
-
395
- <br><br>
396
- <div style='text-align:center; font-size:14px'>Thanks to @multimodalart for their contributions to the demo, esp. the interface and @maxbittker for feedback.
397
- </ div>''')
398
-
399
- # TODO quiet logging
400
- scheduler = BackgroundScheduler()
401
- scheduler.add_job(func=background_next_image, trigger="interval", seconds=.2)
402
- scheduler.start()
403
-
404
- # TODO shouldn't call this before gradio launch, yeah?
405
- @spaces.GPU()
406
- def encode_space(x):
407
- im = (
408
- model.prior_pipe.image_processor(x, return_tensors="pt")
409
- .pixel_values[0]
410
- .unsqueeze(0)
411
- .to(dtype=model.prior_pipe.image_encoder.dtype, device=device)
412
- )
413
- im_emb = model.prior_pipe.image_encoder(im)["image_embeds"]
414
- return im_emb.detach().to('cpu').to(torch.float32)
415
-
416
- # NOTE:
417
- # media is moved into a random tmp folder so we need to parse filenames carefully.
418
- # do not have any cases where a file name is the same or could be `in` another filename
419
- # you also maybe can't use jpegs lmao
420
-
421
- # prep our calibration videos
422
- m_calibrate = glob.glob('image_init/*')
423
- for im in m_calibrate:
424
- tmp_df = pd.DataFrame(columns=['paths', 'embeddings', 'ips', 'user:rating', 'text', 'gemb', 'from_user_id'])
425
- tmp_df['paths'] = [im]
426
- image = Image.open(im).convert('RGB')
427
- im_emb = encode_space(image)
428
-
429
- tmp_df['embeddings'] = [im_emb.detach().to('cpu')]
430
- tmp_df['user:rating'] = [{' ': ' '}]
431
- tmp_df['text'] = ['']
432
-
433
- # seems to break things...
434
- tmp_df['from_user_id'] = [0]
435
- tmp_df['latest_user_to_rate'] = [0]
436
- prevs_df = pd.concat((prevs_df, tmp_df))
437
 
438
- glob_idx = 0
439
- demo.launch(share=True,)
 
1
+ DEVICE = 'cpu'
2
 
3
  import gradio as gr
4
+ import numpy as np
5
+ from sklearn.svm import LinearSVC
6
+ from sklearn import preprocessing
7
+ import pandas as pd
8
+
9
+ from diffusers import LCMScheduler, AutoencoderTiny, EulerDiscreteScheduler, UNet2DConditionModel
10
+ from diffusers.models import ImageProjection
11
+ from patch_sdxl import SDEmb
12
+ import torch
13
+ import spaces
14
+
15
  import random
16
  import time
17
+
18
  import torch
19
+ from urllib.request import urlopen
20
 
21
+ from PIL import Image
22
+ import requests
23
+ from io import BytesIO, StringIO
24
 
25
+ from huggingface_hub import hf_hub_download
26
+ from safetensors.torch import load_file
27
 
28
+ prompt_list = [p for p in list(set(
29
+ pd.read_csv('./twitter_prompts.csv').iloc[:, 1].tolist())) if type(p) == str]
30
 
31
+ start_time = time.time()
32
 
33
+ ####################### Setup Model
34
+ model_id = "stabilityai/stable-diffusion-xl-base-1.0"
35
+ sdxl_lightening = "ByteDance/SDXL-Lightning"
36
+ ckpt = "sdxl_lightning_2step_unet.safetensors"
37
+ unet = UNet2DConditionModel.from_config(model_id, subfolder="unet").to("cuda", torch.float16)
38
+ unet.load_state_dict(load_file(hf_hub_download(sdxl_lightening, ckpt), device="cuda"))
39
+ pipe = SDEmb.from_pretrained(model_id, unet=unet, torch_dtype=torch.float16, variant="fp16").to("cuda")
40
+ pipe.vae = AutoencoderTiny.from_pretrained("madebyollin/taesdxl", torch_dtype=torch.float16)
41
+ pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
42
+ pipe.to(device='cuda')
43
+ pipe.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin")
44
+
45
+ output_hidden_state = False
46
+ #######################
47
 
48
+ @spaces.GPU
49
+ def predict(
50
+ prompt,
51
+ im_emb=None,
52
+ progress=gr.Progress(track_tqdm=True)
53
+ ):
54
+ """Run a single prediction on the model"""
55
+ with torch.no_grad():
56
+ if im_emb == None:
57
+ im_emb = torch.zeros(1, 1280, dtype=torch.float16, device='cuda')
58
+ image = pipe(
59
+ prompt=prompt,
60
+ ip_adapter_emb=im_emb.to('cuda'),
61
+ height=1024,
62
+ width=1024,
63
+ num_inference_steps=2,
64
+ guidance_scale=0,
65
+ ).images[0]
66
+ im_emb, _ = pipe.encode_image(
67
+ image, 'cuda', 1, output_hidden_state
68
+ )
69
+ return image, im_emb.to(DEVICE)
70
 
71
+ # TODO add to state instead of shared across all
72
+ glob_idx = 0
 
 
73
 
74
+ def next_image(embs, ys, calibrate_prompts):
75
+ global glob_idx
76
+ glob_idx = glob_idx + 1
 
77
 
78
+ # handle case where every instance of calibration prompts is 'Neither' or 'Like' or 'Dislike'
79
+ if len(calibrate_prompts) == 0 and len(list(set(ys))) <= 1:
80
+ embs.append(.01*torch.randn(1, 1280))
81
+ embs.append(.01*torch.randn(1, 1280))
82
+ ys.append(0)
83
+ ys.append(1)
84
+
85
+ with torch.no_grad():
86
+ if len(calibrate_prompts) > 0:
87
+ print('######### Calibrating with sample prompts #########')
88
+ prompt = calibrate_prompts.pop(0)
89
+ print(prompt)
90
+ image, img_emb = predict(prompt)
91
+ embs.append(img_emb)
92
+ return image, embs, ys, calibrate_prompts
93
+ else:
94
+ print('######### Roaming #########')
95
+ # sample only as many negatives as there are positives
96
+ indices = range(len(ys))
97
+ pos_indices = [i for i in indices if ys[i] == 1]
98
+ neg_indices = [i for i in indices if ys[i] == 0]
99
+ lower = min(len(pos_indices), len(neg_indices))
100
+ neg_indices = random.sample(neg_indices, lower)
101
+ pos_indices = random.sample(pos_indices, lower)
102
 
103
+ cut_embs = [embs[i] for i in neg_indices] + [embs[i] for i in pos_indices]
104
+ cut_ys = [ys[i] for i in neg_indices] + [ys[i] for i in pos_indices]
 
105
 
106
+ feature_embs = torch.stack([e[0].detach().cpu() for e in cut_embs])
107
+ scaler = preprocessing.StandardScaler().fit(feature_embs)
108
+ feature_embs = scaler.transform(feature_embs)
109
+ print(np.array(feature_embs).shape, np.array(ys).shape)
110
 
111
+ lin_class = LinearSVC(max_iter=50000, dual='auto', class_weight='balanced').fit(np.array(feature_embs), np.array(cut_ys))
112
+ lin_class.coef_ = torch.tensor(lin_class.coef_, dtype=torch.double)
113
+ lin_class.coef_ = (lin_class.coef_.flatten() / (lin_class.coef_.flatten().norm())).unsqueeze(0)
114
 
 
 
 
 
115
 
116
+ rng_prompt = random.choice(prompt_list)
117
 
118
+ w = 1# if len(embs) % 2 == 0 else 0
119
+ im_emb = w * lin_class.coef_.to(device=DEVICE, dtype=torch.float16)
120
+ prompt= 'an image' if glob_idx % 2 == 0 else rng_prompt
121
+ print(prompt)
122
+ image, im_emb = predict(prompt, im_emb)
123
+ embs.append(im_emb)
124
+ return image, embs, ys, calibrate_prompts
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
 
126
 
 
127
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
 
129
 
130
 
131
 
132
 
133
 
134
+ def start(_, embs, ys, calibrate_prompts):
135
+ image, embs, ys, calibrate_prompts = next_image(embs, ys, calibrate_prompts)
 
136
  return [
137
+ gr.Button(value='Like (L)', interactive=True),
138
+ gr.Button(value='Neither (Space)', interactive=True),
139
+ gr.Button(value='Dislike (A)', interactive=True),
140
  gr.Button(value='Start', interactive=False),
 
 
141
  image,
142
+ embs,
143
+ ys,
144
+ calibrate_prompts
145
  ]
146
 
147
 
148
+ def choose(choice, embs, ys, calibrate_prompts):
149
+ if choice == 'Like':
150
+ choice = 1
151
+ elif choice == 'Neither':
152
+ _ = embs.pop(-1)
153
+ img, embs, ys, calibrate_prompts = next_image(embs, ys, calibrate_prompts)
154
+ return img, embs, ys, calibrate_prompts
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  else:
156
+ choice = 0
157
+ ys.append(choice)
158
+ img, embs, ys, calibrate_prompts = next_image(embs, ys, calibrate_prompts)
159
+ return img, embs, ys, calibrate_prompts
160
 
161
  css = '''.gradio-container{max-width: 700px !important}
162
  #description{text-align: center}
163
+ #description h1{display: block}
164
  #description p{margin-top: 0}
 
 
 
 
 
 
 
 
 
165
  '''
166
+ js = '''
167
  <script>
168
  document.addEventListener('keydown', function(event) {
169
  if (event.key === 'a' || event.key === 'A') {
 
177
  document.getElementById('like').click();
178
  }
179
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  </script>
181
  '''
182
 
183
+ with gr.Blocks(css=css, head=js) as demo:
184
+ gr.Markdown('''# Generative Recommenders
185
+ Explore the latent space without text prompts, based on your preferences. [Learn more on the blog](https://rynmurdock.github.io/posts/2024/3/generative_recomenders/)
 
 
 
 
186
  ''', elem_id="description")
187
+ embs = gr.State([])
188
+ ys = gr.State([])
189
+ calibrate_prompts = gr.State([
190
+ "4k photo",
191
+ 'surrealist art',
192
+ # 'a psychedelic, fractal view',
193
+ 'a beautiful collage',
194
+ 'abstract art',
195
+ 'an eldritch image',
196
+ 'a sketch',
197
+ # 'a city full of darkness and graffiti',
198
+ '',
199
+ ])
200
 
201
  with gr.Row(elem_id='output-image'):
202
+ img = gr.Image(interactive=False, elem_id='output-image',width=700)
 
 
 
 
 
 
 
 
 
 
203
  with gr.Row(equal_height=True):
204
+ b3 = gr.Button(value='Dislike (A)', interactive=False, elem_id="dislike")
205
+ b2 = gr.Button(value='Neither (Space)', interactive=False, elem_id="neither")
206
+ b1 = gr.Button(value='Like (L)', interactive=False, elem_id="like")
 
 
 
 
 
 
 
207
  b1.click(
208
  choose,
209
+ [b1, embs, ys, calibrate_prompts],
210
+ [img, embs, ys, calibrate_prompts]
211
  )
212
  b2.click(
213
  choose,
214
+ [b2, embs, ys, calibrate_prompts],
215
+ [img, embs, ys, calibrate_prompts]
216
  )
217
  b3.click(
218
  choose,
219
+ [b3, embs, ys, calibrate_prompts],
220
+ [img, embs, ys, calibrate_prompts]
 
 
 
 
 
 
 
 
 
 
221
  )
222
  with gr.Row():
223
  b4 = gr.Button(value='Start')
224
  b4.click(start,
225
+ [b4, embs, ys, calibrate_prompts],
226
+ [b1, b2, b3, b4, img, embs, ys, calibrate_prompts])
 
227
  with gr.Row():
228
+ html = gr.HTML('''<div style='text-align:center; font-size:20px'>You will calibrate for several prompts and then roam.</ div>''')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
 
230
+ demo.launch() # Share your demo with just 1 extra parameter 🚀
 
config.py DELETED
@@ -1,16 +0,0 @@
1
- import torch
2
-
3
- # NOTE model path name changed
4
- model_path = './last_epoch_ckpt/'
5
- lr = 1e-5
6
- device = 'cuda'
7
- dtype = torch.bfloat16
8
- data_path = '../data/lke_2017'
9
- save_path = './'
10
- epochs = 4
11
- batch_size = 16
12
- number_k_clip_embed = 16 # divide by this to determine bundling together of sequences -> CLIP
13
- num_workers = 32
14
- seed = 107
15
-
16
- # TODO config option to swap to diffusion?
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
data.py DELETED
@@ -1,147 +0,0 @@
1
- import torch
2
- from PIL import Image
3
- import random
4
- import logging
5
- import torchvision
6
-
7
- import torchvision.transforms as T
8
- from torchvision.transforms.functional import InterpolationMode
9
-
10
- IMAGENET_MEAN = (0.485, 0.456, 0.406)
11
- IMAGENET_STD = (0.229, 0.224, 0.225)
12
-
13
- def build_transform(input_size):
14
- MEAN, STD = IMAGENET_MEAN, IMAGENET_STD
15
- transform = T.Compose([
16
- T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB' else img),
17
- T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC),
18
- T.ToTensor(),
19
- T.Normalize(mean=MEAN, std=STD)
20
- ])
21
- return transform
22
-
23
- def find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):
24
- best_ratio_diff = float('inf')
25
- best_ratio = (1, 1)
26
- area = width * height
27
- for ratio in target_ratios:
28
- target_aspect_ratio = ratio[0] / ratio[1]
29
- ratio_diff = abs(aspect_ratio - target_aspect_ratio)
30
- if ratio_diff < best_ratio_diff:
31
- best_ratio_diff = ratio_diff
32
- best_ratio = ratio
33
- elif ratio_diff == best_ratio_diff:
34
- if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:
35
- best_ratio = ratio
36
- return best_ratio
37
-
38
- def dynamic_preprocess(image, min_num=1, max_num=8, image_size=448, use_thumbnail=False):
39
- orig_width, orig_height = image.size
40
- aspect_ratio = orig_width / orig_height
41
-
42
- # calculate the existing image aspect ratio
43
- target_ratios = set(
44
- (i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1) if
45
- i * j <= max_num and i * j >= min_num)
46
- target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])
47
-
48
- # find the closest aspect ratio to the target
49
- target_aspect_ratio = find_closest_aspect_ratio(
50
- aspect_ratio, target_ratios, orig_width, orig_height, image_size)
51
-
52
- # calculate the target width and height
53
- target_width = image_size * target_aspect_ratio[0]
54
- target_height = image_size * target_aspect_ratio[1]
55
- blocks = target_aspect_ratio[0] * target_aspect_ratio[1]
56
-
57
- # resize the image
58
- resized_img = image.resize((target_width, target_height))
59
- processed_images = []
60
- for i in range(blocks):
61
- box = (
62
- (i % (target_width // image_size)) * image_size,
63
- (i // (target_width // image_size)) * image_size,
64
- ((i % (target_width // image_size)) + 1) * image_size,
65
- ((i // (target_width // image_size)) + 1) * image_size
66
- )
67
- # split the image
68
- split_img = resized_img.crop(box)
69
- processed_images.append(split_img)
70
- assert len(processed_images) == blocks
71
- if use_thumbnail and len(processed_images) != 1:
72
- thumbnail_img = image.resize((image_size, image_size))
73
- processed_images.append(thumbnail_img)
74
- return processed_images
75
-
76
-
77
- def load_image(image_file, pil_image=None, input_size=224,):
78
- if not pil_image:
79
- pil_image = Image.open(image_file)
80
- image = pil_image.convert('RGB')
81
- transform = build_transform(input_size=input_size)
82
- # images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)
83
- pixel_values = [transform(image) for image in [image]]
84
- pixel_values = torch.stack(pixel_values)
85
- return pixel_values
86
-
87
- def my_collate(batch):
88
- try:
89
- targets = torch.stack([s['target'] for s in batch])
90
- samples = torch.stack([s['samples'] for s in batch])
91
-
92
- # targets = torch.stack([s['target'] for s in batch if s is not None])
93
- # samples = torch.stack([s['samples'] for s in batch if s is not None])
94
- except Exception as e:
95
- logging.warning('my_collate issue ', e)
96
- return None
97
- return samples, targets
98
-
99
-
100
- class ImageFolderSample(torchvision.datasets.ImageFolder):
101
- def __init__(self, data_path, k, processor):
102
- super().__init__(data_path)
103
- self.k = k
104
- self.processor = processor
105
-
106
- def safe_getitem(self, index):
107
- try:
108
- target_path, class_type = self.samples[index]
109
- target = torch.from_numpy(self.processor(self.loader(target_path)).data['pixel_values'][0])
110
-
111
- input_paths = random.choices([p[0] for p in self.samples if p != target_path and class_type in p], k=self.k)
112
- assert len(input_paths) == self.k # I think it may do this by default...
113
- samples = torch.stack([torch.from_numpy(self.processor(self.loader(i)).data['pixel_values'][0]) for i in input_paths])
114
- except Exception as e:
115
- logging.warning('getitem issue ', e)
116
- samples, target = None, None
117
-
118
- drop_mask = torch.rand(samples.shape[0],) < .2
119
- samples[drop_mask] = 0
120
-
121
- drop_whole_set_mask = torch.rand(1,) < .1
122
- if drop_whole_set_mask:
123
- samples = torch.zeros_like(samples)
124
- return {'samples': samples[:, :3], 'target': target[:3]}
125
-
126
- def __getitem__(self, index: int):
127
- return self.safe_getitem(index)
128
-
129
-
130
- # https://data.mendeley.com/datasets/fs4k2zc5j5/3
131
- # Gomez, J. C., Ibarra-Manzano, M. A., & Almanza-Ojeda, D. L. (2017). User Identification in Pinterest Through the Refinement of Cascade Fusion of Text and Images. Research in Computing Science, 144, 41-52.
132
- def get_dataset(data_path, processor):
133
- return ImageFolderSample(data_path, 8, processor)
134
-
135
-
136
- def get_dataloader(data_path, batch_size, num_workers, processor):
137
- dataloader = torch.utils.data.DataLoader(
138
- get_dataset(data_path, processor=processor),
139
- num_workers=num_workers,
140
- collate_fn=my_collate,
141
- batch_size=batch_size,
142
- shuffle=True,
143
- drop_last=True
144
- )
145
- return dataloader
146
-
147
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
image_init/10o.png DELETED

Git LFS Details

  • SHA256: 16edbcb1b5cab0d32244ac9faac2f9e25724e00532c867f0b1cd4808cacc1054
  • Pointer size: 131 Bytes
  • Size of remote file: 388 kB
image_init/1o.png DELETED

Git LFS Details

  • SHA256: 15faf7373356cbcc59531da9d02ffe3642826c156409a4a8d88904aca295ebba
  • Pointer size: 131 Bytes
  • Size of remote file: 357 kB
image_init/2o.png DELETED

Git LFS Details

  • SHA256: 5783269bf3847cd08bbf312b2cb53b241a29345564db8e5fe04235b664ee7d5c
  • Pointer size: 132 Bytes
  • Size of remote file: 5.49 MB
image_init/3o.png DELETED

Git LFS Details

  • SHA256: 9070c259c85fc86cce84c1d5ae951588fcc331210350d75601ed89d114b33ec7
  • Pointer size: 132 Bytes
  • Size of remote file: 2 MB
image_init/4o.png DELETED

Git LFS Details

  • SHA256: dffbc9cebbd743c2cdbda578be45c8114b6528d02ab8f71b7cdc057ff84b26a4
  • Pointer size: 132 Bytes
  • Size of remote file: 1.98 MB
image_init/5o.png DELETED

Git LFS Details

  • SHA256: 6683ea703e4f134185a7100ef3e78dac04041340584494799cba5d925fb228df
  • Pointer size: 132 Bytes
  • Size of remote file: 1.21 MB
image_init/6o.png DELETED

Git LFS Details

  • SHA256: 6cf8b9917283b2c5b2d74d5042d0219f7d458e85d1e0c8189aae99f16e304adb
  • Pointer size: 132 Bytes
  • Size of remote file: 1.53 MB
image_init/7o.png DELETED

Git LFS Details

  • SHA256: 76813201ae0f9f845ad8c75c500f72cfa63f2b5d59e6f95ceff3288d0303e1c3
  • Pointer size: 131 Bytes
  • Size of remote file: 469 kB
image_init/8o.png DELETED

Git LFS Details

  • SHA256: d42dffc1ac16cb1645bb24336798671984341fd90c9ab88d3e8ef052afb64429
  • Pointer size: 132 Bytes
  • Size of remote file: 1.01 MB
image_init/9o.png DELETED

Git LFS Details

  • SHA256: 3b687042ce41cf61aa112473c276753992571f15be1e3526479139394d8ed49d
  • Pointer size: 131 Bytes
  • Size of remote file: 463 kB
last_epoch_ckpt/config.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "_class_name": "PriorTransformer",
3
- "_diffusers_version": "0.34.0.dev0",
4
- "_name_or_path": "./last_epoch_ckpt/",
5
- "added_emb_type": "prd",
6
- "additional_embeddings": 3,
7
- "attention_head_dim": 32,
8
- "clip_embed_dim": null,
9
- "dropout": 0.0,
10
- "embedding_dim": 1280,
11
- "embedding_proj_dim": null,
12
- "embedding_proj_norm_type": null,
13
- "encoder_hid_proj_type": "linear",
14
- "norm_in_type": null,
15
- "num_attention_heads": 16,
16
- "num_embeddings": 77,
17
- "num_layers": 10
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
last_epoch_ckpt/diffusion_pytorch_model.safetensors DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:91ca25967a5dd1665b5fb8f1b4a45ba0f7ad0c23929daefb26b267816616e05d
3
- size 136790920
 
 
 
 
latest_val.png DELETED

Git LFS Details

  • SHA256: 5a251efe84452e962b3626af8824ec871bc5bd1be3351332484a6a3c7b5e3ddd
  • Pointer size: 131 Bytes
  • Size of remote file: 469 kB
model.py DELETED
@@ -1,52 +0,0 @@
1
-
2
- import torch
3
- import logging
4
- from diffusers import DiffusionPipeline
5
-
6
- from prior.pipeline_kandinsky_prior import KandinskyPriorPipeline
7
- from prior.prior_transformer import PriorTransformer
8
-
9
-
10
- class Zoo(torch.nn.Module):
11
- def __init__(self, prior, prior_pipe, kandinsky_pipe, ) -> None:
12
- super().__init__()
13
- self.prior = prior
14
- self.prior_pipe = prior_pipe
15
- self.kandinsky_pipe = kandinsky_pipe
16
- self.pre_prior_transformer = None
17
- # NOTE we may get better perf from freezing our prior
18
- # and only training a transformer adapter?
19
-
20
- def forward(self, latents, preferred_embeds):
21
- pred = self.prior(latents, preferred_embeds)
22
- return pred
23
-
24
- def do_validation(self, images): # TODO constant val seed
25
- assert all([len(i) == 8 for i in images]), f'We have must have `k` images, not {len(images)}.'
26
- image_embeds, negative_image_embeds = self.prior_pipe(images).to_tuple()
27
- images = self.kandinsky_pipe(
28
- num_inference_steps=50,
29
- image_embeds=image_embeds,
30
- negative_image_embeds=negative_image_embeds,
31
- ).images
32
- images[0].save('latest_val.png')
33
- return images
34
-
35
- def get_model_and_tokenizer(path, device, dtype):
36
- prior = PriorTransformer.from_pretrained("ECLIPSE-Community/ECLIPSE_KandinskyV22_Prior"
37
- if path is None else path).to(device)
38
-
39
- pipe_prior = KandinskyPriorPipeline.from_pretrained("kandinsky-community/kandinsky-2-2-prior", prior=prior).to(device)
40
- pipe_prior.image_encoder = pipe_prior.image_encoder.to(device, dtype)
41
- # Note: don't set the prior to `dtype`` as it may be half precision,
42
- # and we're training with mixed precision
43
- # so we need to keep our full-precision weight for trained params
44
- kandinsky_pipe = DiffusionPipeline.from_pretrained("kandinsky-community/kandinsky-2-2-decoder").to(device, dtype)
45
- model = Zoo(prior, pipe_prior, kandinsky_pipe).to(device)
46
-
47
- return model, model.prior_pipe.image_encoder
48
-
49
- def get_optimizer(params, lr):
50
- logging.info(f'Training: {params}')
51
- optimizer = torch.optim.AdamW(params, lr=lr)
52
- return optimizer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
patch_sdxl.py ADDED
@@ -0,0 +1,559 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import inspect
2
+ from typing import Any, Callable, Dict, List, Optional, Union, Tuple
3
+
4
+ from diffusers import StableDiffusionXLPipeline
5
+
6
+ import torch
7
+ from packaging import version
8
+ from transformers import CLIPImageProcessor, CLIPTextModel, CLIPTokenizer, CLIPVisionModelWithProjection
9
+
10
+ from diffusers.configuration_utils import FrozenDict
11
+ from diffusers.image_processor import PipelineImageInput, VaeImageProcessor
12
+ from diffusers.loaders import FromSingleFileMixin, IPAdapterMixin, LoraLoaderMixin, TextualInversionLoaderMixin
13
+ from diffusers.models import AutoencoderKL, ImageProjection, UNet2DConditionModel
14
+ from diffusers.models.attention_processor import FusedAttnProcessor2_0
15
+ from diffusers.models.lora import adjust_lora_scale_text_encoder
16
+ from diffusers.schedulers import KarrasDiffusionSchedulers
17
+ from diffusers.utils import (
18
+ USE_PEFT_BACKEND,
19
+ deprecate,
20
+ logging,
21
+ replace_example_docstring,
22
+ scale_lora_layers,
23
+ unscale_lora_layers,
24
+ )
25
+ from diffusers.pipelines.stable_diffusion_xl import StableDiffusionXLPipelineOutput
26
+
27
+
28
+
29
+ from transformers import CLIPFeatureExtractor
30
+ import numpy as np
31
+ import torch
32
+ from PIL import Image
33
+ from typing import Optional, Tuple, Union
34
+
35
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
36
+ torch_device = device
37
+ torch_dtype = torch.float16
38
+
39
+
40
+ logger = logging.get_logger(__name__) # pylint: disable=invalid-name
41
+
42
+ EXAMPLE_DOC_STRING = """
43
+ Examples:
44
+ ```py
45
+ >>> import torch
46
+ >>> from diffusers import StableDiffusionPipeline
47
+
48
+ >>> pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16)
49
+ >>> pipe = pipe.to("cuda")
50
+
51
+ >>> prompt = "a photo of an astronaut riding a horse on mars"
52
+ >>> image = pipe(prompt).images[0]
53
+ ```
54
+ """
55
+
56
+
57
+ def rescale_noise_cfg(noise_cfg, noise_pred_text, guidance_rescale=0.0):
58
+ """
59
+ Rescale `noise_cfg` according to `guidance_rescale`. Based on findings of [Common Diffusion Noise Schedules and
60
+ Sample Steps are Flawed](https://arxiv.org/pdf/2305.08891.pdf). See Section 3.4
61
+ """
62
+ std_text = noise_pred_text.std(dim=list(range(1, noise_pred_text.ndim)), keepdim=True)
63
+ std_cfg = noise_cfg.std(dim=list(range(1, noise_cfg.ndim)), keepdim=True)
64
+ # rescale the results from guidance (fixes overexposure)
65
+ noise_pred_rescaled = noise_cfg * (std_text / std_cfg)
66
+ # mix with the original results from guidance by factor guidance_rescale to avoid "plain looking" images
67
+ noise_cfg = guidance_rescale * noise_pred_rescaled + (1 - guidance_rescale) * noise_cfg
68
+ return noise_cfg
69
+
70
+
71
+ def retrieve_timesteps(
72
+ scheduler,
73
+ num_inference_steps: Optional[int] = None,
74
+ device: Optional[Union[str, torch.device]] = None,
75
+ timesteps: Optional[List[int]] = None,
76
+ **kwargs,
77
+ ):
78
+ """
79
+ Calls the scheduler's `set_timesteps` method and retrieves timesteps from the scheduler after the call. Handles
80
+ custom timesteps. Any kwargs will be supplied to `scheduler.set_timesteps`.
81
+
82
+ Args:
83
+ scheduler (`SchedulerMixin`):
84
+ The scheduler to get timesteps from.
85
+ num_inference_steps (`int`):
86
+ The number of diffusion steps used when generating samples with a pre-trained model. If used,
87
+ `timesteps` must be `None`.
88
+ device (`str` or `torch.device`, *optional*):
89
+ The device to which the timesteps should be moved to. If `None`, the timesteps are not moved.
90
+ timesteps (`List[int]`, *optional*):
91
+ Custom timesteps used to support arbitrary spacing between timesteps. If `None`, then the default
92
+ timestep spacing strategy of the scheduler is used. If `timesteps` is passed, `num_inference_steps`
93
+ must be `None`.
94
+
95
+ Returns:
96
+ `Tuple[torch.Tensor, int]`: A tuple where the first element is the timestep schedule from the scheduler and the
97
+ second element is the number of inference steps.
98
+ """
99
+ if timesteps is not None:
100
+ accepts_timesteps = "timesteps" in set(inspect.signature(scheduler.set_timesteps).parameters.keys())
101
+ if not accepts_timesteps:
102
+ raise ValueError(
103
+ f"The current scheduler class {scheduler.__class__}'s `set_timesteps` does not support custom"
104
+ f" timestep schedules. Please check whether you are using the correct scheduler."
105
+ )
106
+ scheduler.set_timesteps(timesteps=timesteps, device=device, **kwargs)
107
+ timesteps = scheduler.timesteps
108
+ num_inference_steps = len(timesteps)
109
+ else:
110
+ scheduler.set_timesteps(num_inference_steps, device=device, **kwargs)
111
+ timesteps = scheduler.timesteps
112
+ return timesteps, num_inference_steps
113
+
114
+
115
+ class SDEmb(StableDiffusionXLPipeline):
116
+ @torch.no_grad()
117
+ @replace_example_docstring(EXAMPLE_DOC_STRING)
118
+ def __call__(
119
+ self,
120
+ prompt: Union[str, List[str]] = None,
121
+ prompt_2: Optional[Union[str, List[str]]] = None,
122
+ height: Optional[int] = None,
123
+ width: Optional[int] = None,
124
+ num_inference_steps: int = 50,
125
+ timesteps: List[int] = None,
126
+ denoising_end: Optional[float] = None,
127
+ guidance_scale: float = 5.0,
128
+ negative_prompt: Optional[Union[str, List[str]]] = None,
129
+ negative_prompt_2: Optional[Union[str, List[str]]] = None,
130
+ num_images_per_prompt: Optional[int] = 1,
131
+ eta: float = 0.0,
132
+ generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None,
133
+ latents: Optional[torch.FloatTensor] = None,
134
+ prompt_embeds: Optional[torch.FloatTensor] = None,
135
+ negative_prompt_embeds: Optional[torch.FloatTensor] = None,
136
+ pooled_prompt_embeds: Optional[torch.FloatTensor] = None,
137
+ negative_pooled_prompt_embeds: Optional[torch.FloatTensor] = None,
138
+ ip_adapter_image: Optional[PipelineImageInput] = None,
139
+ output_type: Optional[str] = "pil",
140
+ return_dict: bool = True,
141
+ cross_attention_kwargs: Optional[Dict[str, Any]] = None,
142
+ guidance_rescale: float = 0.0,
143
+ original_size: Optional[Tuple[int, int]] = None,
144
+ crops_coords_top_left: Tuple[int, int] = (0, 0),
145
+ target_size: Optional[Tuple[int, int]] = None,
146
+ negative_original_size: Optional[Tuple[int, int]] = None,
147
+ negative_crops_coords_top_left: Tuple[int, int] = (0, 0),
148
+ negative_target_size: Optional[Tuple[int, int]] = None,
149
+ clip_skip: Optional[int] = None,
150
+ callback_on_step_end: Optional[Callable[[int, int, Dict], None]] = None,
151
+ callback_on_step_end_tensor_inputs: List[str] = ["latents"],
152
+ ip_adapter_emb=None,
153
+ **kwargs,
154
+ ):
155
+ r"""
156
+ Function invoked when calling the pipeline for generation.
157
+
158
+ Args:
159
+ prompt (`str` or `List[str]`, *optional*):
160
+ The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`.
161
+ instead.
162
+ prompt_2 (`str` or `List[str]`, *optional*):
163
+ The prompt or prompts to be sent to the `tokenizer_2` and `text_encoder_2`. If not defined, `prompt` is
164
+ used in both text-encoders
165
+ height (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor):
166
+ The height in pixels of the generated image. This is set to 1024 by default for the best results.
167
+ Anything below 512 pixels won't work well for
168
+ [stabilityai/stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0)
169
+ and checkpoints that are not specifically fine-tuned on low resolutions.
170
+ width (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor):
171
+ The width in pixels of the generated image. This is set to 1024 by default for the best results.
172
+ Anything below 512 pixels won't work well for
173
+ [stabilityai/stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0)
174
+ and checkpoints that are not specifically fine-tuned on low resolutions.
175
+ num_inference_steps (`int`, *optional*, defaults to 50):
176
+ The number of denoising steps. More denoising steps usually lead to a higher quality image at the
177
+ expense of slower inference.
178
+ timesteps (`List[int]`, *optional*):
179
+ Custom timesteps to use for the denoising process with schedulers which support a `timesteps` argument
180
+ in their `set_timesteps` method. If not defined, the default behavior when `num_inference_steps` is
181
+ passed will be used. Must be in descending order.
182
+ denoising_end (`float`, *optional*):
183
+ When specified, determines the fraction (between 0.0 and 1.0) of the total denoising process to be
184
+ completed before it is intentionally prematurely terminated. As a result, the returned sample will
185
+ still retain a substantial amount of noise as determined by the discrete timesteps selected by the
186
+ scheduler. The denoising_end parameter should ideally be utilized when this pipeline forms a part of a
187
+ "Mixture of Denoisers" multi-pipeline setup, as elaborated in [**Refining the Image
188
+ Output**](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/stable_diffusion_xl#refining-the-image-output)
189
+ guidance_scale (`float`, *optional*, defaults to 5.0):
190
+ Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598).
191
+ `guidance_scale` is defined as `w` of equation 2. of [Imagen
192
+ Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale >
193
+ 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`,
194
+ usually at the expense of lower image quality.
195
+ negative_prompt (`str` or `List[str]`, *optional*):
196
+ The prompt or prompts not to guide the image generation. If not defined, one has to pass
197
+ `negative_prompt_embeds` instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` is
198
+ less than `1`).
199
+ negative_prompt_2 (`str` or `List[str]`, *optional*):
200
+ The prompt or prompts not to guide the image generation to be sent to `tokenizer_2` and
201
+ `text_encoder_2`. If not defined, `negative_prompt` is used in both text-encoders
202
+ num_images_per_prompt (`int`, *optional*, defaults to 1):
203
+ The number of images to generate per prompt.
204
+ eta (`float`, *optional*, defaults to 0.0):
205
+ Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to
206
+ [`schedulers.DDIMScheduler`], will be ignored for others.
207
+ generator (`torch.Generator` or `List[torch.Generator]`, *optional*):
208
+ One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html)
209
+ to make generation deterministic.
210
+ latents (`torch.FloatTensor`, *optional*):
211
+ Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image
212
+ generation. Can be used to tweak the same generation with different prompts. If not provided, a latents
213
+ tensor will ge generated by sampling using the supplied random `generator`.
214
+ prompt_embeds (`torch.FloatTensor`, *optional*):
215
+ Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not
216
+ provided, text embeddings will be generated from `prompt` input argument.
217
+ negative_prompt_embeds (`torch.FloatTensor`, *optional*):
218
+ Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt
219
+ weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input
220
+ argument.
221
+ pooled_prompt_embeds (`torch.FloatTensor`, *optional*):
222
+ Pre-generated pooled text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting.
223
+ If not provided, pooled text embeddings will be generated from `prompt` input argument.
224
+ negative_pooled_prompt_embeds (`torch.FloatTensor`, *optional*):
225
+ Pre-generated negative pooled text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt
226
+ weighting. If not provided, pooled negative_prompt_embeds will be generated from `negative_prompt`
227
+ input argument.
228
+ ip_adapter_image: (`PipelineImageInput`, *optional*): Optional image input to work with IP Adapters.
229
+ output_type (`str`, *optional*, defaults to `"pil"`):
230
+ The output format of the generate image. Choose between
231
+ [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`.
232
+ return_dict (`bool`, *optional*, defaults to `True`):
233
+ Whether or not to return a [`~pipelines.stable_diffusion_xl.StableDiffusionXLPipelineOutput`] instead
234
+ of a plain tuple.
235
+ cross_attention_kwargs (`dict`, *optional*):
236
+ A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under
237
+ `self.processor` in
238
+ [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).
239
+ guidance_rescale (`float`, *optional*, defaults to 0.0):
240
+ Guidance rescale factor proposed by [Common Diffusion Noise Schedules and Sample Steps are
241
+ Flawed](https://arxiv.org/pdf/2305.08891.pdf) `guidance_scale` is defined as `φ` in equation 16. of
242
+ [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://arxiv.org/pdf/2305.08891.pdf).
243
+ Guidance rescale factor should fix overexposure when using zero terminal SNR.
244
+ original_size (`Tuple[int]`, *optional*, defaults to (1024, 1024)):
245
+ If `original_size` is not the same as `target_size` the image will appear to be down- or upsampled.
246
+ `original_size` defaults to `(height, width)` if not specified. Part of SDXL's micro-conditioning as
247
+ explained in section 2.2 of
248
+ [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952).
249
+ crops_coords_top_left (`Tuple[int]`, *optional*, defaults to (0, 0)):
250
+ `crops_coords_top_left` can be used to generate an image that appears to be "cropped" from the position
251
+ `crops_coords_top_left` downwards. Favorable, well-centered images are usually achieved by setting
252
+ `crops_coords_top_left` to (0, 0). Part of SDXL's micro-conditioning as explained in section 2.2 of
253
+ [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952).
254
+ target_size (`Tuple[int]`, *optional*, defaults to (1024, 1024)):
255
+ For most cases, `target_size` should be set to the desired height and width of the generated image. If
256
+ not specified it will default to `(height, width)`. Part of SDXL's micro-conditioning as explained in
257
+ section 2.2 of [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952).
258
+ negative_original_size (`Tuple[int]`, *optional*, defaults to (1024, 1024)):
259
+ To negatively condition the generation process based on a specific image resolution. Part of SDXL's
260
+ micro-conditioning as explained in section 2.2 of
261
+ [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). For more
262
+ information, refer to this issue thread: https://github.com/huggingface/diffusers/issues/4208.
263
+ negative_crops_coords_top_left (`Tuple[int]`, *optional*, defaults to (0, 0)):
264
+ To negatively condition the generation process based on a specific crop coordinates. Part of SDXL's
265
+ micro-conditioning as explained in section 2.2 of
266
+ [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). For more
267
+ information, refer to this issue thread: https://github.com/huggingface/diffusers/issues/4208.
268
+ negative_target_size (`Tuple[int]`, *optional*, defaults to (1024, 1024)):
269
+ To negatively condition the generation process based on a target image resolution. It should be as same
270
+ as the `target_size` for most cases. Part of SDXL's micro-conditioning as explained in section 2.2 of
271
+ [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). For more
272
+ information, refer to this issue thread: https://github.com/huggingface/diffusers/issues/4208.
273
+ callback_on_step_end (`Callable`, *optional*):
274
+ A function that calls at the end of each denoising steps during the inference. The function is called
275
+ with the following arguments: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int,
276
+ callback_kwargs: Dict)`. `callback_kwargs` will include a list of all tensors as specified by
277
+ `callback_on_step_end_tensor_inputs`.
278
+ callback_on_step_end_tensor_inputs (`List`, *optional*):
279
+ The list of tensor inputs for the `callback_on_step_end` function. The tensors specified in the list
280
+ will be passed as `callback_kwargs` argument. You will only be able to include variables listed in the
281
+ `._callback_tensor_inputs` attribute of your pipeline class.
282
+
283
+ Examples:
284
+
285
+ Returns:
286
+ [`~pipelines.stable_diffusion_xl.StableDiffusionXLPipelineOutput`] or `tuple`:
287
+ [`~pipelines.stable_diffusion_xl.StableDiffusionXLPipelineOutput`] if `return_dict` is True, otherwise a
288
+ `tuple`. When returning a tuple, the first element is a list with the generated images.
289
+ """
290
+
291
+ callback = kwargs.pop("callback", None)
292
+ callback_steps = kwargs.pop("callback_steps", None)
293
+
294
+ if callback is not None:
295
+ deprecate(
296
+ "callback",
297
+ "1.0.0",
298
+ "Passing `callback` as an input argument to `__call__` is deprecated, consider use `callback_on_step_end`",
299
+ )
300
+ if callback_steps is not None:
301
+ deprecate(
302
+ "callback_steps",
303
+ "1.0.0",
304
+ "Passing `callback_steps` as an input argument to `__call__` is deprecated, consider use `callback_on_step_end`",
305
+ )
306
+
307
+ # 0. Default height and width to unet
308
+ height = height or self.default_sample_size * self.vae_scale_factor
309
+ width = width or self.default_sample_size * self.vae_scale_factor
310
+
311
+ original_size = original_size or (height, width)
312
+ target_size = target_size or (height, width)
313
+
314
+ # 1. Check inputs. Raise error if not correct
315
+ self.check_inputs(
316
+ prompt,
317
+ prompt_2,
318
+ height,
319
+ width,
320
+ callback_steps,
321
+ negative_prompt,
322
+ negative_prompt_2,
323
+ prompt_embeds,
324
+ negative_prompt_embeds,
325
+ pooled_prompt_embeds,
326
+ negative_pooled_prompt_embeds,
327
+ callback_on_step_end_tensor_inputs,
328
+ )
329
+
330
+ self._guidance_scale = guidance_scale
331
+ self._guidance_rescale = guidance_rescale
332
+ self._clip_skip = clip_skip
333
+ self._cross_attention_kwargs = cross_attention_kwargs
334
+ self._denoising_end = denoising_end
335
+ self._interrupt = False
336
+
337
+ # 2. Define call parameters
338
+ if prompt is not None and isinstance(prompt, str):
339
+ batch_size = 1
340
+ elif prompt is not None and isinstance(prompt, list):
341
+ batch_size = len(prompt)
342
+ else:
343
+ batch_size = prompt_embeds.shape[0]
344
+
345
+ device = self._execution_device
346
+
347
+ # 3. Encode input prompt
348
+ lora_scale = (
349
+ self.cross_attention_kwargs.get("scale", None) if self.cross_attention_kwargs is not None else None
350
+ )
351
+
352
+ (
353
+ prompt_embeds,
354
+ negative_prompt_embeds,
355
+ pooled_prompt_embeds,
356
+ negative_pooled_prompt_embeds,
357
+ ) = self.encode_prompt(
358
+ prompt=prompt,
359
+ prompt_2=prompt_2,
360
+ device=device,
361
+ num_images_per_prompt=num_images_per_prompt,
362
+ do_classifier_free_guidance=self.do_classifier_free_guidance,
363
+ negative_prompt=negative_prompt,
364
+ negative_prompt_2=negative_prompt_2,
365
+ prompt_embeds=prompt_embeds,
366
+ negative_prompt_embeds=negative_prompt_embeds,
367
+ pooled_prompt_embeds=pooled_prompt_embeds,
368
+ negative_pooled_prompt_embeds=negative_pooled_prompt_embeds,
369
+ lora_scale=lora_scale,
370
+ clip_skip=self.clip_skip,
371
+ )
372
+
373
+ # 4. Prepare timesteps
374
+ timesteps, num_inference_steps = retrieve_timesteps(self.scheduler, num_inference_steps, device, timesteps)
375
+
376
+ # 5. Prepare latent variables
377
+ num_channels_latents = self.unet.config.in_channels
378
+ latents = self.prepare_latents(
379
+ batch_size * num_images_per_prompt,
380
+ num_channels_latents,
381
+ height,
382
+ width,
383
+ prompt_embeds.dtype,
384
+ device,
385
+ generator,
386
+ latents,
387
+ )
388
+
389
+ # 6. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline
390
+ extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta)
391
+
392
+ # 7. Prepare added time ids & embeddings
393
+ add_text_embeds = pooled_prompt_embeds
394
+ if self.text_encoder_2 is None:
395
+ text_encoder_projection_dim = int(pooled_prompt_embeds.shape[-1])
396
+ else:
397
+ text_encoder_projection_dim = self.text_encoder_2.config.projection_dim
398
+
399
+ add_time_ids = self._get_add_time_ids(
400
+ original_size,
401
+ crops_coords_top_left,
402
+ target_size,
403
+ dtype=prompt_embeds.dtype,
404
+ text_encoder_projection_dim=text_encoder_projection_dim,
405
+ )
406
+ if negative_original_size is not None and negative_target_size is not None:
407
+ negative_add_time_ids = self._get_add_time_ids(
408
+ negative_original_size,
409
+ negative_crops_coords_top_left,
410
+ negative_target_size,
411
+ dtype=prompt_embeds.dtype,
412
+ text_encoder_projection_dim=text_encoder_projection_dim,
413
+ )
414
+ else:
415
+ negative_add_time_ids = add_time_ids
416
+
417
+ if self.do_classifier_free_guidance:
418
+ prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds], dim=0)
419
+ add_text_embeds = torch.cat([negative_pooled_prompt_embeds, add_text_embeds], dim=0)
420
+ add_time_ids = torch.cat([negative_add_time_ids, add_time_ids], dim=0)
421
+
422
+ prompt_embeds = prompt_embeds.to(device)
423
+ add_text_embeds = add_text_embeds.to(device)
424
+ add_time_ids = add_time_ids.to(device).repeat(batch_size * num_images_per_prompt, 1)
425
+
426
+ if ip_adapter_emb is not None:
427
+ image_embeds = ip_adapter_emb
428
+
429
+ elif ip_adapter_image is not None:
430
+ output_hidden_state = False if isinstance(self.unet.encoder_hid_proj, ImageProjection) else True
431
+ image_embeds, negative_image_embeds = self.encode_image(
432
+ ip_adapter_image, device, num_images_per_prompt, output_hidden_state
433
+ )
434
+ if self.do_classifier_free_guidance:
435
+ image_embeds = torch.cat([negative_image_embeds, image_embeds])
436
+
437
+ # 8. Denoising loop
438
+ num_warmup_steps = max(len(timesteps) - num_inference_steps * self.scheduler.order, 0)
439
+
440
+ # 8.1 Apply denoising_end
441
+ if (
442
+ self.denoising_end is not None
443
+ and isinstance(self.denoising_end, float)
444
+ and self.denoising_end > 0
445
+ and self.denoising_end < 1
446
+ ):
447
+ discrete_timestep_cutoff = int(
448
+ round(
449
+ self.scheduler.config.num_train_timesteps
450
+ - (self.denoising_end * self.scheduler.config.num_train_timesteps)
451
+ )
452
+ )
453
+ num_inference_steps = len(list(filter(lambda ts: ts >= discrete_timestep_cutoff, timesteps)))
454
+ timesteps = timesteps[:num_inference_steps]
455
+
456
+ # 9. Optionally get Guidance Scale Embedding
457
+ timestep_cond = None
458
+ if self.unet.config.time_cond_proj_dim is not None:
459
+ guidance_scale_tensor = torch.tensor(self.guidance_scale - 1).repeat(batch_size * num_images_per_prompt)
460
+ timestep_cond = self.get_guidance_scale_embedding(
461
+ guidance_scale_tensor, embedding_dim=self.unet.config.time_cond_proj_dim
462
+ ).to(device=device, dtype=latents.dtype)
463
+
464
+ self._num_timesteps = len(timesteps)
465
+ with self.progress_bar(total=num_inference_steps) as progress_bar:
466
+ for i, t in enumerate(timesteps):
467
+ if self.interrupt:
468
+ continue
469
+
470
+ # expand the latents if we are doing classifier free guidance
471
+ latent_model_input = torch.cat([latents] * 2) if self.do_classifier_free_guidance else latents
472
+
473
+ latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)
474
+
475
+ # predict the noise residual
476
+ added_cond_kwargs = {"text_embeds": add_text_embeds, "time_ids": add_time_ids}
477
+ if ip_adapter_image is not None or ip_adapter_emb is not None:
478
+ added_cond_kwargs["image_embeds"] = image_embeds
479
+ noise_pred = self.unet(
480
+ latent_model_input,
481
+ t,
482
+ encoder_hidden_states=prompt_embeds,
483
+ timestep_cond=timestep_cond,
484
+ cross_attention_kwargs=self.cross_attention_kwargs,
485
+ added_cond_kwargs=added_cond_kwargs,
486
+ return_dict=False,
487
+ )[0]
488
+
489
+ # perform guidance
490
+ if self.do_classifier_free_guidance:
491
+ noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)
492
+ noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_text - noise_pred_uncond)
493
+
494
+ if self.do_classifier_free_guidance and self.guidance_rescale > 0.0:
495
+ # Based on 3.4. in https://arxiv.org/pdf/2305.08891.pdf
496
+ noise_pred = rescale_noise_cfg(noise_pred, noise_pred_text, guidance_rescale=self.guidance_rescale)
497
+
498
+ # compute the previous noisy sample x_t -> x_t-1
499
+ latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0]
500
+
501
+ if callback_on_step_end is not None:
502
+ callback_kwargs = {}
503
+ for k in callback_on_step_end_tensor_inputs:
504
+ callback_kwargs[k] = locals()[k]
505
+ callback_outputs = callback_on_step_end(self, i, t, callback_kwargs)
506
+
507
+ latents = callback_outputs.pop("latents", latents)
508
+ prompt_embeds = callback_outputs.pop("prompt_embeds", prompt_embeds)
509
+ negative_prompt_embeds = callback_outputs.pop("negative_prompt_embeds", negative_prompt_embeds)
510
+ add_text_embeds = callback_outputs.pop("add_text_embeds", add_text_embeds)
511
+ negative_pooled_prompt_embeds = callback_outputs.pop(
512
+ "negative_pooled_prompt_embeds", negative_pooled_prompt_embeds
513
+ )
514
+ add_time_ids = callback_outputs.pop("add_time_ids", add_time_ids)
515
+ negative_add_time_ids = callback_outputs.pop("negative_add_time_ids", negative_add_time_ids)
516
+
517
+ # call the callback, if provided
518
+ if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0):
519
+ progress_bar.update()
520
+ if callback is not None and i % callback_steps == 0:
521
+ step_idx = i // getattr(self.scheduler, "order", 1)
522
+ callback(step_idx, t, latents)
523
+
524
+ # if XLA_AVAILABLE:
525
+ # xm.mark_step()
526
+
527
+ if not output_type == "latent":
528
+ # make sure the VAE is in float32 mode, as it overflows in float16
529
+ needs_upcasting = self.vae.dtype == torch.float16 and self.vae.config.force_upcast
530
+
531
+ if needs_upcasting:
532
+ self.upcast_vae()
533
+ latents = latents.to(next(iter(self.vae.post_quant_conv.parameters())).dtype)
534
+
535
+ image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0]
536
+
537
+ # cast back to fp16 if needed
538
+ if needs_upcasting:
539
+ self.vae.to(dtype=torch.float16)
540
+ else:
541
+ image = latents
542
+
543
+ if not output_type == "latent":
544
+ # apply watermark if available
545
+ if self.watermark is not None:
546
+ image = self.watermark.apply_watermark(image)
547
+ image = self.image_processor.postprocess(image, output_type=output_type)
548
+ #maybe_nsfw = any(check_nsfw_images(image))
549
+ #if maybe_nsfw:
550
+ # print('This image could be NSFW so we return a blank image.')
551
+ # return StableDiffusionXLPipelineOutput(images=[Image.new('RGB', (1024, 1024))])
552
+
553
+ # Offload all models
554
+ self.maybe_free_model_hooks()
555
+
556
+ if not return_dict:
557
+ return (image,)
558
+
559
+ return StableDiffusionXLPipelineOutput(images=image)
prior/__init__.py DELETED
File without changes
prior/pipeline_kandinsky_prior.py DELETED
@@ -1,528 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import List, Optional, Union
3
-
4
- import numpy as np
5
- import PIL
6
- import torch
7
- from transformers import (
8
- CLIPImageProcessor,
9
- CLIPTextModelWithProjection,
10
- CLIPTokenizer,
11
- CLIPVisionModelWithProjection,
12
- )
13
-
14
- from diffusers.models import PriorTransformer
15
- from diffusers.schedulers import UnCLIPScheduler
16
- from diffusers.utils import (
17
- BaseOutput,
18
- is_accelerate_available,
19
- is_accelerate_version,
20
- logging,
21
- replace_example_docstring,
22
- )
23
- from diffusers.pipelines.pipeline_utils import DiffusionPipeline
24
-
25
-
26
- logger = logging.get_logger(__name__) # pylint: disable=invalid-name
27
-
28
- EXAMPLE_DOC_STRING = """
29
- Examples:
30
- ```py
31
- >>> from diffusers import KandinskyPipeline, KandinskyPriorPipeline
32
- >>> import torch
33
-
34
- >>> pipe_prior = KandinskyPriorPipeline.from_pretrained("kandinsky-community/kandinsky-2-1-prior")
35
- >>> pipe_prior.to("cuda")
36
-
37
- >>> prompt = "red cat, 4k photo"
38
- >>> out = pipe_prior(prompt)
39
- >>> image_emb = out.image_embeds
40
- >>> negative_image_emb = out.negative_image_embeds
41
-
42
- >>> pipe = KandinskyPipeline.from_pretrained("kandinsky-community/kandinsky-2-1")
43
- >>> pipe.to("cuda")
44
-
45
- >>> image = pipe(
46
- ... prompt,
47
- ... image_embeds=image_emb,
48
- ... negative_image_embeds=negative_image_emb,
49
- ... height=768,
50
- ... width=768,
51
- ... num_inference_steps=100,
52
- ... ).images
53
-
54
- >>> image[0].save("cat.png")
55
- ```
56
- """
57
-
58
- EXAMPLE_INTERPOLATE_DOC_STRING = """
59
- Examples:
60
- ```py
61
- >>> from diffusers import KandinskyPriorPipeline, KandinskyPipeline
62
- >>> from diffusers.utils import load_image
63
- >>> import PIL
64
-
65
- >>> import torch
66
- >>> from torchvision import transforms
67
-
68
- >>> pipe_prior = KandinskyPriorPipeline.from_pretrained(
69
- ... "kandinsky-community/kandinsky-2-1-prior", torch_dtype=torch.float16
70
- ... )
71
- >>> pipe_prior.to("cuda")
72
-
73
- >>> img1 = load_image(
74
- ... "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
75
- ... "/kandinsky/cat.png"
76
- ... )
77
-
78
- >>> img2 = load_image(
79
- ... "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
80
- ... "/kandinsky/starry_night.jpeg"
81
- ... )
82
-
83
- >>> images_texts = ["a cat", img1, img2]
84
- >>> weights = [0.3, 0.3, 0.4]
85
- >>> image_emb, zero_image_emb = pipe_prior.interpolate(images_texts, weights)
86
-
87
- >>> pipe = KandinskyPipeline.from_pretrained("kandinsky-community/kandinsky-2-1", torch_dtype=torch.float16)
88
- >>> pipe.to("cuda")
89
-
90
- >>> image = pipe(
91
- ... "",
92
- ... image_embeds=image_emb,
93
- ... negative_image_embeds=zero_image_emb,
94
- ... height=768,
95
- ... width=768,
96
- ... num_inference_steps=150,
97
- ... ).images[0]
98
-
99
- >>> image.save("starry_cat.png")
100
- ```
101
- """
102
-
103
-
104
- @dataclass
105
- class KandinskyPriorPipelineOutput(BaseOutput):
106
- """
107
- Output class for KandinskyPriorPipeline.
108
-
109
- Args:
110
- image_embeds (`torch.FloatTensor`)
111
- clip image embeddings for text prompt
112
- negative_image_embeds (`List[PIL.Image.Image]` or `np.ndarray`)
113
- clip image embeddings for unconditional tokens
114
- """
115
-
116
- image_embeds: Union[torch.FloatTensor, np.ndarray]
117
- negative_image_embeds: Union[torch.FloatTensor, np.ndarray]
118
-
119
-
120
- class KandinskyPriorPipeline(DiffusionPipeline):
121
- """
122
- Pipeline for generating image prior for Kandinsky
123
-
124
- This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the
125
- library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.)
126
-
127
- Args:
128
- prior ([`PriorTransformer`]):
129
- The canonincal unCLIP prior to approximate the image embedding from the text embedding.
130
- image_encoder ([`CLIPVisionModelWithProjection`]):
131
- Frozen image-encoder.
132
- text_encoder ([`CLIPTextModelWithProjection`]):
133
- Frozen text-encoder.
134
- tokenizer (`CLIPTokenizer`):
135
- Tokenizer of class
136
- [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer).
137
- scheduler ([`UnCLIPScheduler`]):
138
- A scheduler to be used in combination with `prior` to generate image embedding.
139
- """
140
-
141
- _exclude_from_cpu_offload = ["prior"]
142
-
143
- def __init__(
144
- self,
145
- prior: PriorTransformer,
146
- image_encoder: CLIPVisionModelWithProjection,
147
- text_encoder: CLIPTextModelWithProjection,
148
- tokenizer: CLIPTokenizer,
149
- scheduler: UnCLIPScheduler,
150
- image_processor: CLIPImageProcessor,
151
- ):
152
- super().__init__()
153
-
154
- self.register_modules(
155
- prior=prior,
156
- text_encoder=text_encoder,
157
- tokenizer=tokenizer,
158
- scheduler=scheduler,
159
- image_encoder=image_encoder,
160
- image_processor=image_processor,
161
- )
162
-
163
- @torch.no_grad()
164
- @replace_example_docstring(EXAMPLE_INTERPOLATE_DOC_STRING)
165
- def interpolate(
166
- self,
167
- images_and_prompts: List[Union[str, PIL.Image.Image, torch.FloatTensor]],
168
- weights: List[float],
169
- num_images_per_prompt: int = 1,
170
- num_inference_steps: int = 25,
171
- generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None,
172
- latents: Optional[torch.FloatTensor] = None,
173
- negative_prior_prompt: Optional[str] = None,
174
- negative_prompt: str = "",
175
- guidance_scale: float = 4.0,
176
- device=None,
177
- ):
178
- """
179
- Function invoked when using the prior pipeline for interpolation.
180
-
181
- Args:
182
- images_and_prompts (`List[Union[str, PIL.Image.Image, torch.FloatTensor]]`):
183
- list of prompts and images to guide the image generation.
184
- weights: (`List[float]`):
185
- list of weights for each condition in `images_and_prompts`
186
- num_images_per_prompt (`int`, *optional*, defaults to 1):
187
- The number of images to generate per prompt.
188
- num_inference_steps (`int`, *optional*, defaults to 25):
189
- The number of denoising steps. More denoising steps usually lead to a higher quality image at the
190
- expense of slower inference.
191
- generator (`torch.Generator` or `List[torch.Generator]`, *optional*):
192
- One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html)
193
- to make generation deterministic.
194
- latents (`torch.FloatTensor`, *optional*):
195
- Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image
196
- generation. Can be used to tweak the same generation with different prompts. If not provided, a latents
197
- tensor will ge generated by sampling using the supplied random `generator`.
198
- negative_prior_prompt (`str`, *optional*):
199
- The prompt not to guide the prior diffusion process. Ignored when not using guidance (i.e., ignored if
200
- `guidance_scale` is less than `1`).
201
- negative_prompt (`str` or `List[str]`, *optional*):
202
- The prompt not to guide the image generation. Ignored when not using guidance (i.e., ignored if
203
- `guidance_scale` is less than `1`).
204
- guidance_scale (`float`, *optional*, defaults to 4.0):
205
- Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598).
206
- `guidance_scale` is defined as `w` of equation 2. of [Imagen
207
- Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale >
208
- 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`,
209
- usually at the expense of lower image quality.
210
-
211
- Examples:
212
-
213
- Returns:
214
- [`KandinskyPriorPipelineOutput`] or `tuple`
215
- """
216
-
217
- device = device or self.device
218
-
219
- if len(images_and_prompts) != len(weights):
220
- raise ValueError(
221
- f"`images_and_prompts` contains {len(images_and_prompts)} items and `weights` contains {len(weights)} items - they should be lists of same length"
222
- )
223
-
224
- image_embeddings = []
225
- for cond, weight in zip(images_and_prompts, weights):
226
- if isinstance(cond, str):
227
- image_emb = self(
228
- cond,
229
- num_inference_steps=num_inference_steps,
230
- num_images_per_prompt=num_images_per_prompt,
231
- generator=generator,
232
- latents=latents,
233
- negative_prompt=negative_prior_prompt,
234
- guidance_scale=guidance_scale,
235
- ).image_embeds
236
-
237
- elif isinstance(cond, (PIL.Image.Image, torch.Tensor)):
238
- if isinstance(cond, PIL.Image.Image):
239
- cond = (
240
- self.image_processor(cond, return_tensors="pt")
241
- .pixel_values[0]
242
- .unsqueeze(0)
243
- .to(dtype=self.image_encoder.dtype, device=device)
244
- )
245
-
246
- image_emb = self.image_encoder(cond)["image_embeds"]
247
-
248
- else:
249
- raise ValueError(
250
- f"`images_and_prompts` can only contains elements to be of type `str`, `PIL.Image.Image` or `torch.Tensor` but is {type(cond)}"
251
- )
252
-
253
- image_embeddings.append(image_emb * weight)
254
-
255
- image_emb = torch.cat(image_embeddings).sum(dim=0, keepdim=True)
256
-
257
- out_zero = self(
258
- negative_prompt,
259
- num_inference_steps=num_inference_steps,
260
- num_images_per_prompt=num_images_per_prompt,
261
- generator=generator,
262
- latents=latents,
263
- negative_prompt=negative_prior_prompt,
264
- guidance_scale=guidance_scale,
265
- )
266
- zero_image_emb = (
267
- out_zero.negative_image_embeds
268
- if negative_prompt == ""
269
- else out_zero.image_embeds
270
- )
271
-
272
- return KandinskyPriorPipelineOutput(
273
- image_embeds=image_emb, negative_image_embeds=zero_image_emb
274
- )
275
-
276
- # Copied from diffusers.pipelines.unclip.pipeline_unclip.UnCLIPPipeline.prepare_latents
277
- def prepare_latents(self, shape, dtype, device, generator, latents, scheduler):
278
- if latents is None:
279
- latents = torch.randn(
280
- shape, generator=generator, device=device, dtype=dtype
281
- )
282
- else:
283
- if latents.shape != shape:
284
- raise ValueError(
285
- f"Unexpected latents shape, got {latents.shape}, expected {shape}"
286
- )
287
- latents = latents.to(device)
288
-
289
- latents = latents * scheduler.init_noise_sigma
290
- return latents
291
-
292
- def get_zero_embed(self, batch_size=1, device=None):
293
- device = device or self.device
294
- zero_img = torch.zeros(
295
- 1,
296
- 3,
297
- self.image_encoder.config.image_size,
298
- self.image_encoder.config.image_size,
299
- ).to(device=device, dtype=self.image_encoder.dtype)
300
- zero_image_emb = self.image_encoder(zero_img)["image_embeds"]
301
- zero_image_emb = zero_image_emb.repeat(batch_size, 1)
302
- return zero_image_emb
303
-
304
- def _encode_prompt(
305
- self,
306
- prompt,
307
- device,
308
- num_images_per_prompt,
309
- do_classifier_free_guidance,
310
- negative_prompt=None,
311
- ):
312
- batch_size = len(prompt) if isinstance(prompt, list) else 1
313
- # get prompt text embeddings
314
- cond = (
315
- self.image_processor(prompt, return_tensors="pt")
316
- .pixel_values[0]
317
- .unsqueeze(0)
318
- .to(dtype=self.image_encoder.dtype, device=device)
319
- )
320
- prompt_embeds = self.image_encoder(cond)["image_embeds"]
321
-
322
- prompt_embeds = prompt_embeds.repeat_interleave(num_images_per_prompt, dim=0)
323
-
324
- if do_classifier_free_guidance:
325
- if negative_prompt is None:
326
- uncond_tokens = self.get_zero_embed(batch_size=prompt_embeds.shape[0])
327
- elif type(prompt) is not type(negative_prompt):
328
- raise TypeError(
329
- f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !="
330
- f" {type(prompt)}."
331
- )
332
- elif batch_size != len(negative_prompt):
333
- raise ValueError(
334
- f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:"
335
- f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches"
336
- " the batch size of `prompt`."
337
- )
338
- else:
339
- uncond_tokens = negative_prompt
340
-
341
- cond = (
342
- self.image_processor(uncond_tokens, return_tensors="pt")
343
- .pixel_values[0]
344
- .unsqueeze(0)
345
- .to(dtype=self.image_encoder.dtype, device=device)
346
- )
347
-
348
- negative_prompt_embeds = self.image_encoder(cond)["image_embeds"]
349
-
350
- seq_len = negative_prompt_embeds.shape[1]
351
- negative_prompt_embeds = negative_prompt_embeds.repeat(
352
- 1, num_images_per_prompt
353
- )
354
- negative_prompt_embeds = negative_prompt_embeds.view(
355
- batch_size * num_images_per_prompt, seq_len
356
- )
357
-
358
- # For classifier free guidance, we need to do two forward passes.
359
- # Here we concatenate the unconditional and text embeddings into a single batch
360
- # to avoid doing two forward passes
361
- prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds])
362
- return prompt_embeds, None
363
-
364
- def enable_model_cpu_offload(self, gpu_id=0):
365
- r"""
366
- Offloads all models to CPU using accelerate, reducing memory usage with a low impact on performance. Compared
367
- to `enable_sequential_cpu_offload`, this method moves one whole model at a time to the GPU when its `forward`
368
- method is called, and the model remains in GPU until the next model runs. Memory savings are lower than with
369
- `enable_sequential_cpu_offload`, but performance is much better due to the iterative execution of the `unet`.
370
- """
371
- if is_accelerate_available() and is_accelerate_version(">=", "0.17.0.dev0"):
372
- from accelerate import cpu_offload_with_hook
373
- else:
374
- raise ImportError(
375
- "`enable_model_cpu_offload` requires `accelerate v0.17.0` or higher."
376
- )
377
-
378
- device = torch.device(f"cuda:{gpu_id}")
379
-
380
- if self.device.type != "cpu":
381
- self.to("cpu", silence_dtype_warnings=True)
382
- torch.cuda.empty_cache() # otherwise we don't see the memory savings (but they probably exist)
383
-
384
- hook = None
385
- for cpu_offloaded_model in [self.text_encoder, self.prior]:
386
- _, hook = cpu_offload_with_hook(
387
- cpu_offloaded_model, device, prev_module_hook=hook
388
- )
389
-
390
- # We'll offload the last model manually.
391
- self.prior_hook = hook
392
-
393
- _, hook = cpu_offload_with_hook(
394
- self.image_encoder, device, prev_module_hook=self.prior_hook
395
- )
396
-
397
- self.final_offload_hook = hook
398
-
399
- @torch.no_grad()
400
- @replace_example_docstring(EXAMPLE_DOC_STRING)
401
- def __call__(
402
- self,
403
- prompt: Union[str, List[str]],
404
- negative_prompt: Optional[Union[str, List[str]]] = None,
405
- num_images_per_prompt: int = 1,
406
- num_inference_steps: int = 25,
407
- generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None,
408
- latents: Optional[torch.FloatTensor] = None,
409
- guidance_scale: float = 4.0,
410
- output_type: Optional[str] = "pt",
411
- return_dict: bool = True,
412
- ):
413
- """
414
- Function invoked when calling the pipeline for generation.
415
-
416
- Args:
417
- prompt (`str` or `List[str]`):
418
- The prompt or prompts to guide the image generation.
419
- negative_prompt (`str` or `List[str]`, *optional*):
420
- The prompt or prompts not to guide the image generation. Ignored when not using guidance (i.e., ignored
421
- if `guidance_scale` is less than `1`).
422
- num_images_per_prompt (`int`, *optional*, defaults to 1):
423
- The number of images to generate per prompt.
424
- num_inference_steps (`int`, *optional*, defaults to 25):
425
- The number of denoising steps. More denoising steps usually lead to a higher quality image at the
426
- expense of slower inference.
427
- generator (`torch.Generator` or `List[torch.Generator]`, *optional*):
428
- One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html)
429
- to make generation deterministic.
430
- latents (`torch.FloatTensor`, *optional*):
431
- Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image
432
- generation. Can be used to tweak the same generation with different prompts. If not provided, a latents
433
- tensor will ge generated by sampling using the supplied random `generator`.
434
- guidance_scale (`float`, *optional*, defaults to 4.0):
435
- Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598).
436
- `guidance_scale` is defined as `w` of equation 2. of [Imagen
437
- Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale >
438
- 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`,
439
- usually at the expense of lower image quality.
440
- output_type (`str`, *optional*, defaults to `"pt"`):
441
- The output format of the generate image. Choose between: `"np"` (`np.array`) or `"pt"`
442
- (`torch.Tensor`).
443
- return_dict (`bool`, *optional*, defaults to `True`):
444
- Whether or not to return a [`~pipelines.ImagePipelineOutput`] instead of a plain tuple.
445
-
446
- Examples:
447
-
448
- Returns:
449
- [`KandinskyPriorPipelineOutput`] or `tuple`
450
- """
451
-
452
- # if the negative prompt is defined we double the batch size to
453
- # directly retrieve the negative prompt embedding
454
- if negative_prompt is not None:
455
- prompt = prompt + negative_prompt
456
- negative_prompt = 2 * negative_prompt
457
-
458
- device = self._execution_device
459
-
460
- batch_size = len(prompt)
461
- batch_size = batch_size * num_images_per_prompt
462
-
463
- full_prompt = []
464
- for b in prompt: # TODO of course vectorize this lol
465
- full_seq = []
466
- for p in b:
467
- prompt_embeds, text_mask = self._encode_prompt(
468
- p, device, num_images_per_prompt, False, negative_prompt
469
- )
470
- full_seq.append(prompt_embeds)
471
- prompt_embeds = torch.cat(full_seq, 0)
472
- full_prompt.append(prompt_embeds)
473
- prompt_embeds = torch.stack(full_prompt)
474
- if prompt_embeds.shape[1] < 8: # TODO grab as `k` arg from config
475
- prompt_embeds = torch.nn.functional.pad(prompt_embeds, [0, 0, 0, 8-prompt_embeds.shape[1]])
476
- assert prompt_embeds.shape[1] == 8, f"The model is set to take `k`` cond image embeds but is shape {prompt_embeds.shape}"
477
-
478
- prompt_embeds = prompt_embeds.to('cuda') # TODO set with `k` arg from config
479
-
480
- hidden_states = torch.randn(
481
- (batch_size, prompt_embeds.shape[-1]),
482
- device=prompt_embeds.device,
483
- dtype=prompt_embeds.dtype,
484
- generator=generator,
485
- )
486
-
487
- latents = self.prior(
488
- hidden_states,
489
- proj_embedding=prompt_embeds,
490
- encoder_hidden_states=prompt_embeds,
491
- attention_mask=text_mask,
492
- ).predicted_image_embedding
493
-
494
- image_embeddings = latents
495
-
496
- # if negative prompt has been defined, we retrieve split the image embedding into two
497
- if negative_prompt is None:
498
- zero_embeds = self.get_zero_embed(latents.shape[0], device=latents.device)
499
-
500
- if (
501
- hasattr(self, "final_offload_hook")
502
- and self.final_offload_hook is not None
503
- ):
504
- self.final_offload_hook.offload()
505
- else:
506
- image_embeddings, zero_embeds = image_embeddings.chunk(2)
507
-
508
- if (
509
- hasattr(self, "final_offload_hook")
510
- and self.final_offload_hook is not None
511
- ):
512
- self.prior_hook.offload()
513
-
514
- if output_type not in ["pt", "np"]:
515
- raise ValueError(
516
- f"Only the output types `pt` and `np` are supported not output_type={output_type}"
517
- )
518
-
519
- if output_type == "np":
520
- image_embeddings = image_embeddings.cpu().numpy()
521
- zero_embeds = zero_embeds.cpu().numpy()
522
-
523
- if not return_dict:
524
- return (image_embeddings, zero_embeds)
525
-
526
- return KandinskyPriorPipelineOutput(
527
- image_embeds=image_embeddings, negative_image_embeds=zero_embeds
528
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
prior/prior_transformer.py DELETED
@@ -1,369 +0,0 @@
1
- import sys
2
- sys.path.append("..")
3
-
4
- from dataclasses import dataclass
5
- from typing import Dict, Optional, Union
6
-
7
-
8
- import torch
9
- import torch.nn.functional as F
10
- from torch import nn
11
-
12
- from diffusers.configuration_utils import ConfigMixin, register_to_config
13
- from diffusers.utils import BaseOutput
14
- from diffusers.models.attention import BasicTransformerBlock
15
- from diffusers.models.attention_processor import AttentionProcessor, AttnProcessor
16
- from diffusers.models.embeddings import TimestepEmbedding, Timesteps
17
- from diffusers.models.modeling_utils import ModelMixin
18
-
19
-
20
- @dataclass
21
- class PriorTransformerOutput(BaseOutput):
22
- """
23
- The output of [`PriorTransformer`].
24
-
25
- Args:
26
- predicted_image_embedding (`torch.FloatTensor` of shape `(batch_size, embedding_dim)`):
27
- The predicted CLIP image embedding conditioned on the CLIP text embedding input.
28
- """
29
-
30
- predicted_image_embedding: torch.FloatTensor
31
-
32
-
33
- class PriorTransformer(ModelMixin, ConfigMixin):
34
- """
35
- A Prior Transformer model.
36
-
37
- Parameters:
38
- num_attention_heads (`int`, *optional*, defaults to 32): The number of heads to use for multi-head attention.
39
- attention_head_dim (`int`, *optional*, defaults to 64): The number of channels in each head.
40
- num_layers (`int`, *optional*, defaults to 20): The number of layers of Transformer blocks to use.
41
- embedding_dim (`int`, *optional*, defaults to 768): The dimension of the model input `hidden_states`
42
- num_embeddings (`int`, *optional*, defaults to 77):
43
- The number of embeddings of the model input `hidden_states`
44
- additional_embeddings (`int`, *optional*, defaults to 4): The number of additional tokens appended to the
45
- projected `hidden_states`. The actual length of the used `hidden_states` is `num_embeddings +
46
- additional_embeddings`.
47
- dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use.
48
- time_embed_act_fn (`str`, *optional*, defaults to 'silu'):
49
- The activation function to use to create timestep embeddings.
50
- norm_in_type (`str`, *optional*, defaults to None): The normalization layer to apply on hidden states before
51
- passing to Transformer blocks. Set it to `None` if normalization is not needed.
52
- embedding_proj_norm_type (`str`, *optional*, defaults to None):
53
- The normalization layer to apply on the input `proj_embedding`. Set it to `None` if normalization is not
54
- needed.
55
- encoder_hid_proj_type (`str`, *optional*, defaults to `linear`):
56
- The projection layer to apply on the input `encoder_hidden_states`. Set it to `None` if
57
- `encoder_hidden_states` is `None`.
58
- added_emb_type (`str`, *optional*, defaults to `prd`): Additional embeddings to condition the model.
59
- Choose from `prd` or `None`. if choose `prd`, it will prepend a token indicating the (quantized) dot
60
- product between the text embedding and image embedding as proposed in the unclip paper
61
- https://arxiv.org/abs/2204.06125 If it is `None`, no additional embeddings will be prepended.
62
- time_embed_dim (`int, *optional*, defaults to None): The dimension of timestep embeddings.
63
- If None, will be set to `num_attention_heads * attention_head_dim`
64
- embedding_proj_dim (`int`, *optional*, default to None):
65
- The dimension of `proj_embedding`. If None, will be set to `embedding_dim`.
66
- clip_embed_dim (`int`, *optional*, default to None):
67
- The dimension of the output. If None, will be set to `embedding_dim`.
68
- """
69
-
70
- @register_to_config
71
- def __init__(
72
- self,
73
- num_attention_heads: int = 32,
74
- attention_head_dim: int = 64,
75
- num_layers: int = 20,
76
- embedding_dim: int = 768,
77
- num_embeddings=77,
78
- additional_embeddings=3, # as we have remvoed the time embedding
79
- dropout: float = 0.0,
80
- # time_embed_act_fn: str = "silu",
81
- norm_in_type: Optional[str] = None, # layer
82
- embedding_proj_norm_type: Optional[str] = None, # layer
83
- encoder_hid_proj_type: Optional[str] = "linear", # linear
84
- added_emb_type: Optional[str] = "prd", # prd
85
- # time_embed_dim: Optional[int] = None,
86
- embedding_proj_dim: Optional[int] = None,
87
- clip_embed_dim: Optional[int] = None,
88
- ):
89
- super().__init__()
90
- self.num_attention_heads = num_attention_heads
91
- self.attention_head_dim = attention_head_dim
92
- inner_dim = num_attention_heads * attention_head_dim
93
- self.additional_embeddings = additional_embeddings
94
-
95
- # time_embed_dim = time_embed_dim or inner_dim
96
- embedding_proj_dim = embedding_proj_dim or embedding_dim
97
- clip_embed_dim = clip_embed_dim or embedding_dim
98
-
99
- # self.time_proj = Timesteps(inner_dim, True, 0)
100
- # self.time_embedding = TimestepEmbedding(inner_dim, time_embed_dim, out_dim=inner_dim, act_fn=time_embed_act_fn)
101
-
102
- self.proj_in = nn.Linear(embedding_dim, inner_dim)
103
-
104
- if embedding_proj_norm_type is None:
105
- self.embedding_proj_norm = None
106
- elif embedding_proj_norm_type == "layer":
107
- self.embedding_proj_norm = nn.LayerNorm(embedding_proj_dim)
108
- else:
109
- raise ValueError(f"unsupported embedding_proj_norm_type: {embedding_proj_norm_type}")
110
-
111
- self.embedding_proj = nn.Linear(embedding_proj_dim, inner_dim)
112
-
113
- if encoder_hid_proj_type is None:
114
- self.encoder_hidden_states_proj = None
115
- elif encoder_hid_proj_type == "linear":
116
- self.encoder_hidden_states_proj = nn.Linear(embedding_dim, inner_dim)
117
- else:
118
- raise ValueError(f"unsupported encoder_hid_proj_type: {encoder_hid_proj_type}")
119
-
120
- self.positional_embedding = nn.Parameter(torch.zeros(1, num_embeddings + additional_embeddings, inner_dim))
121
-
122
- if added_emb_type == "prd":
123
- self.prd_embedding = nn.Parameter(torch.zeros(1, 1, inner_dim))
124
- elif added_emb_type is None:
125
- self.prd_embedding = None
126
- else:
127
- raise ValueError(
128
- f"`added_emb_type`: {added_emb_type} is not supported. Make sure to choose one of `'prd'` or `None`."
129
- )
130
-
131
- self.transformer_blocks = nn.ModuleList(
132
- [
133
- BasicTransformerBlock(
134
- inner_dim,
135
- num_attention_heads,
136
- attention_head_dim,
137
- dropout=dropout,
138
- activation_fn="gelu",
139
- attention_bias=True,
140
- )
141
- for d in range(num_layers)
142
- ]
143
- )
144
-
145
- if norm_in_type == "layer":
146
- self.norm_in = nn.LayerNorm(inner_dim)
147
- elif norm_in_type is None:
148
- self.norm_in = None
149
- else:
150
- raise ValueError(f"Unsupported norm_in_type: {norm_in_type}.")
151
-
152
- self.norm_out = nn.LayerNorm(inner_dim)
153
-
154
- self.proj_to_clip_embeddings = nn.Linear(inner_dim, clip_embed_dim)
155
-
156
- causal_attention_mask = torch.full(
157
- [num_embeddings + additional_embeddings, num_embeddings + additional_embeddings], -10000.0
158
- )
159
- causal_attention_mask.triu_(1)
160
- causal_attention_mask = causal_attention_mask[None, ...]
161
- self.register_buffer("causal_attention_mask", causal_attention_mask, persistent=False)
162
-
163
- self.clip_mean = nn.Parameter(torch.zeros(1, clip_embed_dim))
164
- self.clip_std = nn.Parameter(torch.zeros(1, clip_embed_dim))
165
-
166
- @property
167
- # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.attn_processors
168
- def attn_processors(self) -> Dict[str, AttentionProcessor]:
169
- r"""
170
- Returns:
171
- `dict` of attention processors: A dictionary containing all attention processors used in the model with
172
- indexed by its weight name.
173
- """
174
- # set recursively
175
- processors = {}
176
-
177
- def fn_recursive_add_processors(name: str, module: torch.nn.Module, processors: Dict[str, AttentionProcessor]):
178
- if hasattr(module, "set_processor"):
179
- processors[f"{name}.processor"] = module.processor
180
-
181
- for sub_name, child in module.named_children():
182
- fn_recursive_add_processors(f"{name}.{sub_name}", child, processors)
183
-
184
- return processors
185
-
186
- for name, module in self.named_children():
187
- fn_recursive_add_processors(name, module, processors)
188
-
189
- return processors
190
-
191
- # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.set_attn_processor
192
- def set_attn_processor(self, processor: Union[AttentionProcessor, Dict[str, AttentionProcessor]]):
193
- r"""
194
- Sets the attention processor to use to compute attention.
195
-
196
- Parameters:
197
- processor (`dict` of `AttentionProcessor` or only `AttentionProcessor`):
198
- The instantiated processor class or a dictionary of processor classes that will be set as the processor
199
- for **all** `Attention` layers.
200
-
201
- If `processor` is a dict, the key needs to define the path to the corresponding cross attention
202
- processor. This is strongly recommended when setting trainable attention processors.
203
-
204
- """
205
- count = len(self.attn_processors.keys())
206
-
207
- if isinstance(processor, dict) and len(processor) != count:
208
- raise ValueError(
209
- f"A dict of processors was passed, but the number of processors {len(processor)} does not match the"
210
- f" number of attention layers: {count}. Please make sure to pass {count} processor classes."
211
- )
212
-
213
- def fn_recursive_attn_processor(name: str, module: torch.nn.Module, processor):
214
- if hasattr(module, "set_processor"):
215
- if not isinstance(processor, dict):
216
- module.set_processor(processor)
217
- else:
218
- module.set_processor(processor.pop(f"{name}.processor"))
219
-
220
- for sub_name, child in module.named_children():
221
- fn_recursive_attn_processor(f"{name}.{sub_name}", child, processor)
222
-
223
- for name, module in self.named_children():
224
- fn_recursive_attn_processor(name, module, processor)
225
-
226
- # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.set_default_attn_processor
227
- def set_default_attn_processor(self):
228
- """
229
- Disables custom attention processors and sets the default attention implementation.
230
- """
231
- self.set_attn_processor(AttnProcessor())
232
-
233
- def forward(
234
- self,
235
- hidden_states,
236
- # timestep: Union[torch.Tensor, float, int],
237
- proj_embedding: torch.FloatTensor,
238
- encoder_hidden_states: Optional[torch.FloatTensor] = None,
239
- attention_mask: Optional[torch.BoolTensor] = None,
240
- return_dict: bool = True,
241
- ):
242
- """
243
- The [`PriorTransformer`] forward method.
244
-
245
- Args:
246
- hidden_states (`torch.FloatTensor` of shape `(batch_size, embedding_dim)`):
247
- The currently predicted image embeddings.
248
- timestep (`torch.LongTensor`):
249
- Current denoising step.
250
- proj_embedding (`torch.FloatTensor` of shape `(batch_size, embedding_dim)`):
251
- Projected embedding vector the denoising process is conditioned on.
252
- encoder_hidden_states (`torch.FloatTensor` of shape `(batch_size, num_embeddings, embedding_dim)`):
253
- Hidden states of the text embeddings the denoising process is conditioned on.
254
- attention_mask (`torch.BoolTensor` of shape `(batch_size, num_embeddings)`):
255
- Text mask for the text embeddings.
256
- return_dict (`bool`, *optional*, defaults to `True`):
257
- Whether or not to return a [`~models.prior_transformer.PriorTransformerOutput`] instead of a plain
258
- tuple.
259
-
260
- Returns:
261
- [`~models.prior_transformer.PriorTransformerOutput`] or `tuple`:
262
- If return_dict is True, a [`~models.prior_transformer.PriorTransformerOutput`] is returned, otherwise a
263
- tuple is returned where the first element is the sample tensor.
264
- """
265
- batch_size = hidden_states.shape[0]
266
-
267
- # timesteps = timestep
268
- # if not torch.is_tensor(timesteps):
269
- # timesteps = torch.tensor([timesteps], dtype=torch.long, device=hidden_states.device)
270
- # elif torch.is_tensor(timesteps) and len(timesteps.shape) == 0:
271
- # timesteps = timesteps[None].to(hidden_states.device)
272
-
273
- # broadcast to batch dimension in a way that's compatible with ONNX/Core ML
274
- # timesteps = timesteps * torch.ones(batch_size, dtype=timesteps.dtype, device=timesteps.device)
275
-
276
- # timesteps_projected = self.time_proj(timesteps)
277
-
278
- # timesteps does not contain any weights and will always return f32 tensors
279
- # but time_embedding might be fp16, so we need to cast here.
280
- # timesteps_projected = timesteps_projected.to(dtype=self.dtype)
281
- # time_embeddings = self.time_embedding(timesteps_projected)
282
-
283
- if self.embedding_proj_norm is not None:
284
- proj_embedding = self.embedding_proj_norm(proj_embedding)
285
-
286
- proj_embeddings = self.embedding_proj(proj_embedding)
287
- if self.encoder_hidden_states_proj is not None and encoder_hidden_states is not None:
288
- encoder_hidden_states = self.encoder_hidden_states_proj(encoder_hidden_states)
289
- # elif self.encoder_hidden_states_proj is not None and encoder_hidden_states is None:
290
- # raise ValueError("`encoder_hidden_states_proj` requires `encoder_hidden_states` to be set")
291
-
292
- hidden_states = self.proj_in(hidden_states)
293
-
294
- # TODO this really also ought to derive from config's `k`
295
- positional_embeddings = self.positional_embedding.to(hidden_states.dtype)
296
-
297
- additional_embeds = []
298
- additional_embeddings_len = 0
299
-
300
- if encoder_hidden_states is not None:
301
- additional_embeds.append(encoder_hidden_states)
302
- additional_embeddings_len += encoder_hidden_states.shape[1]
303
-
304
- if len(proj_embeddings.shape) == 2:
305
- proj_embeddings = proj_embeddings[:, None, :]
306
-
307
- if len(hidden_states.shape) == 2:
308
- hidden_states = hidden_states[:, None, :]
309
-
310
- additional_embeds = additional_embeds + [
311
- proj_embeddings,
312
- # time_embeddings[:, None, :],
313
- hidden_states,
314
- ]
315
-
316
- if self.prd_embedding is not None:
317
- prd_embedding = self.prd_embedding.to(hidden_states.dtype).expand(batch_size, -1, -1)
318
- additional_embeds.append(prd_embedding)
319
-
320
- hidden_states = torch.cat(
321
- additional_embeds,
322
- dim=1,
323
- )
324
-
325
- # Allow positional_embedding to not include the `addtional_embeddings` and instead pad it with zeros for these additional tokens
326
- additional_embeddings_len = additional_embeddings_len + proj_embeddings.shape[1] + 1
327
- if positional_embeddings.shape[1] < hidden_states.shape[1]:
328
- positional_embeddings = F.pad(
329
- positional_embeddings,
330
- (
331
- 0,
332
- 0,
333
- additional_embeddings_len,
334
- self.prd_embedding.shape[1] if self.prd_embedding is not None else 0,
335
- ),
336
- value=0.0,
337
- )
338
-
339
- hidden_states = hidden_states + positional_embeddings[:, :hidden_states.shape[1]]
340
-
341
- if attention_mask is not None:
342
- attention_mask = (1 - attention_mask.to(hidden_states.dtype)) * -10000.0
343
- attention_mask = F.pad(attention_mask, (0, self.additional_embeddings), value=0.0)
344
- attention_mask = (attention_mask[:, None, :] + self.causal_attention_mask).to(hidden_states.dtype)
345
- attention_mask = attention_mask.repeat_interleave(self.config.num_attention_heads, dim=0)
346
-
347
- if self.norm_in is not None:
348
- hidden_states = self.norm_in(hidden_states)
349
-
350
- for block in self.transformer_blocks:
351
- hidden_states = block(hidden_states, attention_mask=attention_mask)
352
-
353
- hidden_states = self.norm_out(hidden_states)
354
-
355
- if self.prd_embedding is not None:
356
- hidden_states = hidden_states[:, -1]
357
- else:
358
- hidden_states = hidden_states[:, additional_embeddings_len:]
359
-
360
- predicted_image_embedding = self.proj_to_clip_embeddings(hidden_states)
361
-
362
- if not return_dict:
363
- return (predicted_image_embedding,)
364
-
365
- return PriorTransformerOutput(predicted_image_embedding=predicted_image_embedding)
366
-
367
- def post_process_latents(self, prior_latents):
368
- prior_latents = (prior_latents * self.clip_std) + self.clip_mean
369
- return prior_latents
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -3,16 +3,8 @@ numpy
3
  scikit-learn
4
  pandas
5
  torch
6
- torchvision
7
  numpy
8
- matplotlib
9
  diffusers
10
  accelerate
11
  transformers
12
- sentencepiece
13
- peft
14
- imageio
15
- apscheduler
16
- pandas
17
- av
18
- glob2
 
3
  scikit-learn
4
  pandas
5
  torch
 
6
  numpy
 
7
  diffusers
8
  accelerate
9
  transformers
10
+ peft
 
 
 
 
 
 
train.py DELETED
@@ -1,94 +0,0 @@
1
-
2
-
3
- ########################################
4
- # python -m train
5
- ###########################################
6
-
7
-
8
- import torch
9
- import logging
10
- import numpy as np
11
- from tqdm import tqdm
12
- from PIL import Image
13
-
14
- from data import get_dataloader
15
- from model import get_model_and_tokenizer, get_optimizer
16
- import config
17
-
18
- logging.basicConfig(level=logging.INFO)
19
-
20
- def get_loss(model, input, target, tokenizer):
21
- with torch.no_grad():
22
- assert len(input.shape) == 5 # [batch, s, c, w, h]
23
- cuts = config.number_k_clip_embed
24
- assert input.shape[0] * input.shape[1] % cuts == 0, 'batch size * `k` preferred embeds must be divisible by cuts'
25
- input = input.view(cuts//8, -1, 3, target.shape[-2], target.shape[-1])
26
- full_seq = []
27
- for b in input:
28
- input = tokenizer(b)['image_embeds'] # in our case, tokenizer is a clip embedding model
29
- full_seq.append(input)
30
- input = torch.stack(full_seq)
31
-
32
- target = tokenizer(target)['image_embeds']
33
-
34
- input = input.view(target.shape[0], -1, target.shape[-1])
35
- assert len(input.shape) == 3 # [batch, sequence, inner]
36
-
37
- with torch.cuda.amp.autocast(enabled=False, ):
38
- input = input.to(torch.float32)
39
- latent = torch.randn(input.shape[0], input.shape[-1], device=input.device)
40
- output = model(latent, input).predicted_image_embedding
41
-
42
- target = target.to(torch.float32)
43
- mse_loss = torch.nn.functional.mse_loss(target, output).mean()
44
-
45
- assert len(target.shape) == 2 and len(output.shape) == 2
46
- cosine_loss = 1 - torch.nn.functional.cosine_similarity(output, target).mean()
47
- loss = mse_loss + .2 * cosine_loss
48
-
49
- logging.info(f'MSE: {mse_loss.item()}, Cosine: {cosine_loss.item()}, Weighted Total: {loss.item()}')
50
- # TODO wandb
51
-
52
- return loss
53
-
54
- def main():
55
- np.random.seed(config.seed)
56
- torch.manual_seed(config.seed)
57
-
58
- model, tokenizer = get_model_and_tokenizer(config.model_path, config.device, config.dtype)
59
- optimizer = get_optimizer(list(model.prior.parameters()), config.lr)
60
- dataloader = get_dataloader(config.data_path, config.batch_size, config.num_workers,
61
- model.prior_pipe.image_processor)
62
-
63
- for epoch in range(config.epochs):
64
- for ind, batch in tqdm(enumerate(iter(dataloader))):
65
- if batch is None:
66
- continue
67
-
68
- input, target = batch
69
- input = input.to(config.device)
70
- target = target.to(config.device)
71
-
72
- if ind % 50 == 0:
73
- with torch.cuda.amp.autocast(enabled=True, dtype=config.dtype): # NOTE using autocast because our training model is also our val model, so don't want to set to full half precision.
74
- examples = ['../generative_recommender/Blue_Tigers_space/1o.png',
75
- '../generative_recommender/Blue_Tigers_space/2o.png',
76
- '../generative_recommender/Blue_Tigers_space/3o.png',
77
- '../generative_recommender/Blue_Tigers_space/4o.png',
78
- '../generative_recommender/Blue_Tigers_space/5o.png',
79
- '../generative_recommender/Blue_Tigers_space/6o.png',
80
- '../generative_recommender/Blue_Tigers_space/7o.png',
81
- '../generative_recommender/Blue_Tigers_space/8o.png',]
82
- model.do_validation([[Image.open('../'+j) for j in examples]])
83
-
84
- loss = get_loss(model, input, target, tokenizer)
85
- loss.backward()
86
- optimizer.step()
87
- optimizer.zero_grad()
88
-
89
- if ind % 100 == 0:
90
- # TODO add loading from path
91
- model.prior.save_pretrained(f'{config.save_path}/last_epoch_ckpt', from_pt=True)
92
-
93
- if __name__ == '__main__':
94
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
train_requirements.txt DELETED
@@ -1,642 +0,0 @@
1
- absl-py==1.4.0
2
- accelerate==0.26.1
3
- addict==2.4.0
4
- aeiou==0.0.20
5
- aenum==3.1.15
6
- aiobotocore==2.13.0
7
- aiofiles==23.1.0
8
- aiohttp==3.9.5
9
- aioitertools==0.11.0
10
- aiosignal==1.3.1
11
- alias-free-torch==0.0.6
12
- aliyun-python-sdk-core==2.15.1
13
- aliyun-python-sdk-kms==2.16.3
14
- altair==4.2.2
15
- anaconda-anon-usage @ file:///croot/anaconda-anon-usage_1710965072196/work
16
- anaconda-client==1.11.2
17
- anaconda-cloud-auth @ file:///croot/anaconda-cloud-auth_1712794769769/work
18
- anaconda-navigator @ file:///croot/anaconda-navigator_1712087978399/work
19
- anaconda-project @ file:///opt/conda/conda-bld/anaconda-project_1660339890420/work
20
- annotated-types @ file:///croot/annotated-types_1709542908624/work
21
- antlr4-python3-runtime==4.9.3
22
- anyio==4.3.0
23
- appdirs==1.4.4
24
- apptools==5.2.1
25
- APScheduler==3.10.4
26
- argbind==0.3.9
27
- argcomplete==3.1.1
28
- asgiref==3.7.2
29
- asttokens==2.2.1
30
- astunparse==1.6.3
31
- async-timeout==4.0.2
32
- atproto==0.0.10
33
- attrs==25.1.0
34
- audioread==3.0.1
35
- auraloss==0.4.0
36
- av==10.0.0
37
- awscli==1.33.2
38
- backcall==0.2.0
39
- backports.functools-lru-cache @ file:///tmp/build/80754af9/backports.functools_lru_cache_1618170165463/work
40
- backports.tempfile @ file:///home/linux1/recipes/ci/backports.tempfile_1610991236607/work
41
- backports.weakref==1.0.post1
42
- bases==0.2.1
43
- basicsr==1.4.2
44
- beautifulsoup4==4.12.2
45
- bitsandbytes==0.43.1
46
- black==24.10.0
47
- bleach==6.1.0
48
- blendmodes==2022
49
- blinker==1.6.2
50
- blis==0.7.9
51
- blobfile==2.1.1
52
- blosc2==2.5.1
53
- bokeh==3.4.1
54
- boltons==23.0.0
55
- boto==2.49.0
56
- boto3==1.34.120
57
- botocore==1.34.120
58
- Bottleneck @ file:///croot/bottleneck_1707864210935/work
59
- braceexpand==0.1.7
60
- Brotli @ file:///tmp/abs_ecyw11_7ze/croots/recipe/brotli-split_1659616059936/work
61
- brotlipy==0.7.0
62
- cached-property==1.5.2
63
- cachetools==5.3.3
64
- Cartopy==0.21.1
65
- catalogue==2.0.8
66
- certifi==2025.1.31
67
- cffi==1.15.1
68
- cfgv==3.3.1
69
- chardet @ file:///home/builder/ci_310/chardet_1640804867535/work
70
- charset-normalizer==3.1.0
71
- chex==0.1.81
72
- clean-fid==0.1.35
73
- click==8.1.3
74
- clip @ git+https://github.com/openai/CLIP.git@a9b1bf5920416aaeaec965c25dd9e8f98c864f16
75
- clip-anytorch==2.6.0
76
- cloudpickle==2.2.1
77
- clyent==1.2.2
78
- cmake==3.26.4
79
- colorama==0.4.6
80
- colorcet==3.1.0
81
- colored==2.2.4
82
- coloredlogs==15.0.1
83
- comm==0.1.4
84
- commonmark==0.9.1
85
- comtypes==1.2.0
86
- conda @ file:///croot/conda_1696257509808/work
87
- conda-build @ file:///croot/conda-build_1701720841368/work
88
- conda-content-trust @ file:///tmp/abs_5952f1c8-355c-4855-ad2e-538535021ba5h26t22e5/croots/recipe/conda-content-trust_1658126371814/work
89
- conda-libmamba-solver @ file:///croot/conda-libmamba-solver_1698163451663/work/src
90
- conda-pack @ file:///tmp/build/80754af9/conda-pack_1611163042455/work
91
- conda-package-handling @ file:///croot/conda-package-handling_1690999929514/work
92
- conda-repo-cli @ file:///croot/conda-repo-cli_1709246574569/work
93
- conda-token @ file:///Users/paulyim/miniconda3/envs/c3i/conda-bld/conda-token_1662660369760/work
94
- conda-verify==3.4.2
95
- conda_index @ file:///croot/conda-index_1706633791028/work
96
- conda_package_streaming @ file:///croot/conda-package-streaming_1690987966409/work
97
- confection==0.0.4
98
- configobj==5.0.8
99
- configparser==7.0.0
100
- contextlib2==21.6.0
101
- contexttimer==0.3.3
102
- contourpy==1.2.1
103
- cramjam==2.8.3
104
- crcmod==1.7
105
- cryptography @ file:///croot/cryptography_1677533068310/work
106
- cuda-python==12.4.0
107
- curl_cffi==0.6.4
108
- cycler==0.11.0
109
- cymem==2.0.7
110
- Cython==0.29.35
111
- dacite==1.8.1
112
- dag-cbor==0.3.2
113
- datasets==2.21.0
114
- dctorch==0.1.2
115
- -e git+https://github.com/jannerm/ddpo.git@b217eef955a94bf58e4de68caa5ec0a6558c221d#egg=ddpo
116
- debugpy==1.6.7
117
- decorator==4.4.2
118
- decord==0.6.0
119
- DeepCache==0.1.1
120
- deepspeed==0.14.2
121
- defusedxml @ file:///tmp/build/80754af9/defusedxml_1615228127516/work
122
- Deprecated==1.2.14
123
- deprecation==2.1.0
124
- descript-audio-codec==1.0.0
125
- descript-audiotools==0.7.2
126
- diffusers @ git+https://github.com/huggingface/diffusers.git@06beecafc55cfddeb1b0b8660188de249f74b899
127
- dill==0.3.6
128
- disnake==2.9.0
129
- Django==4.2.2
130
- django-memcache-status==2.3
131
- django-pylibmc==0.6.1
132
- dm-tree==0.1.8
133
- dnspython==2.6.1
134
- docker-pycreds==0.4.0
135
- docstring-parser==0.15
136
- docutils==0.16
137
- EasyProcess==1.1
138
- einops==0.7.0
139
- einops-exts==0.0.4
140
- ema-pytorch==0.2.3
141
- email_validator==2.1.1
142
- emoji==2.4.0
143
- encodec==0.1.1
144
- entrypoints==0.4
145
- envisage==7.0.3
146
- etils==1.3.0
147
- eva-decord==0.6.1
148
- exceptiongroup==1.1.1
149
- executing==1.2.0
150
- facexlib==0.3.0
151
- fairscale==0.4.4
152
- fastapi==0.111.0
153
- fastapi-cli==0.0.4
154
- fastcore==1.5.44
155
- fastjsonschema @ file:///opt/conda/conda-bld/python-fastjsonschema_1661371079312/work
156
- fastparquet==2024.5.0
157
- ffmpeg==1.4
158
- ffmpeg-python==0.2.0
159
- ffmpegio==0.8.3
160
- ffmpegio-core==0.8.3
161
- ffmpy==0.3.0
162
- filelock @ file:///croot/filelock_1700591183607/work
163
- filterpy==1.4.5
164
- fire==0.6.0
165
- flash-attn==2.5.9.post1
166
- Flask==2.3.2
167
- flatbuffers==23.5.26
168
- flatten-dict==0.4.2
169
- flax==0.6.9
170
- flow-vis==0.1
171
- fonttools==4.42.1
172
- frozenlist==1.3.3
173
- fsspec==2024.6.0
174
- ftfy==6.1.1
175
- future @ file:///croot/future_1677599870788/work
176
- fvcore==0.1.5.post20221221
177
- gast==0.4.0
178
- gcs-oauth2-boto-plugin==3.0
179
- gcsfs==2023.6.0
180
- gdcm==1.1
181
- gdown==4.7.1
182
- gfpgan==1.3.8
183
- gguf==0.16.2
184
- gin-config==0.5.0
185
- gitdb==4.0.10
186
- GitPython==3.1.30
187
- gmpy2 @ file:///tmp/build/80754af9/gmpy2_1645455533097/work
188
- google-api-core==2.11.1
189
- google-apitools==0.5.32
190
- google-auth==2.29.0
191
- google-auth-oauthlib==1.0.0
192
- google-cloud-core==2.3.2
193
- google-cloud-storage==2.10.0
194
- google-crc32c==1.5.0
195
- google-pasta==0.2.0
196
- google-reauth==0.1.1
197
- google-resumable-media==2.5.0
198
- googleapis-common-protos==1.59.1
199
- gradio==4.31.5
200
- gradio_client==0.16.4
201
- grpcio==1.54.2
202
- gsutil==5.25
203
- h11==0.14.0
204
- h5py==3.11.0
205
- hjson==3.1.0
206
- holoviews==1.18.3
207
- httpcore==1.0.5
208
- httplib2==0.20.4
209
- httptools==0.6.1
210
- httpx==0.27.0
211
- httpx-ws==0.3.1
212
- huggingface-hub==0.30.2
213
- humanfriendly==10.0
214
- humanize==4.7.0
215
- hydra-core==1.1.2
216
- hyper-tile @ git+https://github.com/tfernd/HyperTile@2ef64b2800d007d305755c33550537410310d7df
217
- icecream==2.1.3
218
- identify==2.5.24
219
- idna @ file:///croot/idna_1666125576474/work
220
- imagebind @ git+https://github.com/facebookresearch/ImageBind.git@95d27c7fd5a8362f3527e176c3a80ae5a4d880c0
221
- imageio==2.34.2
222
- imageio-ffmpeg==0.4.8
223
- importlib-metadata==6.8.0
224
- importlib-resources==5.12.0
225
- inflect==6.0.4
226
- inflection==0.5.1
227
- install==1.3.5
228
- iopath==0.1.9
229
- ipykernel==6.25.0
230
- ipython==8.14.0
231
- ipywidgets==8.0.6
232
- itsdangerous==2.1.2
233
- jaraco.classes @ file:///tmp/build/80754af9/jaraco.classes_1620983179379/work
234
- jax==0.4.6
235
- jaxlib==0.4.6
236
- jedi==0.19.0
237
- jeepney @ file:///tmp/build/80754af9/jeepney_1627537048313/work
238
- Jinja2==3.1.2
239
- jmespath==0.10.0
240
- joblib==1.3.2
241
- jsonmerge==1.8.0
242
- jsonpatch @ file:///croot/jsonpatch_1710807507480/work
243
- jsonpointer==2.1
244
- jsonschema @ file:///croot/jsonschema_1699041609003/work
245
- jsonschema-specifications @ file:///croot/jsonschema-specifications_1699032386549/work
246
- julius==0.2.7
247
- jupyter-js-widgets-nbextension==0.0.2.dev0
248
- jupyter_client==8.3.0
249
- jupyter_core @ file:///croot/jupyter_core_1698937308754/work
250
- jupyterlab-widgets==3.0.7
251
- k-diffusion==0.1.1
252
- kaggle==1.5.13
253
- kagglehub==0.3.12
254
- kandinsky2 @ git+https://github.com/ai-forever/Kandinsky-2.git@aeefc1ce3a989eefe7c99d6a02cce44318c4d210
255
- kecam==1.4.1
256
- keras==2.14.0
257
- keras-efficientnet-v2==1.2.2
258
- Keras-Preprocessing==1.1.2
259
- keyring @ file:///croot/keyring_1709632513808/work
260
- kiwisolver==1.4.5
261
- kornia==0.6.7
262
- laion-clap==1.1.4
263
- langcodes==3.3.0
264
- lark==1.1.2
265
- lazy_loader==0.2
266
- libarchive-c @ file:///tmp/build/80754af9/python-libarchive-c_1617780486945/work
267
- libclang==16.0.0
268
- libmambapy @ file:///croot/mamba-split_1694187754698/work/libmambapy
269
- librosa==0.9.2
270
- lightning-utilities==0.8.0
271
- linkify-it-py==2.0.2
272
- lit==16.0.6
273
- llvmlite==0.42.0
274
- lmdb==1.4.1
275
- local-attention==1.8.6
276
- loguru==0.7.2
277
- lpips==0.1.4
278
- lvis==0.5.3
279
- lxml==4.9.4
280
- Markdown==3.6
281
- markdown-it-py==2.2.0
282
- markdown2==2.4.8
283
- MarkupSafe==2.1.2
284
- matplotlib==3.7.3
285
- matplotlib-inline==0.1.6
286
- mayavi==4.8.1
287
- mc-bin-client==1.0.1
288
- mdit-py-plugins==0.3.3
289
- mdurl==0.1.2
290
- mediapipe==0.10.15
291
- menuinst @ file:///croot/menuinst_1706732933928/work
292
- mkl-fft @ file:///croot/mkl_fft_1695058164594/work
293
- mkl-random @ file:///croot/mkl_random_1695059800811/work
294
- mkl-service==2.4.0
295
- ml-collections==0.1.1
296
- ml-dtypes==0.2.0
297
- mmcv==1.7.2
298
- mmengine==0.10.4
299
- model-index==0.1.11
300
- more-itertools @ file:///croot/more-itertools_1700662129964/work
301
- MouseInfo==0.1.3
302
- moviepy==1.0.3
303
- mpmath @ file:///croot/mpmath_1690848262763/work
304
- msgpack==1.0.5
305
- multidict==6.0.4
306
- multiformats==0.2.1
307
- multiformats-config==0.2.0.post4
308
- multiprocess==0.70.14
309
- murmurhash==1.0.9
310
- mypy-extensions==1.0.0
311
- namex==0.0.8
312
- natsort==8.4.0
313
- navigator-updater @ file:///croot/navigator-updater_1713453362034/work
314
- nbformat @ file:///croot/nbformat_1694616755618/work
315
- ndindex==1.8
316
- nest-asyncio==1.5.7
317
- networkx==3.1
318
- nh3==0.2.13
319
- nibabel==5.1.0
320
- ninja==1.11.1
321
- nlpaug==1.1.11
322
- nltk==3.8.1
323
- nodeenv==1.8.0
324
- numba==0.59.1
325
- numexpr @ file:///croot/numexpr_1696515281613/work
326
- numpy==1.26.4
327
- nvidia-cublas-cu11==11.11.3.6
328
- nvidia-cublas-cu117==11.10.1.25
329
- nvidia-cublas-cu12==12.3.4.1
330
- nvidia-cuda-cupti-cu11==11.8.87
331
- nvidia-cuda-cupti-cu117==11.7.50
332
- nvidia-cuda-cupti-cu12==12.3.101
333
- nvidia-cuda-nvcc-cu11==11.8.89
334
- nvidia-cuda-nvcc-cu12==12.3.107
335
- nvidia-cuda-nvrtc-cu11==11.8.89
336
- nvidia-cuda-nvrtc-cu12==12.3.107
337
- nvidia-cuda-runtime-cu11==11.8.89
338
- nvidia-cuda-runtime-cu117==11.7.60
339
- nvidia-cuda-runtime-cu12==12.3.101
340
- nvidia-cudnn-cu11==8.7.0.84
341
- nvidia-cudnn-cu116==8.4.0.27
342
- nvidia-cudnn-cu12==9.0.0.312
343
- nvidia-cufft-cu11==10.9.0.58
344
- nvidia-cufft-cu12==11.0.12.1
345
- nvidia-curand-cu11==10.3.0.86
346
- nvidia-curand-cu12==10.3.4.107
347
- nvidia-cusolver-cu11==11.4.1.48
348
- nvidia-cusolver-cu12==11.5.4.101
349
- nvidia-cusparse-cu11==11.7.5.86
350
- nvidia-cusparse-cu12==12.2.0.103
351
- nvidia-nccl-cu11==2.19.3
352
- nvidia-nccl-cu12==2.19.3
353
- nvidia-nvjitlink-cu12==12.3.101
354
- nvidia-nvtx-cu11==11.8.86
355
- nvidia-pyindex==1.0.9
356
- oauth2client==4.1.3
357
- oauthlib==3.2.2
358
- omegaconf==2.3.0
359
- onnx==1.15.0
360
- onnx-graphsurgeon==0.5.2
361
- onnx2torch==1.5.6
362
- onnxruntime==1.16.3
363
- open_clip_torch==2.26.1
364
- openai==0.27.8
365
- opencv-contrib-python==4.6.0.66
366
- opencv-python==4.6.0
367
- opendatalab==0.0.10
368
- opendatasets==0.1.22
369
- openmim==0.3.9
370
- openxlab==0.1.1
371
- opt-einsum==3.3.0
372
- optax==0.1.5
373
- optree==0.11.0
374
- orbax-checkpoint==0.1.6
375
- ordered-set==4.1.0
376
- orjson==3.9.0
377
- oss2==2.17.0
378
- outcome==1.3.0.post0
379
- packaging @ file:///croot/packaging_1710807400464/work
380
- pandas==2.0.2
381
- panel==1.4.4
382
- param==2.1.0
383
- parameterized==0.9.0
384
- parso==0.8.3
385
- pathspec==0.11.1
386
- pathtools==0.1.2
387
- pathy==0.10.1
388
- pedalboard==0.7.4
389
- peewee==3.16.2
390
- peft==0.10.0
391
- pexpect==4.8.0
392
- pickleshare==0.7.5
393
- piexif==1.1.3
394
- Pillow==9.4.0
395
- pkce @ file:///croot/pkce_1690384816590/work
396
- pkginfo @ file:///croot/pkginfo_1679431160147/work
397
- platformdirs==3.8.0
398
- plotly==5.14.1
399
- pluggy @ file:///tmp/build/80754af9/pluggy_1648024709248/work
400
- ply==3.11
401
- polygraphy==0.49.9
402
- pooch==1.8.1
403
- portalocker==2.7.0
404
- pre-commit==3.3.1
405
- prefigure==0.0.9
406
- preshed==3.0.8
407
- proglog==0.1.10
408
- progressbar==2.5
409
- prompt-toolkit==3.0.39
410
- protobuf==4.25.3
411
- psutil==5.9.5
412
- ptyprocess==0.7.0
413
- pure-eval==0.2.2
414
- py-cpuinfo==9.0.0
415
- pyarrow==17.0.0
416
- pyasn1==0.6.0
417
- pyasn1-modules==0.3.0
418
- PyAutoGUI==0.9.54
419
- pyav==12.0.5
420
- pycocoevalcap==1.2
421
- pycocotools==2.0.6
422
- pycosat @ file:///croot/pycosat_1696536503704/work
423
- pycparser==2.21
424
- pycryptodome==3.20.0
425
- pycryptodomex==3.19.0
426
- pydantic==2.7.3
427
- pydantic_core==2.18.4
428
- pydeck==0.8.1b0
429
- pyDeprecate==0.3.2
430
- pydicom==2.3.1
431
- pydot==1.4.2
432
- pydub==0.25.1
433
- pyface==8.0.0
434
- PyGetWindow==0.0.9
435
- Pygments==2.15.1
436
- PyJWT==2.7.0
437
- pylibmc==1.6.3
438
- pyloudnorm==0.1.1
439
- pymemcache==4.0.0
440
- Pympler==1.0.1
441
- PyMsgBox==1.0.9
442
- pynndescent==0.5.12
443
- pynvml==11.5.0
444
- pyOpenSSL @ file:///croot/pyopenssl_1690223430423/work
445
- pyparsing==3.1.1
446
- pyperclip==1.9.0
447
- pyproj==3.6.0
448
- PyQt5==5.15.10
449
- PyQt5-sip @ file:///croot/pyqt-split_1698769088074/work/pyqt_sip
450
- pyre-extensions==0.0.29
451
- PyRect==0.2.0
452
- PyScreeze==1.0.1
453
- pyshp==2.3.1
454
- PySocks==1.7.1
455
- pystoi==0.4.1
456
- python-dateutil @ file:///tmp/build/80754af9/python-dateutil_1626374649649/work
457
- python-docx==0.8.11
458
- python-dotenv==1.0.0
459
- python-magic==0.4.27
460
- python-memcached==1.59
461
- python-multipart==0.0.9
462
- python-slugify==8.0.1
463
- python3-xlib==0.15
464
- pytorch-lantern==0.12.7
465
- pytorch-lightning==2.1.0
466
- pytorch-pretrained-biggan==0.1.1
467
- pytorch-warmup==0.1.1
468
- pytorchvideo==0.1.5
469
- pytweening==1.2.0
470
- pytz @ file:///croot/pytz_1695131579487/work
471
- pyu2f==0.1.5
472
- PyVirtualDisplay==3.0
473
- pyviz_comms==3.0.2
474
- PyWavelets==1.4.1
475
- PyYAML==6.0
476
- pyzmq==25.1.0
477
- QtPy @ file:///croot/qtpy_1700144840038/work
478
- randomname==0.2.1
479
- realesrgan==0.3.0
480
- referencing @ file:///croot/referencing_1699012038513/work
481
- regex==2023.6.3
482
- repeng @ git+https://github.com/vgel/repeng.git@c9093abddd87f865e7e2bcf4b3e556ec8813b5b2
483
- replicate==0.25.1
484
- requests==2.32.3
485
- requests-oauthlib==1.3.1
486
- requests-toolbelt @ file:///croot/requests-toolbelt_1690874004362/work
487
- resampy==0.4.3
488
- resize-right==0.0.2
489
- responses==0.18.0
490
- retry-decorator==1.1.1
491
- rfc3986==1.5.0
492
- rich==12.6.0
493
- rotary-embedding-torch==0.3.0
494
- rpds-py @ file:///croot/rpds-py_1698945930462/work
495
- rsa==4.7.2
496
- ruamel-yaml-conda @ file:///croot/ruamel_yaml_1667489728852/work
497
- ruamel.yaml @ file:///croot/ruamel.yaml_1666304550667/work
498
- ruamel.yaml.clib @ file:///croot/ruamel.yaml.clib_1666302247304/work
499
- ruff==0.4.1
500
- s2wrapper @ git+https://github.com/bfshi/scaling_on_scales@f08aec91337ae1ed6d7cc7a55441a96d51c14dd1
501
- s3fs==2024.6.0
502
- s3transfer==0.10.1
503
- sacremoses==0.0.53
504
- safetensors==0.4.1
505
- salesforce-lavis @ git+https://github.com/salesforce/LAVIS.git@4a85b17846ee62f09c40f37cc955dd33c2abec68
506
- scikit-image==0.20.0
507
- scikit-learn==1.5.1
508
- scikit-surprise==1.1.3
509
- scipy==1.11.1
510
- SecretStorage @ file:///croot/secretstorage_1678709481048/work
511
- selenium==4.29.0
512
- semantic-version==2.10.0
513
- semver @ file:///croot/semver_1709243621175/work
514
- sentencepiece==0.1.99
515
- sentry-sdk==1.25.1
516
- setproctitle==1.3.2
517
- sgm @ file:///home/ryn_mote/Misc/generative-models
518
- shapely==2.0.1
519
- shellingham==1.5.0.post1
520
- shortuuid==1.0.11
521
- SimpleITK==2.2.1
522
- sip @ file:///croot/sip_1698675935381/work
523
- six @ file:///tmp/build/80754af9/six_1644875935023/work
524
- sk-video==1.1.10
525
- smart-open==6.3.0
526
- smmap==5.0.0
527
- sniffio==1.3.0
528
- sortedcontainers==2.4.0
529
- sounddevice==0.5.0
530
- SoundFile==0.10.2
531
- soupsieve==2.4.1
532
- spaces==0.27.0
533
- spacy==3.5.3
534
- spacy-legacy==3.0.12
535
- spacy-loggers==1.0.4
536
- sqlparse==0.4.4
537
- srsly==2.4.6
538
- stable-audio-tools==0.0.16
539
- stable-fast @ https://github.com/chengzeyi/stable-fast/releases/download/v1.0.4/stable_fast-1.0.4+torch220cu118-cp310-cp310-manylinux2014_x86_64.whl#sha256=11716f733237f557bee452eee63db415b4daeff29a28d939f73fff8003f0d415
540
- stack-data==0.6.2
541
- stanza==1.5.0
542
- starlette==0.37.2
543
- streamlit==1.22.0
544
- svgwrite==1.4.3
545
- sympy @ file:///croot/sympy_1701397643339/work
546
- tables==3.9.2
547
- tabulate==0.9.0
548
- tenacity==8.2.2
549
- tensorboard==2.14.1
550
- tensorboard-data-server==0.7.2
551
- tensorboard-plugin-wit==1.8.1
552
- tensorflow==2.14.0
553
- tensorflow-addons==0.16.1
554
- tensorflow-estimator==2.14.0
555
- tensorflow-hub==0.16.1
556
- tensorflow-io-gcs-filesystem==0.32.0
557
- tensorrt==8.6.1.post1
558
- tensorrt-bindings==8.6.1
559
- tensorrt-libs==8.6.1
560
- tensorstore==0.1.39
561
- termcolor==2.3.0
562
- text-unidecode==1.3
563
- tf-estimator-nightly==2.8.0.dev2021122109
564
- tf_keras==2.16.0
565
- tgate==0.1.1
566
- thinc==8.1.10
567
- threadpoolctl==3.2.0
568
- tifffile==2023.4.12
569
- tiktoken==0.4.0
570
- timm==0.9.8
571
- tokenizers==0.20.3
572
- tomesd==0.1.3
573
- tomli==2.0.1
574
- tomlkit==0.12.0
575
- toolz==0.12.0
576
- torch==2.2.2+cu118
577
- torch-ema==0.3
578
- torch-stoi==0.2.1
579
- torchaudio==2.0.2+cu118
580
- torchdiffeq==0.2.3
581
- torchio==0.19.0
582
- torchlibrosa==0.1.0
583
- torchmetrics==0.11.4
584
- torchsde==0.2.6
585
- torchvision==0.15.2+cu118
586
- tornado @ file:///croot/tornado_1696936946304/work
587
- tqdm==4.66.5
588
- traitlets @ file:///croot/traitlets_1671143879854/work
589
- traits==6.4.1
590
- traitsui==8.0.0
591
- trampoline==0.1.2
592
- transformers==4.46.3
593
- trio==0.29.0
594
- trio-websocket==0.12.2
595
- triton==2.2.0
596
- truststore @ file:///croot/truststore_1695244293384/work
597
- typed-argument-parser==1.8.1
598
- typeguard==4.2.1
599
- typer==0.12.3
600
- types-regex==2023.6.3.1
601
- typing-inspect==0.8.0
602
- typing-validation==1.0.0.post2
603
- typing_extensions==4.12.2
604
- tzdata @ file:///croot/python-tzdata_1690578112552/work
605
- tzlocal==5.0.1
606
- uc-micro-py==1.0.2
607
- ujson @ file:///opt/conda/conda-bld/ujson_1657544923770/work
608
- umap-learn==0.5.6
609
- undetected-chromedriver==3.5.5
610
- urllib3==1.26.18
611
- uvicorn==0.29.0
612
- uvloop==0.19.0
613
- v-diffusion-pytorch==0.0.2
614
- validators==0.20.0
615
- vector-quantize-pytorch==1.9.14
616
- vtk==9.2.6
617
- wandb==0.15.4
618
- wasabi==1.1.1
619
- watchdog==3.0.0
620
- watchfiles==0.22.0
621
- wavedrom==2.0.3.post3
622
- wcwidth==0.2.6
623
- webdataset==0.2.48
624
- webencodings==0.5.1
625
- websocket-client==1.8.0
626
- websockets==11.0.3
627
- Werkzeug==2.3.4
628
- wget==3.2
629
- widgetsnbextension==4.0.7
630
- wikipedia==1.4.0
631
- wrapt==1.14.1
632
- wsproto==1.2.0
633
- x-transformers==1.26.6
634
- xformers==0.0.20
635
- xxhash==3.2.0
636
- xyzservices==2024.4.0
637
- yacs==0.1.8
638
- yapf==0.40.1
639
- yarl==1.9.2
640
- yattag==1.15.1
641
- zipp==3.16.0
642
- zstandard @ file:///croot/zstandard_1677013143055/work
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
twitter_prompts.csv ADDED
@@ -0,0 +1,2088 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ,0
2
+ 0,Persephone
3
+ 1,"A portrait: man, whose lineage is corpse."
4
+ 2,a beautiful Waluigi
5
+ 3,president abe lincoln but a cat
6
+ 4,a woman and a crow
7
+ 5,"A professional, minimalist poster for the book The Old Man and the Sea"
8
+ 6,"half Ryan, half pigeon"
9
+ 7,Easter cat
10
+ 8,a beautiful woman
11
+ 9,a cherry tree made of fractals
12
+ 10,a christmas card from the victorian era
13
+ 11,The Theotokos is a bird
14
+ 12,
15
+ 13,A short life full of immense joy
16
+ 14,a character from a ghibli movie
17
+ 15,A structure made of people standing on top of other people
18
+ 16,зеленая собака
19
+ 17,a painting of the city
20
+ 18,a character from a ghibli movie
21
+ 19,pasta ömetabolism
22
+ 20,"a brilliant sketch titled ""Let Forever be Delayed"""
23
+ 21,the sun is shining on the lake
24
+ 22,Monet Lisa
25
+ 23,Genesis
26
+ 24,Synesthesia
27
+ 25,A dead man
28
+ 26,a cherry tree made of fractals
29
+ 27,enough
30
+ 28,The First Supper
31
+ 29,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
32
+ 30,a painting of the last day
33
+ 31,Dead Codes by Ryan Murdock
34
+ 32,Genesis
35
+ 33,symmetry
36
+ 34,The OLD DATA
37
+ 35,a beautiful person
38
+ 36,the whitest man
39
+ 37,Death is a black camel that kneels down so we can ride
40
+ 38,a goblin by van gogh
41
+ 39,a portrait of a beautiful person
42
+ 40,a famous painted portrait of Lady Macbeth
43
+ 41,on the edge of grace
44
+ 42,"""A God Made of Wires and Dust"" by Ryan Murdock"
45
+ 43,symmetry
46
+ 44,a beautiful person
47
+ 45,"If we're not careful, it's only art about not-quite-dead pigs from now on."
48
+ 46,Beauty here -- a photograph by Ryan Murdock
49
+ 47,Hunger art by r.j. Murdock
50
+ 48,"A professional, minimalist poster for the film Donnie Darko"
51
+ 49,A black and white photo of a rainbow.
52
+ 50,a beautiful painting
53
+ 51,Monet Lisa
54
+ 52,a painting of the city
55
+ 53,A structure made of people standing on top of other people
56
+ 54,a criminal
57
+ 55,a cherry tree made of fractals
58
+ 56,Persephone flees Hades
59
+ 57,a tree with weaping branches
60
+ 58,a tree with weaping branches
61
+ 59,Genesis
62
+ 60,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
63
+ 61,a cute cat
64
+ 62,Aflame
65
+ 63,A cat wearing a tophat
66
+ 64,a terrifying night hag
67
+ 65,a beautiful woman
68
+ 66,Fire
69
+ 67,a cherry tree made of fractals
70
+ 68,The EcoCathedral
71
+ 69,a man on fire
72
+ 70,A structure made of people standing on top of other people
73
+ 71,totemic dusk
74
+ 72,The Death of Achilles
75
+ 73,Everywhere is no-place
76
+ 74,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
77
+ 75,An Arundel Tomb
78
+ 76,The average Advadnoun twitter follower
79
+ 77,I can read when there's writing on the wall
80
+ 78,
81
+ 79,A Tragedy
82
+ 80,Breathe deep the fumes at Delphi
83
+ 81,a pOrTRaIT Of tHe SpOngeBOb CHicKen
84
+ 82,a portrait of a beautiful person
85
+ 83,a beautiful person
86
+ 84,a portrait of a beautiful person
87
+ 85,Dead Codes by Ryan Murdock
88
+ 86,a photo of a purple dog
89
+ 87,Memento Mori
90
+ 88,"joy, happiness, bliss"
91
+ 89,Paradise Lost
92
+ 90,a beautiful person
93
+ 91,melancholia
94
+ 92,Monet Lisa
95
+ 93,"Of that which one cannot speak, one must be silent."
96
+ 94,
97
+ 95,Juliet
98
+ 96,God killed Van Gogh.
99
+ 97,a cherry tree made of fractals
100
+ 98,a horse with four eyes.
101
+ 99,a beautiful person
102
+ 100,With the Gods in envy of their visions
103
+ 101,The Lost Generation
104
+ 102,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
105
+ 103,a portrait of a beautiful person
106
+ 104,"half Ryan, half pigeon"
107
+ 105,a ginormous baby
108
+ 106,a wormhole
109
+ 107,Ophelia
110
+ 108,"""The hunger artist, full"" by Ryan Murdock"
111
+ 109,I will meet you in a field firmly set within wrong.nnBy Ryan Murdock
112
+ 110,"Intricate, Weeping Tree by Ryan Murdock"
113
+ 111,everything was beautiful and nothing hurt
114
+ 112,Saturn being a good dad to his son
115
+ 113,The years gild our memoriesnUnfairly.
116
+ 114,Intimations of Immortality
117
+ 115,meaningless neko ♡♡ neko
118
+ 116,chiaroscuro
119
+ 117,The Patron Saint of Evil
120
+ 118,a portrait of a beautiful person
121
+ 119,"Mephisto, shrouded in smoke"
122
+ 120,everything was beautiful and nothing hurt
123
+ 121,God killed Van Gogh.
124
+ 122,a man wearing makeup
125
+ 123,Everywhere is no-place
126
+ 124,🔴~__��'t �
127
+ 125,a beautiful waluigi
128
+ 126,a beautiful woman
129
+ 127,a portrait of a beautiful person
130
+ 128,/
131
+ 129,a green doG
132
+ 130,Dead Codes by Ryan Murdock
133
+ 131,I miss the Spring
134
+ 132,
135
+ 133,"a person with 2 eyes, one mouth, one nose, and no extra holes!"
136
+ 134,a woman and a crow
137
+ 135,a photo from {my hometown}
138
+ 136,Summer's Symphony: Counterpoint and Melody
139
+ 137,a cute cat
140
+ 138,"God, it's amazing."
141
+ 139,a painting of a sycamore in
142
+ 140,distinguished leaves decorated
143
+ 141,I do not think they'll sing for me
144
+ 142,the monet lisa
145
+ 143,a portrait of Abraham Lincoln
146
+ 144,The average Advadnoun twitter follower
147
+ 145,Dancing in the moonlight
148
+ 146,Shinji Ikari
149
+ 147,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
150
+ 148,/
151
+ 149,is this loss? but it's van gogh
152
+ 150,Shinji Ikari
153
+ 151,a portrait of Juliet
154
+ 152,A sticky-note magnum opus featuring birds
155
+ 153,a silent palace
156
+ 154,"""A new hope blooms on the long notes of old horns."""
157
+ 155,The things I'll take with me
158
+ 156,is this loss? but it's van gogh
159
+ 157,a beautiful haunting
160
+ 158,Summer's Symphony: Counterpoint and Melody
161
+ 159,зеленая собака
162
+ 160,Last Breath
163
+ 161,Last Breath
164
+ 162,a cherry tree made of fractals
165
+ 163,The Theotokos is a bird
166
+ 164,a man holding an apple in one hand
167
+ 165,a beautiful person
168
+ 166,Monet Lisa
169
+ 167,A baroque portrait of Hamlet
170
+ 168,A gun killed Van Gogh.
171
+ 169,totemic dusk
172
+ 170,a portrait of a beautiful person
173
+ 171,pasta ömetabolism
174
+ 172,a beautiful person
175
+ 173,Taylor Swift
176
+ 174,colorful rabbits chandelier polaroid
177
+ 175,Dancing in the moonlight
178
+ 176,I will meet you in a field firmly set within wrong.nnBy Ryan Murdock
179
+ 177,symmetry
180
+ 178,"""Your mind flls in the gaps"" - by Ryan Murdock"
181
+ 179,the moon is a sickle cell
182
+ 180,"joy, happiness, bliss"
183
+ 181,Beauty here -- a photograph by Ryan Murdock
184
+ 182,a beautiful person
185
+ 183,a photo of a purple dog
186
+ 184,A propaganda poster promoting big chungus
187
+ 185,a beautiful person
188
+ 186,a tree with weaping branches
189
+ 187,A gun killed Van Gogh.
190
+ 188,"""A new hope blooms on the long notes of old horns."""
191
+ 189,a portrait of Abe Lincoln
192
+ 190,"""I love you more than the world can contain in its lonely and ramshackle head."""
193
+ 191,a character from a ghibli movie
194
+ 192,f*** it market standard rule language – distinguish np tax science research
195
+ 193,a portrait of Abe Lincoln
196
+ 194,a wholesome clown. Not creepy at all
197
+ 195,
198
+ 196,a corgi
199
+ 197,Easter cat
200
+ 198,a portrait of Abraham Lincoln
201
+ 199,a person's face
202
+ 200,A poster advertising Freudian Psychoanalytics
203
+ 201,Dancing in the moonlight
204
+ 202,Cat in a teacup
205
+ 203,a beautiful person
206
+ 204,Summer's Symphony: Counterpoint and Melody
207
+ 205,Post-Modern Nouveaux Statue
208
+ 206,a famous painted portrait of Lady Macbeth
209
+ 207,photosynthesis
210
+ 208,a photo of a purple dog
211
+ 209,
212
+ 210,a photo of Juliet
213
+ 211,The Starry Night
214
+ 212,Saturn being a good dad to his son
215
+ 213,a beautiful person
216
+ 214,In smoke and mould the fleshless dead
217
+ 215,totemic dusk
218
+ 216,a beautiful woman
219
+ 217,God killed Van Gogh.
220
+ 218,is this loss? but it's van gogh
221
+ 219,Nostos
222
+ 220,a silent palace
223
+ 221,"""The hunger artist, full"" by Ryan Murdock"
224
+ 222,a green doG
225
+ 223,Weeping Roses
226
+ 224,for sale: baby shoes; never worn
227
+ 225,a dog eating a cheese burger
228
+ 226,a man inside a cage
229
+ 227,Contentment at the Disco
230
+ 228,a photo from {my hometown}
231
+ 229,The EcoCathedral
232
+ 230,The OLD DATA
233
+ 231,treehouse in the style of studio ghibli animation
234
+ 232,
235
+ 233,"""The hunger artist, full"" by Ryan Murdock"
236
+ 234,
237
+ 235,Everywhere is no-place
238
+ 236,"A portrait: man, whose lineage is corpse."
239
+ 237,Last Breath
240
+ 238,A propaganda poster promoting big chungus
241
+ 239,зеленая собака
242
+ 240,a beautiful person
243
+ 241,Memento Mori
244
+ 242,A propaganda poster promoting big chungus
245
+ 243,is this loss?
246
+ 244,a tree with weaping branches
247
+ 245,Nostos
248
+ 246,Beauty here -- a photograph by Ryan Murdock
249
+ 247,a tiny church inside an eyeball
250
+ 248,
251
+ 249,a cherry tree made of fractals
252
+ 250,"joy, happiness, bliss"
253
+ 251,The First Supper
254
+ 252,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
255
+ 253,🔴~__��'t �
256
+ 254,Dancing in the moonlight
257
+ 255,Mona Lisa
258
+ 256,"God, it's amazing."
259
+ 257,a man holding an apple in one hand
260
+ 258,Some stolen Gods take up the reigns of darkness.
261
+ 259,🔴~__��'t �
262
+ 260,Figure 5: a corgi
263
+ 261,a photo from {my hometown}
264
+ 262,Anxiety: the one emotion that does not lie
265
+ 263,In the temple of God
266
+ 264,
267
+ 265,Metaphysics
268
+ 266,a beautiful woman
269
+ 267,a beautiful woman
270
+ 268,a surrealist eye
271
+ 269,the massive hope nof early iterations
272
+ 270,Ophelia
273
+ 271,a minimalist painting that you wouldn't understand
274
+ 272,Aflame
275
+ 273,a christmas card from the victorian era
276
+ 274,Dancing in the moonlight
277
+ 275,/
278
+ 276,"Mephisto, shrouded in smoke"
279
+ 277,a beautiful woman
280
+ 278,зеленая собака
281
+ 279,Easter cat
282
+ 280,The Oracle leans forward to say: beware the ides of March
283
+ 281,a portrait of a beautiful person
284
+ 282,Persephone
285
+ 283,a portrait of Abraham Lincoln
286
+ 284,the moon is a sickle cell
287
+ 285,symmetry
288
+ 286,Monet Lisa
289
+ 287,Saturn being a good dad to his son
290
+ 288,The Monet Lisa
291
+ 289,I sold my soul at the crossroads
292
+ 290,a beautiful person
293
+ 291,A poster advertising Freudian Psychoanalytics
294
+ 292,Cat in a teacup
295
+ 293,a silent palace
296
+ 294,
297
+ 295,a beautiful person
298
+ 296,
299
+ 297,
300
+ 298,Super Mario World but every character is Luigi
301
+ 299,chiaroscuro
302
+ 300,A dead man
303
+ 301,pasta ömetabolism
304
+ 302,A vanitas still life that features twitter follower counts
305
+ 303,slightly mild cosplaying pseudo beard
306
+ 304,Monet Lisa
307
+ 305,Mona Lisa
308
+ 306,handsome commemorative garden pigeon
309
+ 307,pasta ömetabolism
310
+ 308,"""The hunger artist, full"" by Ryan Murdock"
311
+ 309,a gorgeous bouquet with roses and sunflowers
312
+ 310,is this loss? but it's van gogh
313
+ 311,Memorial
314
+ 312,a forest filled with moonlight
315
+ 313,Post-Modern Nouveaux Statue
316
+ 314,she sings opera
317
+ 315,"God closes a door, boards up stained-glass windows."
318
+ 316,a dog wearing a suit playing tennis
319
+ 317,Intimations of Immortality
320
+ 318,
321
+ 319,turnt brony undergrad dwight
322
+ 320,a famous painted portrait of Lady Macbeth
323
+ 321,a cherry tree made of fractals
324
+ 322,Weeping Roses
325
+ 323,pasta ömetabolism
326
+ 324,
327
+ 325,
328
+ 326,"A portrait: man, whose lineage is corpse."
329
+ 327,The average Advadnoun twitter follower
330
+ 328,the moon is a sickle cell
331
+ 329,A black and white photo of a rainbow.
332
+ 330,God killed Van Gogh.
333
+ 331,turnt brony undergrad dwight
334
+ 332,"a brilliant sketch titled ""Let Forever be Delayed"""
335
+ 333,handsome commemorative garden pigeon
336
+ 334,a painting of a sycamore in
337
+ 335,a professional photo of a cat wearing a party hat
338
+ 336,Persephone
339
+ 337,Taylor Swift
340
+ 338,Homer Simpson
341
+ 339,using generated paint
342
+ 340,A black and white photo of a rainbow.
343
+ 341,meaningless neko ♡♡ neko
344
+ 342,is this loss? but it's van gogh
345
+ 343,Is this loss?
346
+ 344,a man from an anime
347
+ 345,the massive hope nof early iterations
348
+ 346,a beautiful woman
349
+ 347,Post-Modern Nouveaux Statue
350
+ 348,photosynthesis
351
+ 349,a cherry tree made of fractals
352
+ 350,a minimalist painting that you wouldn't understand
353
+ 351,a corgi
354
+ 352,handsome commemorative garden pigeon
355
+ 353,The OLD DATA
356
+ 354,cowboy with a trumpet
357
+ 355,A short life full of immense joy
358
+ 356,a beautiful woman
359
+ 357,The end of nothing is eroding. A watercolor by K.
360
+ 358,''
361
+ 359,symmetry
362
+ 360,a portrait of Abraham Lincoln
363
+ 361,Last Breath
364
+ 362,the eternal dread of lemongrab
365
+ 363,vangogh # landscape
366
+ 364,a cherry tree made of fractals
367
+ 365,The Devil Whispers blood
368
+ 366,a silent palace
369
+ 367,Paradise Lost
370
+ 368,Monet Lisa
371
+ 369,Everywhere is no-place
372
+ 370,Taylor Swift
373
+ 371,"r.j. Murdock's ""The Death of a Hacker"""
374
+ 372,a portrait of Abraham Lincoln
375
+ 373,I know the end
376
+ 374,Persephone
377
+ 375,A poster advertising Freudian Psychoanalytics
378
+ 376,a beautiful woman
379
+ 377,A black and white photo of a rainbow.
380
+ 378,the whitest man
381
+ 379,the eternal dread of lemongrab
382
+ 380,a drawing by an AI
383
+ 381,🔴~__��'t �
384
+ 382,We haunt the synapses
385
+ 383,frogs in the style of Ralph Steadman
386
+ 384,a beautiful haunting
387
+ 385,photosynthesis
388
+ 386,a character from a ghibli movie
389
+ 387,A structure made of people standing on top of other people
390
+ 388,Intimations of Immortality
391
+ 389,a jukebox powered by smoke
392
+ 390,beautiful art
393
+ 391,In the temple of God
394
+ 392,Intimations of Immortality
395
+ 393,a beautiful painting
396
+ 394,A gun killed Van Gogh.
397
+ 395,a man with no eyes
398
+ 396,a famous painted portrait of Lady Macbeth
399
+ 397,a tasteful haunting
400
+ 398,a jukebox powered by smoke
401
+ 399,a portrait of Juliet
402
+ 400,The Patron Saint of Evil
403
+ 401,a beautiful Waluigi
404
+ 402,a gilded lily
405
+ 403,
406
+ 404,Kierkegaard on the edge
407
+ 405,a beautiful person
408
+ 406,Just west of Alpha Centauri
409
+ 407,a horse with four eyes.
410
+ 408,Good grief
411
+ 409,a portrait of a beautiful person
412
+ 410,Aflame
413
+ 411,a man wearing makeup
414
+ 412,a portrait of Abraham Lincoln
415
+ 413,a corgi
416
+ 414,I do not think they'll sing for me
417
+ 415,Intimations of Immortality
418
+ 416,A poster serving as a memento mori
419
+ 417,Psychology
420
+ 418,A gun killed Van Gogh.
421
+ 419,"a brilliant sketch titled ""Let Forever be Delayed"""
422
+ 420,using generated paint
423
+ 421,pasta ömetabolism
424
+ 422,a summer day
425
+ 423,a gilded lily
426
+ 424,a cute cat
427
+ 425,on the edge of grace
428
+ 426,Art is growing.
429
+ 427,Spiderman delivering a pizza
430
+ 428,the intersection of art and technology
431
+ 429,"""The hunger artist, full"" by Ryan Murdock"
432
+ 430,a tarot card
433
+ 431,an omen
434
+ 432,slightly mild cosplaying pseudo beard
435
+ 433,meaningless neko ♡♡ neko
436
+ 434,intricate nothing
437
+ 435,symmetry
438
+ 436,I have no idea what anything in this image is
439
+ 437,a photo from {my hometown}
440
+ 438,a sad man
441
+ 439,face like an M.C. Escher drawing n(you could get lost in its beauty)
442
+ 440,A E S T H E T I C ?
443
+ 441,totemic dusk
444
+ 442,Nostos
445
+ 443,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
446
+ 444,a silent palace
447
+ 445,a beautiful painting
448
+ 446,"half Ryan, half pigeon"
449
+ 447,Weeping Roses
450
+ 448,a broken heart
451
+ 449,a portrait of Juliet
452
+ 450,a painting of the last day
453
+ 451,"a brilliant sketch titled ""Let Forever be Delayed"""
454
+ 452,a beautiful person
455
+ 453,"""The hunger artist, full"" by Ryan Murdock"
456
+ 454,a horse with four eyes.
457
+ 455,a photo of a purple dog
458
+ 456,a summoning
459
+ 457,Redacted ████████
460
+ 458,a ginormous baby
461
+ 459,On the edge of endless darkness
462
+ 460,The Fates knit such delicate nooses for us to bind
463
+ 461,Theotokos of Milk
464
+ 462,A minimalistic still life of a cat sitting on a table
465
+ 463,Dancing in the moonlight
466
+ 464,a minimalist painting that you wouldn't understand
467
+ 465,a beautiful woman
468
+ 466,totemic dusk
469
+ 467,"Ryan Murdock's ""God haunts the suburbs"""
470
+ 468,Dancing in the moonlight
471
+ 469,a beautiful woman
472
+ 470,a city in Van Gogh's style
473
+ 471,"""The hunger artist, full"" by Ryan Murdock"
474
+ 472,a person's face
475
+ 473,a portrait of <name>
476
+ 474,Dancing in the moonlight
477
+ 475,a portrait of Persephone
478
+ 476,a minimalist painting that you wouldn't understand
479
+ 477,a portrait of Abraham Lincoln
480
+ 478,Synesthesia
481
+ 479,a cute corgi
482
+ 480,a portrait of advadnoun
483
+ 481,a green doG
484
+ 482,a man with no eyes
485
+ 483,a cherry tree made of fractals
486
+ 484,a ginormous baby
487
+ 485,
488
+ 486,turnt brony undergrad dwight
489
+ 487,"God, it's amazing."
490
+ 488,"""The hunger artist, full"" by Ryan Murdock"
491
+ 489,We haunt the synapses
492
+ 490,God's Eyes are Wired Shut
493
+ 491,a famous painted portrait of Lady Macbeth
494
+ 492,Juliet
495
+ 493,a character from a ghibli movie
496
+ 494,the whitest man
497
+ 495,a horse with four eyes.
498
+ 496,a photo of a purple dog
499
+ 497,a beautiful person
500
+ 498,The Patron Saint of Hackers
501
+ 499,Dead Codes by Ryan Murdock
502
+ 500,something trite
503
+ 501,beautiful art
504
+ 502,
505
+ 503,the monet lisa
506
+ 504,a cute cat
507
+ 505,👉 👈
508
+ 506,A propaganda poster promoting big chungus
509
+ 507,a beautiful person
510
+ 508,a portrait of advadnoun
511
+ 509,a cherry tree made of fractals
512
+ 510,"It's a meme, I guess"
513
+ 511,a person's face
514
+ 512,A baroque portrait of Hamlet
515
+ 513,a city in Van Gogh's style
516
+ 514,"""The hunger artist, full"" by Ryan Murdock"
517
+ 515,a man with no eyes
518
+ 516,a minimalist painting that you wouldn't understand
519
+ 517,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
520
+ 518,"joy, happiness, bliss"
521
+ 519,
522
+ 520,"a brilliant sketch titled ""Let Forever be Delayed"""
523
+ 521,Last Breath
524
+ 522,On the edge of endless darkness
525
+ 523,a photo of Juliet
526
+ 524,Summer's Symphony: Counterpoint and Melody
527
+ 525,Persephone
528
+ 526,a green doG
529
+ 527,symmetry
530
+ 528,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
531
+ 529,The Starry Night
532
+ 530,Genesis
533
+ 531,bootleg edgy casual assange
534
+ 532,Memento Mori
535
+ 533,meaningless neko ♡♡ neko
536
+ 534,totemic dusk
537
+ 535,Aflame
538
+ 536,"""Here lies Ryan Murdock"" -- a memorial with the date and cause of departure."
539
+ 537,"""The hunger artist, full"" by Ryan Murdock"
540
+ 538,f*** you
541
+ 539,a tree with leaves that are amarillo sightseeing thetic
542
+ 540,a painting of the last day
543
+ 541,"God, it's amazing."
544
+ 542,Paradise Lost
545
+ 543,a gilded lily
546
+ 544,Aflame
547
+ 545,a portrait of <name>
548
+ 546,a painting that couldn't be sold
549
+ 547,a man holding an apple in one hand
550
+ 548,"A clock with gorgeous, intricate gradients on it"
551
+ 549,a goblin by van gogh
552
+ 550,"a person with 2 eyes, one mouth, one nose, and no extra holes!"
553
+ 551,A vanitas still life that features twitter follower counts
554
+ 552,the whitest man
555
+ 553,"""The hunger artist, full"" by Ryan Murdock"
556
+ 554,is this loss? but it's van gogh
557
+ 555,Synesthesia
558
+ 556,Aflame
559
+ 557,a cherry tree made of fractals
560
+ 558,A propaganda poster for daring to eat a peach.
561
+ 559,A vanitas still life that features twitter follower counts
562
+ 560,the moon is a sickle cell
563
+ 561,The Lost Generation
564
+ 562,the eternal dread of lemongrab
565
+ 563,The First Supper
566
+ 564,a character from a ghibli movie
567
+ 565,a man on fire
568
+ 566,symmetry
569
+ 567,pasta ömetabolism
570
+ 568,a horse with four eyes.
571
+ 569,Metaphysics
572
+ 570,Synesthesia
573
+ 571,The Fates knit such delicate nooses for us to bind
574
+ 572,Knowledge of Good and Evil
575
+ 573,meaningless neko ♡♡ neko
576
+ 574,A Tragedy
577
+ 575,
578
+ 576,a drawing by an AI
579
+ 577,The Fool tarot card but it's The Lovers
580
+ 578,a beautiful person
581
+ 579,a silent palace
582
+ 580,an omen
583
+ 581,"A portrait: man, whose lineage is corpse."
584
+ 582,Dancing in the moonlight
585
+ 583,a gilded lily
586
+ 584,turnt brony undergrad dwight
587
+ 585,"a person with 2 eyes, one mouth, one nose, and no extra holes!"
588
+ 586,totemic dusk
589
+ 587,Monet Lisa
590
+ 588,fatal skull prose visits bend ntuscan painting underthecomprehend
591
+ 589,Monet Lisa
592
+ 590,Aflame
593
+ 591,an intricate painting Of Eternity by Ryan Murdock
594
+ 592,"Intricate, Weeping Tree by Ryan Murdock"
595
+ 593,Summer's Symphony: Counterpoint and Melody
596
+ 594,Monet Lisa
597
+ 595,Last Breath
598
+ 596,is this loss? but it's van gogh
599
+ 597,"half Ryan, half pigeon"
600
+ 598,"God closes a door, boards up the stained-glass windows. nnGod hides."
601
+ 599,Everything was beautiful and nothing hurt
602
+ 600,"r.j. Murdock's ""The Death of a Hacker"""
603
+ 601,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
604
+ 602,meaningless neko ♡♡ neko
605
+ 603,twilight
606
+ 604,the sun is shining on the lake
607
+ 605,a portrait of a beautiful person
608
+ 606,the sun is shining on the lake
609
+ 607,
610
+ 608,a portrait of Abe Lincoln
611
+ 609,A gun killed Van Gogh.
612
+ 610,a photo from {my hometown}
613
+ 611,The Fool tarot card but it's The Lovers
614
+ 612,A structure made of people standing on top of other people
615
+ 613,"God closes a door, boards up the stained-glass windows. nnGod hides."
616
+ 614,an old man
617
+ 615,a beautiful waluigi
618
+ 616,is this loss? but it's van gogh
619
+ 617,a man standing alone in a wheat field
620
+ 618,Aflame
621
+ 619,Synesthesia
622
+ 620,
623
+ 621,Intimations of Immortality
624
+ 622,The First Supper
625
+ 623,"God, it's amazing."
626
+ 624,Persephone
627
+ 625,"r.j. Murdock's ""The Death of a Hacker"""
628
+ 626,God's Eyes are Wired Shut
629
+ 627,Do you remember the mythic beast?nA last-minute cancellation at The Last Supper
630
+ 628,f*** it market standard rule language – distinguish np tax science research
631
+ 629,totemic dusk
632
+ 630,Cat in a teacup
633
+ 631,frogs in the style of Ralph Steadman
634
+ 632,a beautiful person
635
+ 633,The Starry Night
636
+ 634,Juliet
637
+ 635,turnt brony undergrad dwight
638
+ 636,
639
+ 637,There is something so interesting about a bleeding edge full of dust.
640
+ 638,On the edge of endless darkness
641
+ 639,The warrior Achilles devours slain Hector's corpse -- an ink poster by Ryan Murdock
642
+ 640,turnt brony undergrad dwight
643
+ 641,Intimations of Immortality
644
+ 642,a portrait of Abraham Lincoln
645
+ 643,a man wearing makeup
646
+ 644,a sketch of the mind of god
647
+ 645,a man on fire
648
+ 646,a portrait of Abraham Lincoln
649
+ 647,
650
+ 648,The ancient Θωερτυ keyboard of brave Achilles
651
+ 649,goes thu extre— dum dum dizzy grimstupiddic ious mindidioirony merely experiment .
652
+ 650,"A group portrait featuring the id, ego, and superego"
653
+ 651,a photo from {my hometown}
654
+ 652,A structure made of people standing on top of other people
655
+ 653,a famous painted portrait of Lady Macbeth
656
+ 654,ogden
657
+ 655,pasta ömetabolism
658
+ 656,a tree with weaping branches
659
+ 657,photosynthesis
660
+ 658,handsome commemorative garden pigeon
661
+ 659,a photo of a purple dog
662
+ 660,"a brilliant sketch titled ""Let Forever be Delayed"""
663
+ 661,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
664
+ 662,The Death of Achilles
665
+ 663,potus mormon lincoln rooster
666
+ 664,A black and white photo of a rainbow.
667
+ 665,a beautiful haunting
668
+ 666,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
669
+ 667,In the temple of God
670
+ 668,a beautiful person
671
+ 669,The Patron Saint of Mathematics
672
+ 670,a brilliant painting titled
673
+ 671,a gilded lily
674
+ 672,a tiny church inside an eyeball
675
+ 673,a portrait of Juliet
676
+ 674,A painting that sold for a million dollars
677
+ 675,the moon is a sickle cell
678
+ 676,photosynthesis
679
+ 677,The Theotokos is a bird
680
+ 678,the whitest man
681
+ 679,The Monet Lisa
682
+ 680,Beauty here -- a photograph by Ryan Murdock
683
+ 681,Breathe deep the fumes at Delphi
684
+ 682,the sun is shining on the lake
685
+ 683,photosynthesis
686
+ 684,The things I'll take with me
687
+ 685,a green doG
688
+ 686,a beautiful person
689
+ 687,The years gild our memoriesnUnfairly.
690
+ 688,The Lost Generation
691
+ 689,a beautiful person
692
+ 690,The average Advadnoun twitter follower
693
+ 691,a goblin by van gogh
694
+ 692,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
695
+ 693,"A professional, minimalist poster for the book The Old Man and the Sea"
696
+ 694,
697
+ 695,Cat in a teacup
698
+ 696,a beautiful person
699
+ 697,beautiful art
700
+ 698,I sold my soul at the crossroads
701
+ 699,face like an M.C. Escher drawing n(you could get lost in its beauty)
702
+ 700,a gorgeous bouquet with roses and sunflowers
703
+ 701,a portrait of Abraham Lincoln
704
+ 702,Sisyphus
705
+ 703,a cute cat
706
+ 704,a portrait of <name>
707
+ 705,a minimalist painting that you wouldn't understand
708
+ 706,a photo of Bernie Sanders sitting on a chair and wearing mittens
709
+ 707,a woman and a crow
710
+ 708,a character from a ghibli movie
711
+ 709,a photo of a purple dog
712
+ 710,a dog eating a cheese burger
713
+ 711,Last Breath
714
+ 712,a sketch of the mind of god
715
+ 713,a steampunk technomancer
716
+ 714,We haunt the synapses
717
+ 715,using generated paint
718
+ 716,a cherry tree made of fractals
719
+ 717,Saturn being a good dad to his son
720
+ 718,oof deeplearning corgi corgi rendering
721
+ 719,
722
+ 720,Dancing in the moonlight
723
+ 721,A Tragedy
724
+ 722,A propaganda poster promoting big chungus
725
+ 723,A structure made of people standing on top of other people
726
+ 724,"A cute, minmimalist valentine's day card featuring a cat"
727
+ 725,a cute cat
728
+ 726,The skyscraper draws blood -- a landscape
729
+ 727,the monet lisa
730
+ 728,a photo of a person generating a painting of a person with AI
731
+ 729,"""A God Made of Wires and Dust"" by Ryan Murdock"
732
+ 730,Monet Lisa
733
+ 731,photosynthesis
734
+ 732,Hunger art by r.j. Murdock
735
+ 733,"""The hunger artist, full"" by Ryan Murdock"
736
+ 734,An Arundel Tomb
737
+ 735,twilight
738
+ 736,"r.j. Murdock's ""The Death of a Hacker"""
739
+ 737,living in a den of thieves
740
+ 738,"""A new hope blooms on the long notes of old horns."""
741
+ 739,"The laptop of brave Achaean Achilles, who would not live long."
742
+ 740,a minimalist painting that you wouldn't understand
743
+ 741,"Intricate, Weeping Tree by Ryan Murdock"
744
+ 742,The Fool
745
+ 743,a summoning
746
+ 744,pasta ömetabolism
747
+ 745,"a brilliant sketch titled ""Let Forever be Delayed"""
748
+ 746,a silent palace
749
+ 747,The average Advadnoun twitter follower
750
+ 748,f*** it market standard rule language – distinguish np tax science research
751
+ 749,Monet Lisa
752
+ 750,"a brilliant sketch titled ""Let Forever be Delayed"""
753
+ 751,meaningless neko ♡♡ neko
754
+ 752,"God, it's amazing."
755
+ 753,Nostos
756
+ 754,Shinji Ikari
757
+ 755,a beautiful woman
758
+ 756,The Starry Night
759
+ 757,hamont parkland avenue incumbscreenshotsaturday hemisphere footage algorithm
760
+ 758,a beautiful woman
761
+ 759,
762
+ 760,Summer always ending
763
+ 761,president abe lincoln but a cat
764
+ 762,🎷
765
+ 763,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
766
+ 764,a cherry tree made of fractals
767
+ 765,A painting that sold for one billion dollars
768
+ 766,a man standing alone in a wheat field
769
+ 767,symmetry
770
+ 768,a broken heart
771
+ 769,a silent palace
772
+ 770,A vanitas still life that features twitter follower counts
773
+ 771,"half Ryan, half pigeon"
774
+ 772,"a brilliant sketch titled ""Let Forever be Delayed"""
775
+ 773,slightly mild cosplaying pseudo beard
776
+ 774,a portrait of <name>
777
+ 775,God's Eyes are Wired Shut
778
+ 776,she sings opera
779
+ 777,a person's face
780
+ 778,a cherry tree made of fractals
781
+ 779,Dead Codes by Ryan Murdock
782
+ 780,Everywhere is no-place
783
+ 781,The First Supper
784
+ 782,Monet Lisa
785
+ 783,A short life full of immense joy
786
+ 784,Anxiety: the one emotion that does not lie
787
+ 785,Anxiety: the one emotion that does not lie
788
+ 786,symmetry
789
+ 787,a beautiful waluigi
790
+ 788,a goblin by van gogh
791
+ 789,"""A new hope blooms on the long notes of old horns."""
792
+ 790,Juliet
793
+ 791,The OLD DATA
794
+ 792,a beautiful woman
795
+ 793,The average Advadnoun twitter follower
796
+ 794,Synesthesia by Ryan Murdock
797
+ 795,Persephone flees Hades
798
+ 796,Last Breath
799
+ 797,a portrait of Persephone
800
+ 798,Homer Simpson
801
+ 799,totemic dusk
802
+ 800,a steampunk technomancer
803
+ 801,a portrait of Abraham Lincoln
804
+ 802,a cherry tree made of fractals
805
+ 803,bored of dying
806
+ 804,a famous painted portrait of Lady Macbeth
807
+ 805,a summer day
808
+ 806,A E S T H E T I C ?
809
+ 807,A vanitas still life that features twitter follower counts
810
+ 808,an illustration of a baby daikon radish in a tutu walking a dog
811
+ 809,Persephone
812
+ 810,pasta ömetabolism
813
+ 811,A vision of the Theotokos in my glass of coffee
814
+ 812,a dog.
815
+ 813,a photo of a person generating a painting of a person with AI
816
+ 814,🔴~__��'t �
817
+ 815,Intimations of Immortality
818
+ 816,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
819
+ 817,A dead man
820
+ 818,The Oracle leans forward to say: beware the ides of March
821
+ 819,Monet Lisa
822
+ 820,a silent palace
823
+ 821,an intricate painting of eternity
824
+ 822,A propaganda poster for chunky cats.
825
+ 823,God killed Van Gogh.
826
+ 824,the eyes of God are wired shut
827
+ 825,Persephone
828
+ 826,symmetry
829
+ 827,Mona Lisa
830
+ 828,Saturn being a good dad to his son
831
+ 829,a technomancer
832
+ 830,
833
+ 831,a cherry tree made of fractals
834
+ 832,A cat wearing a tophat
835
+ 833,frogs in the style of Ralph Steadman
836
+ 834,a portrait of a beautiful person
837
+ 835,a green dog
838
+ 836,a portrait of Abraham Lincoln
839
+ 837,Hungry Dogs Will Devour in the Daytime
840
+ 838,a photo of a purple dog
841
+ 839,Cat in a teacup
842
+ 840,
843
+ 841,Nostos
844
+ 842,A baroque portrait of Hamlet
845
+ 843,Saturn being a good dad to his son
846
+ 844,Hell is Paradise
847
+ 845,a taste
848
+ 846,"God, it's amazing."
849
+ 847,Everywhere is no-place
850
+ 848,a minimalist painting that you wouldn't understand
851
+ 849,a tree with weaping branches
852
+ 850,a portrait of Elvis Presley
853
+ 851,a man standing alone in a wheat field
854
+ 852,Juliet
855
+ 853,I sold my soul at the crossroads
856
+ 854,a beautiful person
857
+ 855,photosynthesis
858
+ 856,
859
+ 857,"Mephisto, shrouded in smoke"
860
+ 858,playing Go with Death
861
+ 859,a painting of the last day
862
+ 860,totemic dusk
863
+ 861,Hell is Paradise
864
+ 862,a christmas card from the victorian era
865
+ 863,Good grief
866
+ 864,handsome commemorative garden pigeon
867
+ 865,a portrait of <name>
868
+ 866,a portrait of Abraham Lincoln
869
+ 867,she came in through the wall
870
+ 868,a sad man
871
+ 869,In the temple of God
872
+ 870,fuzzy pals hum
873
+ 871,a painting of a sycamore in
874
+ 872,a beautiful waluigi
875
+ 873,"a brilliant sketch titled ""Let Forever be Delayed"""
876
+ 874,a portrait of a beautiful person
877
+ 875,a portrait of Juliet
878
+ 876,MEMETIC HAZARD
879
+ 877,The years gild our memoriesnUnfairly.
880
+ 878,Mona Lisa
881
+ 879,pasta ömetabolism
882
+ 880,pasta ömetabolism
883
+ 881,bored of dying
884
+ 882,Cat in a teacup
885
+ 883,a cherry tree made of fractals
886
+ 884,an intricate drawing of eternity
887
+ 885,mammals
888
+ 886,a portrait of Persephone
889
+ 887,treehouse in the style of studio ghibli animation
890
+ 888,watching TV in purgatory
891
+ 889,The winds of change by Ryan Murdock
892
+ 890,a technomancer
893
+ 891,a portrait of Persephone
894
+ 892,Last Breath
895
+ 893,A minimalistic still life of a cat sitting on a table
896
+ 894,
897
+ 895,cult of prisms
898
+ 896,Aflame
899
+ 897,Cat in a teacup
900
+ 898,"God, it's amazing."
901
+ 899,a minimalist painting that you wouldn't understand
902
+ 900,a woman and a crow
903
+ 901,totemic dusk
904
+ 902,a city in Van Gogh's style
905
+ 903,A baroque portrait of Hamlet
906
+ 904,murdoch
907
+ 905,a silent palace
908
+ 906,Anxiety: the one emotion that does not lie
909
+ 907,a photo of a purple dog
910
+ 908,the moon is a sickle cell
911
+ 909,Tendrils of smoke curl around the caterpillar with a hookah
912
+ 910,president abe lincoln but a cat
913
+ 911,a beautiful woman
914
+ 912,handsome commemorative garden pigeon
915
+ 913,an intricate painting of eternity
916
+ 914,"God, it's amazing."
917
+ 915,Grippy socks; no drawstrings: high fashion
918
+ 916,The average Advadnoun twitter follower
919
+ 917,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
920
+ 918,a photo from {my hometown}
921
+ 919,MEMETIC HAZARD
922
+ 920,a portrait of Elvis Presley
923
+ 921,a woman and a crow
924
+ 922,Saturn being a good dad to his son
925
+ 923,beautiful art
926
+ 924,Shinji Ikari
927
+ 925,a portrait of <name>
928
+ 926,a photo of a purple dog
929
+ 927,Ophelia
930
+ 928,a dog wearing a suit playing tennis
931
+ 929,We haunt the synapses
932
+ 930,I do not think they'll sing for me
933
+ 931,Genesis
934
+ 932,a beautiful person
935
+ 933,"a brilliant sketch titled ""Let Forever be Delayed"""
936
+ 934,Metaphysics
937
+ 935,bored of dying
938
+ 936,treehouse in the style of studio ghibli animation
939
+ 937,
940
+ 938,photosynthesis
941
+ 939,A structure made of people standing on top of other people
942
+ 940,meaningless neko ♡♡ neko
943
+ 941,a photo of the sun melting into the ocean
944
+ 942,symmetry
945
+ 943,the moon is a sickle cell
946
+ 944,Dancing in the moonlight
947
+ 945,Last Breath
948
+ 946,I sold my soul at the crossroads
949
+ 947,a beautiful woman
950
+ 948,"God, it's amazing."
951
+ 949,Cat in a teacup
952
+ 950,a tree with weaping branches
953
+ 951,"God, it's amazing."
954
+ 952,Cat in a teacup
955
+ 953,"r.j. Murdock's ""The Death of a Hacker"""
956
+ 954,using generated paint
957
+ 955,fuzzy pals hum
958
+ 956,"A portrait: man, whose lineage is corpse."
959
+ 957,a ginormous baby
960
+ 958,a beautiful woman
961
+ 959,"half Ryan, half pigeon"
962
+ 960,when the wind blows
963
+ 961,a beautiful woman
964
+ 962,pasta ömetabolism
965
+ 963,a cherry tree made of fractals
966
+ 964,The Monet Lisa
967
+ 965,"""The hunger artist, full"" by Ryan Murdock"
968
+ 966,a portrait of advadnoun
969
+ 967,The Fool tarot card but it's The Lovers
970
+ 968,Persephone
971
+ 969,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
972
+ 970,an omen
973
+ 971,the eternal dread of lemongrab
974
+ 972,a man on fire
975
+ 973,Aflame
976
+ 974,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
977
+ 975,twilight
978
+ 976,hamont parkland avenue incumbscreenshotsaturday hemisphere footage algorithm
979
+ 977,a silent palace
980
+ 978,a selfie
981
+ 979,the moon is a sickle cell
982
+ 980,a portrait of Abraham Lincoln
983
+ 981,a tree with weaping branches
984
+ 982,a tiny church inside an eyeball
985
+ 983,a portrait of a beautiful person
986
+ 984,Paradise Lost
987
+ 985,a horse with four eyes.
988
+ 986,president abe lincoln but a cat
989
+ 987,a summer day
990
+ 988,Anxiety: the one emotion that does not lie
991
+ 989,Saturn being a good dad to his son
992
+ 990,In the temple of God
993
+ 991,Redacted ████████
994
+ 992,Dr. Faustus and Mephisto
995
+ 993,a minimalist painting that you wouldn't understand
996
+ 994,a man standing alone in a wheat field
997
+ 995,a seance in the basement
998
+ 996,a portrait of <name>
999
+ 997,Aflame
1000
+ 998,the moon is a sickle cell
1001
+ 999,beautiful art
1002
+ 1000,a man on fire
1003
+ 1001,a tiny church inside an eyeball
1004
+ 1002,totemic dusk
1005
+ 1003,Persephone
1006
+ 1004,piss indiefilm
1007
+ 1005,a beautiful woman
1008
+ 1006,The EcoCathedral
1009
+ 1007,"joy, happiness, bliss"
1010
+ 1008,Intimations of Immortality
1011
+ 1009,the whitest man
1012
+ 1010,a silent palace
1013
+ 1011,
1014
+ 1012,a woman and a crow
1015
+ 1013,Memento Mori
1016
+ 1014,Visions in envy of the gods
1017
+ 1015,symmetry
1018
+ 1016,A poster advertising Freudian Psychoanalytics
1019
+ 1017,A propaganda poster promoting big chungus
1020
+ 1018,With the Gods in envy of their visions
1021
+ 1019,a cherry tree made of fractals
1022
+ 1020,pasta ömetabolism
1023
+ 1021,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1024
+ 1022,a beautiful person
1025
+ 1023,cowboy with a trumpet
1026
+ 1024,a portrait of a beautiful person
1027
+ 1025,The OLD DATA
1028
+ 1026,f*** it market standard rule language – distinguish np tax science research
1029
+ 1027,murdoch
1030
+ 1028,Some stolen Gods take up the reigns of darkness.
1031
+ 1029,a portrait of Juliet
1032
+ 1030,a god
1033
+ 1031,she sings opera
1034
+ 1032,The First Supper
1035
+ 1033,handsome commemorative garden pigeon
1036
+ 1034,cult of prisms
1037
+ 1035,Cat in a teacup
1038
+ 1036,💨 👻 ☺ 🔮 🔺 ✊
1039
+ 1037,a portrait of Abraham Lincoln
1040
+ 1038,a corgi
1041
+ 1039,a beautiful woman
1042
+ 1040,a portrait of a beautiful person
1043
+ 1041,Dead Codes by Ryan Murdock
1044
+ 1042,totemic dusk
1045
+ 1043,Juliet
1046
+ 1044,a portrait of Elvis Presley
1047
+ 1045,a criminal
1048
+ 1046,Genesis where the universe was made
1049
+ 1047,a portrait of <name>
1050
+ 1048,turnt brony undergrad dwight
1051
+ 1049,Cat in a teacup
1052
+ 1050,a corgi
1053
+ 1051,"Hamlet saying ""To be or not to be"""
1054
+ 1052,a portrait of a beautiful person
1055
+ 1053,A E S T H E T I C ?
1056
+ 1054,Figure 5: a corgi
1057
+ 1055,A gun killed Van Gogh.
1058
+ 1056,Persephone flees Hades
1059
+ 1057,a silent palace
1060
+ 1058,pasta ömetabolism
1061
+ 1059,a beautiful person
1062
+ 1060,on the edge of grace
1063
+ 1061,a portrait of Elvis Presley
1064
+ 1062,Persephone
1065
+ 1063,Tendrils of smoke curl around the caterpillar with a hookah
1066
+ 1064,"half Ryan, half pigeon"
1067
+ 1065,a sunflower
1068
+ 1066,a beautiful person
1069
+ 1067,a portrait of Juliet
1070
+ 1068,A dead man
1071
+ 1069,a character from a ghibli movie
1072
+ 1070,a silent palace
1073
+ 1071,a portrait of Elvis Presley
1074
+ 1072,a portrait of advadnoun
1075
+ 1073,A E S T H E T I C ?
1076
+ 1074,зеленая собака
1077
+ 1075,A baroque portrait of Hamlet
1078
+ 1076,a man at the beach
1079
+ 1077,Sisyphus
1080
+ 1078,Good grief
1081
+ 1079,"r.j. Murdock's ""The Death of a Hacker"""
1082
+ 1080,a beautiful woman
1083
+ 1081,🔴~__��'t �
1084
+ 1082,a portrait of advadnoun
1085
+ 1083,a painting of a sycamore in
1086
+ 1084,president abe lincoln but a cat
1087
+ 1085,The agony of time
1088
+ 1086,God once loved a woman
1089
+ 1087,pasta ömetabolism
1090
+ 1088,Dead Codes by Ryan Murdock
1091
+ 1089,
1092
+ 1090,slightly mild cosplaying pseudo beard
1093
+ 1091,Last Breath
1094
+ 1092,The Oracle leans forward to say: beware the ides of March
1095
+ 1093,The Devil Wears Khakis
1096
+ 1094,"""The hunger artist, full"" by Ryan Murdock"
1097
+ 1095,In the temple of God
1098
+ 1096,a beautiful person
1099
+ 1097,a man from an anime
1100
+ 1098,She's gorgeous
1101
+ 1099,A vanitas still life that features twitter follower counts
1102
+ 1100,
1103
+ 1101,the eternal dread of lemongrab
1104
+ 1102,Advadnoun
1105
+ 1103,a summer day
1106
+ 1104,The Fool tarot card but it's The Lovers
1107
+ 1105,I miss the Spring
1108
+ 1106,an illustration of a baby daikon radish in a tutu walking a dog
1109
+ 1107,The Oracle leans forward to say: beware the ides of March
1110
+ 1108,Contentment at the Disco
1111
+ 1109,The First Supper
1112
+ 1110,Saturn being a good dad to his son
1113
+ 1111,a beautiful woman
1114
+ 1112,"Intricate, Weeping Tree by Ryan Murdock"
1115
+ 1113,"a brilliant sketch titled ""Let Forever be Delayed"""
1116
+ 1114,beautiful art
1117
+ 1115,
1118
+ 1116,a silent palace
1119
+ 1117,a portrait of Juliet
1120
+ 1118,A propaganda poster promoting big chungus
1121
+ 1119,a portrait of a beautiful person
1122
+ 1120,a portrait of Abraham Lincoln
1123
+ 1121,
1124
+ 1122,the whitest man
1125
+ 1123,a portrait of Abe Lincoln
1126
+ 1124,Monet Lisa
1127
+ 1125,The Fool tarot card but it's The Lovers
1128
+ 1126,a portrait of <name>
1129
+ 1127,a portrait of Elvis Presley
1130
+ 1128,Post-Modern Nouveaux Statue
1131
+ 1129,a cherry tree made of fractals
1132
+ 1130,f*** it market standard rule language – distinguish np tax science research
1133
+ 1131,symmetry
1134
+ 1132,pasta ömetabolism
1135
+ 1133,a brilliant painting titled
1136
+ 1134,The First Supper
1137
+ 1135,a corgi
1138
+ 1136,a beautiful person
1139
+ 1137,a green doG
1140
+ 1138,The OLD DATA
1141
+ 1139,Ophelia
1142
+ 1140,a portrait of Abraham Lincoln
1143
+ 1141,incineratures motherhood
1144
+ 1142,a green dog
1145
+ 1143,a portrait of advadnoun
1146
+ 1144,a sunflower
1147
+ 1145,
1148
+ 1146,a man from an anime
1149
+ 1147,Beauty here -- a photograph by Ryan Murdock
1150
+ 1148,slightly mild cosplaying pseudo beard
1151
+ 1149,Nostos
1152
+ 1150,pasta ömetabolism
1153
+ 1151,a beautiful person
1154
+ 1152,"half Ryan, half pigeon"
1155
+ 1153,turnt brony undergrad dwight
1156
+ 1154,beautiful art
1157
+ 1155,a portrait of Persephone
1158
+ 1156,A sticky-note magnum opus featuring birds
1159
+ 1157,I sold my soul at the crossroads
1160
+ 1158,"a brilliant sketch titled ""Let Forever be Delayed"""
1161
+ 1159,A poster advertising Freudian Psychoanalytics
1162
+ 1160,using generated paint
1163
+ 1161,The OLD DATA
1164
+ 1162,a horse with four eyes.
1165
+ 1163,is this loss? but it's van gogh
1166
+ 1164,a gorgeous bouquet with roses and sunflowers
1167
+ 1165,Anxiety: the one emotion that does not lie
1168
+ 1166,turnt brony undergrad dwight
1169
+ 1167,The Lost Generation
1170
+ 1168,Taylor Swift
1171
+ 1169,The Lost Generation
1172
+ 1170,a photo from {my hometown}
1173
+ 1171,The OLD DATA
1174
+ 1172,a portrait of <name>
1175
+ 1173,a cherry tree made of fractals
1176
+ 1174,an intricate sculpture of Death itself
1177
+ 1175,
1178
+ 1176,зеленая собака
1179
+ 1177,a sunflower
1180
+ 1178,angst
1181
+ 1179,president abe lincoln but a cat
1182
+ 1180,a beautiful person
1183
+ 1181,The OLD DATA
1184
+ 1182,"You shake the demons hand, and redo it all, again."
1185
+ 1183,the latent space
1186
+ 1184,Fire
1187
+ 1185,a tree with weaping branches
1188
+ 1186,treehouse in the style of studio ghibli animation
1189
+ 1187,Good grief
1190
+ 1188,a portrait of <name>
1191
+ 1189,a wholesome clown. Not creepy at all
1192
+ 1190,Theotokos of Milk
1193
+ 1191,"God closes a door, boards up the stained-glass windows. nnGod hides."
1194
+ 1192,I sold my soul at the crossroads
1195
+ 1193,"Mephisto, shrouded in smoke"
1196
+ 1194,A baroque portrait of Hamlet
1197
+ 1195,a lamp
1198
+ 1196,MEMETIC HAZARD
1199
+ 1197,"""Your mind falls in the gaps"" - by Ryan Murdock"
1200
+ 1198,cowboy with a trumpet
1201
+ 1199,Aflame
1202
+ 1200,A vanitas still life that features twitter follower counts
1203
+ 1201,a beautiful person
1204
+ 1202,Synesthesia
1205
+ 1203,Is this loss?
1206
+ 1204,Adverb working on Photoshop Neural Filters | Behance Art
1207
+ 1205,Everything was beautiful and nothing hurt
1208
+ 1206,Mona Lisa
1209
+ 1207,A structure made of people standing on top of other people
1210
+ 1208,"Intricate, Weeping Tree by Ryan Murdock"
1211
+ 1209,the whitest man
1212
+ 1210,The Fates knit such delicate nooses for us to bind
1213
+ 1211,a tree with weaping branches
1214
+ 1212,a beautiful person
1215
+ 1213,Nostos
1216
+ 1214,Post-Modern Nouveaux Statue
1217
+ 1215,Genesis
1218
+ 1216,totemic dusk
1219
+ 1217,a dog.
1220
+ 1218,photosynthesis
1221
+ 1219,The average Advadnoun twitter follower
1222
+ 1220,"""The hunger artist, full"" by Ryan Murdock"
1223
+ 1221,a person's face
1224
+ 1222,slightly mild cosplaying pseudo beard
1225
+ 1223,a jukebox powered by smoke
1226
+ 1224,Monet Lisa
1227
+ 1225,Intimations of Immortality
1228
+ 1226,a gorgeous bouquet with roses and sunflowers
1229
+ 1227,face like an M.C. Escher drawing n(you could get lost in its beauty)
1230
+ 1228,a photo of a purple dog
1231
+ 1229,a tiny church inside an eyeball
1232
+ 1230,Good grief
1233
+ 1231,Last Breath
1234
+ 1232,a beautiful waluigi
1235
+ 1233,the moon is a sickle cell
1236
+ 1234,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1237
+ 1235,I sold my soul at the crossroads
1238
+ 1236,Persephone
1239
+ 1237,a portrait of Abraham Lincoln
1240
+ 1238,a beautiful painting
1241
+ 1239,Last Breath
1242
+ 1240,a man on fire
1243
+ 1241,"a brilliant sketch titled ""Let Forever be Delayed"""
1244
+ 1242,A gun killed Van Gogh.
1245
+ 1243,a sketch of the mind of god
1246
+ 1244,Intimations of Immortality
1247
+ 1245,Intimations of Immortality
1248
+ 1246,turnt brony undergrad dwight
1249
+ 1247,A sticky-note magnum opus featuring birds
1250
+ 1248,Aflame
1251
+ 1249,Grippy socks; no drawstrings: high fashion
1252
+ 1250,👉 👈
1253
+ 1251,Shrek the ogre
1254
+ 1252,a beautiful woman
1255
+ 1253,a portrait of Elvis Presley
1256
+ 1254,president abe lincoln but a cat
1257
+ 1255,Post-antiquity art
1258
+ 1256,using generated paint
1259
+ 1257,a dog eating a cheese burger
1260
+ 1258,The average Advadnoun twitter follower
1261
+ 1259,Monet Lisa
1262
+ 1260,"A professional, minimalist poster for the book The Old Man and the Sea"
1263
+ 1261,We haunt the synapses
1264
+ 1262,Post-Modern Nouveaux Statue
1265
+ 1263,a picture of Ryan Murdock
1266
+ 1264,cowboy with a trumpet
1267
+ 1265,colorful rabbits chandelier polaroid
1268
+ 1266,a character from a ghibli movie
1269
+ 1267,a goblin by van gogh
1270
+ 1268,a beautiful painting
1271
+ 1269,a photo of a purple dog
1272
+ 1270,a portrait of Persephone
1273
+ 1271,"Hamlet saying ""To be or not to be"""
1274
+ 1272,Homer Simpson
1275
+ 1273,a cute cat
1276
+ 1274,turnt brony undergrad dwight
1277
+ 1275,Intimations of Immortality
1278
+ 1276,a man wearing makeup
1279
+ 1277,They called you the hyacinth girl
1280
+ 1278,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1281
+ 1279,Cat in a teacup
1282
+ 1280,Juliet
1283
+ 1281,"""The wages of sin are generous"" by Ryan Murdock"
1284
+ 1282,"Pig, neither dead nor alive, stare into the heart of light, the silence."
1285
+ 1283,
1286
+ 1284,a horse with four eyes.
1287
+ 1285,Advadnoun
1288
+ 1286,Last Breath
1289
+ 1287,totemic dusk
1290
+ 1288,The OLD DATA
1291
+ 1289,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1292
+ 1290,a man holding an apple in one hand
1293
+ 1291,a beautiful woman
1294
+ 1292,melancholia
1295
+ 1293,Shinji Ikari
1296
+ 1294,a gorgeous bouquet with roses and sunflowers
1297
+ 1295,a portrait of advadnoun
1298
+ 1296,a known
1299
+ 1297,Genesis
1300
+ 1298,In smoke and mould the fleshless dead
1301
+ 1299,The average Advadnoun twitter follower
1302
+ 1300,a cute cat
1303
+ 1301,a painting of a sycamore in
1304
+ 1302,a woman and a crow
1305
+ 1303,Persephone
1306
+ 1304,
1307
+ 1305,using generated paint
1308
+ 1306,"A cute, minmimalist valentine's day card featuring a cat"
1309
+ 1307,a painting that couldn't be sold
1310
+ 1308,bored of dying
1311
+ 1309,pasta ömetabolism
1312
+ 1310,Dancing in the moonlight
1313
+ 1311,a beautiful woman
1314
+ 1312,Dr. Faustus and Mephisto
1315
+ 1313,"joy, happiness, bliss"
1316
+ 1314,a photo from {my hometown}
1317
+ 1315,a wholesome clown. Not creepy at all
1318
+ 1316,a portrait of Elvis Presley
1319
+ 1317,a cherry tree made of fractals
1320
+ 1318,a man standing alone in a wheat field
1321
+ 1319,Dancing in the moonlight
1322
+ 1320,Hunger art by Ryan Murdock
1323
+ 1321,a beautiful waluigi
1324
+ 1322,A black and white photo of a rainbow.
1325
+ 1323,totemic dusk
1326
+ 1324,a beautiful person
1327
+ 1325,
1328
+ 1326,a beautiful woman
1329
+ 1327,a horse with four eyes.
1330
+ 1328,The Lost Generation
1331
+ 1329,Death is a black camel that kneels down so we can ride
1332
+ 1330,a ginormous baby
1333
+ 1331,Dancing in the moonlight
1334
+ 1332,an old man
1335
+ 1333,a horse with four eyes.
1336
+ 1334,a photo of a purple dog
1337
+ 1335,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1338
+ 1336,a silent palace
1339
+ 1337,The OLD DATA
1340
+ 1338,a tree with weaping branches
1341
+ 1339,Creativity is only composition in disguise.
1342
+ 1340,"r.j. Murdock's ""The Death of a Hacker"""
1343
+ 1341,Persephone
1344
+ 1342,president abe lincoln but a cat
1345
+ 1343,There is something so interesting about a bleeding edge full of dust.
1346
+ 1344,A poster advertising death by water
1347
+ 1345,Persephone
1348
+ 1346,Saturn being a good dad to his son
1349
+ 1347,is this loss? but it's van gogh
1350
+ 1348,Monet Lisa
1351
+ 1349,fuzzy pals hum
1352
+ 1350,"""The hunger artist, full"" by Ryan Murdock"
1353
+ 1351,Shinji Ikari
1354
+ 1352,a beautiful woman
1355
+ 1353,"Son of man,nYou cannot say, or guess, for you know onlynA heap of broken images"
1356
+ 1354,God once loved a woman
1357
+ 1355,a horse with four eyes.
1358
+ 1356,a cherry tree made of fractals
1359
+ 1357,a beautiful haunting
1360
+ 1358,I miss the Spring
1361
+ 1359,gradient
1362
+ 1360,a wormhole
1363
+ 1361,a beautiful woman
1364
+ 1362,president abe lincoln but a cat
1365
+ 1363,handsome commemorative garden pigeon
1366
+ 1364,Everywhere is no-place
1367
+ 1365,"""It is beginning to end.""nby Ryan Murdock."
1368
+ 1366,she sings opera
1369
+ 1367,a jukebox powered by smoke
1370
+ 1368,a portrait of Juliet
1371
+ 1369,playing Go with Death
1372
+ 1370,a man standing alone in a wheat field
1373
+ 1371,Dead Codes by Ryan Murdock
1374
+ 1372,Synesthesia
1375
+ 1373,The years gild our memoriesnUnfairly.
1376
+ 1374,A propaganda poster promoting big chungus
1377
+ 1375,"God, it's amazing."
1378
+ 1376,Persephone
1379
+ 1377,a beautiful person
1380
+ 1378,MEMETIC HAZARD
1381
+ 1379,totemic dusk
1382
+ 1380,Intimations of Immortality
1383
+ 1381,A poster advertising death by water
1384
+ 1382,a photo of a purple dog
1385
+ 1383,symmetry
1386
+ 1384,A poster advertising misery
1387
+ 1385,a portrait of Elvis Presley
1388
+ 1386,Post-Modern Nouveaux Statue
1389
+ 1387,a man from an anime
1390
+ 1388,Anxiety: the one emotion that does not lie
1391
+ 1389,photosynthesis
1392
+ 1390,the man in the mirror
1393
+ 1391,"half Ryan, half pigeon"
1394
+ 1392,Sorrow's my body on the wavesnnAlone on the water
1395
+ 1393,a seance in the basement
1396
+ 1394,A poster serving as a memento mori
1397
+ 1395,Aflame
1398
+ 1396,A structure made of people standing on top of other people
1399
+ 1397,The First Supper
1400
+ 1398,totemic dusk
1401
+ 1399,a beautiful person
1402
+ 1400,a painting of the last day
1403
+ 1401,a photo of Juliet
1404
+ 1402,a horse with four eyes
1405
+ 1403,pasta ömetabolism
1406
+ 1404,Synesthesia
1407
+ 1405,a cherry tree made of fractals
1408
+ 1406,Post-post-post-post-modern art
1409
+ 1407,pasta ömetabolism
1410
+ 1408,MEMETIC HAZARD
1411
+ 1409,a portrait of Abe Lincoln
1412
+ 1410,Everywhere is no-place
1413
+ 1411,Memento Mori
1414
+ 1412,The average Advadnoun twitter follower
1415
+ 1413,a beautiful painting
1416
+ 1414,A black and white photo of a rainbow.
1417
+ 1415,The Death of Achilles
1418
+ 1416,a portrait of <name>
1419
+ 1417,cult of prisms
1420
+ 1418,a beautiful person
1421
+ 1419,a beautiful painting
1422
+ 1420,a beautiful woman
1423
+ 1421,An Arundel Tomb
1424
+ 1422,she came in through the wall
1425
+ 1423,the moon is a sickle cell
1426
+ 1424,a minimalist painting that you wouldn't understand
1427
+ 1425,a beast of burden
1428
+ 1426,a gilded lily
1429
+ 1427,a beautiful woman
1430
+ 1428,a brilliant painting titled
1431
+ 1429,a painting of the city
1432
+ 1430,"""Your mind falls in the gaps"" - by Ryan Murdock"
1433
+ 1431,"r.j. Murdock's ""The Death of a Hacker"""
1434
+ 1432,Aflame
1435
+ 1433,a beautiful painting
1436
+ 1434,Juliet
1437
+ 1435,turnt brony undergrad dwight
1438
+ 1436,symmetry
1439
+ 1437,Going home -- melanchonostalgic photography
1440
+ 1438,a character from a ghibli movie
1441
+ 1439,She's gorgeous
1442
+ 1440,incineratures motherhood
1443
+ 1441,a calm still life in ethereal blue
1444
+ 1442,incineratures motherhood
1445
+ 1443,A baroque portrait of Hamlet
1446
+ 1444,"A professional, minimalist poster for the book The Old Man and the Sea"
1447
+ 1445,Anxiety: the one emotion that does not lie
1448
+ 1446,a portrait of a beautiful person
1449
+ 1447,"Go off to sleep in the sunshine, I don’t want to see the day when it’s dying"
1450
+ 1448,a tree with weaping branches
1451
+ 1449,''''
1452
+ 1450,Intimations of Immortality
1453
+ 1451,Weeping Roses
1454
+ 1452,playing Go with Death
1455
+ 1453,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1456
+ 1454,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1457
+ 1455,turnt brony undergrad dwight
1458
+ 1456,Dancing in the moonlight
1459
+ 1457,Figure 5: a corgi
1460
+ 1458,a beautiful woman
1461
+ 1459,A Tragedy
1462
+ 1460,a photo of a purple dog
1463
+ 1461,a famous painted portrait of Lady Macbeth
1464
+ 1462,"A cute, minmimalist valentine's day card featuring a cat"
1465
+ 1463,The things I'll take with me
1466
+ 1464,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1467
+ 1465,Summer's Symphony: Counterpoint and Melody
1468
+ 1466,a horse with four eyes
1469
+ 1467,Aflame
1470
+ 1468,a ginormous baby
1471
+ 1469,
1472
+ 1470,Saturn being a good dad to his son
1473
+ 1471,a beautiful woman
1474
+ 1472,a terrifying night hag
1475
+ 1473,a portrait of Abraham Lincoln
1476
+ 1474,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
1477
+ 1475,a cute cat
1478
+ 1476,"""The hunger artist, full"" by Ryan Murdock"
1479
+ 1477,A baroque portrait of Hamlet
1480
+ 1478,a beautiful person
1481
+ 1479,Last Breath
1482
+ 1480,Juliet
1483
+ 1481,"Go off to sleep in the sunshine, I don’t want to see the day when it’s dying"
1484
+ 1482,"God, it's amazing."
1485
+ 1483,a portrait of Abraham Lincoln
1486
+ 1484,a woman and a crow
1487
+ 1485,a portrait of Abraham Lincoln
1488
+ 1486,Dancing in the moonlight
1489
+ 1487,a tree with weaping branches
1490
+ 1488,using generated paint
1491
+ 1489,a gilded lily
1492
+ 1490,treehouse in the style of studio ghibli animation
1493
+ 1491,chiaroscuro
1494
+ 1492,Last Breath
1495
+ 1493,A dead man
1496
+ 1494,a summer day
1497
+ 1495,The fates knit such intricate nooses for us to bind.
1498
+ 1496,bored of dying
1499
+ 1497,🔴~__��'t �
1500
+ 1498,Pig which could not cease to die.
1501
+ 1499,Intimations of Immortality
1502
+ 1500,a painting of a sycamore in
1503
+ 1501,The Fool
1504
+ 1502,she isn't busy: she just isn't into you
1505
+ 1503,a beautiful person
1506
+ 1504,"""The hunger artist, full"" by Ryan Murdock"
1507
+ 1505,
1508
+ 1506,a portrait of Elvis Presley
1509
+ 1507,a woman and a crow
1510
+ 1508,Homer Simpson
1511
+ 1509,Anxiety: the one emotion that does not lie
1512
+ 1510,A structure made of people standing on top of other people
1513
+ 1511,a beautiful person
1514
+ 1512,a beautiful person
1515
+ 1513,totemic dusk
1516
+ 1514,a christmas card from the victorian era
1517
+ 1515,Sickness of the Soul
1518
+ 1516,God is in heaven and all is right in the world
1519
+ 1517,Mona Lisa
1520
+ 1518,a portrait of Abraham Lincoln
1521
+ 1519,a cute cat
1522
+ 1520,turnt brony undergrad dwight
1523
+ 1521,"a brilliant sketch titled ""Let Forever be Delayed"""
1524
+ 1522,a city in Van Gogh's style
1525
+ 1523,Synesthesia by Ryan Murdock
1526
+ 1524,"""A God Made of Wires and Dust"" by Ryan Murdock"
1527
+ 1525,a beautiful dawn
1528
+ 1526,a portrait of Abraham Lincoln
1529
+ 1527,
1530
+ 1528,a horse with four eyes.
1531
+ 1529,Last Breath
1532
+ 1530,slightly mild cosplaying pseudo beard
1533
+ 1531,
1534
+ 1532,A dead man
1535
+ 1533,cowboy with a trumpet
1536
+ 1534,We haunt the synapses
1537
+ 1535,
1538
+ 1536,a horse with four eyes.
1539
+ 1537,pasta ömetabolism
1540
+ 1538,A short life full of immense joy
1541
+ 1539,a wormhole
1542
+ 1540,Juliet
1543
+ 1541,is this loss? but it's van gogh
1544
+ 1542,tamine ethereal image
1545
+ 1543,is this loss? but it's van gogh
1546
+ 1544,"A clock with gorgeous, intricate gradients on it"
1547
+ 1545,Dancing in the moonlight
1548
+ 1546,a broken heart
1549
+ 1547,a wormhole
1550
+ 1548,beautiful art
1551
+ 1549,Genesis
1552
+ 1550,face like an M.C. Escher drawing n(you could get lost in its beauty)
1553
+ 1551,a character from a ghibli movie
1554
+ 1552,Cat in a teacup
1555
+ 1553,symmetry
1556
+ 1554,A black and white photo of a rainbow.
1557
+ 1555,A propaganda poster promoting big chungus
1558
+ 1556,a woman and a crow
1559
+ 1557,a green doG
1560
+ 1558,"""The hunger artist, full"" by Ryan Murdock"
1561
+ 1559,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1562
+ 1560,Last Breath
1563
+ 1561,The Monet Lisa
1564
+ 1562,all architecture
1565
+ 1563,The Virgin Mary as a broken-down android
1566
+ 1564,a terrifying night hag
1567
+ 1565,a green doG
1568
+ 1566,pasta ömetabolism
1569
+ 1567,The Fool tarot card but it's The Lovers
1570
+ 1568,Do you remember the mythic beast?nA last-minute cancellation at The Last Supper
1571
+ 1569,the eternal dread of lemongrab
1572
+ 1570,The warrior Achilles devours slain Hector's corpse -- an ink poster by Ryan Murdock
1573
+ 1571,Shinji Ikari
1574
+ 1572,The Monet Lisa
1575
+ 1573,a cherry tree made of fractals
1576
+ 1574,a portrait of Juliet
1577
+ 1575,She's gorgeous
1578
+ 1576,A black and white photo of a rainbow.
1579
+ 1577,They called you the hyacinth girl
1580
+ 1578,a portrait of <name>
1581
+ 1579,photosynthesis
1582
+ 1580,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1583
+ 1581,The Starry Night
1584
+ 1582,"""A new hope blooms on the long notes of old horns."""
1585
+ 1583,A minimalistic still life of a cat sitting on a table
1586
+ 1584,a dog eating a cheese burger
1587
+ 1585,A structure made of people standing on top of other people
1588
+ 1586,Genesis
1589
+ 1587,
1590
+ 1588,"Oh the Death, not pigs forever."
1591
+ 1589,The Starry Night
1592
+ 1590,Persephone
1593
+ 1591,a beautiful person
1594
+ 1592,Sickness of the Soul
1595
+ 1593,turnt brony undergrad dwight
1596
+ 1594,a gilded lily
1597
+ 1595,Photograph of a glass of Blue Tea
1598
+ 1596,a woman and a crow
1599
+ 1597,
1600
+ 1598,a beautiful person
1601
+ 1599,turnt brony undergrad dwight
1602
+ 1600,mammals
1603
+ 1601,The Lost Generation
1604
+ 1602,a goblin by van gogh
1605
+ 1603,A black and white photo of a rainbow.
1606
+ 1604,"""Your mind flails in the gaps"" - by Ryan Murdock"
1607
+ 1605,"half Ryan, half pigeon"
1608
+ 1606,An Arundel Tomb
1609
+ 1607,pasta ömetabolism
1610
+ 1608,A dandelion blown into the universe
1611
+ 1609,a man at the beach
1612
+ 1610,Monet Lisa
1613
+ 1611,"r.j. Murdock's ""The Death of a Hacker"""
1614
+ 1612,Saturn being a good dad to his son
1615
+ 1613,The Starry Night
1616
+ 1614,a beautiful person
1617
+ 1615,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1618
+ 1616,an old man
1619
+ 1617,an intricate sculpture of Death itself
1620
+ 1618,Genesis
1621
+ 1619,a cherry tree made of fractals
1622
+ 1620,a beautiful woman
1623
+ 1621,a beautiful woman
1624
+ 1622,an illustration of a baby daikon radish in a tutu walking a dog
1625
+ 1623,
1626
+ 1624,the latent space
1627
+ 1625,A dead man
1628
+ 1626,
1629
+ 1627,frogs in the style of Ralph Steadman
1630
+ 1628,a cherry tree made of fractals
1631
+ 1629,fuzzy pals hum
1632
+ 1630,a tiny church inside an eyeball
1633
+ 1631,Aflame
1634
+ 1632,a sunflower
1635
+ 1633,Nostos
1636
+ 1634,Monet Lisa
1637
+ 1635,Monet Lisa
1638
+ 1636,a cherry tree made of fractals
1639
+ 1637,Cat in a teacup
1640
+ 1638,I miss the Spring
1641
+ 1639,a beautiful person
1642
+ 1640,Redacted ████████
1643
+ 1641,"God, it's amazing."
1644
+ 1642,a portrait of <name>
1645
+ 1643,Shrek the ogre
1646
+ 1644,Super Mario World but every character is Luigi
1647
+ 1645,God killed Van Gogh.
1648
+ 1646,"A cute, minmimalist valentine's day card featuring a cat"
1649
+ 1647,She's gorgeous
1650
+ 1648,a sunflower
1651
+ 1649,the sun is shining on the lake
1652
+ 1650,the intersection of art and technology
1653
+ 1651,a beautiful woman
1654
+ 1652,a beautiful painting
1655
+ 1653,Paradise Lost
1656
+ 1654,president abe lincoln but a cat
1657
+ 1655,
1658
+ 1656,"""The Penultimate Supper"" by Da Vinci"
1659
+ 1657,On the edge of endless darkness
1660
+ 1658,With the Gods in envy of their visions
1661
+ 1659,Dril is a cyber-philosopher.
1662
+ 1660,"r.j. Murdock's ""The Death of a Hacker"""
1663
+ 1661,
1664
+ 1662,a picture of Ryan Murdock
1665
+ 1663,A E S T H E T I C ?
1666
+ 1664,deepdream aka inceptionism
1667
+ 1665,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
1668
+ 1666,a beautiful woman
1669
+ 1667,Homer Simpson
1670
+ 1668,Persephone
1671
+ 1669,the whitest man
1672
+ 1670,handsome commemorative garden pigeon
1673
+ 1671,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
1674
+ 1672,a minimalist painting that you wouldn't understand
1675
+ 1673,a beautiful person
1676
+ 1674,Monet Lisa
1677
+ 1675,Monet Lisa
1678
+ 1676,cult of prisms
1679
+ 1677,"a ""This machine kills Trojans"" sticker on a Greek lyre"
1680
+ 1678,The agony of time
1681
+ 1679,turnt brony undergrad dwight
1682
+ 1680,the whitest man
1683
+ 1681,Dril is a cyber-philosopher.
1684
+ 1682,Alan Turing
1685
+ 1683,when the wind blows
1686
+ 1684,a portrait of Persephone
1687
+ 1685,deepdream aka inceptionism
1688
+ 1686,Dead Codes by Ryan Murdock
1689
+ 1687,Saturn being a good dad to his son
1690
+ 1688,a portrait of Abraham Lincoln
1691
+ 1689,The Theotokos is a bird
1692
+ 1690,a beautiful woman
1693
+ 1691,"i'm never gonna lose the desire to be loved. ""Oh the pain!! The pain! The agony!"""
1694
+ 1692,a corgi
1695
+ 1693,a green doG
1696
+ 1694,A E S T H E T I C ?
1697
+ 1695,
1698
+ 1696,the intersection of art and technology
1699
+ 1697,Dead Codes by Ryan Murdock
1700
+ 1698,a cute rabbit
1701
+ 1699,"God, it's amazing."
1702
+ 1700,a silent palace
1703
+ 1701,a wholesome clown. Not creepy at all
1704
+ 1702,Exquisite LonelinessnnLurid art by Ryan Murdock
1705
+ 1703,A structure made of people standing on top of other people
1706
+ 1704,Dead Codes by Ryan Murdock
1707
+ 1705,a gorgeous bouquet with roses and sunflowers
1708
+ 1706,a portrait of <name>
1709
+ 1707,intricate nothing
1710
+ 1708,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1711
+ 1709,Metaphysics
1712
+ 1710,using generated paint
1713
+ 1711,a minimalist painting that you wouldn't understand
1714
+ 1712,she sings opera
1715
+ 1713,Cat in a teacup
1716
+ 1714,turnt brony undergrad dwight
1717
+ 1715,a beautiful woman
1718
+ 1716,"""The hunger artist, full"" by Ryan Murdock"
1719
+ 1717,The years gild our memoriesnUnfairly.
1720
+ 1718,a woman and a crow
1721
+ 1719,A vanitas still life that features twitter follower counts
1722
+ 1720,The Monet Lisa
1723
+ 1721,a gorgeous bouquet with roses and sunflowers
1724
+ 1722,Philosophy is really homesickness: the urge to be at home everywhere
1725
+ 1723,a green doG
1726
+ 1724,an omen
1727
+ 1725,An elegant image of nature with gorgeous swirling gradients by R.J. Murdock
1728
+ 1726,a cute corgi
1729
+ 1727,cowboy with a trumpet
1730
+ 1728,"The laptop of brave Achaean Achilles, who would not live long."
1731
+ 1729,a portrait of a beautiful woman
1732
+ 1730,slightly mild cosplaying pseudo beard
1733
+ 1731,a man standing alone in a wheat field
1734
+ 1732,Aflame
1735
+ 1733,a portrait of Persephone
1736
+ 1734,a woman and a crow
1737
+ 1735,I sold my soul at the crossroads
1738
+ 1736,the demise of the universe
1739
+ 1737,a portrait of a beautiful person
1740
+ 1738,"Mephisto, shrouded in smoke"
1741
+ 1739,a portrait of advadnoun
1742
+ 1740,God is in heaven and all is right in the world
1743
+ 1741,a cherry tree made of fractals
1744
+ 1742,Odysseus speaks to the shades in Hades
1745
+ 1743,a steampunk technomancer
1746
+ 1744,a woman and a crow
1747
+ 1745,treehouse in the style of studio ghibli animation
1748
+ 1746,a gorgeous bouquet with roses and sunflowers
1749
+ 1747,🎷
1750
+ 1748,a cherry tree made of fractals
1751
+ 1749,"A cute, minmimalist valentine's day card featuring a cat"
1752
+ 1750,a famous painted portrait of Lady Macbeth
1753
+ 1751,pasta ömetabolism
1754
+ 1752,A short life full of immense joy
1755
+ 1753,a terrifying night hag
1756
+ 1754,a horse with four eyes.
1757
+ 1755,A baroque portrait of Hamlet
1758
+ 1756,this person is
1759
+ 1757,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1760
+ 1758,"a brilliant sketch titled ""Let Forever be Delayed"""
1761
+ 1759,baby metal
1762
+ 1760,a character from a ghibli movie
1763
+ 1761,a corgi
1764
+ 1762,the massive hope nof early iterations
1765
+ 1763,a portrait of a beautiful person
1766
+ 1764,Intimations of Immortality
1767
+ 1765,a silent palace
1768
+ 1766,Post-post-post-post-modern art
1769
+ 1767,a person's face
1770
+ 1768,"r.j. Murdock's ""The Death of a Hacker"""
1771
+ 1769,a cherry tree made of fractals
1772
+ 1770,Ophelia
1773
+ 1771,A E S T H E T I C ?
1774
+ 1772,
1775
+ 1773,
1776
+ 1774,Genesis
1777
+ 1775,Persephone
1778
+ 1776,Last Breath
1779
+ 1777,a portrait of Abraham Lincoln
1780
+ 1778,The OLD DATA
1781
+ 1779,the whitest man
1782
+ 1780,a minimalist painting that you wouldn't understand
1783
+ 1781,God once loved a woman
1784
+ 1782,totemic dusk
1785
+ 1783,when the wind blows
1786
+ 1784,treehouse in the style of studio ghibli animation
1787
+ 1785,a corgi
1788
+ 1786,Last Breath
1789
+ 1787,slightly mild cosplaying pseudo beard
1790
+ 1788,a portrait of a beautiful woman
1791
+ 1789,
1792
+ 1790,a photo from {my hometown}
1793
+ 1791,Dancing in the moonlight
1794
+ 1792,Everywhere is no-place
1795
+ 1793,Post-post-post-post-modern art
1796
+ 1794,👉 👈
1797
+ 1795,
1798
+ 1796,a woman and a crow
1799
+ 1797,"half Ryan, half pigeon"
1800
+ 1798,president abe lincoln but a cat
1801
+ 1799,A propaganda poster promoting big chungus
1802
+ 1800,"""The hunger artist, full"" by Ryan Murdock"
1803
+ 1801,a painting that couldn't be sold
1804
+ 1802,a beautiful haunting
1805
+ 1803,a technomancer
1806
+ 1804,"""A God Made of Wires and Dust"" by Ryan Murdock"
1807
+ 1805,little birds
1808
+ 1806,"""The hunger artist, full"" by Ryan Murdock"
1809
+ 1807,"""The hunger artist, full"" by Ryan Murdock"
1810
+ 1808,rooted reflected worries
1811
+ 1809,is this loss? but it's van gogh
1812
+ 1810,a portrait of <name>
1813
+ 1811,a beautiful person
1814
+ 1812,a photo portrait of Joe Bidenthulu
1815
+ 1813,a dog eating a cheese burger
1816
+ 1814,Aflame
1817
+ 1815,"a brilliant sketch titled ""Let Forever be Delayed"""
1818
+ 1816,Aflame
1819
+ 1817,Aflame
1820
+ 1818,a beautiful haunting
1821
+ 1819,totemic dusk
1822
+ 1820,"""The hunger artist, full"" by Ryan Murdock"
1823
+ 1821,Intimations of Immortality
1824
+ 1822,"""Your mind fails in the gaps"" - by Ryan Murdock"
1825
+ 1823,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1826
+ 1824,a dog.
1827
+ 1825,a green doG
1828
+ 1826,The Lost Generation
1829
+ 1827,Last Breath
1830
+ 1828,intricate nothing
1831
+ 1829,"God, it's amazing."
1832
+ 1830,this person is
1833
+ 1831,a silent palace
1834
+ 1832,a dog eating a cheese burger
1835
+ 1833,Genesis
1836
+ 1834,a calm still life in ethereal blue
1837
+ 1835,slightly mild cosplaying pseudo beard
1838
+ 1836,A propaganda poster promoting big chungus
1839
+ 1837,is this loss? but it's van gogh
1840
+ 1838,Dancing in the moonlight
1841
+ 1839,a corgi
1842
+ 1840,🔴~__��'t �
1843
+ 1841,totemic dusk
1844
+ 1842,a ginormous baby
1845
+ 1843,Dancing in the moonlight
1846
+ 1844,a photo from {my hometown}
1847
+ 1845,a beautiful Waluigi
1848
+ 1846,human
1849
+ 1847,A black and white photo of a rainbow.
1850
+ 1848,a beautiful person
1851
+ 1849,"""Cameras can't make art""nnAn oil on canvas by Murdock"
1852
+ 1850,a cherry tree made of fractals
1853
+ 1851,a beautiful person
1854
+ 1852,Taylor Swift
1855
+ 1853,a man on fire
1856
+ 1854,Post-Modern Nouveaux Statue
1857
+ 1855,is this loss? but it's van gogh
1858
+ 1856,a man at the beach
1859
+ 1857,a beautiful person
1860
+ 1858,"""The hunger artist, full"" by Ryan Murdock"
1861
+ 1859,The OLD DATA
1862
+ 1860,Dancing in the moonlight
1863
+ 1861,A structure made of people standing on top of other people
1864
+ 1862,a horse with four eyes.
1865
+ 1863,�>: ican read wii
1866
+ 1864,a portrait of Abraham Lincoln
1867
+ 1865,A propaganda poster for chunky cats.
1868
+ 1866,
1869
+ 1867,The Death of Achilles
1870
+ 1868,on the edge of grace
1871
+ 1869,I did not mean it I wanted a cute clever cartoon I swear.
1872
+ 1870,a handwritten obituary
1873
+ 1871,a man standing alone in a wheat field
1874
+ 1872,the intersection of art and technology
1875
+ 1873,Memento Mori
1876
+ 1874,a portrait of a beautiful woman
1877
+ 1875,cigar sammycorgi
1878
+ 1876,a steampunk technomancer
1879
+ 1877,"Sons are like birds, flying always over the mountain"
1880
+ 1878,The Lost Generation
1881
+ 1879,a minimalist painting that you wouldn't understand
1882
+ 1880,A black and white photo of a rainbow.
1883
+ 1881,a man holding an apple in one hand
1884
+ 1882,🔴~__��'t �
1885
+ 1883,🍰 🇺 🎓 🐶
1886
+ 1884,a man holding an apple in one hand
1887
+ 1885,a sketch of the mind of god
1888
+ 1886,treehouse in the style of studio ghibli animation
1889
+ 1887,Beauty here -- a photograph by Ryan Murdock
1890
+ 1888,A E S T H E T I C ?
1891
+ 1889,a selfie
1892
+ 1890,is this loss? but it's van gogh
1893
+ 1891,Costco wedding
1894
+ 1892,a beautiful person
1895
+ 1893,a green doG
1896
+ 1894,symmetry
1897
+ 1895,a dog eating a cheese burger
1898
+ 1896,a summer day
1899
+ 1897,"""A God Made of Wires and Dust"" by Ryan Murdock"
1900
+ 1898,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1901
+ 1899,a portrait of a beautiful woman
1902
+ 1900,зеленая собака
1903
+ 1901,"joy, happiness, bliss"
1904
+ 1902,Juliet
1905
+ 1903,a wholesome clown. Not creepy at all
1906
+ 1904,meaningless neko ♡�� neko
1907
+ 1905,I can read when there's writing on the wall
1908
+ 1906,"Oh the Death, not pigs forever."
1909
+ 1907,a minimalist painting that you wouldn't understand
1910
+ 1908,Aflame
1911
+ 1909,Super Mario World but every character is Luigi
1912
+ 1910,/
1913
+ 1911,Dead Codes by Ryan Murdock
1914
+ 1912,A vanitas still life that features twitter follower counts
1915
+ 1913,a beautiful woman
1916
+ 1914,a lamp
1917
+ 1915,
1918
+ 1916,the eyes of God are wired shut
1919
+ 1917,intricate nothing
1920
+ 1918,Is this loss?
1921
+ 1919,a photo of a purple dog
1922
+ 1920,a lamp
1923
+ 1921,totemic dusk
1924
+ 1922,The average Advadnoun twitter follower
1925
+ 1923,photosynthesis
1926
+ 1924,Costco wedding
1927
+ 1925,🔴~__��'t �
1928
+ 1926,Aflame
1929
+ 1927,a cherry tree made of fractals
1930
+ 1928,an intricate painting of eternity
1931
+ 1929,Saturn being a good dad to his son
1932
+ 1930,Nostos
1933
+ 1931,a beautiful person
1934
+ 1932,A gargoyle of wires and flesh
1935
+ 1933,🎷
1936
+ 1934,a beautiful person
1937
+ 1935,a tack
1938
+ 1936,Faceless Sorrow
1939
+ 1937,a gorgeous bouquet with roses and sunflowers
1940
+ 1938,using generated paint
1941
+ 1939,A Tragedy
1942
+ 1940,зеленая собака
1943
+ 1941,🔴~__��'t �
1944
+ 1942,A Tragedy
1945
+ 1943,A sticky-note magnum opus featuring birds
1946
+ 1944,president abe lincoln but a cat
1947
+ 1945,using generated paint
1948
+ 1946,
1949
+ 1947,Intimations of Immortality
1950
+ 1948,a portrait of <name>
1951
+ 1949,a silent palace
1952
+ 1950,A poster advertising death by water
1953
+ 1951,A propaganda poster promoting big chungus
1954
+ 1952,totemic dusk
1955
+ 1953,a horse with four eyes.
1956
+ 1954,cigar sammycorgi
1957
+ 1955,"""It is beginning to end.""nby Ryan Murdock."
1958
+ 1956,all architecture
1959
+ 1957,a portrait of Abraham Lincoln
1960
+ 1958,"joy, happiness, bliss"
1961
+ 1959,a man with a beard
1962
+ 1960,Genesis
1963
+ 1961,👉 👈
1964
+ 1962,Summer's Symphony: Counterpoint and Melody
1965
+ 1963,A gun killed Van Gogh.
1966
+ 1964,snazzy snazzy myspace cosplaying undergrad lookin cosplaying jared
1967
+ 1965,A minimalist propaganda poster promoting panpsychism
1968
+ 1966,Persephone
1969
+ 1967,a goblin by van gogh
1970
+ 1968,"""A new hope blooms on the long notes of old horns."""
1971
+ 1969,a painting of the city
1972
+ 1970,
1973
+ 1971,The agony of time
1974
+ 1972,Ophelia
1975
+ 1973,turnt brony undergrad dwight
1976
+ 1974,a beautiful person
1977
+ 1975,totemic dusk
1978
+ 1976,The Fool tarot card but it's The Lovers
1979
+ 1977,
1980
+ 1978,a broken heart
1981
+ 1979,"Rise, Oink, Lazarus of Bethany"
1982
+ 1980,"""The hunger artist, full"" by Ryan Murdock"
1983
+ 1981,a cherry tree made of fractals
1984
+ 1982,an intricate painting of eternity
1985
+ 1983,She's gorgeous
1986
+ 1984,a beautiful person
1987
+ 1985,I will meet you in a field firmly set within wrong.nnBy Ryan Murdock
1988
+ 1986,using generated paint
1989
+ 1987,a portrait of Abe Lincoln
1990
+ 1988,Persephone flees Hades
1991
+ 1989,a steampunk technomancer
1992
+ 1990,a beautiful woman
1993
+ 1991,"A portrait: man, whose lineage is corpse."
1994
+ 1992,🔴~__��'t �
1995
+ 1993,Intimations of Immortality
1996
+ 1994,an omen
1997
+ 1995,Persephone
1998
+ 1996,"God closes a door, boards up stained-glass windows."
1999
+ 1997,"""A new hope blooms on the long notes of old horns."""
2000
+ 1998,Fire
2001
+ 1999,
2002
+ 2000,Metaphysics
2003
+ 2001,"""The hunger artist, full"" by Ryan Murdock"
2004
+ 2002,when the wind blows
2005
+ 2003,a portrait of a beautiful person
2006
+ 2004,The Lost Generation
2007
+ 2005,a corgi
2008
+ 2006,a beautiful woman
2009
+ 2007,pasta ömetabolism
2010
+ 2008,a sad man
2011
+ 2009,Juliet
2012
+ 2010,a painting of a sycamore in
2013
+ 2011,a portrait of Abraham Lincoln
2014
+ 2012,The Fates knit such delicate nooses for us to bind
2015
+ 2013,a photo from {my hometown}
2016
+ 2014,a tree with leaves that are amarillo sightseeing thetic
2017
+ 2015,Sickness of the Soul
2018
+ 2016,pasta ömetabolism
2019
+ 2017,pasta ömetabolism
2020
+ 2018,bored of dying
2021
+ 2019,An Arundel Tomb
2022
+ 2020,The Starry Night
2023
+ 2021,Nostos
2024
+ 2022,bored of dying
2025
+ 2023,The Lost Generation
2026
+ 2024,The average Advadnoun twitter follower
2027
+ 2025,pathoarthistory evankirstel sleep depend npainter ☼ nightmare comprehend
2028
+ 2026,a silent palace
2029
+ 2027,beautiful art
2030
+ 2028,
2031
+ 2029,Last Breath
2032
+ 2030,
2033
+ 2031,a
2034
+ 2032,a portrait of advadnoun
2035
+ 2033,a portrait of a beautiful person
2036
+ 2034,a man holding an apple in one hand
2037
+ 2035,a gorgeous bouquet with roses and sunflowers
2038
+ 2036,photosynthesis
2039
+ 2037,God killed Van Gogh.
2040
+ 2038,Saturn being a good dad to his son
2041
+ 2039,a horse with four eyes.
2042
+ 2040,a beautiful woman
2043
+ 2041,a beautiful person
2044
+ 2042,a portrait of Abe Lincoln
2045
+ 2043,totemic dusk
2046
+ 2044,A Tragedy
2047
+ 2045,Persephone
2048
+ 2046,The OLD DATA
2049
+ 2047,"Elvis holding a rabbit. A detailed, high-quality photo without distortions"
2050
+ 2048,face like an M.C. Escher drawing n(you could get lost in its beauty)
2051
+ 2049,Dead Codes by Ryan Murdock
2052
+ 2050,Intimations of Immortality
2053
+ 2051,turnt brony undergrad dwight
2054
+ 2052,a photo of a purple dog
2055
+ 2053,Cat in a teacup
2056
+ 2054,🔴~__��'t �
2057
+ 2055,turnt brony undergrad dwight
2058
+ 2056,Beauty here -- a photo by r.j. Murdock
2059
+ 2057,The Fool
2060
+ 2058,a portrait of Juliet
2061
+ 2059,a jukebox powered by smoke
2062
+ 2060,cowboy with a trumpet
2063
+ 2061,twilight
2064
+ 2062,"joy, happiness, bliss"
2065
+ 2063,Dead Codes by Ryan Murdock
2066
+ 2064,"a brilliant sketch titled ""Let Forever be Delayed"""
2067
+ 2065,tamine ethereal image
2068
+ 2066,a portrait of <name>
2069
+ 2067,"God, it's amazing."
2070
+ 2068,she came in through the wall
2071
+ 2069,Fire
2072
+ 2070,Juliet
2073
+ 2071,God killed Van Gogh.
2074
+ 2072,a portrait of Persephone
2075
+ 2073,a beautiful person
2076
+ 2074,the whitest man
2077
+ 2075,Somewhere where I am not.nIntricate beauty by Ryan Murdock.
2078
+ 2076,a gilded lily
2079
+ 2077,The Lost Generation
2080
+ 2078,Dead Codes by Ryan Murdock
2081
+ 2079,Intimations of Immortality
2082
+ 2080,meaningless neko ♡♡ neko
2083
+ 2081,beautiful art
2084
+ 2082,"""The hunger artist, full"" by Ryan Murdock"
2085
+ 2083,an intricate painting of eternity
2086
+ 2084,Good grief
2087
+ 2085,"a person with 2 eyes, one mouth, one nose, and no extra holes!"
2088
+ 2086,The Fool