About 2020 Apple Silicon Macs

Japanese

Today, Nov. 10, 2020, Apple announced three new models of Macs with Apple Silicon.

  • Macbook Air (13 inch, base price $999)
  • Macbook Pro (13 inch, base price $1299)
  • Mac mini (base price $699)

All of them have the new M1 chip that integrates CPU, GPU and neural engine among with other features. The base models have 8GB RAM and 256GB SSD.

Customization options are few due to its integrated chip design. Upgrading RAM to 16GB (max) costs $200 and storage is about $400/TB up to 2TB.

There are more details on specs on other sites, so I’ll focus on writing just my opinions about them.

Apple seemed to focus on how “lazy” they can be on hardware this time. They focused on designing a minimum number (1!) of chips while trying to make a product lineup that can access the largest number of customers. So, it makes sense that they focused on the ‘entry’ models of their products. Also, they reduced the effort by reusing the exterior designs of the existing products. Probably they would still have extra space inside due to integrating functions to M1 chip and removing a fan (Air) so that space might have been filled with extra battery. (We’ll see when iFixit tear it down next week.) It is possible that they have been designing recent products compatible with both previous logic boards and the board for M1.

Where did they put the resources that they saved in hardware design? My guess is that they went to software that needs to be changed radically because of the switch of the CPU architecture. Intel CPUs are in the x86 family and M1 is in the ARM family that has a different instruction set. I don’t know how much effort is necessary to maintain perfect backward compatibility at a reasonable speed, but it won’t sell well if many problems arise upon release of these Macs. I think it is reasonable to be very cautious about this.

It will ultimately depend on preferences which one you should buy, but it should be noted that they are all using the same chip. The only possibility for performance difference is the thermal capability of Air that went fanless this time. If thermal throttling occurs, it may sacrifice some performance during intensive tasks. It is possible that fanless design is just fine because M1 will be very power efficient. (Based on A14’s 6W Thermal Design Power (TDP), I expect M1 TDP to be ~10W.) Other than that, they are all identical, so you can just choose based on your use cases. Laptops come with a complete set of interfaces, so they are more expensive than mini. The main features that make Pro different are the fan, touch bar, and microphone array. If you don’t care, Air is better and you save $300.

The differences between A14 Bionic and M1 are just the number of high-performance cores (2 to 4) and GPU cores (4 to 8). Several days before this event, there was a leaked Geekbench 5 score of a chip called A14X (non-existing). The score was ~7000. The score of A14 was ~4000 and if you think that the high-performance cores are doubled but the high-efficiency cores are the same (4), this seems a reasonable score for M1. This score is close to Ryzen 7 4800HS or Core-i7 10875H that are relatively high-end mobile processors (not the highest, though) and, by itself, it is not amazing yet. However, if the power necessary to do the calculation is expected to be 1/3 or 1/4, this suddenly becomes the king in performance/watt. Probably the closest competition is Ryzen 4800U which already has almost insane perf/watt with a score of ~6000 and 15W TDP. M1 well outperform this, and it sounds more insane. These numbers matter when you increase the core count further for more powerful desktops, so I want proper measurements to be done.

For scientific computing, this computer should be pretty good hardware. However, the software may not be ARM native at the beginning, and your favorite one may not even work, so it might be wiser to buy after making sure what you want to use works on these machines. These computers can replace pretty much every computer but high-end desktops, so if you want to do the very extensive computation, probably it’s better to wait until iMacs or Mac Pros that are coming later.

For me, if the computer can do neural network training using Neural Engine cores with Tensorflow or PyTorch, I’d think about buying one for the World Making project. Even in that case, probably waiting for a more powerful iMac might be better. At least I’d like to see what happens over the next few weeks. This is a very exciting year for computing.

2020年の Apple Silicon Mac について

English

2020年11月10日、Apple Siliconを乗せた新しいMacのモデルが公開されました。

ラインナップは

  • Macbook Air (13インチ)
  • Macbook Pro (13インチ)
  • Mac mini

で、それぞれM1チップを積んでおり、他のプロセッサオプションはありません。

価格はそれぞれ最低値が

  • Air: $999
  • Pro: $1299
  • mini: $699

で、ベースモデルはメモリは8G、ストレージが256GBになります。

グラフィックス統合チップを使っているのでカスタマイズオプションは少なくメモリを16GBにするのに+$200、ストレージを増やすのに概ね$400/TB 程度となります。

スペックの解説は他のサイトに詳しいので、ここでは個人的な見解を書いていきます。

今回アップルが注力した点は、「ハード面でどれだけ手を抜けるか」ということだと思います。まずは作るチップの種類を最小限(1種類)に抑えた上で、可能な限り広い範囲に届く製品ラインアップ(エントリー向けの3種類)を組みました。Apple Siliconのデビュー作として効果を出すためには一番客層の厚いエントリー層に向けた製品を出すのは必然だったと思います。ハードウェアのデザインは昔のものをそのまま流用し、チップ統合やファンの撤去によって余ったスペースはおそらくバッテリーで埋めたものと思われます(一週間後にiFixitが分解したときにわかりますね)。ここ数年で出した製品はM1への移行がスムーズになるようにM1を意識した設計がほどこされていた可能性もあります。

ハード面で浮いたリソースはどこに回されたのでしょうか。これはおそらくx86ベースからARMベースのシステムにするために必要だった後方互換性をとるためのソフトウェア周りに、でしょう。私は異なるアーキテクチャでソフトウェアの互換性をとるための開発がどのくらい困難なものかはわからないのですが、発売からすぐにソフトウェア周りに多数の不具合が見つかるようでは評判が悪くなるのでこの部分のテストに注力するのは適切なように思われます。

どれを買えばいいかは人それぞれだと思いますが、Macbook AirとProが全く同じプロセッサで動いていることは注目すべきところだと思います。同じプロセッサだから同じパフォーマンスが出るかというとそういうものではなく、Airはファンレスで排熱が弱いので少しでも長い計算を行うと発熱で計算能力を落とすかもしれません。このあたりはベンチマークの結果を見たいところです。A14のTDP(Thermal Design Power)が6Wであることを考慮するとM1はおそらく10W程度だと思われるので、ファンレスでも十分な可能性はあります。それ以外では性能は同じだと思われるのでラップトップがいいかデスクトップがいいか、あるいはタッチバーが好きかどうかで決めていいのではないかと思います。

M1チップについてですが、A14との違いはハイパフォーマンスコアが2つから4つになったこと、GPUコアが4つから8つになったことで、あとは大体同じです。イベントの少し前にA14Xという(存在しない)チップの非公式のGeekbench 5スコアのリークがあったようで、スコアは7000程度とのことでした。A14がだいたい4000くらいなので、ハイパフォーマンスコアが2倍になり、高効率コアが4つのまま据置きであることを考えるとこれがM1でも納得できる数値だと思います。これは Ryzen 7 4800HS や Core-i7 10875Hと同程度で、モバイル用のハイエンドのものと肩を並べる程度のパフォーマンスになり、これ自体ラップトップとしてはそれほど驚異的な数字ではありません。しかし、消費電力がそれらハイエンドCPUの1/3から1/4になると予想されることも考慮に入れると驚くべき数字になります。ほとんど非合理とも言える効率で有名なRyzen 4800Uですら15Wでスコア6000程度なことを考えると、10W程度のプロセッサで7000を出すとなると、何かがおかしいようにも感じます。このあたりの数字は将来もっとコア数を増やした際にデータセンター等で使えるかどうか、というところに関わってくる可能性があるので適切な測定がなされる(あるいはデータが提供される)ことを期待します。

科学計算をするのに適切な計算機であるかという観点から見ると、ハードウェアの観点から言うと十分に使用に耐えうると思います。ただ、最初のうちはARMネイティブで動くソフトが少ないかもしれないので、ソフトウェアの移行が進んでから購入する方が賢いかもしれません。このままのスペックでもかなりの計算はできますし(中堅デスクトップ程度かと)、発熱やファンノイズの問題もほぼないと言えるでしょう。ハイエンドデスクトップを置き換えたいのであれば、来年以降のiMacかMac Proを待つ方がよさそうです。

もしニューラルエンジンがモデルのトレーニングで(Tensorflowなどで)簡単にできるようになった場合、購入することも考えています。本当はより高性能なプロセッサを積んだiMacを待ちたいところですが、どうするか少し決めかねています。長くなりましたが、以上です。

The first world

Japanese

I implemented the first world. In this post, I set the rules of the first world, write them in the OpenAI Gym format, register it as an OpenAI Gym environment, and use Keras-rl2 to train a neural net for this environment.

I put the code on Github, so I’ll focus on the specifications of the world.

  • The world is a 30 x 30 2D grid space
  • There is only one living entity (agent)
  • The agent has 100 energy at the beginning
  • Food is distributed randomly (both location and amount (0-100) are random)
  • Time is discretized in steps
  • In each step, the agent can either move to one of four directions or stay.
  • The agent spends 1 energy if it moves or 0.5 energy if it stays.
  • If the agent overlaps with food, it gains its energy, and get a reward point of the (food amount)/100.
  • If it uses up the energy, it dies and loses 3 reward points.
  • In each step, there is a 2% chance that food appears in the world. The amount is random (0-100).
  • An episode ends if the agent dies or at 2000 steps.

When the environment is registered to OpenAI Gym, doing “pip -e gym-smallworld” keeps the environment editable during development. It makes easy to keep modifying the world specification.

The world is defined now. The network training is pretty much a simplified version of the Atari game example from Keras-rl2. Specifically,

  • 2 layers of 3 x 3 x 16 convolutional layers (stride 1)
  • 1 dense layer with 32 neurons
  • Scaled exponential linear unit (selu) for activation function
  • Deep Q Network (DQN) with epsilon greedy Q policy with linear annealing
  • Adam optimizer with learning rate = 0.001
  • 10000 warm-up steps
  • the target model is updated every 10000 steps.

The difference from the example is the size of the network (smaller) and the use of selu (which I have a nice experience with). Most other things are the same. No GPU used. If you install appropriate packages (gym, Keras-rl2, etc, with Python 3) it should work fine on a CPU. If it works, the training begins and animation like this will be displayed.

A green dot is the agent and red dots are food. The brighter the dot is, the more food there is there. If you hide this animation with other window and not let it render on your display, it seems that it omits the calculation of this and calculation gets efficient. I don’t know exactly how it works, but it’s a nice tip.

Pretty much what the agent has to do is to move towards any available food. There are no obstacles or enemies, so this is a pretty straightforward task. With this simple training scheme, the episode reward goes up nicely, and saturate near 1.5-2M steps (blue is the epsode reward, orange is the Q-value). It takes about half a day with Core i7-3770k.

An issue is that the current program does not have the same performance when it is switched to the test mode. I’ll investigate the reason for this (I assume that the policy change between the training mode and test mode is the issue).

Anyways, the first world is completed. My next task is to make an environment for multiple agents that could be trained simultaneously and independently.

最初の世界

English

さて、今回から世界の実装を始めていきます。今回のゴールは、最初のシンプルな世界のルールを決め、OpenAI Gym に登録できる形式で書き下し、Keras-rl2を使ってトレーニングができるところまでとします。細かいことは気にせず、とりあえず動くものを作ります。

コードは Github に置いておいたので、ここでは世界の仕様を書いていきます。

  • 30 × 30 の二次元グリッドスペース空間
  • エージェントは1つのみ
  • エージェントは最初に100のエネルギーを持っている
  • 空間には食べ物がランダムに配置されている(場所も量(0-100)もランダム)
  • 時間は不連続(ステップ制)
  • 各ステップに生き物は各方向に移動するか、待機するかを選択できる(選択肢は5つ)
  • 生き物は移動するとエネルギーを1消費し、待機すると0.5消費する
  • 生き物が食べ物に重なるとそのエネルギーを自分のものにでき、同時に食べ物の量/100分のスコアを獲得する
  • 生き物が全てのエネルギーを使うと死亡し、スコアを3点失う
  • 1ステップごとに2%の確率でランダムなマスにランダムな量(0-100)の食べ物が発生する
  • 生き物が死ぬか2000ステップを過ぎたら終了する

OpenAI Gym に登録するときは、 pip -e gym-smallworld のように -e (editable) オプションをつけると、世界の仕様を変更するのが簡単になります。

一方、トレーニングの方法は、Keras-rl2の例にあるAtariゲーム用のトレーニングコードをほぼ流用しました。具体的には以下の仕様でトレーニングします。

  • 3 × 3 × 16 の畳み込みレイヤー(ストライド数1)を2枚
  • 32ニューロンの全結合層が1枚
  • 活性化関数は scaled exponential linear unit (selu) (変更点)
  • Deep Q Network (DQN) を epsilon greedy Q ポリシーと共に使い、線形焼き鈍し(linear annealing)をする
  • 最適化には Adam をラーニングレート0.001で用いる
  • ウォームアップステップは10000
  • ターゲットモデルは10000ステップごとに更新される

ネットワークを小さくし、デフォルトの relu を selu に変更しました。それ以外はだいたい元のコードのままです。GPUで動かすようにはしていないので、適当なパッケージ(gym, keras-rl2あたり)を入れればどんなパソコンでも動くはずです。(Python 3 で動かしています。)動いた場合は下のようなアニメーションが表示され、トレーニングが始まります。

緑が生き物で、赤が食べ物です。明るいほど食べ物のエネルギーが大きいことを示しています。この画像ですが、バックグラウンドにもっていって描画されないようにすると、計算を省略するみたいで、効率が上がります。見たいときはフォアグラウンドにもってくると適切な速度で表示されます。どういう仕組みかはわかりませんが、便利です。

見える範囲にある食べ物を集めていればよく、邪魔するものも何もないので、非常に簡単なタスクです。Atariのゲームの方がよほど難しいと思われます。episode_rewardもとんとん拍子に上昇し、次の図のようにだいたい1.5-2Mステップで収束します(青がエピソードごとのスコア、オレンジがQ値です)。Core i7-3770kで半日程度かかりました。

現時点での問題として、テストの時にトレーニング時のパフォーマンスが発揮できないのですが、これについては後々原因を追求します。(トレーニング時とテスト時のポリシーの変更によるところかなと思っています)

とりあえず動く世界ができました。次は複数エージェントでのトレーニングの実装をしたいと思います。