* Fix memory management in llava and server code
Fixes this error:
llama_new_context_with_model: graph splits (measure): 3
Available slots:
-> Slot 0 - max context: 6000
{"timestamp":
1707926446,"level":"INFO","function":"main","line":2623,"message":"model loaded"}
all slots are idle and system prompt is empty, clear the KV cache
slot 0 - loaded image
slot 0 is processing [task id: 0]
slot 0 : kv cache rm - [0, end)
slot 0 - encoding image [id: 1]
munmap_chunk(): invalid pointer
Aborted
* Make it cleaner by checking size in batch free wrapper
return new clip_image_f32();
}
-void clip_image_u8_free (struct clip_image_u8 * img) { delete img; }
+void clip_image_u8_free(struct clip_image_u8 * img) { delete img; }
void clip_image_f32_free(struct clip_image_f32 * img) { delete img; }
+void clip_image_u8_batch_free(struct clip_image_u8_batch & batch) {
+ if (batch.size > 0) {
+ delete[] batch.data;
+ batch.size = 0;
+ }
+}
+void clip_image_f32_batch_free(struct clip_image_f32_batch & batch) {
+ if (batch.size > 0) {
+ delete[] batch.data;
+ batch.size = 0;
+ }
+}
static void build_clip_img_from_data(const stbi_uc * data, int nx, int ny, clip_image_u8 * img) {
img->nx = nx;
pad_to_square = false;
}
// free the previous res_imgs if any set
- if (res_imgs.size > 0 && res_imgs.size < 100) {
- for (size_t i = 0; i < res_imgs.size; i++) {
- clip_image_f32_free(&(res_imgs.data[i]));
- }
- delete[] res_imgs.data;
+ if (res_imgs.size > 0) {
+ clip_image_f32_batch_free(res_imgs);
}
res_imgs.data = nullptr;
res_imgs.size = 0;
res_imgs.size = 1;
res_imgs.data = new clip_image_f32[res_imgs.size];
- res_imgs.data[0] = std::move(*res);
+ res_imgs.data[0] = *res;
+ clip_image_f32_free(res);
return true;
}
CLIP_API void clip_image_u8_free (struct clip_image_u8 * img);
CLIP_API void clip_image_f32_free(struct clip_image_f32 * img);
+CLIP_API void clip_image_u8_batch_free (struct clip_image_u8_batch & batch);
+CLIP_API void clip_image_f32_batch_free(struct clip_image_f32_batch & batch);
CLIP_API bool clip_image_load_from_file(const char * fname, struct clip_image_u8 * img);
{
LOG_TEE("Error processing the given image");
clip_free(clp_ctx);
- clip_image_f32_free(img_res_v.data);
+ clip_image_f32_batch_free(img_res_v);
+ return false;
+ }
+ if (img_res_v.size == 0)
+ {
+ LOG_TEE("Error processing the given image");
return false;
}
if (!img.image_embedding)
{
LOG_TEE("Unable to allocate memory for image embeddings\n");
+ clip_image_f32_batch_free(img_res_v);
clip_free(clp_ctx);
return false;
}
if (!clip_image_encode(clp_ctx, params.n_threads, img_res, img.image_embedding))
{
LOG_TEE("Unable to encode image\n");
+ clip_image_f32_batch_free(img_res_v);
return false;
}
- clip_image_f32_free(img_res_v.data);
+ clip_image_f32_batch_free(img_res_v);
img.request_encode_image = false;
}