Skip to content

Commit ec3da87

Browse files
authored
[None][perf] disagg: serialize Request input_token_ids as int32 bytes (#15134)
Signed-off-by: Iman Tabrizian <itabrizian@nvidia.com>
1 parent 2862ef6 commit ec3da87

1 file changed

Lines changed: 16 additions & 3 deletions

File tree

cpp/tensorrt_llm/nanobind/executor/request.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <nanobind/stl/vector.h>
3737
#include <sstream>
3838

39+
#include <cstring>
3940
#include <optional>
4041
#include <vector>
4142

@@ -591,7 +592,15 @@ void initRequestBindings(nb::module_& m)
591592

592593
auto requestGetstate = [](tle::Request const& self)
593594
{
594-
return nb::make_tuple(self.getInputTokenIds(), self.getMaxTokens(), self.getStreaming(),
595+
// Serialize input_token_ids as a raw int32 byte buffer instead of a Python
596+
// list[int]: nanobind casts VecTokens element-by-element (a PyLong storm,
597+
// ISL-proportional) on every Request pickle -- the request broadcast and the
598+
// RPC IPC submit. A bytes blob is a memcpy, ~order-of-magnitude cheaper.
599+
// Paired with requestSetstate.
600+
auto const& inputTokenIds = self.getInputTokenIds();
601+
auto inputTokenIdsBytes = nb::bytes(
602+
reinterpret_cast<char const*>(inputTokenIds.data()), inputTokenIds.size() * sizeof(VecTokens::value_type));
603+
return nb::make_tuple(std::move(inputTokenIdsBytes), self.getMaxTokens(), self.getStreaming(),
595604
self.getSamplingConfig(), self.getOutputConfig(), self.getEndId(), self.getPadId(), self.getPositionIds(),
596605
self.getBadWords(), self.getStopWords(), self.getEmbeddingBias(), self.getExternalDraftTokensConfig(),
597606
self.getPromptTuningConfig(), self.getMultimodalInput(), self.getMultimodalEmbedding(),
@@ -608,8 +617,12 @@ void initRequestBindings(nb::module_& m)
608617
{
609618
throw std::runtime_error("Invalid Request state!");
610619
}
611-
new (&self) tle::Request(nb::cast<VecTokens>(state[0]), nb::cast<SizeType32>(state[1]),
612-
nb::cast<bool>(state[2]), nb::cast<tle::SamplingConfig>(state[3]), nb::cast<tle::OutputConfig>(state[4]),
620+
// input_token_ids is a raw int32 byte buffer (see requestGetstate).
621+
auto const inputTokenIdsBytes = nb::cast<nb::bytes>(state[0]);
622+
VecTokens inputTokenIds(inputTokenIdsBytes.size() / sizeof(VecTokens::value_type));
623+
std::memcpy(inputTokenIds.data(), inputTokenIdsBytes.c_str(), inputTokenIdsBytes.size());
624+
new (&self) tle::Request(std::move(inputTokenIds), nb::cast<SizeType32>(state[1]), nb::cast<bool>(state[2]),
625+
nb::cast<tle::SamplingConfig>(state[3]), nb::cast<tle::OutputConfig>(state[4]),
613626
nb::cast<std::optional<SizeType32>>(state[5]), nb::cast<std::optional<SizeType32>>(state[6]),
614627
nb::cast<std::optional<std::vector<SizeType32>>>(state[7]),
615628
nb::cast<std::optional<std::list<VecTokens>>>(state[8]),

0 commit comments

Comments
 (0)