if (ubatch->pos && pos) {
const int64_t n_tokens = ubatch->n_tokens;
- if (ubatch->token && n_pos_per_embd > 1) {
+ if (ubatch->token && n_pos_per_embd == 4) {
// in case we're using M-RoPE with text tokens, convert the 1D positions to 4D
- // the other dimensions are all 0, they are unused for text tokens
- std::vector<llama_pos> pos_data(n_tokens*n_pos_per_embd, 0);
+ // the 3 first dims are the same, and 4th dim is all 0
+ std::vector<llama_pos> pos_data(n_tokens*n_pos_per_embd);
// copy the first dimension
for (int i = 0; i < n_tokens; ++i) {
- pos_data[i] = ubatch->pos[i];
+ pos_data[ i] = ubatch->pos[i];
+ pos_data[ n_tokens + i] = ubatch->pos[i];
+ pos_data[2 * n_tokens + i] = ubatch->pos[i];
+ pos_data[3 * n_tokens + i] = 0; // 4th dim is 0
}
ggml_backend_tensor_set(pos, pos_data.data(), 0, pos_data.size()*ggml_element_size(pos));
} else {