Merge pull request #41 from daily-co/optimize-pipeline

Optimize pipeline processing
This commit is contained in:
Moishe Lettvin
2024-03-07 21:01:03 -05:00
committed by GitHub
5 changed files with 32 additions and 20 deletions

View File

@@ -48,6 +48,16 @@ class Pipeline:
raise ValueError("Source queue not set") raise ValueError("Source queue not set")
yield await self.source.get() yield await self.source.get()
async def run_pipeline_recursively(
self, initial_frame: Frame, processors: List[FrameProcessor]
) -> AsyncGenerator[Frame, None]:
if processors:
async for frame in processors[0].process_frame(initial_frame):
async for final_frame in self.run_pipeline_recursively(frame, processors[1:]):
yield final_frame
else:
yield initial_frame
async def run_pipeline(self): async def run_pipeline(self):
""" Run the pipeline. Take each frame from the source queue, pass it to """ Run the pipeline. Take each frame from the source queue, pass it to
the first frame_processor, pass the output of that frame_processor to the the first frame_processor, pass the output of that frame_processor to the
@@ -65,23 +75,12 @@ class Pipeline:
try: try:
while True: while True:
frame_generators = [self.get_next_source_frame()] initial_frame = await self.source.get()
for processor in self.processors: async for frame in self.run_pipeline_recursively(initial_frame, self.processors):
next_frame_generators = [] await self.sink.put(frame)
for frame_generator in frame_generators:
async for frame in frame_generator:
next_frame_generators.append(processor.process_frame(frame))
frame_generators = next_frame_generators
for frame_generator in frame_generators: if isinstance(initial_frame, EndFrame) or isinstance(initial_frame, EndPipeFrame):
async for frame in frame_generator: break
await self.sink.put(frame)
if isinstance(
frame, EndFrame
) or isinstance(
frame, EndPipeFrame
):
return
except asyncio.CancelledError: except asyncio.CancelledError:
# this means there's been an interruption, do any cleanup necessary here. # this means there's been an interruption, do any cleanup necessary here.
for processor in self.processors: for processor in self.processors:

View File

@@ -1,5 +1,4 @@
import asyncio import asyncio
from doctest import OutputChecker
import unittest import unittest
from dailyai.pipeline.aggregators import SentenceAggregator, StatelessTextTransformer from dailyai.pipeline.aggregators import SentenceAggregator, StatelessTextTransformer
from dailyai.pipeline.frames import EndFrame, TextFrame from dailyai.pipeline.frames import EndFrame, TextFrame

View File

@@ -44,7 +44,8 @@ async def main(room_url: str):
buffer_queue = asyncio.Queue() buffer_queue = asyncio.Queue()
source_queue = asyncio.Queue() source_queue = asyncio.Queue()
pipeline = Pipeline(source = source_queue, sink=buffer_queue, processors=[llm, elevenlabs_tts]) pipeline = Pipeline(source = source_queue, sink=buffer_queue, processors=[llm, elevenlabs_tts])
source_queue.put_nowait(LLMMessagesQueueFrame(messages)) await source_queue.put(LLMMessagesQueueFrame(messages))
await source_queue.put(EndFrame())
pipeline_run_task = pipeline.run_pipeline() pipeline_run_task = pipeline.run_pipeline()
@transport.event_handler("on_first_other_participant_joined") @transport.event_handler("on_first_other_participant_joined")

View File

@@ -47,7 +47,20 @@ async def main(room_url):
source_queue = asyncio.Queue() source_queue = asyncio.Queue()
for month in ["January", "February"]: for month in [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
]:
messages = [ messages = [
{ {
"role": "system", "role": "system",

View File

@@ -51,8 +51,8 @@ async def main(room_url: str, token):
tma_in, tma_in,
llm, llm,
fl2, fl2,
tts,
tma_out, tma_out,
tts
], ],
) )
await transport.run_uninterruptible_pipeline(pipeline) await transport.run_uninterruptible_pipeline(pipeline)