Skip to content

Commit 1460e29

Browse files
fgsiveoneyongjay
andauthored
fix: prevent dangling pointer in merged embedding buffer(pytorch#18410) (pytorch#18987)
Co-authored-by: yongjay <yongjaylu@gmail.com>
1 parent 1941d07 commit 1460e29

2 files changed

Lines changed: 8 additions & 5 deletions

File tree

examples/qualcomm/oss_scripts/llama/runner/multimodal_runner/multimodal_embedding_merger.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ TensorStruct<float> MultimodalEmbeddingMerger::merge(
9292
"No text embeddings added. Call add_text_embeddings() first.");
9393

9494
// Final merged embeddings
95-
std::vector<float> merged_buffer;
95+
std::shared_ptr<std::vector<float>> merged_buffer =
96+
std::make_shared<std::vector<float>>();
9697
std::vector<executorch::aten::TensorImpl::SizesType> sizes;
9798
TensorStruct<float> merged_embeddings;
9899

@@ -121,7 +122,7 @@ TensorStruct<float> MultimodalEmbeddingMerger::merge(
121122
total_tokens_ = total_tokens_ - num_placeholder_tokens;
122123

123124
size_t total_elements = total_tokens_ * embedding_dim_;
124-
merged_buffer.resize(total_elements);
125+
merged_buffer->resize(total_elements);
125126

126127
// Merge embeddings based on input_ids
127128
size_t text_emb_idx = 0; // Which text embedding chunk in current turn
@@ -144,7 +145,7 @@ TensorStruct<float> MultimodalEmbeddingMerger::merge(
144145

145146
size_t num_elements = num_image_tokens * embedding_dim_;
146147
std::memcpy(
147-
merged_buffer.data() + output_offset,
148+
merged_buffer->data() + output_offset,
148149
image_buffer.data(),
149150
num_elements * sizeof(float));
150151

@@ -160,7 +161,7 @@ TensorStruct<float> MultimodalEmbeddingMerger::merge(
160161
const std::vector<float>& text_buffer =
161162
text_embedding_buffers_[text_emb_idx];
162163
std::memcpy(
163-
merged_buffer.data() + output_offset,
164+
merged_buffer->data() + output_offset,
164165
text_buffer.data() + text_token_idx * embedding_dim_,
165166
embedding_dim_ * sizeof(float));
166167

@@ -176,7 +177,8 @@ TensorStruct<float> MultimodalEmbeddingMerger::merge(
176177
image_embedding_buffers_.size());
177178

178179
// Setup tensor metadata
179-
merged_embeddings.data = merged_buffer.data();
180+
merged_embeddings.buffer = merged_buffer;
181+
merged_embeddings.data = merged_buffer->data();
180182
merged_embeddings.size = total_elements * sizeof(float);
181183

182184
// Setup sizes and dim_order: [1, total_tokens, embedding_dim]

examples/qualcomm/oss_scripts/llama/runner/utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
template <typename T>
1616
struct TensorStruct {
1717
std::unique_ptr<executorch::aten::TensorImpl> tensor;
18+
std::shared_ptr<std::vector<T>> buffer;
1819
T* data;
1920
// data size in bytes
2021
size_t size;

0 commit comments

Comments
 (0)