View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

  • 概要
  • トランスクリプト
  • コード
  • AppleシリコンでのMLXの導入

    MLXは、Appleシリコン上で数値計算や機械学習を行うための柔軟で効率的な配列フレームワークです。ユニファイドメモリ、遅延計算、関数変換など、MLXの基本的な機能を解説します。また、SwiftとPythonのAPIを使用して、各種のAppleプラットフォーム上で機械学習モデルを構築、高速化するためのより高度な手法についても紹介します。

    関連する章

    • 0:00 - イントロダクション
    • 1:15 - MLXの概要
    • 4:21 - 主な機能
    • 10:15 - MLXの高速化
    • 17:30 - MLX Swift

    リソース

    • MLX
    • MLX LM - Python API
    • MLX Examples
    • MLX Explore - Python API
    • MLX Framework
    • MLX Llama Inference
    • MLX Swift
    • MLX Swift Examples
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC25

    • MLX:Appleシリコンでの大規模言語モデルの実行
  • このビデオを検索

    こんにちは Awniです 本セッションでは MLXの概要を説明します MLXはAppleシリコン向けに開発された オープンソースの配列フレームワークです 幅広い用途に対応できる 柔軟なツールで 基本的な数値計算から Appleデバイス上で最大規模の 最先端機械学習モデルまで 実行できます 大規模な言語モデルで テキストを生成する場合や 最新モデルで画像 オーディオまたはビデオを生成する場合は MLXが最適です 機械学習モデルを Mac上で直接 トレーニング、微調整 カスタマイズするのにも使えます まずMLXとは何か どこで役立つのか少し詳しく説明します またPythonでMLXを使用するための 基本も説明します インストールと 基本的な配列操作などです その後 他のフレームワークと 異なる顕著な 主要機能をいくつか説明します 次にAppleシリコン上で 機械学習のワークロードを可能な限り 高速化するMLXのツールを いくつか説明します

    最後のセクションで MLX Swiftを どのように使い始めるか 簡単に説明します ではMLXの概要を詳しく見ていきます MLXはAppleシリコンでの スピードを目的に一から設計され CPU上での実行や GPU上での高速化が 可能です MLXは さまざまな アプリに使用でき 小規模な数値計算から 大規模な機械学習まで対応します 使いやすく柔軟な設計で スピードと効率を 損なうことはありません

    MLXにはNumPyに準拠した 主要なAPIが備わっています 多くの場合 ドロップイン 代替品として使用して ほとんどの数値計算を高速化できます MLXには 機械学習に必要な ツールもすべて揃っています 自動微分や 高レベルのライブラリなどです これらの高レベルのAPIは PyTorchやJAXに似ています こうしたフレームワークを学んだ方には MLXは馴染みやすく 始めるのも簡単でしょう MLXを使用するとデバイス上で直接 より高度な機械学習を行うことができます たとえばMLXは 人気アプリLM Studioで 使用されており 自分のMacで直接 大規模言語モデルを使って テキストを生成できます

    MLX上に構築された MLX LMパッケージを使い テキストを生成し 最大数千億の パラメータサイズの 言語モデルを微調整できます これに関する詳細を知る上で 役立つセッションは 「MLX:Appleシリコンでの 大規模言語モデルの実行」です MLXはフル機能のPython APIを備え ラピッドプロトタイプに役立ちます SwiftのAPIもあります ニューラルネットワークを構築し 最適化する高レベルの パッケージがすべて 含まれています MLXには C++とCのAPIもあり これらの言語で使用して 最新の機械学習モデルを Appleシリコンで実行できます たとえばMac、iPhone、iPad Vision Proなどです MLXソフトウェアはすべてオープンソースで 寛容なMITライセンスの下で提供されており 主要ソフトウェアは GitHubで公開されており PythonとSwift APIで構築された 数例とパッケージも含まれています MLXにはHugging Faceに活発な モデルクリエイターコミュニティもあります 最新モデルの多くはすでに Hugging Face OrganizationのMLXコミュニティにあり 新しいモデルが毎日アップされています PythonでMLXを使用開始するには PyPiからのインストールが最も簡単です ターミナルで1行pip3 install mlxを 実行するだけです MLXは簡単に使えます 配列の計算の実行を開始するには Pythonファイルを開いて MLXをインポートするだけです 次に いくつかの配列を作成し それらで基本的な操作を行えます たとえばここでは2つの 整数配列を追加します

    また形状やデータ型など 配列に関する情報も 簡単に調べることができます 前に述べたようにMLX Python APIは NumPyに似ています 通常 操作の名前と署名は同じで 同じように動作します NumPyのようなフレームワークを 学んでいる場合は MLXは馴染みやすく 始めるのも簡単です MLXが何で どのように役立つのか いくつかの基本がわかったところで 主な機能について見ていきましょう ユニファイドメモリや遅延評価 関数変換、ニューラルネットワークの 構築と最適化のための 高レベルのパッケージなどです MLXは高性能なAppleシリコンを 活用できるようにデザインされています これにはユニファイドメモリに固有の 新しいプログラミングモデルが含まれます

    機械学習用に広く使われている システムには独立したメモリを持つ 別個のGPUがあります 一方Appleシリコンにはユニファイド メモリアーキテクチャがあります CPUとGPUが同一の物理メモリを 共有しているということです

    ユニファイドメモリを使用するには MLXは 従来のフレームワークで 慣れているものとは異なります 従来のフレームワークでは 計算はデータに従います 配列がCPUメモリにある場合 計算はCPUで行われます 配列がGPUメモリにある場合 計算はGPUで行われます

    MLXでは配列はユニファイド メモリに割り当てられます サポートされているデバイスの どれで使うときでも どこにもコピーする必要はありません

    デバイスに対して操作を実行するには 操作自体にデバイスを 指定します たとえば ここではGPUに aとbを加算し CPUでaとbを乗算します この操作は並列実行することもできます またMLXは依存関係が存在する場合 自動的に管理します MLXのもう一つの重要な特徴は 遅延計算です MLXを可能な限り効率的にするために 特に非常に大規模な計算の場合 MLXには遅延実行エンジンがあります

    2つの配列に対する加算のような 操作が呼び出されると 実際の計算は行われません 代わりに ここに示すような 計算グラフが作成されます

    配列Cはまだ計算されていません 実際に使用する必要がある場合にのみ 計算されます たとえばCを印刷したり MLXからCを変換して Pythonリストに変換するときは 計算が強制されます mx.evalでグラフの評価を 明示的に強制できます 遅延計算にはいくつかの利点があります 計算グラフの構築と 実行を切り離すことで MLXは 結果を計算する前に グラフ上で変換と 最適化を行えます また遅延計算への支払いは 使用分だけです 関数変換はMLXの もう一つの重要な機能です 高速配列フレームワークから 機械学習モデルのトレーニングと 性能向上に役立つはるかに 強力なツールへと進化しています

    関数変換は 関数を入力として受け取り 新しい関数を 返す変換です

    MLXにはいくつかの 関数変換があります それらは通常2つのカテゴリの いずれかに分類されます 自動微分の変換は 計算グラフを 最適化するための変換です たとえば関数変換を 使用して 自動的に MLXの任意の関数の 勾配を計算できます

    入力の正弦を計算する基本的な 関数があるとします この関数の勾配を取るには mx.grad関数変換を 使用できます mx.gradの出力は 新しい関数で 配列で呼び出すと 導関数が得られます 関数変換は 任意に構成可能です 2次導関数を取るには mx.gradの出力に mx.gradを使用するだけです

    結果は別の関数であり 配列で呼び出すと 微分の2次導関数が 得られます

    MLXにはニューラルネットワークの構築と トレーニングを容易にできる 高レベルのパッケージも2つあります

    1つはmlx.nnでニューラルネットワークの 構築に使用するモジュラーライブラリです 2つ目は一般的な最適化アルゴリズムの ライブラリであるmlx.optimizersです この2つはスタンドアロンでも 使用できますが 互いにシームレスに 統合することも可能です

    mlx.nnパッケージは ニューラルネットワークの構築に 必要なすべてを備えています nn.moduleはすべてのレイヤーとコンテナが 継承するプライマリ基底クラスです パラメータへのアクセスや パラメータの読み込み 保存などに役立つ方法を表示します

    nnライブラリにはnn.Linearのような 標準の既製層の セットがありますが nn.Moduleから継承することで 独自の層を構築することもできます

    一般的に使用される損失関数と 初期化方法も nn.lossesとnn.init サブパッケージに含まれています

    mlx.nnを使って単純な多層ニューラル ネットワークを構築する方法を 紹介します

    最初のステップはnn.Moduleを 継承するカスタムクラスを作成することです 今回は単純な1つの隠れ層の ニューラル ネットワークを使用します モジュールの初期化メソッド内に 線形層を作成します 次に呼び出し関数を実装します これは指定された入力に対する モジュールの出力を計算します 呼び出し関数は最初の 線形層を呼び出し ReLU活性化関数を適用し 次に2番目の線形層を呼び出します MLXはAppleシリコンの 統一メモリアーキテクチャ向けに設計 最適化されていますが 簡単に始められるように 上位のニューラルネットワークパッケージは PyTorchのような一般的に使用される 機械学習フレームワークと類似した 設計となっています

    MLXモデルの実装をPyTorchの 同様の実装と比較してみます 2つはほぼ同じですが 出力を計算する関数に わずかな違いが2つだけあります PyTorchでモデルを構築 したことがある方は MLXへの切り替えは 非常に簡単なはずです MLXの主な機能のほとんどを見てきたので 機械学習ワークロードを 可能な限り高速かつ効率的に 作成する方法について話します まず関数をコンパイルして 高速化する方法を説明します 次にmx.fastサブパッケージについて 説明します このサブパッケージには 一般的な機械学習操作の 高速実装が標準で用意されており 独自のMetalカーネルを 追加するためのAPIも提供されています その後 メモリ使用量の削減と モデル実行の高速化を 実現する量子化の使い方を紹介します 最後にMLXを使って 多数のマシン間で計算を 配信する方法を紹介します MLXのほとんどすべての現実的な 計算は 配列に対して いくつかの操作を実行する関数で 構成されます そのような関数を 高速化する簡単な方法は mx.compile関数変換を 使用することです いくつかの要素ごとの 操作を行う関数があるとします たとえばこのGELU活性化関数 などです この関数の計算グラフには いくつかのノードが含まれています これらの各ノードは内部で 別のGPUカーネルの 起動に対応します

    グラフのコンパイルでは これらの個別のカーネルをすべて 単一の融合カーネルに統合します これによりメモリ帯域幅と グラフ実行のオーバーヘッドを節約し はるかに効率的な計算ができます

    mx.compileの使用は簡単で 関数にmx.compile関数変換を デコレーターとして適用するだけです コンパイルは多くの場合うまく機能しますが 機械学習の 一般的な操作などの より複雑な操作では mx.fastサブパッケージを使用すると より高速に実行できる可能性があります たとえばTransformerモデルの 主な構成要素の多くは mx.fastにある操作を使用します たとえば位置エンコーディング 正規化層 スケール ドット積アテンションなどです mx.fastの操作は より特殊化されていますが トレーニングと推論の両方で可能な限り 高速になるように高度に調整されています また高度に構成可能で 特定の計算の多くのバリエーションを 高速化できます たとえばスケールドット積 アテンションの操作は 入力に任意のマスクを受け取れます マスクは加算マスク ブール型マスク マスクタイプを示す文字列にできます mx.fastの操作の1つである RMS normを詳しく見てみましょう RMS normは最新のTransformerベースの 多くの大規模言語モデルで使われています MLXの操作を使用した 基本的な実装では 大規模な計算グラフが生成されます

    代わりに実装全体を1回の mx.fast.rms_normへの 呼び出しに 置き換えることができます コードは単純になり 計算グラフにノードは1つだけとなり 計算自体が はるかに高速になります

    MLXには関数の最適化のために よりカスタマイズされた実装が必要な場合で それがmx.fastにないとき カスタムMetalカーネルを 追加するための APIがあります カスタムカーネルを書き込めば MLXが残りのすべてを処理します ジャストインタイムコンパイルと 実行が含まれます これらのカーネルはMetalで書かれますが これはApple GPUで関数を実行するために Appleが開発した言語とAPIです カーネルを構築するには Metalコードのソース文字列と 入力と出力に関する 情報を渡します

    カーネルを呼び出すには グリッドサイズと 出力の 形状とタイプを指定します MLXは カーネル呼び出しを 他の操作と同じように扱います 計算グラフにノードを作成し 遅延評価されます

    機械学習のワークロードを 高速化するツールキットの中で もう1つが量子化です 大規模なモデルが高速であるためには 大量のメモリとメモリ帯域幅が必要です 多くの場合トレーニングで 推論と同等または同程度の 品質を得るためには 推論に実際に必要な精度よりも はるかに高い精度が 必要になります 精度を下げることでより大きなモデルを メモリに収め実行を加速できます

    モデルが32ビット 浮動小数点精度の場合 最初のステップとして bfloat16またはfloat16を使用し メモリ使用量を 半分に減らすことができます 16ビットが多すぎると MLXには配列をさらに小さく 量子化しその中で操作を行うための ルーチンが組み込まれています たとえば要素あたり4ビットを 使用して量子化すると メモリ要件をさらに削減できます

    行列を量子化するには mx.quantizeを使用します 要素ごと使用するビット数と グループサイズを指定します グループサイズにより 量子化行列において共有される スケール値とバイアス値を持つ 要素の数が決定されます ビットが小さく グループサイズが大きいほど 結果は小さく 高速になります MLXにはビットとグループサイズに さまざまな選択肢があり 可能な限りの柔軟性を実現します

    定量化されていない 入力ベクトルまたは行列を 定量化された行列と乗算するには mx.quantized_matmulを使用します

    mx.dequantizeを使用して 元の入力の近似値を回復します

    MLX.mnにはモジュールを1つのコマンドで 量子化する便利なユーティリティもあります たとえば埋め込み層に続いて 複数の線形層が積み重なった モデルがあるとします nn.quantizeを使用して モデルを量子化できます quantizeコマンドには オプションのコールバックを 受け取る機能があり ユーザーは どの層を量子化するか 各レイヤーで どのような精度を使用するかを より細かく制御できます

    大規模言語モデルで テキストを生成する際 量子化はメモリ使用量を 大幅に削減し 毎秒生成されるトークンを増やします 場合によっては 1台のマシンでは不十分です たとえば1台のマシンのメモリに収まらない 大規模なモデルを使用して テキストを生成する場合が あるかもしれません 大規模なデータセットでモデルを 微調整または評価する場合もあります どちらも並列化が容易で 複数のマシンを使用すると はるかに高速になります

    MLXは設定なしですぐに使え 複数のマシンで 任意の計算を実行します マシンはEthernetまたは Thunderbolt接続できます

    mx.distributed サブパッケージを使用すると 複数のマシン間で計算を 配信できます MX distributedは 主に一連の通信操作です

    たとえばall_Sumは すべてのマシンの入力配列を加算します all_Sumの出力は入力の合計で これは各マシンで同じです 複数のマシンで配列を 合計する方法を詳しく見てみましょう mx.distributed.initを使って 分散バックエンドを初期化します このステップは任意ですが コミュニケーショングループへのアクセスが 必要なときに呼び出すものです コミュニケーショングループには プロセスの総数や 現在のプロセスインデックスなど 有用な情報が添付されています

    次に 各プロセスに単一の値を 含む配列を作成し mx.distributed.all_sumを呼び出して すべてのプロセスにわたる配列を合算します

    MLXには複数のマシンでMLXプログラムを 実行するための便利なランチャがあります 4台のマシンでプログラムを 実行するには4つのホストIPアドレスで mlx.launchを使用します ここまではすべてPythonでMLXを 使用することを説明しました 多くの場合Pythonの使いやすさと 柔軟性が好まれるかもしれませんが Swiftの方がよい場合もあります そのためMLXはSwiftでの フル機能のAPIを提供しています Metal上に構築され macOS、iOS、iPadOS visionOSなど すべてにわたってうまく機能します SwiftでMLXを始めるには みなさんのXcodeプロジェクトに パッケージのまま追加するだけです プロジェクトをクリックし 次にパッケージの 依存関係タブの プラス記号をクリックします 次にMLX Swift GitHub リポジトリのURLを入力し パッケージを追加するボタンを クリックします MLX Swiftで構築を開始するのに 必要なのはこれだけです PythonとSwiftの間の移行を できるだけ簡単にするために 2つの言語間のAPIは 意図的に似せています これまでのPythonコードスニペットと MLX Swiftのものを 並べて比較したものです 配列の作成 それらに対する操作の実行 配列に関するメタデータの検査は PythonとSwiftでほぼ同じです これまで見てきた PythonでMLXを使用するときの すべての主要機能とともに MLXの高速化の部分で話した最適化は MLX Swiftにも同様に適用されます MLXの多くの主要な機能の 概要を説明してきました フレームワークの詳細は MLX Webサイトをご覧ください これにはドキュメントや 例などへのリンクがあります Python APIとSwift APIの両方に サンプルリポジトリがあり ここに一般的な機械学習の ユースケースの例が多くあります これには言語モデルのトレーニングと生成 画像生成 音声認識などが含まれます これらの例はMLXについて 学びを深めるのに最適で 独自のプロジェクトでMLXを使用して 構築するための良い出発点となります ありがとうございました みなさんがMLXで何を 構築するか楽しみです

    • 3:48 - Basics

      import mlx.core as mx
      
      # Make an array
      a = mx.array([1, 2, 3])
      
      # Make another array
      b = mx.array([4, 5, 6])
      
      # Do an operation
      c = a + b
      
      # Access information about the array
      shape = c.shape
      dtype = c.dtype
      
      print(f"Result c: {c}")
      print(f"Shape: {shape}")
      print(f"Data type: {dtype}")
    • 5:31 - Unified memory

      import mlx.core as mx
      
      a = mx.array([1, 2, 3])
      b = mx.array([4, 5, 6])
      
      c = mx.add(a, b, stream=mx.gpu)
      d = mx.multiply(a, b, stream=mx.cpu)
      
      print(f"c computed on the GPU: {c}")
      print(f"d computed on the CPU: {d}")
    • 6:20 - Lazy computation

      import mlx.core as mx
      
      # Make an array
      a = mx.array([1, 2, 3])
      
      # Make another array
      b = mx.array([4, 5, 6])
      
      # Do an operation
      c = a + b
      
      # Evaluates c before printing it
      print(c)
      
      # Also evaluates c
      c_list = c.tolist()
      
      # Also evaluates c
      mx.eval(c)
      
      print(f"Evaluate c by converting to list: {c_list}")
      print(f"Evaluate c using print: {c}")
      print(f"Evaluate c using mx.eval(): {c}")
    • 7:32 - Function transformation

      import mlx.core as mx
      
      def sin(x):
          return mx.sin(x)
      
      dfdx = mx.grad(sin)
      
      def sin(x):
          return mx.sin(x)
      
      d2fdx2 = mx.grad(mx.grad(mx.sin))
      
      # Computes the second derivative of sine at 1.0
      d2fdx2(mx.array(1.0))
    • 9:16 - Neural Networks in MLX

      import mlx.core as mx
      import mlx.nn as nn
      import mlx.optimizers as optim
      
      class MLP(nn.Module):
          """A simple MLP."""
      
          def __init__(self, dim, h_dim):
              super().__init__()
              self.linear1 = nn.Linear(dim, h_dim)
              self.linear2 = nn.Linear(h_dim, dim)
      
          def __call__(self, x):
              x = self.linear1(x)
              x = nn.relu(x)
              x = self.linear2(x)
              return x
    • 9:57 - MLX and PyTorch

      # MLX version
      import mlx.core as mx
      import mlx.nn as nn
      import mlx.optimizers as optim
      
      class MLP(nn.Module):
          """A simple MLP."""
      
          def __init__(self, dim, h_dim):
              super().__init__()
              self.linear1 = nn.Linear(dim, h_dim)
              self.linear2 = nn.Linear(h_dim, dim)
      
          def __call__(self, x):
              x = self.linear1(x)
              x = nn.relu(x)
              x = self.linear2(x)
              return x
      
      # PyTorch version
      import torch
      import torch.nn as nn
      import torch.optim as optim
      
      class MLP(nn.Module):
          """A simple MLP."""
      
          def __init__(self, dim, h_dim):
              super().__init__()
              self.linear1 = nn.Linear(dim, h_dim)
              self.linear2 = nn.Linear(h_dim, dim)
      
          def forward(self, x):
              x = self.linear1(x)
              x = x.relu()
              x = self.linear2(x)
              return x
    • 11:35 - Compiling MLX functions

      import mlx.core as mx
      import math
      
      def gelu(x):
          return x * (1 + mx.erf(x / math.sqrt(2))) / 2
      
      @mx.compile
      def compiled_gelu(x):
          return x * (1 + mx.erf(x / math.sqrt(2))) / 2
      
      x = mx.random.normal(shape=(4,))
      
      out = gelu(x)
      compiled_out = compiled_gelu(x)
      print(f"gelu:          {out}")
      print(f"compiled gelu: {compiled_out}")
    • 12:32 - MLX Fast package

      import mlx.core as mx
      import time
      
      def rms_norm(x, weight, eps=1e-5):
          y = x.astype(mx.float32)
          y = y * mx.rsqrt(mx.mean(
              mx.square(y), 
              axis=-1, 
              keepdims=True,
          ) + eps)
          return (weight * y).astype(x.dtype)
      
      batch_size = 8192
      feature_dim = 4096
      iterations = 1000
      
      x = mx.random.normal([batch_size, feature_dim])
      weight = mx.ones(feature_dim)
      bias = mx.zeros(feature_dim)
      
      start_time = time.perf_counter()
      for _ in range(iterations):
          y = rms_norm(x, weight, eps=1e-5)
          mx.eval(y)
      rms_norm_time = time.perf_counter() - start_time
      print(f"rms_norm execution: {gelu_time:0.4f} sec")
      
      start_time = time.perf_counter()
      for _ in range(iterations):
          mx.eval(mx.fast.rms_norm(x, weight, eps=1e-5))
      fast_rms_norm_time = time.perf_counter() - start_time
      print(f"mx.fast.rms_norm execution: {compiled_gelu_time:0.4f} sec")
      
      print(f"mx.fast.rms_norm speedup: {rms_norm_time/fast_rms_norm_time:0.2f}x")
    • 13:30 - Custom Metal kernel

      import mlx.core as mx
      
      # Build the kernel
      source = """
          uint elem = thread_position_in_grid.x;
          out[elem] = metal::exp(inp[elem]);
      """
      kernel = mx.fast.metal_kernel(
          name="myexp",
          input_names=["inp"],
          output_names=["out"],
          source=source,
      )
      
      # Call the kernel on a sample input
      x = mx.array([1.0, 2.0, 3.0])
      out = kernel(
          inputs=[x],
          grid=(x.size, 1, 1),
          threadgroup=(256, 1, 1),
          output_shapes=[x.shape],
          output_dtypes=[x.dtype],
      )[0]
      print(out)
    • 14:41 - Quantization

      import mlx.core as mx
      
      x = mx.random.normal([1024])
      weight = mx.random.normal([1024, 1024])
      
      quantized_weight, scales, biases = mx.quantize(
              weight, bits=4, group_size=32,
      )
      
      y = mx.quantized_matmul(
          x,
          quantized_weight,
          scales=scales,
          biases=biases,
          bits=4,
          group_size=32,
      )
      
      w_orig = mx.dequantize(
          quantized_weight,
          scales=scales,
          biases=biases,
          bits=4,
          group_size=32,
      )
    • 15:23 - Quantized models

      import mlx.nn as nn
      
      model = nn.Sequential(
          nn.Embedding(100, 32),
          nn.Linear(32, 32),
          nn.Linear(32, 32),
          nn.Linear(32, 1),
      )
      
      print(model)
      
      nn.quantize(
          model,
          bits=4,
          group_size=32,
      )
      
      print(model)
    • 16:50 - Distributed

      import mlx.core as mx
      
      group = mx.distributed.init()
      
      world_size = group.size()
      rank = group.rank()
      
      x = mx.array([1.0])
      
      x_sum = mx.distributed.all_sum(x)
      
      print(x_sum)
    • 17:20 - Distributed launcher

      mlx.launch --hosts ip1, ip2, ip3, ip4 my_script.py
    • 18:20 - MLX Swift

      // Swift
      import MLX
      
      // Make an array
      let a = MLXArray([1, 2, 3])
      
      // Make another array
      let b = MLXArray([1, 2, 3])
      
      // Do an operation
      let c = a + b
      
      // Access information about the array
      let shape = c.shape
      let dtype = c.dtype
      
      // Print results
      print("a: \(a)")
      print("b: \(b)")
      print("c = a + b: \(c)")
      print("shape: \(shape)")
      print("dtype: \(dtype)")

Developer Footer

  • ビデオ
  • WWDC25
  • AppleシリコンでのMLXの導入
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習とAI
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン