summaryrefslogtreecommitdiff
path: root/examples/llava/clip.cpp
diff options
context:
space:
mode:
authorElbios <141279586+Elbios@users.noreply.github.com>2024-02-15 09:01:57 +0100
committerGitHub <noreply@github.com>2024-02-15 10:01:57 +0200
commit0d4177126b0556e202efb85bf3f768be81076400 (patch)
treeb696a05bc6a6378b72cd0be3f96211ffe0056db1 /examples/llava/clip.cpp
parent7930a8a6e89a04c77c51e3ae5dc1cd8e845b6b8f (diff)
llava : fix memory management bug (#5491)
* 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
Diffstat (limited to 'examples/llava/clip.cpp')
-rw-r--r--examples/llava/clip.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/examples/llava/clip.cpp b/examples/llava/clip.cpp
index 9c5091e6..2cad27e8 100644
--- a/examples/llava/clip.cpp
+++ b/examples/llava/clip.cpp
@@ -1230,8 +1230,20 @@ struct clip_image_f32 * clip_image_f32_init() {
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;
@@ -1494,11 +1506,8 @@ bool clip_image_preprocess(struct clip_ctx * ctx, const clip_image_u8 * img, cli
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;
@@ -1650,7 +1659,8 @@ bool clip_image_preprocess(struct clip_ctx * ctx, const clip_image_u8 * img, cli
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;
}