使用 Kiro 和 Arm MCP Server 的自动化云迁移

发布: (2025年12月20日 GMT+8 08:11)
11 min read
原文: Dev.to

抱歉,我需要您提供要翻译的具体文本内容(文章正文),才能为您完成简体中文翻译。请将需要翻译的文本粘贴在这里,我会在保持原有格式、代码块和链接不变的前提下为您进行翻译。

Introduction

AWS Graviton 提供了 AWS 上任何 EC2 实例中最佳的性价比,最近的 Graviton 5 公布更让其价值主张更强大。迁移到 Graviton 在财务上是明智的,同时也能为您的应用带来巨大的性能提升。

大多数应用可以无缝迁移,但如果您的代码中有针对 x86 的特定优化怎么办?

好消息: 您不再需要手动进行迁移。

在本文中,我将展示如何结合使用 Kiro(AWS 的智能 IDE)和 Arm MCP Server,自动化整个迁移过程——包括 Docker 镜像、SIMD 内在函数、编译器标志,全部内容。

Arm MCP Server 为你提供的功能

Arm MCP Server 实现了 Model Context Protocol (MCP)——一种让 AI 编码助手接入专用工具的标准方式。将它连接到 Kiro 后,你将获得一个能够:

  • 检查 Docker 镜像 是否支持 arm64,无需手动浏览清单。
  • 🔍 扫描代码库,查找 x86‑特定代码(intrinsics、构建标志等)。
  • 📚 搜索 Arm 知识库,获取迁移指南和等价的 intrinsic 信息。
  • 🧪 分析汇编,了解性能特征。

示例:迁移遗留的基准测试应用

想象一下,你接手了一个与 x86 紧密耦合的遗留基准测试应用。下面是原始的 Dockerfile

FROM centos:6

# CentOS 6 reached EOL – use vault mirrors
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
    sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Base.repo

# Install EPEL repository (required for some development tools)
RUN yum install -y epel-release && \
    sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/epel.repo && \
    sed -i 's|^#baseurl=http://download.fedoraproject.org/pub/epel|baseurl=http://archives.fedoraproject.org/pub/archive/epel|g' /etc/yum.repos.d/epel.repo

# Install Developer Toolset 2 for better C++11 support (GCC 4.8)
RUN yum install -y centos-release-scl && \
    sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo && \
    sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo && \
    sed -i 's|^# baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo && \
    sed -i 's|^# baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo

# Install build tools
RUN yum install -y \
    devtoolset-2-gcc \
    devtoolset-2-gcc-c++ \
    devtoolset-2-binutils \
    make \
    && yum clean all

WORKDIR /app
COPY *.h *.cpp ./

# AVX2 intrinsics are used in the code
RUN scl enable devtoolset-2 "g++ -O2 -mavx2 -o benchmark \
    main.cpp \
    matrix_operations.cpp \
    -std=c++11"

CMD ["./benchmark"]

为什么这个 Dockerfile 在 Graviton 上无法工作

问题说明
centos:6没有 arm64 变体——基础镜像仅支持 x86。
-mavx2仅适用于 x86 的编译器标志;Arm CPU 不识别 AVX2。
AVX2 本机函数 (__m256 等)在 Arm 上无法编译;需要使用 Arm 等价的 SIMD 本机函数。

如果你没有自行发现这些问题,也没关系——Kiro + Arm MCP Server 会帮你找出来。

有问题的矩阵乘法代码

以下是使用 AVX2 本机指令进行双精度矩阵乘法的 matrix_operations.cpp 文件。(此片段故意简化——完整实现中包含实际的乘法内核。)

// matrix_operations.cpp
#include "matrix_operations.h"
#include <vector>
#include <random>
#include <iostream>
#include <immintrin.h>   // AVX2 intrinsics

// ---------------------------------------------------------------------------
// Matrix constructor
// ---------------------------------------------------------------------------
Matrix::Matrix(size_t r, size_t c) : rows(r), cols(c) {
    // Allocate a rows × cols matrix filled with zeros
    data.resize(rows, std::vector<double>(cols, 0.0));
}

// ---------------------------------------------------------------------------
// Fill the matrix with random values in the range [0.0, 10.0)
// ---------------------------------------------------------------------------
void Matrix::randomize() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0.0, 10.0);

    for (size_t i = 0; i < rows; ++i) {
        for (size_t j = 0; j < cols; ++j) {
            data[i][j] = dis(gen);
        }
    }
}

// ---------------------------------------------------------------------------
// (The multiplication routine that uses AVX2 intrinsics is omitted here)
// ---------------------------------------------------------------------------

为什么此代码在 ARM v8 AArch64 上会失败

问题说明
AVX2 本机指令 (_mm256_*)这些 x86‑64 专有指令在 ARM v8 上不可用。
缺少 include guard / 头文件原始片段省略了若干标准头文件,导致编译错误。
std::vector 初始化错误std::vector(cols, 0.0) 应写成 std::vector<double>(cols, 0.0)
循环截断 / 语法错误randomize 方法的部分代码不完整。

建议的迁移路径(使用 Kiro 助手)

  1. 检测架构

    • Kiro 读取 CI 配置(.github/workflows/*.yml),确定运行器为 arm64
  2. 识别不兼容的本机指令

    • 它扫描源码中的 AVX2 本机指令(_mm256_*),并将其标记为不可移植。
  3. 提出可移植的替代方案

    • Kiro 建议将 AVX2 代码替换为 ARM NEON 等价实现(float64x2_tfloat64x4_t 等),或在性能影响可接受的情况下回退到标量实现。
  4. 自动化重构(可选 PR)

    • Kiro 可以生成一个 Pull Request,内容包括:
      • 将 Docker/CI 镜像更新为 ARM 兼容的基础镜像。
      • 调整构建命令(例如添加 -march=armv8-a+simd)。
      • 用 NEON‑兼容代码或可移植的标量循环替换 AVX2 本机指令。
  5. 验证

    • 完成修改后,Kiro 在 arm64 运行器上运行基准测试,将性能与原始 x86 构建进行对比,并报告差异。

TL;DR

  • Problem: x86‑specific Docker 基础镜像、编译器标志以及 AVX2 内置函数导致代码无法在 Graviton(ARM)实例上运行。
  • Solution: 使用 Kiro + Arm MCP Server 自动检测并替换有问题的部分(例如 AVX2 内置函数、仅限 x86 的预处理器检查)。
  • Result: 一个干净、兼容 ARM 的 Docker 镜像和源代码,可在最新的 Graviton 5 实例上运行,提供性价比高的性能提升。

试一试吧——你的未来的自己(以及你的 AWS 账单)会感谢你的!

头文件 matrix_operations.h

#ifndef MATRIX_OPERATIONS_H
#define MATRIX_OPERATIONS_H

#include <cstddef>          // size_t
#include <vector>           // std::vector
#include <iostream>         // std::cout (optional, for debugging)

class Matrix {
private:
    std::vector<std::vector<double>> data;   // 2‑D storage
    size_t rows;
    size_t cols;

public:
    // ctor
    Matrix(size_t r, size_t c);

    // fill the matrix with random values (0‑1)
    void randomize();

    // matrix multiplication (returns a new matrix)
    Matrix multiply(const Matrix& other) const;

    // sum of all elements – handy for a quick sanity check
    double sum() const;

    // simple accessors
    size_t getRows() const { return rows; }
    size_t getCols() const { return cols; }
};

// Benchmark driver – defined in a separate .cpp file
void benchmark_matrix_ops();

#endif // MATRIX_OPERATIONS_H

修复内容

问题原始已修复
缺少 include guard 结束标记#endif // MATRIX_OPERATIONS_H 出现在类定义 之前将 guard 移动,使其包裹整个文件
#include 行为空#include添加所需头文件(<cstddef><vector><iostream>
向量声明语法错误std::vector> data;改为 std::vector<std::vector<double>> data;
未闭合的注释 / 多余文本"Time: "删除 – 这不是头文件的一部分
函数原型缺少分号在需要的地方为每个原型添加 ;

源文件 main.cpp

#include "matrix_operations.h"
#include <iostream>

int main() {
    std::cout << "Matrix Operations Benchmark\n"
              << "============================\n";

#if defined(__x86_64__) || defined(_M_X64)
    std::cout << "Running on x86‑64 architecture with AVX2 optimisations\n";
#else
    std::cout << "Running on a non‑x86 architecture (e.g., ARM/Graviton)\n";
#endif

    // Execute the benchmark – implementation lives in matrix_operations.cpp
    benchmark_matrix_ops();

    return 0;
}

修复内容

问题原始已修复
缺少 <iostream> 的包含#include(空)添加了 #include <iostream>
#error 指令阻止了在 ARM 上的编译#error "This code requires x86-64 architecture with AVX2 support"已替换为运行时消息;代码现在可以在任何架构上编译。
缩进不一致 / 多余空格混合使用制表符和空格已规范为 4 空格缩进
不必要的 using namespace std;(不存在)——保留显式的 std:: 以保持清晰无需更改

如何使项目兼容 ARM

  1. 移除 AVX2 内在函数 – 用可移植的 SIMD 库(例如 xsimd 或编译器自动向量化)替代。

  2. 更新 Dockerfile

    # 使用兼容 ARM 的基础镜像
    FROM public.ecr.aws/ubuntu/ubuntu:22.04-arm64
    
    # 安装构建工具
    RUN apt-get update && apt-get install -y \
        build-essential cmake git \
        && rm -rf /var/lib/apt/lists/*
    
    # 复制源码并构建
    COPY . /app
    WORKDIR /app
    RUN cmake -B build && cmake --build build -j$(nproc)
  3. 使用相应的编译选项

    g++ -O3 -march=armv8.2-a+simd -std=c++20 -I. -o matrix_demo main.cpp matrix_operations.cpp
  4. 在 Graviton 上运行容器 – 镜像现在可以在没有 x86 特定检查的情况下启动,并且能够利用 ARM 原生 SIMD 扩展。

快速测试

# 本地构建(ARM 主机或通过 Docker 模拟)
docker build -t matrix-bench:arm .

# 运行
docker run --rm matrix-bench:arm

预期输出:

Matrix Operations Benchmark
============================
Running on a non‑x86 architecture (e.g., ARM/Graviton)
[benchmark output…]

现在代码已完全可移植,您可以利用 Graviton 5 实例提供的高性价比性能。祝编码愉快!

将 Kiro + MCP 迁移到 ARM

代码中包含许多 x86 特定的内在函数,但 Kiro 可以自动处理转换。

1. 配置 Kiro 以连接 ARM MCP 服务器

在项目根目录创建文件 .kiro/settings/mcp.json

{
  "mcpServers": {
    "arm-mcp": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-v", "/path/to/your/code:/workspace",
        "armlimited/arm-mcp:1.0.1"
      ]
    }
  }
}

注意事项

  • 该命令通过 Docker 运行 ARM MCP 服务器。
  • /path/to/your/code 替换为项目的绝对路径。
  • Kiro 会自动识别新服务器。通过在聊天中输入 /mcp 验证连接;你应该会看到列出 arm-mcp 及其工具。

2. 在聊天中进行快速检查

你可以让 Kiro 执行临时检查,例如:

Check the base image in the Dockerfile for ARM compatibility

Kiro 将使用 MCP 工具并报告 centos:6 仅支持 amd64

3. 使用引导文档自动化迁移

创建 .kiro/steering/arm-migration.md

---
inclusion: manual
---

Your goal is to migrate a codebase from x86 to ARM. Use the MCP server tools to help you with this. Check for x86‑specific dependencies (build flags, intrinsics, libraries, etc.) and replace them with ARM‑equivalent ones, ensuring compatibility and optimizing performance. Examine Dockerfiles, version files
Back to Blog

相关文章

阅读更多 »