qmichalwarda commited on
Commit
cdc35ee
·
verified ·
1 Parent(s): 6334efd

qev_fast vision: fix KeyError when a full image cache evicts an image the same call uses

Browse files
Files changed (2) hide show
  1. SHA256SUMS +1 -1
  2. qev_fast/vision.py +13 -5
SHA256SUMS CHANGED
@@ -21,7 +21,7 @@ ed65a44a68aefcc6397068db52274433cd372a2c5fff6b1f7f901ef543429941 qev_fast/engin
21
  e9a6ef607a94a11f659f4d57fa1588c8b99b5288535ed9fb7db0a144fd817c55 qev_fast/prefix.py
22
  c849a299772c7186b5b30feb9db777ef12673271e739051ce0968f6bbc741b27 qev_fast/runner.py
23
  9a7e7a159b4b6c9c1755ccbaf6c11b433bac78f8ec67474833e61821d77999ef qev_fast/systemone.py
24
- 53c44b0101b889464a78cf7b8c8bfe518765610f39478df1b7a3e8f680cb02e4 qev_fast/vision.py
25
  e8d061404d312ca2cfbec5db8d5adbacb9fd2888e20997833f8080ed317e4184 qev_image.py
26
  1cfc5fbdc1b4317bd2df8f2e965ee466f95a33af5db8c949d157f86c93996d4e qev_image_server.py
27
  01239024d6bce903ae16a8bda08a56b6ecbf43d630b9bd590fb1a73e9c11e54c qev_server.py
 
21
  e9a6ef607a94a11f659f4d57fa1588c8b99b5288535ed9fb7db0a144fd817c55 qev_fast/prefix.py
22
  c849a299772c7186b5b30feb9db777ef12673271e739051ce0968f6bbc741b27 qev_fast/runner.py
23
  9a7e7a159b4b6c9c1755ccbaf6c11b433bac78f8ec67474833e61821d77999ef qev_fast/systemone.py
24
+ 3713ce5af6d548cd5db324feae5d31f99379ddb21c544d3cc0bad98939ad159a qev_fast/vision.py
25
  e8d061404d312ca2cfbec5db8d5adbacb9fd2888e20997833f8080ed317e4184 qev_image.py
26
  1cfc5fbdc1b4317bd2df8f2e965ee466f95a33af5db8c949d157f86c93996d4e qev_image_server.py
27
  01239024d6bce903ae16a8bda08a56b6ecbf43d630b9bd590fb1a73e9c11e54c qev_server.py
qev_fast/vision.py CHANGED
@@ -105,19 +105,27 @@ class Vision:
105
  seen.add(p.key)
106
  self.stats["images"] += len(preps)
107
  self.stats["cache_hits"] += len(preps) - len(todo)
 
108
  if todo:
109
  pix = torch.cat([p.pix for p in todo]).to(self.device, self.visual.dtype)
110
  thw = torch.cat([p.thw for p in todo]).to(self.device)
111
  out = self.visual(pix, grid_thw=thw, return_dict=True).pooler_output
112
  self.stats["tower_calls"] += 1
113
  for p, e in zip(todo, torch.split(out, [p.n for p in todo]), strict=True):
114
- self.cache[p.key] = e
115
- while len(self.cache) > self.cache_size:
116
- self.cache.popitem(last=False)
117
  res = []
118
  for p in preps:
119
- self.cache.move_to_end(p.key)
120
- res.append(self.cache[p.key])
 
 
 
 
 
 
 
121
  return res
122
 
123
  def positions(self, ids: list, preps: list) -> np.ndarray:
 
105
  seen.add(p.key)
106
  self.stats["images"] += len(preps)
107
  self.stats["cache_hits"] += len(preps) - len(todo)
108
+ fresh = {}
109
  if todo:
110
  pix = torch.cat([p.pix for p in todo]).to(self.device, self.visual.dtype)
111
  thw = torch.cat([p.thw for p in todo]).to(self.device)
112
  out = self.visual(pix, grid_thw=thw, return_dict=True).pooler_output
113
  self.stats["tower_calls"] += 1
114
  for p, e in zip(todo, torch.split(out, [p.n for p in todo]), strict=True):
115
+ fresh[p.key] = e
116
+ # Read every embedding of this call before the cache is trimmed: trimming can evict a cached image this same
117
+ # call uses (a full cache, one cached and one new image), and a call can hold more images than the cache.
118
  res = []
119
  for p in preps:
120
+ e = fresh.get(p.key)
121
+ if e is None:
122
+ e = self.cache[p.key]
123
+ self.cache.move_to_end(p.key)
124
+ res.append(e)
125
+ for k, e in fresh.items():
126
+ self.cache[k] = e
127
+ while len(self.cache) > self.cache_size:
128
+ self.cache.popitem(last=False)
129
  return res
130
 
131
  def positions(self, ids: list, preps: list) -> np.ndarray: