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