-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Expand file tree
/
Copy pathcacheTransferLayer.cpp
More file actions
145 lines (125 loc) · 5.04 KB
/
Copy pathcacheTransferLayer.cpp
File metadata and controls
145 lines (125 loc) · 5.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "cacheTransferLayer.h"
#include "tensorrt_llm/batch_manager/cacheFormatter.h"
#include "tensorrt_llm/batch_manager/rnnCacheFormatter.h"
#include "tensorrt_llm/common/assert.h"
#include "tensorrt_llm/common/logger.h"
#include "tensorrt_llm/executor/cache_transmission/agent_utils/connection.h"
#include "tensorrt_llm/executor/cache_transmission/cacheSplitConcat.h"
#include <algorithm>
namespace tensorrt_llm::batch_manager
{
CacheTransferLayer::CacheTransferLayer(executor::kv_cache::CacheState cacheState,
std::unique_ptr<BaseCacheFormatter> kvFormatter, std::unique_ptr<RnnCacheFormatter> rnnFormatter)
: mCacheState{std::move(cacheState)}
, mKvFormatter{std::move(kvFormatter)}
, mRnnFormatter{std::move(rnnFormatter)}
{
TLLM_CHECK(mKvFormatter);
}
CacheTransferLayer::~CacheTransferLayer() = default;
CacheTransferLayer::CacheTransferLayer(CacheTransferLayer&&) noexcept = default;
CacheTransferLayer& CacheTransferLayer::operator=(CacheTransferLayer&&) noexcept = default;
void CacheTransferLayer::validateSupport(executor::DataTransceiverState const& peerState) const
{
TLLM_CHECK_WITH_INFO(mKvFormatter->inquireSupport(mCacheState, peerState.getCacheState().value()),
"Disagg server does not currently support these cacheState, please check the cacheState of the context and "
"gen executors");
bool const selfHasRnn = mCacheState.hasRnnConfig();
bool const peerHasRnn = peerState.getCacheState().value().hasRnnConfig();
if (mRnnFormatter && selfHasRnn)
{
// Unified pool path (CppMambaHybridCacheManager) uses RnnCacheFormatter.
if (peerHasRnn)
{
TLLM_CHECK_WITH_INFO(mRnnFormatter->inquireSupport(mCacheState, peerState.getCacheState().value()),
"Disagg server does not currently support these RNN state configurations, please check the RNN "
"state of the context and gen executors");
}
else
{
TLLM_LOG_WARNING("Self has RNN state but peer does not. RNN transfer will be skipped.");
}
}
else if (!selfHasRnn && peerHasRnn)
{
TLLM_LOG_WARNING("Peer has RNN state but self does not. RNN transfer will be skipped.");
}
}
std::vector<SizeType32> CacheTransferLayer::computeCounterparts(
SizeType32 selfIdx, executor::DataTransceiverState const& peerState) const
{
auto counterparts
= executor::kv_cache::targetIRanks(peerState.getCacheState().value(), mCacheState, selfIdx).mIRanks;
// Add RNN counterparts that are not already in the KV set
if (mRnnFormatter && mCacheState.hasRnnConfig() && peerState.getCacheState().value().hasRnnConfig())
{
auto rnnCounterparts
= executor::kv_cache::targetIRanksForRnn(peerState.getCacheState().value(), mCacheState, selfIdx).mIRanks;
for (auto rank : rnnCounterparts)
{
if (std::find(counterparts.begin(), counterparts.end(), rank) == counterparts.end())
{
counterparts.push_back(rank);
}
}
}
return counterparts;
}
void CacheTransferLayer::format(TransferSession& session) const
{
mKvFormatter->format(session);
if (mRnnFormatter)
{
for (auto const* conn : session.getConnections())
{
if (conn != nullptr)
{
conn->activateBuffer(static_cast<uint8_t>(BufferKind::kRNN));
}
}
mRnnFormatter->format(session);
}
}
void CacheTransferLayer::unformat(TransferSession& session) const
{
mKvFormatter->unformat(session);
if (mRnnFormatter)
{
mRnnFormatter->unformat(session);
}
}
void CacheTransferLayer::setRnnConfig(executor::kv_cache::CacheState::RnnModelConfig rnnModelConfig,
std::vector<SizeType32> rnnLayerNumPerPP, nvinfer1::DataType convStateDataType, nvinfer1::DataType ssmStateDataType)
{
mCacheState.setRnnConfig(
std::move(rnnModelConfig), std::move(rnnLayerNumPerPP), convStateDataType, ssmStateDataType);
}
executor::kv_cache::CacheState const& CacheTransferLayer::getCacheState() const noexcept
{
return mCacheState;
}
kv_cache_manager::BaseKVCacheManager* CacheTransferLayer::getCacheManager() const noexcept
{
return mKvFormatter->getCacheManager();
}
BaseCacheFormatter* CacheTransferLayer::getKvFormatter() const noexcept
{
return mKvFormatter.get();
}
} // namespace tensorrt_llm::batch_manager