Celebrating Pi Day with Cloud Functions
Emma Haruka Iwao
Senior Developer Relations Engineer
March 14 is Pi Day, an annual celebration of the mathematical constant π. We're doing a few experiments with the new Cloud Functions (2nd gen) this year to showcase the new serverless platform.
Serverless π calculation
Can we go serverless to calculate π? There is a relatively new algorithm called the Bailey–Borwein–Plouffe formula (BBP formula) to calculate digits of π without computing the preceding digits, which means we can run many calculations in parallel and gather the results later. We can build a MapReduce pipeline to get the numbers. Cloud Functions (2nd gen) supports larger instances (16 GB memory and 4 vCPUs) and extends the max function execution duration to 60 minutes from 9 minutes so we can push the limits further.
Here's the architecture we built. We used Node to implement the functions.
The calculation runs as follows.
processRequestfunction to create and submit tasks (e.g., calculate X digits from offset Y) to PubSub.
calculateOffsetfunction gets triggered by PubSub, computes digits, and stores the result to Firestore.
A separate controller function keep-watch monitors Firestore and triggers combineResults once all tasks are complete, storing the final output in Cloud Storage as a text file.
How long does it take? It takes about 45 minutes to calculate 64 million digits.
Unfortunately, the BBP formula is computationally more complex than other algorithms used in record-breaking attempts (such as our last 31.4 trillion record), so it is unlikely we can use this method to establish a new record. However, the extended runtime in Cloud Functions makes running many new applications possible, including this experiment.
Serverless Pi API
We've also built a new API to serve digits of π. We previously used Google Kubernetes Engine (GKE), but we have migrated the service to Cloud Functions 2nd gen. We also rewrote the API program to fetch data from Cloud Storage instead of Persistent Disk.
We've reduced the total monthly expenses from about 9,000 US dollars to 450 US dollars by changing the architecture.
Storage cost: The most significant cost factor is the disk. The previous configuration used a Zonal SSD Persistent Disk to store the digits of π, and it's 50 TB with 50 trillion digits in plain text, which costs 8,500 US dollars a month. We've moved all the data to Cloud Storage. We've also changed the object format to a compressed file so that the 50 trillion digits consume 21 TB instead of 50 TB. With these changes, storage cost is about 400 US dollars a month, which is 95% saving.
Compute cost: Cloud Functions also helps reduce cost. There is no base CPU cost for Cloud Functions as it only charges when processing requests. Previously with GKE, we always had four instances in 2 zones that would cost 391 US dollars per month with the e2-standard-4 instance type. We estimate that the monthly cost would be around 7 US dollars for 1 million requests, achieving 98% saving.
The new service architecture is also faster and more robust as it runs in multiple regions. The global HTTP(S) load balancer chooses the closest region automatically and improves latency. The API function has a small cache inside and returns a response without accessing the Cloud Storage bucket on a cache hit.
We have a live demo using the new API where you can listen to music created by the digits of π or watch an animation of transitions of the numerical sequence. We host the entire 50 trillion digits from the 2021 world record for the demo. You can also call the API directly from the command line:
The source code of the API service and the demo are available on GitHub. We use Terraform to manage the infrastructure, and we've published the scripts as well, so it's a great place to learn with actual examples.
Happy Pi Day!