| 132 | if (keep_elems > 0) { |
| 133 | std::copy(source.key.begin(), source.key.end(), cache.import_key_scratch.begin()); |
| 134 | std::copy(source.value.begin(), source.value.end(), cache.import_value_scratch.begin()); |
| 135 | } |
| 136 | write_cache_tensor(cache.key_tensor, cache.import_key_scratch, options_); |
| 137 | write_cache_tensor(cache.value_tensor, cache.import_value_scratch, options_); |
| 138 | } |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | TransformerKVState TransformerKVCache::export_state() const { |
| 143 | TransformerKVState state; |
| 144 | state.current_end = current_end_; |
| 145 | state.layers.resize(layers_.size()); |
| 146 | const size_t keep_elems = static_cast<size_t>(valid_steps_ * step_elems_); |
| 147 | for (size_t layer = 0; layer < layers_.size(); ++layer) { |
| 148 | auto & out = state.layers[layer]; |
| 149 | out.valid_steps = valid_steps_; |
| 150 | if (keep_elems == 0) { |
| 151 | continue; |
| 152 | } |
| 153 | const auto key_values = read_cache_tensor(layers_[layer].key_tensor, options_); |
| 154 | const auto value_values = read_cache_tensor(layers_[layer].value_tensor, options_); |
nothing calls this directly
no test coverage detected