diff --git a/backend/rust/Cargo.lock b/backend/rust/Cargo.lock index 9ef570f5daa8..f4d4397ca217 100644 --- a/backend/rust/Cargo.lock +++ b/backend/rust/Cargo.lock @@ -183,24 +183,19 @@ dependencies = [ "tokio", "tokio-stream", "tonic", - "tonic-build", + "tracing", + "tracing-subscriber", ] [[package]] name = "burn" version = "0.1.0" dependencies = [ - "async-stream 0.2.1", + "async-trait", "bunker", - "prost", - "rand 0.7.3", - "serde", - "serde_json", "tokio", "tokio-stream", "tonic", - "tracing", - "tracing-subscriber", ] [[package]] @@ -224,6 +219,13 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "codegen" +version = "0.1.0" +dependencies = [ + "tonic-build", +] + [[package]] name = "either" version = "1.9.0" diff --git a/backend/rust/Cargo.toml b/backend/rust/Cargo.toml index 194f7573a59f..15a22f54d8b6 100644 --- a/backend/rust/Cargo.toml +++ b/backend/rust/Cargo.toml @@ -3,4 +3,5 @@ resolver = "2" members = [ "bunker", "burn", + "codegen", ] \ No newline at end of file diff --git a/backend/rust/Makefile b/backend/rust/Makefile new file mode 100644 index 000000000000..2a18f0facd82 --- /dev/null +++ b/backend/rust/Makefile @@ -0,0 +1,30 @@ +# default are fmt and then check +.DEFAULT_GOAL := all + +.PHONY: all +all: fmt check + +.PHONY: fmt +fmt: + @echo "Formatting code..." + @cargo fmt --all -- --check + +.PHONY: build +build: + @echo "Building..." + @cargo build --release + +.PHONY: test +test: + @echo "Testing..." + @cargo test --all + +.PHONY: check +check: + @echo "Checking..." + @cargo check --all + +.PHONY: clean +clean: + @echo "Cleaning..." + @cargo clean diff --git a/backend/rust/README.md b/backend/rust/README.md index 8489d0d6fe22..de0012b9b92d 100644 --- a/backend/rust/README.md +++ b/backend/rust/README.md @@ -30,10 +30,8 @@ macOS brew install protobuf ``` -### Generating the server side code - -> Rust backend uses the same proto file with the other backends, so we should keep the same interface of the backend. So, the output file of backend.rs is in the /target folder and do not need to be managed by git. +### Cargo fmt all the code ``` -make build +cargo fmt --all --check ``` \ No newline at end of file diff --git a/backend/rust/bunker/Cargo.toml b/backend/rust/bunker/Cargo.toml index 086317e916f4..cb048a5e71b0 100644 --- a/backend/rust/bunker/Cargo.toml +++ b/backend/rust/bunker/Cargo.toml @@ -16,6 +16,5 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" rand = "0.7" async-trait = "0.1.74" - -[build-dependencies] -tonic-build = "0.10" +tracing-subscriber = "0.3.17" +tracing = "0.1.39" diff --git a/backend/rust/bunker/build.rs b/backend/rust/bunker/build.rs deleted file mode 100644 index d9d332a04e4d..000000000000 --- a/backend/rust/bunker/build.rs +++ /dev/null @@ -1,10 +0,0 @@ -fn main() { - tonic_build::configure() - .out_dir("src") - .build_server(true) - .build_client(false) - .compile( - &["../../../pkg/grpc/proto/backend.proto"], - &["../../../pkg/grpc/proto"]) - .expect("Failed to compile proto file"); -} \ No newline at end of file diff --git a/backend/rust/bunker/src/backend.rs b/backend/rust/bunker/generated/backend.rs similarity index 100% rename from backend/rust/bunker/src/backend.rs rename to backend/rust/bunker/generated/backend.rs diff --git a/backend/rust/bunker/src/lib.rs b/backend/rust/bunker/src/lib.rs index 484161001f54..b4c8fb2726c2 100644 --- a/backend/rust/bunker/src/lib.rs +++ b/backend/rust/bunker/src/lib.rs @@ -1,5 +1,6 @@ -pub mod service; +/// Import the code() backend.rs was generated from backend.proto +pub mod pb { + include!("../generated/backend.rs"); +} -pub mod pb{ - include!("backend.rs"); -} \ No newline at end of file +pub mod service; diff --git a/backend/rust/bunker/src/service.rs b/backend/rust/bunker/src/service.rs index 1cebb11daff6..81cf3132cea0 100644 --- a/backend/rust/bunker/src/service.rs +++ b/backend/rust/bunker/src/service.rs @@ -1,21 +1,43 @@ -use crate::pb::{HealthMessage, PredictOptions,Reply,ModelOptions, EmbeddingResult, GenerateImageRequest,TranscriptRequest,TranscriptResult,TtsRequest,TokenizationResponse,StatusResponse}; +//! Contains the service trait for the bunker service. + use crate::pb::Result as PbResult; -use tonic::{Request, Response, Status}; -use tokio_stream::wrappers::ReceiverStream; +use crate::pb::{ + EmbeddingResult, GenerateImageRequest, HealthMessage, ModelOptions, PredictOptions, Reply, + StatusResponse, TokenizationResponse, TranscriptRequest, TranscriptResult, TtsRequest, +}; use async_trait::async_trait; - +use tokio_stream::wrappers::ReceiverStream; +use tonic::{Request, Response, Status}; #[async_trait] -pub trait BackendService>>{ - async fn health(&self, request: Request) -> Result,Status>; - async fn predict(&self, request: Request) -> Result,Status>; - async fn load_model(&self, request: Request) -> Result,Status>; - async fn predict_stream(&self, request: Request) -> Result,Status>; // https://github.com/rust-lang/rust/issues/29661 - async fn embedding(&self, request: Request) -> Result,Status>; - async fn generate_image(&self, request: Request) -> Result,Status>; - async fn audio_transcription(&self, request: Request) -> Result,Status>; - async fn tts(&self, request: Request) -> Result,Status>; - async fn tokenize_string(&self, request: Request) -> Result,Status>; - async fn status(&self, request: Request) -> Result,Status>; - -} \ No newline at end of file +pub trait BackendService>> { + async fn health(&self, request: Request) -> Result, Status>; + async fn predict(&self, request: Request) -> Result, Status>; + async fn load_model( + &self, + request: Request, + ) -> Result, Status>; + async fn predict_stream(&self, request: Request) + -> Result, Status>; // https://github.com/rust-lang/rust/issues/29661 + async fn embedding( + &self, + request: Request, + ) -> Result, Status>; + async fn generate_image( + &self, + request: Request, + ) -> Result, Status>; + async fn audio_transcription( + &self, + request: Request, + ) -> Result, Status>; + async fn tts(&self, request: Request) -> Result, Status>; + async fn tokenize_string( + &self, + request: Request, + ) -> Result, Status>; + async fn status( + &self, + request: Request, + ) -> Result, Status>; +} diff --git a/backend/rust/burn/Cargo.toml b/backend/rust/burn/Cargo.toml index dfc127d8f670..1d4c804214ed 100644 --- a/backend/rust/burn/Cargo.toml +++ b/backend/rust/burn/Cargo.toml @@ -9,15 +9,7 @@ edition = "2021" # import bunker here bunker = { path = "../bunker" } - -tonic = "0.10" -prost = "0.12" -tokio = { version = "1.0", features = ["rt-multi-thread", "macros", "sync", "time"] } -tokio-stream = "0.1" - -async-stream = "0.2" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -rand = "0.7" -tracing = "0.1" -tracing-subscriber = "0.3" +tokio = "1.33.0" +async-trait = "0.1.74" +tonic = "0.10.2" +tokio-stream = "0.1.14" diff --git a/backend/rust/burn/src/main.rs b/backend/rust/burn/src/main.rs index 4c5015975320..11035a14c582 100644 --- a/backend/rust/burn/src/main.rs +++ b/backend/rust/burn/src/main.rs @@ -1,50 +1,65 @@ -use tokio_stream::wrappers::ReceiverStream; -use tonic::transport::Server; -use tonic::{async_trait, Request, Response, Status}; -use tracing; -use tracing_subscriber; -use bunker::pb::{EmbeddingResult, GenerateImageRequest, HealthMessage, ModelOptions, PredictOptions, Reply, StatusResponse, TokenizationResponse, TranscriptRequest, TranscriptResult, TtsRequest}; use bunker::pb::Result as PbResult; +use bunker::pb::{ + EmbeddingResult, GenerateImageRequest, HealthMessage, ModelOptions, PredictOptions, Reply, + StatusResponse, TokenizationResponse, TranscriptRequest, TranscriptResult, TtsRequest, +}; use bunker::service::BackendService; +use tokio_stream::wrappers::ReceiverStream; +use tonic::{Request, Response, Status}; +use async_trait::async_trait; // implement BackendService trait in bunker struct BurnBackend; #[async_trait] -impl BackendService>> for BurnBackend{ - - async fn health(&self, request: Request) -> Result,Status> { +impl BackendService>> for BurnBackend { + async fn health(&self, request: Request) -> Result, Status> { // return a Result,Status> let reply = Reply { message: "OK".into(), }; - let res=Response::new(reply); + let res = Response::new(reply); Ok(res) } - async fn predict(&self, request: Request) -> Result,Status> { + async fn predict(&self, request: Request) -> Result, Status> { todo!() } - async fn load_model(&self, request: Request) -> Result, Status> { + async fn load_model( + &self, + request: Request, + ) -> Result, Status> { todo!() } - async fn predict_stream(&self, request: Request) -> Result>>, Status> { + async fn predict_stream( + &self, + request: Request, + ) -> Result>>, Status> { todo!() } - async fn embedding(&self, request: Request) -> Result, Status> { + async fn embedding( + &self, + request: Request, + ) -> Result, Status> { todo!() } - async fn generate_image(&self, request: Request) -> Result, Status> { + async fn generate_image( + &self, + request: Request, + ) -> Result, Status> { todo!() } - async fn audio_transcription(&self, request: Request) -> Result, Status> { + async fn audio_transcription( + &self, + request: Request, + ) -> Result, Status> { todo!() } @@ -52,38 +67,22 @@ impl BackendService>> for BurnBackend{ todo!() } - async fn tokenize_string(&self, request: Request) -> Result, Status> { + async fn tokenize_string( + &self, + request: Request, + ) -> Result, Status> { todo!() } - async fn status(&self, request: Request) -> Result, Status> { + async fn status( + &self, + request: Request, + ) -> Result, Status> { todo!() } - } - #[tokio::main] async fn main() -> Result<(), Box> { - - let subscriber = tracing_subscriber::fmt() - .compact() - .with_file(true) - .with_line_number(true) - .with_target(true) - .with_level(true) - .finish(); - - tracing::subscriber::set_global_default(subscriber) - .expect("setting default subscriber failed"); - - let addr = "[::1]:50052".parse().unwrap(); - - let backend = BackendService {}; - - let svc = BurnBackend::new(backend); - - Server::builder().add_service(svc).serve(addr).await?; - - Ok(()) + todo!() } diff --git a/backend/rust/codegen/Cargo.toml b/backend/rust/codegen/Cargo.toml new file mode 100644 index 000000000000..c8eadcf13764 --- /dev/null +++ b/backend/rust/codegen/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "codegen" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tonic-build = "0.10" diff --git a/backend/rust/codegen/build.rs b/backend/rust/codegen/build.rs new file mode 100644 index 000000000000..f702cc7fdc62 --- /dev/null +++ b/backend/rust/codegen/build.rs @@ -0,0 +1,11 @@ +fn main() { + tonic_build::configure() + .out_dir("../bunker/generated") + .build_server(true) + .build_client(false) + .compile( + &["../../../pkg/grpc/proto/backend.proto"], + &["../../../pkg/grpc/proto"], + ) + .unwrap(); +} diff --git a/backend/rust/codegen/src/lib.rs b/backend/rust/codegen/src/lib.rs new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/backend/rust/codegen/src/lib.rs @@ -0,0 +1 @@ +