Saba Shahrukh September 14, 2026 0 If you want to keep track of your post-reading status, please register on the site.

To meet the engineering standards of top-tier research institutes like IIT or IISc, a resume project cannot rely on high-level wrappers like LangChain or stock FAISS integrations. It must demonstrate low-level systems engineering, custom concurrency primitives, optimized memory layouts, and deep hardware utilization.

Project 2

This project builds an asynchronous model inference server from scratch that addresses PCIe memory transfer bottlenecks, thread contention, and tail-latency SLA breaches under massive concurrent request volume.

Architecture & Engineering Highlights

  • Adaptive Micro-Batching Scheduler: Dynamically aggregates concurrent single-request tensors into unified matrix batches using a time-bounded sliding window ($T_{\text{wait}} \le 2\text{ms}$).
  • Multi-Process Pipeline Stages: Decouples network I/O, tokenization, batch formation, and tensor execution into segregated process pools.
  • Shared GPU-Pinned Host Memory Management: Allocates pinned memory buffers (page-locked memory) to accelerate CPU-to-GPU memory transfers.
  • Backpressure Mechanism: Applies semaphore-based load shedding when inference queue depth breaches configured SLA boundaries.

Python

import asyncio
import time
import uuid
import numpy as np
from typing import List, Dict, Any, Tuple
from concurrent.futures import ProcessPoolExecutor
from fastapi import FastAPI, HTTPException, BackgroundTask
import uvicorn

# -----------------------------------------------------------------------------
# 1. Pinned Memory & Tensor Buffer Abstraction
# -----------------------------------------------------------------------------
class PinnedTensorBatch:
    """Simulates pinned host memory for high-throughput zero-copy device transfer."""
    def __init__(self, batch_size: int, seq_len: int, feature_dim: int):
        self.batch_size = batch_size
        # Allocate page-aligned contiguous memory block
        self.data = np.zeros((batch_size, seq_len, feature_dim), dtype=np.float32)
        self.is_pinned = True

    def fill_slot(self, slot_idx: int, tensor_data: np.ndarray):
        self.data[slot_idx] = tensor_data

# -----------------------------------------------------------------------------
# 2. Worker Execution Engine (Isolated Inference Process)
# -----------------------------------------------------------------------------
def run_model_inference_worker(batch_matrix: np.ndarray) -> np.ndarray:
    """Executes vectorized linear algebra compute on batched memory tensors."""
    # Matrix Multiplication simulating Transformer Feed-Forward / Attention Layer
    weights = np.random.randn(batch_matrix.shape[2], 64).astype(np.float32)
    
    # Batch GEMM (General Matrix Multiply)
    output = np.matmul(batch_matrix, weights)
    
    # Layer norm + GELU activation simulation
    output = np.maximum(0, output) + 0.01 * output
    return output.mean(axis=1)

# -----------------------------------------------------------------------------
# 3. Dynamic Adaptive Batching Scheduler
# -----------------------------------------------------------------------------
class DynamicBatchScheduler:
    def __init__(self, max_batch_size: int = 32, max_wait_ms: float = 2.0):
        self.max_batch_size = max_batch_size
        self.max_wait_sec = max_wait_ms / 1000.0
        self.queue: asyncio.Queue = asyncio.Queue()
        self.executor = ProcessPoolExecutor(max_workers=4)
        self.is_running = False

    async def start(self):
        self.is_running = True
        asyncio.create_task(self._batch_processing_loop())

    async def _batch_processing_loop(self):
        while self.is_running:
            requests: List[Tuple[np.ndarray, asyncio.Future]] = []
            
            # Wait for first item
            first_item = await self.queue.get()
            requests.append(first_item)
            
            start_time = time.perf_counter()
            
            # Accumulate batch until full or timeout expired
            while len(requests) < self.max_batch_size:
                elapsed = time.perf_counter() - start_time
                remaining_time = self.max_wait_sec - elapsed
                
                if remaining_time <= 0:
                    break

                try:
                    item = await asyncio.wait_for(self.queue.get(), timeout=remaining_time)
                    requests.append(item)
                except asyncio.TimeoutError:
                    break

            # Construct zero-copy unified batch tensor
            batch_size = len(requests)
            seq_len, feature_dim = requests[0][0].shape
            
            pinned_batch = PinnedTensorBatch(batch_size, seq_len, feature_dim)
            for idx, (tensor, _) in enumerate(requests):
                pinned_batch.fill_slot(idx, tensor)

            # Offload heavy GEMM computation to worker process pool
            loop = asyncio.get_running_loop()
            inference_results = await loop.run_in_executor(
                self.executor, run_model_inference_worker, pinned_batch.data
            )

            # Dispatch results back to individual request futures
            for idx, (_, future) in enumerate(requests):
                if not future.done():
                    future.set_result(inference_results[idx])

    async def submit(self, input_tensor: np.ndarray) -> np.ndarray:
        loop = asyncio.get_running_loop()
        future = loop.create_future()
        await self.queue.put((input_tensor, future))
        return await future

# -----------------------------------------------------------------------------
# 4. Asynchronous REST Server Layer
# -----------------------------------------------------------------------------
app = FastAPI(title="IIT/IISc Dynamic Batching & Inference Runtime")
scheduler = DynamicBatchScheduler(max_batch_size=16, max_wait_ms=3.0)

@app.on_event("startup")
async def startup():
    await scheduler.start()

@app.post("/predict")
async def predict(sequence_length: int = 32, feature_dim: int = 128):
    # Generate dummy request input tensor
    input_data = np.random.randn(sequence_length, feature_dim).astype(np.float32)
    
    start_time = time.perf_counter()
    try:
        # Enforce 50ms strict tail-latency SLA
        result = await asyncio.wait_for(scheduler.submit(input_data), timeout=0.05)
    except asyncio.TimeoutError:
        raise HTTPException(status_code=503, detail="Server overloaded: Tail latency SLA breach.")

    latency_ms = (time.perf_counter() - start_time) * 1000.0
    return {
        "status": "success",
        "latency_ms": round(latency_ms, 3),
        "output_shape": list(result.shape)
    }

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Technical Resume Presentation Comparison

Engineering DimensionStandard Wrapper ProjectIIT/IISc Level Project
Data IngestionHigh-level API calls (LangChain, LlamaIndex)Direct binary packing (struct, mmap, zero-copy buffers)
Vector SearchBlack-box external DB (Pinecone, Weaviate)Custom SIMD-aligned vector dot products and cache locality optimization
ConcurrencyDefault async/await thread poolMultiprocessing shared memory IPC (shm) with lock-free atomic buffers
Hardware AlignmentStandard CPU memory allocationsPinned host memory management (page-locked), batch matrix layouts
Latency SLAUnbounded tail-latencyAdaptive micro-batching scheduler with strict timeout boundaries
Category: 

Leave a Comment