
2.4 核心代码实现
A. 定义事件(使用Avro/Protobuf Schema)
// inference_events.proto
syntax = "proto3";
message InferenceRequest {
string request_id = 1;
string patient_id_hash = 2;
repeated DataSource data_sources = 3;
string workflow_definition_id = 4; // e.g., "dr_diagnosis_v1"
}
message TaskCompleted {
string task_id = 1;
string request_id = 2;
string worker_id = 3;
string stage_name = 4; // "localization"
string artifact_uri = 5; // s3://evidence-bucket/loc/123.json
bool success = 6;
string error_message = 7;
string model_version = 8;
}
message ValidationResult {
string task_id = 1;
string request_id = 2;
bool passed = 3;
map metrics = 4; // e.g., {"dice_score": 0.82}
string decision = 5; // "PROCEED", "FALLBACK", "RETRY"
}
B. Worker示例(C++ + ONNX Runtime)
// localization_worker.cpp
#include <onnxruntime_cxx_api.h>
#include <opencv2/opencv.hpp>
#include <kafkacpp/kafka_producer.h> // A hypothetical Kafka C++ library
void run_localization_task(const std::string& task_json) {
// 1. Parse task, download image from S3/MinIO
Task task = parse_task(task_json);
cv::Mat image = download_image(task.get_input_image_uri());
// 2. Preprocess
cv::Mat resized_img;
cv::resize(image, resized_img, cv::Size(224, 224));
// ... other preprocessing steps
// 3. Run ONNX Model
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "LocalizationWorker");
Ort::Session session(env, L"localization_model_v1.onnx", Ort::SessionOptions{
});
// ... create input tensor, run session, get output tensor ...
// 4. Postprocess results (e.g., NMS, convert to bbox)
LocalizationResult result = postprocess_bboxes(output_tensor);
// 5. Save intermediate artifact
std::string artifact_uri = save_artifact_to_s3(result.to_json(), task.request_id);
// 6. Publish TaskCompleted event
TaskCompletedEvent event;
event.set_task_id(task.id);
event.set_request_id(task.request_id);
event.set_stage_name("localization");
event.set_artifact_uri(artifact_uri);
event.set_success(true);
event.set_model_version("localization_model_v1.onnx");
KafkaProducer producer("task_completed_topic");
producer.produce(event.serialize());
}
C. 验证网关
# validation_gateway.py
from scipy.spatial.distance import dice
import numpy as np
def validate_localization(task_completed_event: TaskCompleted):
"""
Validates a localization task by comparing against a ground truth
if available, or using other heuristics.
"""
ground_truth_uri = get_ground_truth_uri(task_completed_event.request_id)
浙公网安备 33010602011771号