Een korte stapsgewijze introductie tot machine learning in Rust (2024)

Gepubliceerd op:
Ik ben net begonnen met het combineren van machine learning met Rust en heb een eenvoudige gids geschreven voor beginners.

Inleiding

Ik ben altijd gefascineerd geweest door hoe machine learning net magie lijkt, waarbij ruwe gegevens worden omgezet in voorspellingen en inzichten. Onlangs heb ik de sprong gewaagd om dit vakgebied te combineren met mijn passie voor Rust—een taal die draait om prestaties en veiligheid. De reis was moeilijk maar leerzaam, met de strengheid van Rust die ervoor zorgde dat elke stap van het bouwen van een model precies en efficiënt was. Onderweg ontdekte ik tools en bibliotheken die van Rust een verrassend gastvrije omgeving maakten voor ML. Nu ben ik enthousiast om de lessen te delen die ik heb geleerd, van het opzetten van omgevingen tot het uitrollen van modellen die klaar zijn voor productie.

Inleiding tot Machine Learning en Rust

Machine learning (ML) heeft talloze industrieën getransformeerd, van gezondheidszorg tot financiën. Maar het gaat niet alleen om de algoritmen; het gaat ook om de tools en talen die we gebruiken om ze te implementeren. Rust, een taal die geprezen wordt om zijn prestaties en veiligheid, wordt steeds meer een populaire keuze voor ML-projecten. Laten we eens kijken waarom.

Toen ik begon met mijn machine learning-avontuur, zocht ik naar prestaties en veiligheid. Dit leidde me direct naar Rust. Terwijl Python al lang de algemene taal is voor ML, biedt Rust een overtuigend alternatief. Het type-systeem en het eigendomsmodel van Rust voorkomen veel soorten bugs, en het is ontworpen voor gelijktijdigheid. Wat prestaties betreft, kan het vaak met C++ wedijveren.

Hier is hoe ik begon met een eenvoudig lineair regressievoorbeeld, met behulp van de linregress-crate, een lineaire regressiebibliotheek die eenvoudig en effectief is voor beginners:

use linregress::{FormulaRegressionBuilder, RegressionDataBuilder};

fn main() {
    let data = RegressionDataBuilder::new()
        .build_from_slice(&[1.0, 2.0, 3.0], &[2.0, 4.0, 5.9])
        .unwrap();
    let formula = "Y ~ X";
    let regression = FormulaRegressionBuilder::new()
        .data(&data)
        .formula(formula)
        .fit()
        .unwrap();

    println!("{:?}", regression);
}

Deze code past een lineair model toe op gegeven x-y-gegevenspunten. De schoonheid van Rust is zijn expressiviteit en focus op veiligheid, zelfs voor beginners. Als er iets mis kan gaan, is Rust ontworpen om het bij compile-tijd te vangen, waardoor vervelende momenten tijdens het uitvoeren worden voorkomen.

Het Rust-ecosysteem voor ML groeit, en crates zoals linregress zijn nog maar het begin. Bibliotheken zoals ndarray voor n-dimensionale arrays en rand voor willekeurige getallengeneratie zijn van cruciaal belang voor ML-werk, en bieden de bouwstenen die ik nodig had om complexe algoritmen te maken.

Hier is een korte demonstratie van hoe ndarray en rand samen in Rust gebruikt kunnen worden:

use ndarray::Array;
use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let rows = 4;
    let cols = 2;
    let mut array = Array::zeros((rows, cols));
    for mut row in array.genrows_mut() {
        for element in row.iter_mut() {
            *element = rng.gen_range(0.0..10.0)
        }
    }
    println!("Random Array:\n{}", array);
}

In deze code maken we een 4x2 matrix en vullen deze met willekeurige floating-point getallen tussen 0.0 en 10.0. Met de strikte typecontroles en geheugen- en draadveiligheidsgaranties van Rust, kon ik met vertrouwen de array doorlopen en wijzigen, waarbij veelvoorkomende fouten vermeden worden die vaak bij flexibeler talen voorkomen.

Wat ik heb geleerd, is dat in Rust intentie duidelijk is. Elke optie, unwrap, en resultaat is expliciet, zodat je goed nadenkt over de mogelijke uitkomsten van je code-uitvoering.

Als iemand die zowel nieuw is in ML als in Rust, is beginnen met basisoperaties en eenvoudige bibliotheken van belang geweest. Tijdens het werken aan voorbeelden heb ik vaak verwezen naar het Rust Book, een uitgebreide gids voor de syntaxis en concepten van de taal. Voor specifiek ML-bronnen was crates.io, het registreerplatform van de Rust-gemeenschap, erg waardevol. Code-repositories op GitHub, zoals de rust-ml organisatie, bevatten ook verschillende projecten die echte wereldinzicht kunnen bieden.

Het beginnen met machine learning in Rust is een lonende uitdaging. De leercurve kan steil lijken, maar vooruitgang wordt stap voor stap gemaakt, waarbij begrip en vaardigheid worden opgebouwd. In de volgende secties zullen we verder het Rust-ecosysteem voor ML verkennen en verder gaan dan de basis om onze Rust-powered ML-modellen te bouwen, evalueren en implementeren.

De Rust-omgeving instellen voor ML

Je Rust-omgeving instellen voor machine learning kan in het begin een beetje overweldigend lijken, maar ik help je stap voor stap door het proces, zodat je snel met data aan de slag kunt. Een stevige basis is belangrijk voordat je je gaat verdiepen in de complexiteit van machine learning, dus laten we je machine klaar maken.

Allereerst moet je Rust installeren. De makkelijkste manier om Rust te installeren en de toolchain te beheren is via rustup. Voer het volgende uit in je terminal:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Dit script installeert rustup, de installer voor de Rust toolchain. Zodra dit is voltooid, moet je de instructies op het scherm volgen om Rust aan je systeem PATH toe te voegen. Meestal gebeurt dit automatisch, maar als je problemen ondervindt, heeft de Rust installatiepagina gedetailleerde instructies.

Vervolgens moet je de pakketbeheerder voor Rust, Cargo, installeren, maar als je rustup hebt geïnstalleerd, komt Cargo erbij! Je kunt controleren of Cargo is geïnstalleerd door te controleren met:

cargo --version

Met Rust en Cargo geïnstalleerd, ben je klaar om machine learning functionaliteit toe te voegen. In het Rust-ecosysteem zijn er verschillende crates (de term voor pakketten/bibliotheken in Rust) beschikbaar voor machine learning, zoals linfa en smartcore. Ze zijn misschien niet zo ver ontwikkeld als Python's scikit-learn, maar ze zijn veelbelovend.

Om linfa te gebruiken, moet je het in je dependencies opnemen. Open of maak een Cargo.toml bestand in je projectmap en voeg de volgende regels toe:

[dependencies]
linfa = "0.4.0"

Vervolgens zetten we een eenvoudig project op waar we later onze machine learning code in zullen invoegen. Voer het volgende commando in je terminal uit:

cargo new ml_project
cd ml_project

Dit commando maakt een nieuwe map genaamd ml_project aan met een Cargo.toml bestand en een src map met een main.rs bestand. Rust-projecten beginnen met dit main.rs bestand als ingangspunt.

Als je main.rs opent, zie je een eenvoudig "Hello, world!" programma. Laten we dat vervangen door een sjabloon om te zorgen dat alles goed werkt.

fn main() {
    println!("ML-omgeving instellen in Rust!");
}

Voer je project uit met:

cargo run

Je zou de boodschap "ML-omgeving instellen in Rust!" in je terminal moeten zien, wat bevestigt dat alles goed gaat.

Ten slotte raad ik sterk aan om de formatterings- en linting-tools van Rust te gebruiken om je code netjes en foutvrij te houden. Voer de volgende commando's uit om rustfmt en clippy te installeren:

rustup component add rustfmt clippy

En voor elke commit, voer eenvoudig uit:

cargo fmt
cargo clippy

Deze zullen je Rust code formatteren en lints bieden om veelvoorkomende fouten of onidiomatische code op te sporen.

Daar heb je het. Met Rust, Cargo, en wat eerste projectinstellingen achter de rug, ben je klaar om verder te gaan met data verwerken en modellen bouwen. Houd vast aan de eenvoud en prestaties die Rust biedt, en je zult merken dat het een spannende taal is om mee te werken in machine learning. Vergeet niet, als je uitdagingen tegenkomt of meer inzicht nodig hebt, is de Rust community een ongelooflijk ondersteunende bron.

Voorbereiding en Verwerking van Gegevens in Rust

Toen ik begon met machine learning in Rust, ontdekte ik al snel dat goed voorbereide data de basis is voor betrouwbare modellen. Laten we enkele essentiële onderdelen van Rust bekijken die me hielpen mijn data in orde te brengen.

Om te beginnen moest ik mijn dataset lezen. CSV is een veelgebruikt formaat en de csv-crate van Rust is ideaal daarvoor. Het parsen van een CSV-bestand is hierdoor eenvoudig:

use csv::ReaderBuilder;
use std::error::Error;

fn read_csv(file_path: &str)     {
    let mut rdr = ReaderBuilder::new().from_path(file_path)?;
    for result in rdr.records() {
        let record = result?;
        println!("{:?}", record);
    }
    Ok(())
}

Met de data ingeladen was de volgende stap schoonmaken. Dit betekende het behandelen van ontbrekende waarden, het verwijderen van duplicaten en mogelijk het normaliseren of schalen van bepaalde velden. De polars-crate was hier erg handig en bood DataFrame-structuren vergelijkbaar met Pandas in Python:

use polars::prelude::*;

fn clean_data(df: DataFrame)  DataFrame {
    df.drop_nulls(None)
      .drop_duplicates(None, None)
}

Data manipuleren is een standaard onderdeel van voorbereiding, en ik gebruikte opnieuw polars om kolommen te transformeren en aggregaties uit te voeren. Hier voeg ik een nieuwe kolom toe aan mijn DataFrame:

fn transform_data(mut df: DataFrame)  Result DataFrame  {
    let new_col = df.column("existing_col")?.mean()?;
    df = df.hstack(&[Series::new("new_col", &[new_col])])?;
    Ok(df)
}

Hierna kwam feature selectie. Het kiezen van de juiste kenmerken die de voorspellende kracht van mijn model beïnvloeden, was cruciaal. Hier maakte ik een mask om DataFrame-kolommen te filteren op basis van bepaalde criteria:

use polars::prelude::*;

fn select_features(df: &DataFrame)  Result DataFrame  {
    let mask = df.column("feature_importance")?.gt(0.1)?;
    let selected_cols = df.mask(&mask);
    Ok(selected_cols)
}

Tenslotte kwam ik op het punt om de dataset op te splitsen in trainings- en testsets. Het behouden van balans en ze correct door elkaar schudden zorgt ervoor dat mijn model niet bevooroordeeld raakt. De smartcore-crate biedt hulpmiddelen om datasets op een gestratificeerde manier te splitsen.

use smartcore::dataset::shuffle_split::ShuffleSplit;

fn split_data(df: DataFrame)  (DataFrame, DataFrame) {
    let splitter = ShuffleSplit::default().with_test_size(0.3).with_train_size(0.7); 
    let (train_idx, test_idx) = splitter.split(&df.shape().0);

    let train_df = df.take(&train_idx);
    let test_df = df.take(&test_idx);

    (train_df, test_df)
}

Deze code is slechts het begin van wat mogelijk is met Rust. Ik moedig je aan om meer te verkennen door de documentatie van deze crates te bekijken. De Rust-gemeenschap is heel ondersteunend en de vele bronnen die beschikbaar zijn, getuigen daarvan.

Hier zijn enkele startpunten voor jouw avontuur:

  • csv crate docs: hier
  • polars crate docs: hier
  • smartcore repo: hier

Machine learning data voorbereiden kan in het begin lastig zijn, maar de snelheid en veiligheid van Rust geven een vertrouwen dat moeilijk te evenaren is. Naarmate je meer werkt met data, begin je patronen en abstraheringen te zien waarmee je verder kunt bouwen—en zo schrijf jij je eigen verhaal in Rust’s groeiende machine learning ecosysteem. Veel programmeerplezier!

De Juiste Machine Learning Bibliotheek Kiezen in Rust

Met het steeds groter wordende ecosysteem van Rust groeit ook het landschap van zijn machine learning-bibliotheken. De juiste ML-bibliotheek kiezen voor je project betekent kijken naar zaken als gebruiksgemak, prestaties en de mate van ondersteuning door de gemeenschap.

Laten we eens kijken naar enkele topkandidaten.

Allereerst is er linfa—de Rust-versie van Python's scikit-learn. Dit is ideaal voor algemene machine learning-taken. Het biedt allerlei algoritmen en hulpmiddelen voor classificatie, regressie en clustering.

use linfa::prelude::*;
use linfa_linear::LinearRegression;

fn main() {
    let dataset = linfa_datasets::diabetes();
    let model = LinearRegression::default().fit(&dataset).unwrap();
    let prediction = model.predict(&dataset);

    println!("Voorspelde versus werkelijke waarden: {:?}", prediction);
}

Voor taken zoals NLP of computer vision, waar deep learning een vereiste is, kun je tch-rs gebruiken. Dit biedt Rust-bindingen voor PyTorch.

use tch::{nn, nn::Module, nn::OptimizerConfig, Device, Tensor};

fn main() {
    let vs = nn::VarStore::new(Device::cuda_if_available());
    let net = nn::seq()
        .add(nn::linear(vs.root(), 78<a href="/nl/motherboards-memory-slots-available/4">4</a>, 256, Default::default()))
        .add_fn(|xs| xs.relu())
        .add(nn::linear(vs.root(), 256, 10, Default::default()));

    let mut opt = nn::Adam::default().build(&vs, 1e-3).unwrap();

    for epoch in 1..200 {
        let input = Tensor::randn(&[64, 784], (tch::Kind::Float, Device::Cuda(0)));
        let output = net.forward(&input);

        output.backward();
        opt.step();
        // Gewoonlijk zou hier je trainingslogica komen;
        // voor de eenvoud focussen we op de structuur.
    }
}

Als je focust op precisie en prestaties, is de combo van ndarray en ndarray-linalg de ruggengraat voor wetenschappelijke berekeningen in Rust.

use ndarray::prelude::*;
use ndarray_rand::RandomExt;
use ndarray_rand::rand_distr::Uniform;

fn main() {
    let a = Array::random((10, 10), Uniform::new(0., 10.));
    let b = Array::random((10, 10), Uniform::new(0., 10.));

    let c = a.dot(&b);
    println!("{:8.4}", c);
}

Denk eraan, deze bibliotheken installeren is zo simpel als het toevoegen van de benodigde dependencies aan je Cargo.toml. Bijvoorbeeld:

[dependencies]
linfa = "0.4"
tch = "0.4"
ndarray = "0.15"
ndarray-linalg = "0.14"

Voordat je je keuze vastlegt, kijk naar de volwassenheid van de bibliotheken en je ondersteuningsbehoeften. Beginners waarderen misschien robuuste documentatie en gemeenschapsvoorbeelden. Het aantal bijdragers en de frequentie van updates controleren op hun GitHub-repos kan inzicht geven in de lange termijn levensvatbaarheid van de bibliotheek.

Werk je aan een gemeenschapsproject voor machine learning? Bekijk dan are-we-learning-yet.com. Daar vindt je een handige verzameling van machine learning-crates in Rust. Het is een gemeenschapsproject om de staat van ML in het Rust-ecosysteem bij te houden.

Toen ik begon met machine learning in Rust, was door gemeenschapsforums zoeken naar inzichten of een nuttige blogpost vinden deel van het proces. Tegenwoordig hebben een groeiend aantal tutorials en de actieve Rust ML-gemeenschap op platforms zoals users.rust-lang.org en GitHub-discussies de drempel aanzienlijk verlaagd.

De juiste machine learning-bibliotheek kiezen lijkt misschien een uitdaging in het begin. Maar door te kijken naar de eisen van je project en te ontdekken wat deze bibliotheken kunnen, vind je een match die niet alleen voor je huidige project werkt, maar ook bijdraagt aan je groei op het gebied van machine learning met Rust.

Je Eerste Machine Learning Model Bouwen in Rust

Met de juiste omgeving en je data klaar, gaan we onze eerste machine learning-model in Rust bouwen. We kiezen een eenvoudige maar effectieve techniek: lineaire regressie. Dit is een standaardmethode voor voorspellende modellen en een geweldige manier om ML-principes te begrijpen.

We gebruiken de linfa-crate, een framework voor machine learning in Rust dat verschillende algoritmes en hulpmiddelen biedt. Zorg ervoor dat je linfa in je Cargo.toml-bestand hebt opgenomen om aan de slag te kunnen. Als je dataset reeds geladen en verwerkt is, kunnen we beginnen met het leukste gedeelte.

Allereerst moet je je dataset splitsen in een trainingsset en een testset om later je model te valideren.

use linfa::prelude::*;
use linfa_linear::LinearRegression;

let (train, validation) = dataset.split_with_ratio(0.9);

In de bovenstaande code verdelen we de dataset, waarbij 90% wordt gebruikt voor training en de rest voor validatie. Het is belangrijk dat je model goed presteert op ongeziene data.

Vervolgens maken we het lineaire regressiemodel aan. Voor dit voorbeeld houden we het simpel en gebruiken we de standaardinstellingen, maar je kunt ze later aanpassen voor betere prestaties.

let lin_reg = LinearRegression::new();

Training van het model is eenvoudig. Gebruik gewoon de .fit()-methode met je trainingsset en Rust doet de rest.

let model = lin_reg.fit(&train).unwrap();

Na het trainen van het model kunnen we met de validatieset voorspellingen maken en evalueren hoe goed ons model presteert.

let predicted = model.predict(&validation);

Om de prestaties van ons model te meten, berekenen we de mean squared error (MSE) tussen onze voorspellingen en de werkelijke waarden. Dit is een veelgebruikte maatstaf voor regressiemodellen.

let mse = predicted.r2_score(&validation).unwrap();
println!("Mean Squared Error: {}", mse);

Als de MSE te hoog is, kan dit betekenen dat het model onvoldoende presteert. Geen zorgen, dat hoort bij het leerproces. Pas indien nodig je modelparameters aan of probeer meer geavanceerde modellen.

Linfa is een goed gevulde ML-framework in Rust en maakt gebruik van andere crates binnen het ecosysteem om verschillende taken te ondersteunen. Als je dieper wilt graven, bekijk dan de linfa GitHub repository voor meer voorbeelden en algoritmes.

Vergeet niet dat het niet gaat om het perfecte model bij je eerste poging; het gaat om het leren van het proces. Elke stap, van het kiezen van je algoritme tot het interpreteren van de resultaten, draagt bij aan je begrip van machine learning met Rust.

Er is veel meer aan machine learning dan enkel het passen van een eenvoudig model, maar elke expert is ooit een beginner geweest, en je bent goed op weg. Blijf experimenteren met verschillende modellen, het afstemmen van parameters en het valideren van je resultaten. En zodra je je comfortabel voelt met de basis, duik dan in complexe algoritmes en benut de volledige kracht van machine learning in Rust.

Evalueren en Afstemmen van Machine Learning Modellen

Na het trainen van je machine learning-model in Rust, is het belangrijk om te weten hoe goed het eigenlijk is. Het evalueren en afstemmen van modellen kan een gewoon model in een uitstekend model veranderen. Het is een beetje zoals het stemmen van een muziekinstrument; het proces kan het verschil maken tussen een middelmatig geluid en een prachtige melodie.

Eerst gebruik ik cross-validatie om de prestaties van het model te meten. De ML-bibliotheken van Rust, zoals smartcore, maken dit eenvoudig. Deze code laat zien hoe je cross-validatie op een dataset uitvoert:

use smartcore::model_selection::{cross_val_score, KFold};
use smartcore::ensemble::random_forest_classifier::RandomForestClassifier;
use smartcore::dataset::iris::load_dataset;

let data = load_dataset();
let kf = KFold::default().with_n_splits(5);

let scores = cross_val_score(RandomForestClassifier::default(), &data.data, &data.target, kf);

println!("Accuracy: {:?}", scores);

Dit geeft de accuratesse weer van de RandomForestClassifier, gemiddeld over vijf delen van de data. Lage variatie tussen de scores van de delen duidt op een stabiel model, terwijl hoge variatie suggereert dat het model te veel aangepast is aan bepaalde delen van de data.

Vervolgens duik ik in hyperparameter tuning, wat in feite het optimaliseren van modelinstellingen is. In Rust kun je hiervoor frameworks zoals argmin gebruiken. Hier is een voorbeeld van het afstemmen van een hyperparameter met een grid search met smartcore:

use smartcore::model_selection::GridSearchCV;
use smartcore::ensemble::random_forest_classifier::RandomForestClassifier;
use smartcore::metrics::accuracy;
use smartcore::dataset::iris::load_dataset;

let data = load_dataset();
let classifier = RandomForestClassifier::default();

let param_grid = vec![
    ("n_estimators", vec![10, 50, 100]),
    ("max_depth", vec![Some(3), Some(5), None]),
];

let gs = GridSearchCV::fit(
    &classifier,
    &param_grid,
    &data.data,
    &data.target,
    accuracy,
);

println!("Beste parameters: {:?}", gs.best_params());
println!("Beste score: {}", gs.best_score());

Deze code probeert verschillende combinaties uit van het aantal bomen (n_estimators) en de maximale diepte van de bomen (max_depth) om te zien welke de beste accuraatheid geeft.

Zorg ervoor dat je altijd let op overfitting - je model kan hierdoor heel goed worden in het voorspellen van de trainingsdata, maar minder goed in nieuwe, onbekende data.

Na de afstemming is het tijd om het model opnieuw te valideren. Als het tunen succesvol is geweest, zou je een verbetering moeten zien in de accuraatheid (of welke metric je ook gekozen hebt) op de validatieset.

Tot slot, hier een kijkje in wat het implementeren van een model inhoudt, met dit voorbeeld van het serialiseren van een model met serde_pickle voor later gebruik:

use serde_pickle as pickle;
use smartcore::ensemble::random_forest_classifier::RandomForestClassifier;
use smartcore::dataset::iris::load_dataset;
use std::fs::File;
use std::io::Write;

let data = load_dataset();
let model = RandomForestClassifier::default().fit(&data.data, &data.target).unwrap();

let encoded: Vec u8  = pickle::to_vec(&model, true).unwrap();

let mut file = File::create("model.pkl").unwrap();
file.write_all(&encoded).unwrap();

println!("Model opgeslagen naar model.pkl");

Deze code past een RandomForestClassifier toe op de Iris-dataset en serializeert het getrainde model zodat het in een bestand kan worden opgeslagen.

Het evalueren en afstemmen van machine learning-modellen kan inderdaad zo eenvoudig zijn, zelfs in een systeemtaal zoals Rust. Ik hoop dat deze codevoorbeelden en uitleg handig zijn voor jouw reis in Rust-gebaseerde machine learning. Blijf die hyperparameters aanpassen en dat je modellen met precisie en elegantie voorspellen!

Productie-implementatie van Machine Learning-modellen in Rust

Je hebt je machine learning model gebouwd en verfijnd in Rust. Nu komt de laatste en belangrijke stap: het model in productie brengen. Hier wordt al het harde werk en de vele uren die je hebt geïnvesteerd eindelijk praktisch. Laat me je door dit proces leiden met eenvoudige voorbeelden en uitleg.

Eerst moet je ervoor zorgen dat de prestaties van je model aan de verwachtingen voldoen. Rust is een systeemprogrammeertaal en heeft hierdoor een prestatievoordeel. Dit is vooral belangrijk in productie, waar efficiëntie cruciaal is.

Laten we het hebben over de deploy-architectuur. Je kunt je model in de vorm van een microservice inzetten, wat een standaardpraktijk is in de industrie. Microservices zijn gemakkelijk te schalen en te integreren in bestaande systemen, vooral als je containerisatietools zoals Docker gebruikt.

Hier is een eenvoudige Dockerfile om je Rust-machine learning service operationeel te krijgen:

FROM rust:1.XX.0 as builder
WORKDIR /usr/src/myapp
COPY . .
RUN cargo install --path .

FROM debian:buster-slim
COPY --from=builder /usr/local/cargo/bin/myapp /usr/local/bin/myapp
ENTRYPOINT ["myapp"]

Vervang 1.XX.0 door de huidige versie van Rust en myapp door de naam van je applicatie. Na het maken van dit Dockerfile kan je de image bouwen met docker build -t myapp . en deze vervolgens uitvoeren met docker run.

Vervolgens schrijf je een eenvoudige webserver in Rust die als een RESTful API fungeert om met het model te communiceren. Ik maak gebruik van warp, een Rust-webframework:

use warp::Filter;

#[tokio::main]
async fn main() {

    // Defineer de routes
    let health_route = warp::path!("health").map(|| warp::reply::json(&"OK"));
    let predict_route = warp::post()
        .and(warp::path("predict"))
        .and(warp::body::json())
        .map(|input_data| {
            // Roep hier je model predict-functie aan
            let prediction = model.predict(input_data);
            warp::reply::json(&prediction)
        });
        
    // Combineer de routes
    let routes = health_route.or(predict_route);

    // Start de server
    warp::serve(routes).run(([0, 0, 0, 0], 3030)).await;
}

Let op hoe we een gezondheidscontrole route en een voorspellingsendpoint hebben gedefinieerd. Vervang model.predict(input_data) door de daadwerkelijke voorspelfunctie van je model.

Monitor de prestaties van je model in productie. Dit betekent dat je de continue nauwkeurigheid, latentie, doorvoer en foutpercentages in de gaten houdt. Gebruik deze informatie om te bepalen wanneer je je model moet hertrainen of aanpassen.

Testen is een doorlopend proces. Integratietests controleren of je model en API zich naar verwachting gedragen. Unit tests voor kleine onderdelen en end-to-end tests voor het gehele systeem zijn even belangrijk. Rust heeft robuuste testtools ingebouwd in Cargo. Een integratietest voor de voorspellingsroute kan er zo uitzien:

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn test_predict_route() {
        let input_data = MyInputData { /* velden met testgegevens */ };
        let api = filter::predict_route();
        let response = request()
            .method("POST")
            .path("/predict")
            .json(&input_data)
            .reply(&api)
            .await;

        assert_eq!(response.status(), 200, "Verwachtte OK respons");
        
        // Deserialiseer en valideer het voorspelling resultaat
        let prediction: MyPredictionType = serde_json::from_slice(response.body()).unwrap();
        assert!(prediction.is_valid(), "Verwachtte een geldige voorspelling");
    }
}

Vervang MyInputData en MyPredictionType door je specifieke types en zorg dat je tests verschillende gevallen dekken.

Kortom, het in productie brengen van een Rust-machine learning model lijkt misschien lastig in het begin, vooral als je nieuw bent in systeemprogrammering of machine learning. Maar als je deze gestructureerde stappen volgt en de kracht van Rust's veiligheid en prestaties combineert met goede software-engineeringpraktijken, zul je succesvol zijn. Wees nauwkeurig, begrijp dat uitrollen net zo belangrijk is als ontwikkelen, en blijf de prestaties van je model volgen om de integriteit van je applicatie in productie te behouden.


Delen

Opmerkingen (0)

Een reactie plaatsen

© 2023 - 2024 — TensorScience. Alle rechten voorbehouden.