# Copyright 2017 Google Inc. All rights reserved. | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
# At least one GPU is considered available iff COLAB_GPU=1. | |
export COLAB_GPU="$([[ -c /dev/nvidiactl ]] && echo 1)" | |
/usr/local/colab/bin/oom_monitor.sh & | |
# Start the Colab proxy to the Jupyter kernel manager. | |
# TODO(b/267667580): Evaluate use of tcmalloc here and possibly other places. | |
( while true; do | |
GCE_METADATA_HOST="${VM_GCE_METADATA_HOST}" \ | |
LD_PRELOAD='/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4' \ | |
/usr/colab/bin/kernel_manager_proxy \ | |
--listen_port="${KMP_LISTEN_PORT}" \ | |
--target_port="${KMP_TARGET_PORT}" \ | |
${KMP_EXTRA_ARGS} || true | |
sleep 1 | |
done & ) | |
# Start fresh to isolate user-initiated actions from VM build & startup events. | |
for f in /var/log/apt/history.log /var/log/pip.log; do | |
mv "$f" "${f}.bak-run.sh" 2>/dev/null || true # Ignore missing files. | |
done | |
# Warm disk buffers for modules we need for kernel startup. (cf: b/116536906) | |
if [[ "${COLAB_WARMUP_DEFAULTS}" == "1" ]]; then | |
python3 -c "import google.colab._kernel" | |
python3 -c "import matplotlib" | |
# importing tensorflow on a TPU VM causes the process to acquire the TPU for | |
# the duration of the import. This makes the TPU effectively unacquirable for | |
# the duration of the warmup, which can break things like probers. | |
if [[ "${COLAB_TPU_1VM}" == "1" ]]; then | |
python3 -c "import tensorflow" | |
else | |
python3 -c "import tensorflow" & | |
fi | |
fi | |
# Start the server to handle /files and /api/contents requests. | |
/usr/local/bin/colab-fileshim.py ${COLAB_FILESHIM_EXTRA_ARGS} & | |
# Link NVidia tools from a read-only volume mount. | |
for f in $(ls /opt/bin/.nvidia 2>/dev/null); do | |
ln -st /opt/bin "/opt/bin/.nvidia/${f}" | |
ln -st /usr/bin "/opt/bin/.nvidia/${f}" | |
done | |
cd / | |
# Start the node server. | |
if [[ "${COLAB_HUMAN_READABLE_NODE_LOGS}" == "1" ]]; then | |
PIPE=/tmp/.node.out | |
if ! [[ -p "${PIPE}" ]]; then | |
mkfifo "${PIPE}" | |
fi | |
/datalab/web/node_modules/bunyan/bin/bunyan \ | |
-l "${COLAB_NODE_LOG_LEVEL:-info}" < "${PIPE}" & | |
exec >& "${PIPE}" | |
fi | |
exec /tools/node/bin/node /datalab/web/app.js | |