GenAI intro, probability, MLE and Bayes
Core ideas
- GenAI learns patterns in data and makes new content. Core tech: GANs, VAEs, LLMs, diffusion. Generative modelling is (mostly) unsupervised.
- Discriminative learns \(P(Y\mid X)\) (decision boundary). Generative learns \(P(X,Y)\) or \(P(X)\): how the data is made.
- Generator: noise \(z \sim p(z)\) → \(G(z)\); loss = distance between the real and generated distributions.
- 5 families: VAE (encoder → distribution), GAN (generator vs discriminator), autoregressive (PixelRNN/CNN, one pixel at a time), diffusion (add noise, learn to remove it), normalizing flows (invertible, exact likelihood).
- Applications: synthesis, restoration (inpainting, super-resolution), augmentation, image-to-image, video, 3D.
- Synthetic data: cheap, perfect labels, rare events, privacy. Sim2Real gap → domain randomization, fine-tune on real.
- Joint = variables together; marginal = sum the others out; covariance = do they move together; correlation = strength + direction in [−1, 1].
- MLE: parameters that make the observed data most likely. MAP adds a prior. ML = MAP when priors are equal.
- Bayesian learning = prior + data → posterior, updated as new evidence arrives. Bayes optimal classifier weights all hypotheses by posterior.
Formulas
- Bayes: \(P(A\mid B) = \dfrac{P(B\mid A)P(A)}{P(B)}\) · posterior = likelihood × prior / evidence
- \(\rho = \dfrac{\text{Cov}(X,Y)}{\sigma_X\sigma_Y}\) · \(\text{Cov} = \frac{1}{n-1}\sum (x_i-\bar x)(y_i-\bar y)\)
- MLE: \(\theta^* = \arg\max_\theta \sum_i \log P(x_i\mid\theta)\) · MAP: \(\arg\max_h P(D\mid h)P(h)\)
- \(P(A\cup B) = P(A)+P(B)-P(A\cap B)\) · independent: \(P(A\cap B)=P(A)P(B)\)
- Eigen: \(\det(A-\lambda I)=0\) · 2×2 inverse \(\frac{1}{ad-bc}\begin{bmatrix}d&-b\\-c&a\end{bmatrix}\)
Asked in the 2026 assignment
- Generative model → GAN (not ResNet / U-Net / AlexNet).
- Purpose of a generative vision model → generate new images.
- Applications (synthesis, restoration, augmentation) → All of the above.
- Joint distribution → two or more variables occurring together.
- Correlation → strength and direction. Covariance → whether they change together.
- MLE → parameters that make observed data most likely.
- Bayesian learning → prior + observed data; updates with evidence (True).
- GenAI creates new images resembling training data (True).
Traps
- Correlation has strength and direction; covariance is only "do they move together".
- U-Net appears in diffusion models, but it is not the generative model itself.
Neurons, perceptron, MLP, backprop, overfitting
Core ideas
- Neuron (basic unit): multiply by weights → sum + bias → activation.
- Single-layer perceptron: step activation, one hyperplane → only linearly separable problems. Fails on XOR.
- MLP adds hidden layers: layer 1 = half-spaces, layer 2 = convex regions, output = any region → solves XOR.
- Activation = non-linearity. Sigmoid (0..1, vanishes), tanh (−1..1, zero-centred), ReLU (fast, dying ReLU), Leaky ReLU, softmax (multi-class output, sums to 1).
- Forward pass: input → output, compute loss. Backprop: chain rule gradients from output → input, then gradient descent.
- Checkpointing: store all activations (O(N) memory) vs recompute (O(1) memory, O(N²) time).
- Overfitting: great on train, poor on unseen data (high variance). Underfitting = high bias.
- Fixes: regularization (L1 Lasso → zeros / feature selection, L2 Ridge → weight decay), early stopping, k-fold CV (k = 5 or 10).
- λ too big → underfit; too small → overfit.
Formulas
- \(y = f(\sum_i w_i x_i + b)\) · \(\sigma(z) = \frac{1}{1+e^{-z}}\), \(\sigma' = \sigma(1-\sigma) \le 0.25\)
- Softmax \(\frac{e^{z_i}}{\sum_j e^{z_j}}\) · ReLU \(\max(0,z)\)
- Update: \(w \leftarrow w - \eta\,\partial E/\partial w\) · \(E = \tfrac12\sum (y-d)^2\)
- Total error = Bias² + Variance + irreducible · #weights \(=\sum n_{l-1} n_l\)
- L1: \(J + \lambda\sum|w|\) · L2: \(J + \lambda\sum w^2\)
Asked in the 2026 assignment
- Basic unit → Neuron.
- NN applications (image, speech, NLP) → All of the above.
- SLP solves → linearly separable problems. Limitation → can't do XOR.
- Activation function → introduce non-linearity.
- Softmax → multi-class classification.
- Forward pass → input layer toward output layer.
- Backprop → compute gradients to update weights.
- Overfitting → good on train, poor on unseen. Fixes → All of the above.
Traps
- "Cannot solve linearly separable problems" is the reversed (wrong) SLP limitation.
- Kernel is a CNN word, not the basic ANN unit.
CNNs and classic architectures
Core ideas
- CNN = Convolutional Neural Network. Two ideas: local receptive field (each neuron sees a small patch) + weight sharing.
- Conv layer = feature extraction (edges → textures → parts → objects). Pooling = shrink spatial size (max or average).
- Pipeline: conv → activation → normalization → pooling → FC → softmax.
- LeNet-5 (1998): 32×32 grayscale digits, tanh, avg pool.
- AlexNet (2012): 5 conv + 3 FC, ReLU, dropout, augmentation, 2 GPUs, ~60M params. CONV1 = 96 × 11×11, stride 4.
- VGG (2014): only 3×3 convs; three 3×3 = one 7×7 receptive field with fewer params.
- GoogLeNet (2014): Inception module (parallel 1×1, 3×3, 5×5, pool, concatenated), 22 layers, ~5M params, no FC, 1×1 bottlenecks.
- Very deep nets → vanishing gradient (sigmoid′ ≤ 0.25 multiplied many times) and degradation.
- Fixes: ReLU, residual connections, batch norm, good init (Xavier/He). Deeper is NOT always better.
Formulas
- Output size \(= \dfrac{N - F + 2P}{S} + 1\) · 32, 5×5, S1 → 28
- Conv params \(= F\cdot F\cdot C_{in}\cdot C_{out}\) (+ biases)
- VGG: three 3×3 = 27 vs one 7×7 = 49 (per channel pair)
- Inception naive 854M ops → with 1×1 bottleneck 358M
Asked in the 2026 assignment
- CNN → Convolutional Neural Network.
- Conv neuron connects to → a small local patch.
- Conv layer purpose → extract features. Pooling → reduce spatial size.
- Famous CNN → AlexNet.
- Inception module → GoogLeNet; GoogLeNet known for Inception.
- Deep-net problem → vanishing gradient. Fix → ReLU.
- "More layers always better" → False.
Traps
- Pooling reduces size; conv extracts features. Don't swap them.
- VGG = 3×3 only; Inception = GoogLeNet.
ResNet, DenseNet, MobileNet, EfficientNet, RNN intro
Core ideas
- ResNet: skip (residual) connections that jump over one or more layers; learns \(F(x)=H(x)-x\). Fixes vanishing gradient, trains 50 to 152+ layers, adds no params.
- ResNet-18/34 = basic block (two 3×3); 50/101/152 = bottleneck (1×1 → 3×3 → 1×1).
- DenseNet: each layer connects to every previous layer (concatenation). Growth rate k, transition layers.
- MobileNet: for handheld / embedded devices. Depthwise separable conv = depthwise (per channel) + pointwise 1×1.
- EfficientNet: compound scaling of depth, width and resolution together. B0 from NAS, MBConv, SE, Swish.
- Sequence modelling: ordered data (text, speech, video, time series, DNA).
- RNN = Recurrent Neural Network: hidden state carries temporal context, same weights every step.
- Types: one-to-many (captioning), many-to-one (sentiment), many-to-many same length (frame labels), different length (translation).
Formulas
- ResNet: \(a^{[l+2]} = g(z^{[l+2]} + a^{[l]})\) · \(\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y}\left(\frac{\partial F}{\partial x}+1\right)\)
- DenseNet connections \(= \frac{L(L+1)}{2}\) (6 layers → 21)
- EfficientNet: \(d=\alpha^\phi,\ w=\beta^\phi,\ r=\gamma^\phi,\ \alpha\beta^2\gamma^2 \approx 2\)
- RNN: \(h_t = \tanh(W_h h_{t-1} + W_x x_t)\), \(y_t = W_o h_t\)
Asked in the 2026 assignment
- ResNet idea → residual (skip) connections.
- Skip connection → skip one or more layers.
- Advantage → reduces vanishing gradient.
- DenseNet vs ResNet → every layer connected to all previous layers.
- Handheld / embedded → MobileNet.
- EfficientNet → scale depth, width, resolution together.
- Sequence modelling → sequential data. RNN = Recurrent. Application → translation. Feature → temporal context.
Traps
- RNN is Recurrent, not Residual (that's ResNet).
- ResNet adds (+), DenseNet concatenates.
BPTT, LSTM, attention, GRU + GenAI vision tasks
Core ideas
- BPTT: unroll the RNN over time; gradients summed across steps (shared weights). Long products of tanh′ → vanishing. Truncated BPTT cuts it to k steps.
- LSTM (Hochreiter 1997): forget, input, output gates + cell state. Additive cell update (Constant Error Carousel) → long memory.
- GRU (Cho 2014): update + reset gates, no separate cell, faster.
- Seq2seq = encoder + decoder; one fixed context vector is the bottleneck. Attention builds a new context at each decoder step.
- Bidirectional RNN uses past and future; deep RNN stacks layers.
- CV challenges: viewpoint, scale, deformation, occlusion, illumination, clutter, intra-class variation.
- GenAI for vision: classification (augment rare classes), detection (YOLO, Faster R-CNN), segmentation (semantic vs instance, SAM), super-resolution, inpainting, image-to-image, medical synthesis, anomaly detection (low likelihood = anomaly), style transfer, video (temporal coherence).
- Assignment 5 itself: the course covers maths, CV features, CNN/RNN/LSTM, GAN/VAE/diffusion, VLMs and multimodal, agentic AI, all in one course.
Formulas
- LSTM: \(C_t = f_t\odot C_{t-1} + i_t\odot \tilde C_t\), \(h_t = o_t\odot\tanh(C_t)\)
- GRU: \(h_t = z_t\odot h_{t-1} + (1-z_t)\odot\tilde h_t\)
- Attention: \(\alpha_{t,i} = \text{softmax}(e_{t,i})\), \(c_t = \sum_i \alpha_{t,i} h_i\)
- Vanishing: \(0.9^{50}\approx 0.005\)
Asked in the 2026 assignment
- A5: every answer was the one sensible AI option (first option in all 10).
- Why the course matters → modern AI for images and videos.
- Covers → maths foundations, feature extraction, CNN/RNN/LSTM, GAN/VAE/diffusion, VLMs, agentic AI.
- Unique → combines CV, GenAI, multimodal and agentic AI in one course.
Traps
- LSTM has 3 gates, GRU has 2.
- Semantic segmentation doesn't separate two cars; instance segmentation does.
Generative models, MLE, autoregressive, captioning
Core ideas
- Generative model goal: learn \(p(x)\), then make new data similar to the training data.
- Density estimation = estimating the probability distribution of data.
- Taxonomy: explicit density (tractable: FVBN, PixelRNN/CNN, flows; approximate: VAE) vs implicit (GAN).
- Autoregressive: predict each value from the previous ones (chain rule). Slow sequential sampling, exact likelihood.
- FVBN (Fully Visible Belief Network) = explicit-density generative model using the chain rule over pixels.
- PixelRNN (RNN = Recurrent): pixel by pixel from the top-left, Row LSTM / Diagonal BiLSTM. Slow.
- PixelCNN: masked convolutions, generates images pixel by pixel, trains in parallel.
- Spatial context = relationships between nearby / different regions of an image.
- Image captioning = textual description of an image. Attention lets each word focus on the relevant region (Show, Attend and Tell).
Formulas
- MLE: \(\theta^* = \arg\max \sum_i \log p_\theta(x_i)\) = minimize NLL
- Autoregressive: \(p(x) = \prod_i p(x_i \mid x_1,\dots,x_{i-1})\)
- Colour: \(p(R)\,p(G\mid R)\,p(B\mid R,G)\)
- Captioning attention: \(c_t = \sum \alpha_{t,ij}\, z_{ij}\)
Asked in the 2026 assignment
- Goal of generative model → new data like training data.
- MLE → parameters making observed data most likely.
- Density estimation → estimate probability distribution.
- Autoregressive → predict current value from previous values.
- PixelCNN → generate images pixel by pixel. PixelRNN "RNN" → Recurrent.
- Spatial context → relationships between regions.
- Captioning → text description; attention → focus on relevant parts.
- FVBN → a generative model.
Traps
- PixelCNN is still sequential at generation time; only training is parallel.
- FVBN is explicit + tractable; VAE is explicit + approximate; GAN is implicit.
Attention and Transformers
Core ideas
- Attention: score every input, softmax the scores, take a weighted sum → focus on the most relevant parts.
- Q, K, V from linear layers; scale by \(\sqrt{d_k}\) so softmax doesn't saturate.
- Self-attention: Q, K, V from the same sequence → relates different parts of the same input.
- Masked self-attention: future positions set to −∞ → can't attend to the future (decoder / GPT).
- Multi-head: several heads capture different relationships, then concatenate (e.g. 512 → 4 × 128).
- Transformer = attention-based. Encoder → contextual representations; decoder adds masked + cross-attention.
- Input embedding: token → vector (512-d). Positional encoding (sin/cos or learned) adds order.
- Encoder block: MHA → Add & Norm → FFN → Add & Norm. BERT = encoder-only, GPT = decoder-only.
- Transformer vs CNN: CNN is local and builds up; attention relates all elements globally from layer 1.
Formulas
- \(\text{Attention}(Q,K,V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V\)
- Masked: add \(M\) with \(-\infty\) on future positions
- Add & Norm: \(\text{LayerNorm}(x + \text{Sublayer}(x))\) · FFN: \(W_2\,\sigma(W_1x+b_1)+b_2\)
- PE: \(\sin(\omega_k t),\ \cos(\omega_k t)\)
Asked in the 2026 assignment
- Attention → focus on most relevant parts.
- Self-attention → parts of the same sequence.
- Masked → block attending to future positions.
- Multi-head → several heads, different relationships.
- Transformer based on → attention.
- ViT → image split into patches as tokens.
- Transformer vs CNN → attention models relations between elements.
- Encoder → contextual representations. Embedding → tokens to vectors. Positional encoding → order.
Traps
- Self-attention = same sequence; cross-attention = two different ones.
- Attention has no sense of order by itself; that's why positional encoding exists.
ViT, DETR, Swin, autoencoders, VAE
Core ideas
- ViT (Dosovitskiy 2021): 16×16 patches → flatten (768) → linear embed + CLS token + learned position → encoder-only.
- DETR = DEtection TRansformer: encoder-decoder, object queries, bipartite matching, no NMS.
- Swin: attention in local windows + shifted windows to link them, patch merging → hierarchy.
- Autoencoder = encoder + decoder; learns a compact (bottleneck) representation by reconstructing. Uses: compression, denoising, anomaly detection.
- Plain AE is a poor generator: random latent points decode to junk.
- VAE: encoder outputs a distribution (μ, σ), not a point → you can sample and generate.
- Order: Encode → Sample → Decode. Latent z = a sampled representation; sampling gives different outputs.
- Problem formulation: model data via latent z, \(p(x)=\int p(x\mid z)p(z)dz\) (intractable) → train with the ELBO.
- KL term keeps the latent space smooth and close to N(0, I) so sampling works.
Formulas
- ELBO \(= \mathbb E_q[\log p(x\mid z)] - D_{KL}(q(z\mid x)\,\|\,p(z))\le \log p(x)\)
- Reparameterization: \(z = \mu + \sigma\odot\epsilon,\ \epsilon\sim\mathcal N(0,I)\)
- ViT patches \(N = HW/P^2\) · patch dim \(16\cdot16\cdot3 = 768\)
- \(\log p(x) = \text{ELBO} + D_{KL}(q\,\|\,p(z\mid x))\)
Asked in the 2026 assignment
- ViT → patches as tokens. DETR → Detection Transformer. Swin → shifted windows.
- Autoencoder → compact representation; parts → encoder + decoder.
- VAE vs AE → VAE learns a probability distribution for the latent.
- VAE sequence → Encoding → Sampling → Decoding.
- Latent variable → sampled representation of the input.
- Why sample → generate different possible outputs.
- Problem formulation → define how data and its distribution are modelled.
Traps
- VAE does have both an encoder and a decoder and DOES generate.
- Swin is still pure attention, just windowed.
GANs and diffusion
Core ideas
- GAN (Goodfellow 2014): Generator makes fakes from noise; Discriminator tells real (1) from fake (0). Minimax game; equilibrium D = 0.5.
- Problems: mode collapse (little variety), instability, non-convergence, D too strong. Minibatch discrimination helps diversity.
- cGAN: condition on extra info (class label, text) for both G and D.
- WGAN: Wasserstein distance + 1-Lipschitz critic → stable training, less mode collapse.
- Pix2Pix: paired image-to-image (cGAN + λL1). CycleGAN: unpaired (horse ↔ zebra) with cycle-consistency loss.
- Diffusion forward: gradually add Gaussian noise until pure noise. Reverse: network removes noise step by step → new image.
- DDPM = Denoising Diffusion Probabilistic Model (Ho 2020). Network predicts the added noise ε.
- ELBO = the training objective for VAEs and diffusion (lower bound on log-likelihood).
- Guidance: classifier guidance (separate classifier) vs classifier-free (scale s). Stable Diffusion = latent diffusion: VAE latent + text cross-attention U-Net.
Formulas
- \(\min_G\max_D\ \mathbb E[\log D(x)] + \mathbb E[\log(1-D(G(z)))]\)
- Forward: \(x_t = \sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon\), \(\bar\alpha_t = \prod(1-\beta_i)\)
- Loss: \(\|\epsilon - \epsilon_\theta(x_t,t)\|^2\) · CFG: \(\epsilon_\varnothing + s(\epsilon_c - \epsilon_\varnothing)\)
- Cycle: \(\|F(G(x))-x\|_1 + \|G(F(y))-y\|_1\)
Asked in the 2026 assignment
- GAN purpose → new data like training data. Two networks → Generator + Discriminator.
- Generator role → make fake samples.
- Common GAN problem → mode collapse.
- cGAN → generate using extra info like class labels.
- WGAN → stable GAN training.
- Forward diffusion → gradually add noise. Reverse → gradually remove noise.
- DDPM → Denoising Diffusion Probabilistic Model.
- ELBO → objective for learning the generative model.
Traps
- "Distinguish real and fake" is the Discriminator, not the Generator.
- Forward = noising, reverse = generating. Don't flip them.
LLMs and Vision-Language Models
Core ideas
- LLM: Transformer trained with next-token prediction to understand and generate human-like text.
- Architectures: encoder-only (BERT), encoder-decoder (T5, Whisper), decoder-only (GPT, Llama, Claude).
- Tokenization: text → sub-word units (BPE: merge the most frequent pair, e.g. e + s → es). 1 token ≈ 4 chars ≈ 0.75 words.
- Pre-training: learn general patterns from huge text (Common Crawl, C4 ~156B tokens). GPT-3: 175B params.
- Fine-tuning: further train for a task/domain: full, instruction, PEFT (LoRA, adapters), RLHF, DPO.
- Decoding: greedy, top-k, top-p (nucleus), temperature. Perplexity = how "surprised" (lower is better).
- VLM: understands images + language. Vision encoder (ViT/CNN) extracts image features → projection → LLM.
- Alignment: image and text in one common space. Cross-modal attention: one modality attends to the other.
- Contrastive learning: matching image-text pairs get similar representations.
Formulas
- \(P(X) = \prod_t P(x_t\mid x_{\lt t})\) · \(L = -\sum_t \log P(x_t\mid x_{\lt t})\)
- Temperature: \(P_i = \frac{e^{z_i/T}}{\sum_j e^{z_j/T}}\) (T < 1 sharper)
- Perplexity \(= \prod p(x_i\mid x_{\lt i})^{-1/L}\)
- Contrastive: \(L_{CL} = \tfrac12(L_{I\to T} + L_{T\to I})\), cosine with temperature τ
Asked in the 2026 assignment
- LLM purpose → understand and generate human-like text. Architecture → Transformer.
- Tokenization → text into smaller units.
- Pre-training → general patterns from lots of text. Fine-tuning → further training for a task/domain.
- VLM → images + language. Vision encoder → extract image features.
- Alignment → common representation space.
- Cross-modal attention → one modality interacts with another.
- Contrastive learning → similar representations for matching pairs.
Traps
- Pre-training = general; fine-tuning = specific. Don't swap them.
- BERT is encoder-only, GPT is decoder-only.
CLIP and multimodal generative models
Core ideas
- CLIP (Radford 2021): learns the relationship between images and text in one shared embedding space.
- Two encoders: image encoder (ResNet/ViT) + text encoder (Transformer). Trained on web image-text pairs.
- Contrastive learning: matched pairs (diagonal) close, mismatches far. Cosine similarity of normalized embeddings.
- Zero-shot classification: prompts "a photo of a {class}" → pick the class with the highest cosine. No retraining, open vocabulary.
- Prompt engineering: design good text prompts; prompt ensembling averages several templates.
- Multimodal fusion: combine modalities. Early (input), middle (cross-modal interaction), late (decisions). Bilinear / gated variants.
- MLLM: LLM + modality encoders + projector → handles text + images.
- Text-to-image: text description → image (Reed 2016 GAN, diffusion). Captioning is the reverse.
- Training stages: pretraining → alignment → instruction tuning → preference optimization. Challenge: aligning modalities, hallucination.
Formulas
- \(s_{ij} = \frac{v_i^\top t_j}{\|v_i\|\|t_j\|}\) · zero-shot \(\hat c = \arg\max_c s(v, t_c)\)
- Symmetric InfoNCE: \(\tfrac12(L_{I\to T}+L_{T\to I})\) with temperature τ
- Prompt ensemble \(t_c = \frac1K\sum_k f_T(T_{c,k})\)
- MLLM: \(P(y\mid I,q) = \prod_t P(y_t\mid I,q,y_{\lt t})\)
Asked in the 2026 assignment
- CLIP → relationship between images and text.
- Two encoders → image encoder + text encoder.
- Learning type → contrastive.
- Key capability → zero-shot classification.
- Prompt engineering → design suitable text prompts.
- Training data → image-text pairs.
- Multimodal fusion → combine modalities. MLLM → text + images.
- Text-to-image → image from a text description. Challenge → aligning modalities.
Traps
- CLIP's two parts are image + text encoders, not encoder + decoder.
- Zero-shot means no training on the new classes.
Agentic AI and research trends
Core ideas
- Agentic AI: systems that autonomously pursue goals by planning and taking actions. GenAI makes content; agentic AI acts.
- The agent interacts with the environment (tools, APIs, files, web).
- Loop: Goal → Perception → Reasoning → Planning → Action → Observation → Evaluation → Updated state.
- Planning: decide the steps to reach the goal; re-plan after observations. Task decomposition: complex task → subtasks (DAG).
- LLM = brain: reasons and decides; the framework executes. Tool use: external tools via function calls tool(name, args).
- Memory: working (current context) + long-term (vector stores, knowledge graphs) to reuse past info.
- RAG: retrieve relevant info → generate a grounded answer. Agentic RAG = iterative retrieval in the loop.
- Patterns: ReAct (reason → act → observe), reflection (critique → revise), plan-and-execute, human-in-the-loop. Multi-agent: supervisor, pipeline, debate, blackboard.
- Challenges: safety and reliability (prompt injection, data leakage, excess permissions), cost, latency. Trends: DiT, flow matching, text-to-video, world models.
Formulas
- Policy: \(a_t \sim \pi(a_t \mid s_t)\)
- Tool call: tool(name, arguments)
Asked in the 2026 assignment
- Agentic AI → autonomously perform tasks and take actions.
- Agent interacts with → the environment.
- Planning → decide steps to reach a goal. Task decomposition → break into subtasks.
- LLM role → reasoning / decision-making brain.
- Tool use → external tools for specific actions. Memory → store and reuse past info.
- RAG → retrieve relevant info to help answer.
- Multi-agent → multiple agents working together.
- Major challenge → safety and reliability of autonomous actions.
Traps
- The LLM decides; it doesn't replace tools.
- Multi-agent means multiple agents, not multiple GPUs.